diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000000..a471bfa94714 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +dist/* +build/* +coverage/* +public/* +.github/* +node_modules/* +.vscode/* \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 852966d9f93a..1411697a3f25 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,17 +1,29 @@ { - "env": { - "browser": true, - "es2021": true - }, - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "overrides": [ - { - "files": ["src/**/*.ts"], - "extends": "eslint:recommended" - } - ], - "rules": {} + "parser": "@typescript-eslint/parser", // Specifies the ESLint parser for TypeScript + "plugins": ["@typescript-eslint", "import"], // Includes TypeScript and import plugins + "overrides": [ + { + "files": ["src/**/*.{ts,tsx,js,jsx}"], // Applies these rules to all TypeScript and JavaScript files in the src directory + "rules": { + // General rules that apply to all files + "eqeqeq": ["error", "always"], // Enforces the use of === and !== instead of == and != + "indent": ["error", 2], // Enforces a 2-space indentation + "quotes": ["error", "double"], // Enforces the use of double quotes for strings + "no-var": "error", // Disallows the use of var, enforcing let or const instead + "prefer-const": "error", // Prefers the use of const for variables that are never reassigned + "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) + "@typescript-eslint/no-unused-vars": [ "error", { + "args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used. + "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the rest. + }], + "eol-last": ["error", "always"], // Enforces at least one newline at the end of files + "@typescript-eslint/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax + "semi": "off", // Disables the general semi rule for TypeScript files + "@typescript-eslint/no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax + "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors + "curly": ["error", "all"], // Enforces the use of curly braces for all control statements + "@typescript-eslint/brace-style": ["error", "1tbs"] + } + } + ] } diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml new file mode 100644 index 000000000000..5dab0886d590 --- /dev/null +++ b/.github/workflows/eslint.yml @@ -0,0 +1,31 @@ +name: ESLint + +on: + # Trigger the workflow on push or pull request, + # but only for the main branch + push: + branches: + - main # Trigger on push events to the main branch + pull_request: + branches: + - main # Trigger on pull request events targeting the main branch + +jobs: + run-linters: # Define a job named "run-linters" + name: Run linters # Human-readable name for the job + runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job + + steps: + - name: Check out Git repository # Step to check out the repository + uses: actions/checkout@v2 # Use the checkout action version 2 + + - name: Set up Node.js # Step to set up Node.js environment + uses: actions/setup-node@v1 # Use the setup-node action version 1 + with: + node-version: 20 # Specify Node.js version 20 + + - name: Install Node.js dependencies # Step to install Node.js dependencies + run: npm ci # Use 'npm ci' to install dependencies + + - name: eslint # Step to run linters + uses: icrawl/action-eslint@v1 \ No newline at end of file diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 000000000000..01ffebc69c7d --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,7 @@ +pre-commit: + parallel: true + commands: + eslint: + glob: '*.{js,jsx,ts,tsx}' + run: npx eslint --fix {staged_files} + stage_fixed: true \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7db944a4533f..d75e8ed66771 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,97 +1,48 @@ { "name": "pokemon-rogue-battle", "version": "1.0.4", - "lockfileVersion": 3, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "pokemon-rogue-battle", - "version": "1.0.4", - "dependencies": { - "@material/material-color-utilities": "^0.2.7", - "crypto-js": "^4.2.0", - "i18next": "^23.11.1", - "i18next-browser-languagedetector": "^7.2.1", - "json-stable-stringify": "^1.1.0", - "phaser": "^3.70.0", - "phaser3-rex-plugins": "^1.1.84" - }, - "devDependencies": { - "@vitest/coverage-istanbul": "^1.4.0", - "axios": "^1.6.2", - "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.25.0", - "jsdom": "^24.0.0", - "json-beautify": "^1.1.1", - "phaser3spectorjs": "^0.0.8", - "pokenode-ts": "^1.20.0", - "typescript": "^5.0.3", - "vite": "^4.5.0", - "vite-plugin-fs": "^0.4.4", - "vitest": "^1.4.0", - "vitest-canvas-mock": "^0.3.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { + "dependencies": { + "@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { + "@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, - "dependencies": { + "requires": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true }, - "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, - "dependencies": { + "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -101,328 +52,185 @@ "json5": "^2.2.3", "semver": "^6.3.1" }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, - "dependencies": { + "requires": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { + "@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "dependencies": { + "requires": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/@babel/helper-environment-visitor": { + "@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "dev": true }, - "node_modules/@babel/helper-function-name": { + "@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "dependencies": { + "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { + "@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { + "@babel/helper-module-imports": { "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, - "dependencies": { + "requires": { "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { + "@babel/helper-module-transforms": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "dependencies": { + "requires": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { + "@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { + "@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { + "@babel/helper-string-parser": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "dev": true }, - "node_modules/@babel/helper-validator-identifier": { + "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "dev": true }, - "node_modules/@babel/helper-validator-option": { + "@babel/helper-validator-option": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "dev": true }, - "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, - "dependencies": { + "requires": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { + "@babel/highlight": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, - "dependencies": { + "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dependencies": { + "@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "requires": { "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/template": { + "@babel/template": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, - "dependencies": { + "requires": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { + "@babel/traverse": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, - "dependencies": { + "requires": { "@babel/code-frame": "^7.24.1", "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", @@ -433,432 +241,201 @@ "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" } }, - "node_modules/@babel/types": { + "@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, - "dependencies": { + "requires": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@esbuild/aix-ppc64": { + "@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/android-arm": { + "@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/android-arm64": { + "@esbuild/android-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/android-x64": { + "@esbuild/android-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/darwin-arm64": { + "@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/darwin-x64": { + "@esbuild/darwin-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/freebsd-arm64": { + "@esbuild/freebsd-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/freebsd-x64": { + "@esbuild/freebsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-arm": { + "@esbuild/linux-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-arm64": { + "@esbuild/linux-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-ia32": { + "@esbuild/linux-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-loong64": { + "@esbuild/linux-loong64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-mips64el": { + "@esbuild/linux-mips64el": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-ppc64": { + "@esbuild/linux-ppc64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-riscv64": { + "@esbuild/linux-riscv64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-s390x": { + "@esbuild/linux-s390x": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/linux-x64": { + "@esbuild/linux-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/netbsd-x64": { + "@esbuild/netbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/openbsd-x64": { + "@esbuild/openbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/sunos-x64": { + "@esbuild/sunos-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/win32-arm64": { + "@esbuild/win32-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/win32-ia32": { + "@esbuild/win32-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@esbuild/win32-x64": { + "@esbuild/win32-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "optional": true }, - "node_modules/@eslint-community/eslint-utils": { + "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "dependencies": { + "requires": { "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/regexpp": { + "@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } + "dev": true }, - "node_modules/@eslint/eslintrc": { + "@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "dependencies": { + "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", @@ -869,1208 +446,1242 @@ "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "dependencies": { + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + } } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "@eslint/js": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", + "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "dev": true }, - "node_modules/@humanwhocodes/config-array": { + "@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, - "dependencies": { + "requires": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/module-importer": { + "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "dev": true }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@istanbuljs/schema": { + "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/@jest/schemas": { + "@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "dependencies": { + "requires": { "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { + "@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { + "@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } + "dev": true }, - "node_modules/@jridgewell/set-array": { + "@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } + "dev": true }, - "node_modules/@jridgewell/sourcemap-codec": { + "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/@jridgewell/trace-mapping": { + "@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@material/material-color-utilities": { + "@material/material-color-utilities": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==" }, - "node_modules/@nodelib/fs.scandir": { + "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "dependencies": { + "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/@nodelib/fs.stat": { + "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } + "dev": true }, - "node_modules/@nodelib/fs.walk": { + "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "dependencies": { + "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", - "cpu": [ - "ppc64le" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "@rollup/rollup-android-arm-eabi": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", + "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "dev": true, + "optional": true }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "@rollup/rollup-android-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", + "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "dev": true, + "optional": true }, - "node_modules/@vitest/coverage-istanbul": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.4.0.tgz", - "integrity": "sha512-39TjURYyAY6CLDx8M1RNYGoAuWicPWoofk+demJbAZROLCwUgGPgMRSg51GN+snbmQRTpSizuS9XC3cMSdQH2Q==", + "@rollup/rollup-darwin-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", + "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", "dev": true, - "dependencies": { - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-instrument": "^6.0.1", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "test-exclude": "^6.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.4.0" - } + "optional": true }, - "node_modules/@vitest/expect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", - "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", + "@rollup/rollup-darwin-x64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", + "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", "dev": true, - "dependencies": { - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true }, - "node_modules/@vitest/runner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", - "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", + "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", "dev": true, - "dependencies": { - "@vitest/utils": "1.4.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } + "optional": true }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", + "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", + "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true }, - "node_modules/@vitest/snapshot": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", - "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", + "@rollup/rollup-linux-arm64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", + "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", + "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", + "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", + "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", + "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", + "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", + "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", + "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", + "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "dev": true, + "optional": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", + "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/parser": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", + "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vitest/coverage-istanbul": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.5.2.tgz", + "integrity": "sha512-YGC+QSWOL8cQ2HQaTEFttmG9v3DGLy7lMZIGdqjtTgaW6omW17/uZPxuh6m2t69T0rFLqImduVthm5o/gYYWTQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "test-exclude": "^6.0.0" + } + }, + "@vitest/expect": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", + "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", + "dev": true, + "requires": { + "@vitest/spy": "1.5.2", + "@vitest/utils": "1.5.2", + "chai": "^4.3.10" + }, + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + } + }, + "check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + } + } + }, + "@vitest/runner": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", + "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", + "dev": true, + "requires": { + "@vitest/utils": "1.5.2", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, "dependencies": { + "p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", + "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", + "dev": true, + "requires": { "magic-string": "^0.30.5", "pathe": "^1.1.1", "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", - "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "@vitest/spy": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", + "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", "dev": true, - "dependencies": { + "requires": { "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", + "@vitest/utils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", + "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", "dev": true, - "dependencies": { + "requires": { "diff-sequences": "^29.6.3", "estree-walker": "^3.0.3", "loupe": "^2.3.7", "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" } }, - "node_modules/accepts": { + "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "dependencies": { + "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/acorn": { + "acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "dev": true }, - "node_modules/acorn-jsx": { + "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "dev": true }, - "node_modules/acorn-walk": { + "acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "dev": true }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "dependencies": { + "requires": { "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" } }, - "node_modules/ajv": { + "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "dependencies": { + "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { + "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "requires": { + "color-convert": "^1.9.0" } }, - "node_modules/argparse": { + "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "engines": { - "node": "*" + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" } }, - "node_modules/asynckit": { + "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "dependencies": { - "follow-redirects": "^1.15.4", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, - "node_modules/axios-cache-interceptor": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.1.tgz", - "integrity": "sha512-1p/rTi7DSqUghJ5Ck8GKNt47X6f3IB8XnJ+TM4PwIdhimmCgh0jEQiwI8mBvf2kIMIl4Kz5idwbf/ouK75nEHA==", + "axios-cache-interceptor": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.2.tgz", + "integrity": "sha512-zrJZ9DZo5hKfrU+SEN/qhXxGD7GWRzwoqJ7sSvxikizUvDhWy/U9BoAbWLZZdyjbHHsfmS1OlQZCDW6o69r4DA==", "dev": true, - "dependencies": { + "requires": { "cache-parser": "1.2.4", "fast-defer": "1.1.8", - "object-code": "1.3.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" - }, - "peerDependencies": { - "axios": "^1" + "object-code": "1.3.3" } }, - "node_modules/balanced-match": { + "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/brace-expansion": { + "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "dependencies": { + "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/browserslist": { + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { + "requires": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bytes": { + "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/cac": { + "cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/cache-content-type": { + "cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, - "dependencies": { + "requires": { "mime-types": "^2.1.18", "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" } }, - "node_modules/cache-parser": { + "cache-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.4.tgz", "integrity": "sha512-O0KwuHuJnbHUrghHi2kGp0SxnWSIBXTYt7M8WVhW0kbPRUNUKoE/Of6e1rRD6AAxmfxFunKnt90yEK09D+sc5g==", "dev": true }, - "node_modules/call-bind": { + "call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { + "requires": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { + "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "caniuse-lite": { + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "dev": true }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "node_modules/co": { + "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } + "dev": true }, - "node_modules/co-body": { + "co-body": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", "dev": true, - "dependencies": { + "requires": { "inflation": "^2.0.0", "qs": "^6.5.2", "raw-body": "^2.3.3", "type-is": "^1.6.16" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "requires": { + "color-name": "1.1.3" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/combined-stream": { + "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "dependencies": { + "requires": { "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/concat-map": { + "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/content-disposition": { + "confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "dependencies": { + "requires": { "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/content-type": { + "content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/convert-source-map": { + "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/cookies": { + "cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, - "dependencies": { + "requires": { "depd": "~2.0.0", "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/copy-to": { + "copy-to": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", "dev": true }, - "node_modules/cross-fetch": { + "cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { + "requires": { "node-fetch": "^2.6.12" } }, - "node_modules/cross-spawn": { + "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "dependencies": { + "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/crypto-js": { + "crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, - "node_modules/cssfontparser": { + "cssfontparser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", "dev": true }, - "node_modules/cssstyle": { + "cssstyle": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, - "dependencies": { + "requires": { "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" } }, - "node_modules/data-urls": { + "data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, - "dependencies": { + "requires": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" }, - "engines": { - "node": ">=18" + "dependencies": { + "tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "requires": { + "punycode": "^2.3.1" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "requires": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + } + } } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "engines": { - "node": ">=18" + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "node_modules/debug": { + "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "dependencies": { + "requires": { "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, - "node_modules/decimal.js": { + "decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { + "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", "dev": true }, - "node_modules/deep-is": { + "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/define-data-property": { + "define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { + "requires": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "dev": true }, - "node_modules/delegates": { + "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "node_modules/depd": { + "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/destroy": { + "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "dev": true }, - "node_modules/diff-sequences": { + "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "requires": { + "path-type": "^4.0.0" } }, - "node_modules/doctrine": { + "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "dependencies": { + "requires": { "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/ee-first": { + "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "node_modules/electron-to-chromium": { - "version": "1.4.719", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz", - "integrity": "sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==", + "electron-to-chromium": { + "version": "1.4.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", + "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", "dev": true }, - "node_modules/encodeurl": { + "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/entities": { + "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "dev": true }, - "node_modules/es-define-property": { + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { + "requires": { "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" } }, - "node_modules/es-errors": { + "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "node_modules/esbuild": { + "esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { + "requires": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", @@ -2095,44 +1706,35 @@ "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/escalade": { + "escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/escape-html": { + "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "dependencies": { + "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -2167,123 +1769,249 @@ "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, - "bin": { - "eslint": "bin/eslint.js" + "dependencies": { + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "requires": { + "debug": "^3.2.7" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, - "node_modules/eslint-scope": { + "eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "dependencies": { + "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-visitor-keys": { + "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "dev": true }, - "node_modules/espree": { + "espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "dependencies": { + "requires": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, - "node_modules/esquery": { + "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "dependencies": { + "requires": { "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" } }, - "node_modules/esrecurse": { + "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "dependencies": { + "requires": { "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" } }, - "node_modules/estraverse": { + "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } + "dev": true }, - "node_modules/estree-walker": { + "estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "dependencies": { + "requires": { "@types/estree": "^1.0.0" } }, - "node_modules/esutils": { + "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/eventemitter3": { + "eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "node_modules/execa": { + "execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, - "dependencies": { + "requires": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", @@ -2293,746 +2021,782 @@ "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/fast-deep-equal": { + "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-defer": { + "fast-defer": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", "dev": true }, - "node_modules/fast-json-stable-stringify": { + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { + "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fastq": { + "fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "dependencies": { + "requires": { "reusify": "^1.0.4" } }, - "node_modules/file-entry-cache": { + "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "dependencies": { + "requires": { "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/find-up": { + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "dependencies": { + "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { + "flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "dependencies": { + "requires": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flatted": { + "flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/follow-redirects": { + "follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "requires": { + "is-callable": "^1.1.3" } }, - "node_modules/form-data": { + "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "dependencies": { + "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" } }, - "node_modules/fresh": { + "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/fs.realpath": { + "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { + "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "optional": true }, - "node_modules/function-bind": { + "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, - "node_modules/gensync": { + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } + "dev": true }, - "node_modules/get-func-name": { + "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, - "engines": { - "node": "*" - } + "dev": true }, - "node_modules/get-intrinsic": { + "get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { + "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { + "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 + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, - "node_modules/glob": { + "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "dependencies": { + "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { + "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "dependencies": { + "requires": { "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" } }, - "node_modules/gopd": { + "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { + "requires": { "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { + "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/happy-dom": { - "version": "14.3.9", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.3.9.tgz", - "integrity": "sha512-0kPQchwthekcYpYN8CvCiq+/z5bqFYDLbTxZ+yDLwT8AFRVJDFadShHRxp3VAZRy7a5isOZ1j/LzsU1dtAIZMQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "entities": "^4.5.0", - "webidl-conversions": "^7.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/happy-dom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true }, - "node_modules/has-property-descriptors": { + "has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { + "requires": { "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { + "has-proto": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, - "node_modules/has-symbols": { + "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "node_modules/has-tostringtag": { + "has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "dependencies": { + "requires": { "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dependencies": { + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" } }, - "node_modules/html-encoding-sniffer": { + "html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, - "dependencies": { + "requires": { "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" } }, - "node_modules/html-escaper": { + "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-assert": { + "http-assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, - "dependencies": { + "requires": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/http-errors": { + "http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, - "dependencies": { + "requires": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + } } }, - "node_modules/http-proxy-agent": { + "http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "dependencies": { + "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" } }, - "node_modules/https-proxy-agent": { + "https-proxy-agent": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, - "dependencies": { + "requires": { "agent-base": "^7.0.2", "debug": "4" - }, - "engines": { - "node": ">= 14" } }, - "node_modules/human-signals": { + "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, - "engines": { - "node": ">=16.17.0" - } + "dev": true }, - "node_modules/i18next": { - "version": "23.11.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.1.tgz", - "integrity": "sha512-mXw4A24BiPZKRsbb9ewgSvjYd6fxFCNwJyfK6nYfSTIAX2GkCWcb598m3DFkDZmqADatvuASrKo6qwORz3VwTQ==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { + "i18next": { + "version": "23.11.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", + "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", + "requires": { "@babel/runtime": "^7.23.2" } }, - "node_modules/i18next-browser-languagedetector": { + "i18next-browser-languagedetector": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", - "dependencies": { + "requires": { "@babel/runtime": "^7.23.2" } }, - "node_modules/i18next-http-backend": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz", - "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==", - "dependencies": { + "i18next-http-backend": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.1.tgz", + "integrity": "sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==", + "requires": { "cross-fetch": "4.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "node_modules/ignore": { + "ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } + "dev": true }, - "node_modules/import-fresh": { + "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "dependencies": { + "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { + "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } + "dev": true }, - "node_modules/inflation": { + "inflation": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "dev": true }, - "node_modules/inflight": { + "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "dependencies": { + "requires": { "once": "^1.3.0", "wrappy": "1" } }, - "node_modules/inherits": { + "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/is-extglob": { + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/is-generator-function": { + "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "dependencies": { + "requires": { "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { + "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "dependencies": { + "requires": { "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/is-potential-custom-element-name": { + "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "node_modules/is-stream": { + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "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 + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" } }, - "node_modules/isarray": { + "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "node_modules/isexe": { + "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/istanbul-lib-coverage": { + "istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/istanbul-lib-instrument": { + "istanbul-lib-instrument": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, - "dependencies": { + "requires": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" } }, - "node_modules/istanbul-lib-report": { + "istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "dependencies": { + "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, - "engines": { - "node": ">=10" + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "node_modules/istanbul-lib-source-maps": { + "istanbul-lib-source-maps": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/istanbul-reports": { + "istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "dependencies": { + "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/jest-canvas-mock": { + "jest-canvas-mock": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", "dev": true, - "dependencies": { + "requires": { "cssfontparser": "^1.2.1", "moo-color": "^1.0.2" } }, - "node_modules/js-tokens": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", - "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/js-yaml": { + "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { + "requires": { "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { + "jsdom": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", "dev": true, - "dependencies": { + "requires": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", @@ -3055,170 +2819,110 @@ "ws": "^8.16.0", "xml-name-validator": "^5.0.0" }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" + "tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "requires": { + "punycode": "^2.3.1" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "requires": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + } + } } }, - "node_modules/jsesc": { + "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/json-beautify": { + "json-beautify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz", "integrity": "sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==", - "dev": true, - "bin": { - "json-beautify": "bin/json-beautify" - } + "dev": true }, - "node_modules/json-buffer": { + "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-schema-traverse": { + "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify": { + "json-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "dependencies": { + "requires": { "call-bind": "^1.0.5", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-stable-stringify-without-jsonify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json5": { + "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, - "node_modules/jsonify": { + "jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" }, - "node_modules/keygrip": { + "keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, - "dependencies": { + "requires": { "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/keyv": { + "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "dependencies": { + "requires": { "json-buffer": "3.0.1" } }, - "node_modules/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", + "koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", "dev": true, - "dependencies": { + "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", @@ -3242,1975 +2946,1667 @@ "statuses": "^1.5.0", "type-is": "^1.6.16", "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" } }, - "node_modules/koa-bodyparser": { + "koa-bodyparser": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", "dev": true, - "dependencies": { + "requires": { "co-body": "^6.0.0", "copy-to": "^2.0.1", "type-is": "^1.6.18" - }, - "engines": { - "node": ">=8.0.0" } }, - "node_modules/koa-compose": { + "koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", "dev": true }, - "node_modules/koa-convert": { + "koa-convert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, - "dependencies": { + "requires": { "co": "^4.6.0", "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" } }, - "node_modules/koa-cors": { + "koa-cors": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/koa-cors/-/koa-cors-0.0.16.tgz", "integrity": "sha512-s15knPxe3AJBi2I/ZMPL0pSqU+PLYLO6k5tI0AqClkzavowvocPlSdFUwaHNqtjHMhsGmiq2tiX/25iILJx9YA==", "dev": true }, - "node_modules/koa-router": { + "koa-router": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", - "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", "dev": true, - "dependencies": { + "requires": { "debug": "^4.1.1", "http-errors": "^1.7.3", "koa-compose": "^4.1.0", "methods": "^1.1.2", "path-to-regexp": "^6.1.0" - }, - "engines": { - "node": ">= 8.0.0" } }, - "node_modules/levn": { + "lefthook": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.12.tgz", + "integrity": "sha512-SoHhB0L1D5twH5KKsGAT1h4qF+RhGfPo/JC5z60H0RDuFWtSwFNOeFpT4Qa7XwM6J9c1fvqZzOH9/4XF7dG9Uw==", + "dev": true, + "requires": { + "lefthook-darwin-arm64": "1.6.12", + "lefthook-darwin-x64": "1.6.12", + "lefthook-freebsd-arm64": "1.6.12", + "lefthook-freebsd-x64": "1.6.12", + "lefthook-linux-arm64": "1.6.12", + "lefthook-linux-x64": "1.6.12", + "lefthook-windows-arm64": "1.6.12", + "lefthook-windows-x64": "1.6.12" + } + }, + "lefthook-darwin-arm64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.12.tgz", + "integrity": "sha512-IJa50i+78nGxtSvnxLSDfSjBjjM7Ixl03V4+yl3Kdn+S+FwzEZet3LYTLbnKFUVy9Bg23obI3yXgwUx+tJjFXg==", + "dev": true, + "optional": true + }, + "lefthook-darwin-x64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.12.tgz", + "integrity": "sha512-h11ByUtwM78FShgWgSUyyZtwKW6pjYfYvTygw24c/lZXKjupfowK5Ps5A73hCsjr0AEJNVpgW1S5Jd22gIJJCA==", + "dev": true, + "optional": true + }, + "lefthook-freebsd-arm64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.12.tgz", + "integrity": "sha512-Aw1+AosL8r/LFSVKG7i8GI1FpHnWFG66/6DBDUgCwNAwhNCXt7tERAM8dj9S6EqmqHCQCC0nI/6qKNBsFPk7Ow==", + "dev": true, + "optional": true + }, + "lefthook-freebsd-x64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.12.tgz", + "integrity": "sha512-G8Dg7UuRstXrqaEA8MSOZikz6PpjPUQu3QmiihzcyGdzI76jFsmjJb2vkrnvMsH9u2gWb3J4sp3TULhbMHXwSw==", + "dev": true, + "optional": true + }, + "lefthook-linux-arm64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.12.tgz", + "integrity": "sha512-fwO0i6x5EPelL66EwaySzGzvVbN2vLFZDUWuTi8nZzEgBsCBuG0mORxZg91cNCGLRPT3sgzWPraTkyzIJa7kHg==", + "dev": true, + "optional": true + }, + "lefthook-linux-x64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.12.tgz", + "integrity": "sha512-pRAZKZhSoirjRwDF0TrqxgkeXtUmJqaUi0kGmMJmutToqo9IXQcnpueVmyV9Z1m6lLJn4PpKoFydY6tFXqvyNQ==", + "dev": true, + "optional": true + }, + "lefthook-windows-arm64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.12.tgz", + "integrity": "sha512-jMMIoqNKtiqGrwyWeN3JXGXi7H7iAXsGB5v4DkcUbdw9y50qhruxWz84I2PoxwYmZVeMxRR+VpYvS7nOvBmzWA==", + "dev": true, + "optional": true + }, + "lefthook-windows-x64": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.12.tgz", + "integrity": "sha512-XqEBVIhp/Fd1Fs+VBlPhrSJlUkyXEJuxQmiYSYow3C18RNpQQrJFVFpz0wE/IDTn2jOXx+p5+hcdlJb+s6bnpA==", + "dev": true, + "optional": true + }, + "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "dependencies": { + "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" } }, - "node_modules/local-pkg": { + "local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, - "dependencies": { + "requires": { "mlly": "^1.4.2", "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" } }, - "node_modules/locate-path": { + "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "dependencies": { + "requires": { "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { + "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/loupe": { + "loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, - "dependencies": { + "requires": { "get-func-name": "^2.0.1" } }, - "node_modules/lru-cache": { + "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "dependencies": { + "requires": { "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, - "dependencies": { + "requires": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, - "node_modules/magicast": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", - "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "magicast": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, - "dependencies": { - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "source-map-js": "^1.0.2" + "requires": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" } }, - "node_modules/make-dir": { + "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "dependencies": { + "requires": { "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/media-typer": { + "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/merge-stream": { + "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 }, - "node_modules/methods": { + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", + "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", "dev": true, - "engines": { - "node": ">= 0.6" + "requires": { + "braces": "^3.0.3", + "picomatch": "^4.0.2" } }, - "node_modules/mime-db": { + "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/mime-types": { + "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "dependencies": { + "requires": { "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/mimic-fn": { + "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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/minimatch": { + "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "dependencies": { + "requires": { "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" } }, - "node_modules/mlly": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", "dev": true, - "dependencies": { + "requires": { "acorn": "^8.11.3", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "ufo": "^1.3.2" } }, - "node_modules/moo-color": { + "moo-color": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", "dev": true, - "dependencies": { + "requires": { "color-name": "^1.1.4" + }, + "dependencies": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } } }, - "node_modules/ms": { + "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/mustache": { + "mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" - } + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" }, - "node_modules/nanoid": { + "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } + "dev": true }, - "node_modules/natural-compare": { + "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/negotiator": { + "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/node-fetch": { + "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { + "requires": { "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } } }, - "node_modules/node-releases": { + "node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/npm-run-path": { + "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, - "dependencies": { + "requires": { "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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "nwsapi": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", "dev": true }, - "node_modules/object-code": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.2.tgz", - "integrity": "sha512-3CVDmQiru7YYVr+4OpCGrqkVE7GogmWinDcgfno1fXlKgIhtW9FhgHTiV98gMPUjQwWuWvijQDCY8sGnqKrhTw==", + "object-code": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", + "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", "dev": true }, - "node_modules/object-inspect": { + "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "dev": true }, - "node_modules/object-keys": { + "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, - "node_modules/on-finished": { + "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "dependencies": { + "requires": { "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/once": { + "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "dependencies": { + "requires": { "wrappy": "1" } }, - "node_modules/onetime": { + "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, - "dependencies": { + "requires": { "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/only": { + "only": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", "dev": true }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", + "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" } }, - "node_modules/p-limit": { + "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "dependencies": { + "requires": { "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { + "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "dependencies": { + "requires": { "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/papaparse": { + "papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, - "node_modules/parent-module": { + "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "dependencies": { + "requires": { "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" } }, - "node_modules/parse5": { + "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, - "dependencies": { + "requires": { "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { + "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/path-exists": { + "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/path-is-absolute": { + "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/path-key": { + "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "node_modules/pathe": { + "pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/phaser": { - "version": "3.80.0", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.0.tgz", - "integrity": "sha512-LUEPFzQKXSlPxrDjFUaeq6t47j1Y58F67OsCKflvDH1DUSwVxAD1/vDUPQJj+dWniKBxAlL1BoCXQnjmtcJxUQ==", - "dependencies": { + "phaser": { + "version": "3.80.1", + "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", + "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", + "requires": { "eventemitter3": "^5.0.1" } }, - "node_modules/phaser3-rex-plugins": { - "version": "1.80.0", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.0.tgz", - "integrity": "sha512-OeayvK1rKSKUKs/nGWvMPx/x5AgyaV8WgyyCy5shn84B702yatlt93xLIIii5ER3O5ovqndK6Ne/ARaGsdbiwQ==", - "dependencies": { + "phaser3-rex-plugins": { + "version": "1.80.2", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.2.tgz", + "integrity": "sha512-ZPA4c47WQRU6rqLdlOFizGU+ljtP4C2blhcpbYSsNMqNRHD7o8vRBEzEhl8w6CMGvcy+eVoA6v10cyL4eIZARw==", + "requires": { "eventemitter3": "^3.1.2", "i18next": "^22.5.1", - "i18next-http-backend": "^2.4.1", + "i18next-http-backend": "^2.5.0", "js-yaml": "^4.1.0", "mustache": "^4.2.0", "papaparse": "^5.4.1", "webfontloader": "^1.6.28" - } - }, - "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "node_modules/phaser3-rex-plugins/node_modules/i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + "i18next": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", + "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "requires": { + "@babel/runtime": "^7.20.6" + } } - ], - "dependencies": { - "@babel/runtime": "^7.20.6" } }, - "node_modules/phaser3spectorjs": { + "phaser3spectorjs": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", "dev": true }, - "node_modules/picocolors": { + "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + }, + "pkg-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", + "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "requires": { + "confbox": "^0.1.7", + "mlly": "^1.6.1", + "pathe": "^1.1.2" } }, - "node_modules/pokenode-ts": { + "pokenode-ts": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/pokenode-ts/-/pokenode-ts-1.20.0.tgz", "integrity": "sha512-6MekrbiQc9nmaZJ5xpyhRSEMFo4xEsMuB7RR3EqfPvuXo/3StnH1p4brfIiIWDCcZvu7t9a0vjodiR4TnRdLEw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/Gabb-c/pokenode-ts?sponsor=1" - }, - "peerDependencies": { - "axios": "^1.4.0", - "axios-cache-interceptor": "^1.2.0" - } + "dev": true }, - "node_modules/postcss": { + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, + "postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { + "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" } }, - "node_modules/prelude-ls": { + "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "dev": true }, - "node_modules/pretty-format": { + "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "dependencies": { + "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, - "node_modules/proxy-from-env": { + "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/psl": { + "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/punycode": { + "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "requires": { + "side-channel": "^1.0.6" } }, - "node_modules/querystringify": { + "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, - "node_modules/queue-microtask": { + "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dev": true }, - "node_modules/raw-body": { + "raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "dependencies": { + "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "react-is": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", + "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", "dev": true }, - "node_modules/regenerator-runtime": { + "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "node_modules/requires-port": { + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, + "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/resolve-from": { + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/reusify": { + "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/rimraf": { + "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "dependencies": { + "requires": { "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { + "rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { + "requires": { "fsevents": "~2.3.2" } }, - "node_modules/rrweb-cssom": { + "rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", "dev": true }, - "node_modules/run-parallel": { + "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { + "requires": { "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + } }, - "node_modules/safer-buffer": { + "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/saxes": { + "saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, - "dependencies": { + "requires": { "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" } }, - "node_modules/semver": { + "semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "dependencies": { + "requires": { "lru-cache": "^6.0.0" }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" } }, - "node_modules/setprototypeof": { + "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "node_modules/shebang-command": { + "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "dependencies": { + "requires": { "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/shebang-regex": { + "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", + "requires": { + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { + "siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, - "node_modules/signal-exit": { + "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, - "node_modules/source-map-js": { + "source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/stackback": { + "stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/statuses": { + "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "dev": true }, - "node_modules/std-env": { + "std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "node_modules/strip-ansi": { + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "dependencies": { + "requires": { "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/strip-final-newline": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/strip-json-comments": { + "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/strip-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", - "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, - "dependencies": { - "js-tokens": "^8.0.2" + "requires": { + "js-tokens": "^9.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true + } } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "requires": { + "has-flag": "^3.0.0" } }, - "node_modules/symbol-tree": { + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/test-exclude": { + "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "dependencies": { + "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" } }, - "node_modules/text-table": { + "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "tinybench": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, - "node_modules/tinypool": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz", - "integrity": "sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } + "tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true }, - "node_modules/tinyspy": { + "tinyspy": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } + "dev": true }, - "node_modules/to-fast-properties": { + "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 + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "engines": { - "node": ">=4" + "requires": { + "is-number": "^7.0.0" } }, - "node_modules/toidentifier": { + "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } + "dev": true }, - "node_modules/tough-cookie": { + "tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, - "dependencies": { + "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" } }, - "node_modules/tr46": { + "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tsscmp": { + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true, - "engines": { - "node": ">=0.6.x" - } + "dev": true }, - "node_modules/type-check": { + "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "dependencies": { + "requires": { "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" } }, - "node_modules/type-detect": { + "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/type-fest": { + "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true }, - "node_modules/type-is": { + "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "dependencies": { + "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true + }, + "typescript-eslint": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.10.0.tgz", + "integrity": "sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "7.10.0", + "@typescript-eslint/parser": "7.10.0", + "@typescript-eslint/utils": "7.10.0" } }, - "node_modules/ufo": { + "ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, - "node_modules/universalify": { + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } + "dev": true }, - "node_modules/unpipe": { + "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/update-browserslist-db": { + "update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { + "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { + "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "dependencies": { + "requires": { "punycode": "^2.1.0" } }, - "node_modules/url-parse": { + "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "dependencies": { + "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "node_modules/vary": { + "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/vite": { + "vite": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, - "dependencies": { + "requires": { "esbuild": "^0.18.10", + "fsevents": "~2.3.2", "postcss": "^8.4.27", "rollup": "^3.27.1" + } + }, + "vite-node": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", + "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { + "dependencies": { + "@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "dev": true, "optional": true }, - "less": { + "@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "dev": true, "optional": true }, - "lightningcss": { + "@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "dev": true, "optional": true }, - "sass": { + "@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "dev": true, "optional": true }, - "stylus": { + "@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "dev": true, "optional": true }, - "sugarss": { + "@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "dev": true, "optional": true }, - "terser": { + "@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "dev": true, "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", - "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-node/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vite-node/node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-node/node_modules/vite": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", - "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.36", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { + }, + "@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "dev": true, "optional": true }, - "less": { + "@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "dev": true, "optional": true }, - "lightningcss": { + "@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "dev": true, "optional": true }, - "sass": { + "@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "dev": true, "optional": true }, - "stylus": { + "@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "dev": true, "optional": true }, - "sugarss": { + "@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "dev": true, "optional": true }, - "terser": { + "@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "dev": true, "optional": true + }, + "esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "requires": { + "esbuild": "^0.20.1", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + } } } }, - "node_modules/vite-plugin-fs": { + "vite-plugin-fs": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/vite-plugin-fs/-/vite-plugin-fs-0.4.4.tgz", "integrity": "sha512-TT9kEU2LX3musejDL99nLdjDl7P74AdTnK3yozehswg0FhKSGlNstkHVUgcswKSk6vH/Uzqgz+df7WT0sEA/IA==", "dev": true, - "dependencies": { + "requires": { "koa": "^2.13.4", "koa-bodyparser": "^4.3.0", "koa-cors": "^0.0.16", "koa-router": "^10.1.1" - }, - "engines": { - "node": ">=14" } }, - "node_modules/vitest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", - "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "vitest": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", + "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", "dev": true, - "dependencies": { - "@vitest/expect": "1.4.0", - "@vitest/runner": "1.4.0", - "@vitest/snapshot": "1.4.0", - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", + "requires": { + "@vitest/expect": "1.5.2", + "@vitest/runner": "1.5.2", + "@vitest/snapshot": "1.5.2", + "@vitest/spy": "1.5.2", + "@vitest/utils": "1.5.2", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -5222,705 +4618,426 @@ "std-env": "^3.5.0", "strip-literal": "^2.0.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.4.0", + "vite-node": "1.5.2", "why-is-node-running": "^2.2.2" }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.4.0", - "@vitest/ui": "1.4.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { + "dependencies": { + "@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "dev": true, "optional": true }, - "@types/node": { + "@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "dev": true, "optional": true }, - "@vitest/browser": { + "@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "dev": true, "optional": true }, - "@vitest/ui": { + "@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "dev": true, "optional": true }, - "happy-dom": { + "@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "dev": true, "optional": true }, - "jsdom": { + "@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "dev": true, "optional": true - } - } - }, - "node_modules/vitest-canvas-mock": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", - "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", - "dev": true, - "dependencies": { - "jest-canvas-mock": "~2.5.2" - }, - "peerDependencies": { - "vitest": "*" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/vitest/node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", - "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.36", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { + }, + "@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "dev": true, "optional": true }, - "less": { + "@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "dev": true, "optional": true }, - "lightningcss": { + "@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "dev": true, "optional": true }, - "sass": { + "@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "dev": true, "optional": true }, - "stylus": { + "@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "dev": true, "optional": true }, - "sugarss": { + "@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "dev": true, "optional": true }, - "terser": { + "@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "dev": true, "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "dev": true, + "optional": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + } + }, + "check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "requires": { + "esbuild": "^0.20.1", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + } } } }, - "node_modules/w3c-xmlserializer": { + "vitest-canvas-mock": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", + "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", + "dev": true, + "requires": { + "jest-canvas-mock": "~2.5.2" + } + }, + "w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, - "dependencies": { + "requires": { "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" } }, - "node_modules/webfontloader": { + "webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" }, - "node_modules/webidl-conversions": { + "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/whatwg-encoding": { + "whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, - "dependencies": { + "requires": { "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } + "whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true }, - "node_modules/whatwg-url": { + "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { + "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { + "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "dependencies": { + "requires": { "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/why-is-node-running": { + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", "dev": true, - "dependencies": { + "requires": { "siginfo": "^2.0.0", "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" } }, - "node_modules/wrappy": { + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/ws": { + "ws": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "dev": true }, - "node_modules/xml-name-validator": { + "xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "engines": { - "node": ">=18" - } + "dev": true }, - "node_modules/xmlchars": { + "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/yallist": { + "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/ylru": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", - "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } + "ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true }, - "node_modules/yocto-queue": { + "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true } } } diff --git a/package.json b/package.json index d5ffb651f547..2f2d711ce470 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,25 @@ "preview": "vite preview", "test": "vitest run", "test:cov": "vitest run --coverage", - "test:watch": "vitest watch --coverage" + "test:watch": "vitest watch --coverage", + "eslint": "eslint --fix ." }, "devDependencies": { + "@eslint/js": "^9.3.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "@vitest/coverage-istanbul": "^1.4.0", "axios": "^1.6.2", "axios-cache-interceptor": "^1.3.2", - "eslint": "^8.25.0", + "eslint": "^8.57.0", + "eslint-plugin-import": "^2.29.1", "jsdom": "^24.0.0", "json-beautify": "^1.1.1", + "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", "pokenode-ts": "^1.20.0", - "typescript": "^5.0.3", + "typescript": "^5.4.5", + "typescript-eslint": "^7.10.0", "vite": "^4.5.0", "vite-plugin-fs": "^0.4.4", "vitest": "^1.4.0", diff --git a/src/account.ts b/src/account.ts index f5d4e2858b49..c63bf879e9f6 100644 --- a/src/account.ts +++ b/src/account.ts @@ -12,27 +12,28 @@ export const clientSessionId = Utils.randomString(32); export function updateUserInfo(): Promise<[boolean, integer]> { return new Promise<[boolean, integer]>(resolve => { if (bypassLogin) { - loggedInUser = { username: 'Guest', lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1 }; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { - if (localStorage.getItem(`sessionData${s ? s : ''}_${loggedInUser.username}`)) { + if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { lastSessionSlot = s; break; } } loggedInUser.lastSessionSlot = lastSessionSlot; // Migrate old data from before the username was appended - [ 'data', 'sessionData', 'sessionData1', 'sessionData2', 'sessionData3', 'sessionData4' ].map(d => { + [ "data", "sessionData", "sessionData1", "sessionData2", "sessionData3", "sessionData4" ].map(d => { if (localStorage.hasOwnProperty(d)) { - if (localStorage.hasOwnProperty(`${d}_${loggedInUser.username}`)) + if (localStorage.hasOwnProperty(`${d}_${loggedInUser.username}`)) { localStorage.setItem(`${d}_${loggedInUser.username}_bak`, localStorage.getItem(`${d}_${loggedInUser.username}`)); + } localStorage.setItem(`${d}_${loggedInUser.username}`, localStorage.getItem(d)); localStorage.removeItem(d); } }); return resolve([ true, 200 ]); } - Utils.apiFetch('account/info', true).then(response => { + Utils.apiFetch("account/info", true).then(response => { if (!response.ok) { resolve([ false, response.status ]); return; @@ -46,4 +47,4 @@ export function updateUserInfo(): Promise<[boolean, integer]> { resolve([ false, 500 ]); }); }); -} \ No newline at end of file +} diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 95b5ca2faaf8..ba035cc72217 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,65 +1,60 @@ -import Phaser from 'phaser'; -import UI, { Mode } from './ui/ui'; -import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from './phases'; -import Pokemon, { PlayerPokemon, EnemyPokemon } from './field/pokemon'; -import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies, speciesStarters } from './data/pokemon-species'; -import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from './modifier/modifier'; -import { PokeballType } from './data/pokeball'; -import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; -import { Phase } from './phase'; -import { initGameSpeed } from './system/game-speed'; +import Phaser from "phaser"; +import UI from "./ui/ui"; +import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; +import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; +import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies } from "./data/pokemon-species"; +import * as Utils from "./utils"; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; +import { PokeballType } from "./data/pokeball"; +import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; +import { Phase } from "./phase"; +import { initGameSpeed } from "./system/game-speed"; import { Biome } from "./data/enums/biome"; -import { Arena, ArenaBase } from './field/arena'; -import { GameData, PlayerGender } from './system/game-data'; -import StarterSelectUiHandler from './ui/starter-select-ui-handler'; -import { TextStyle, addTextObject } from './ui/text'; +import { Arena, ArenaBase } from "./field/arena"; +import { GameData, PlayerGender } from "./system/game-data"; +import { TextStyle, addTextObject } from "./ui/text"; import { Moves } from "./data/enums/moves"; import { allMoves } from "./data/move"; -import { initMoves } from './data/move'; -import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from './modifier/modifier-type'; -import AbilityBar from './ui/ability-bar'; -import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, applyAbAttrs, initAbilities } from './data/ability'; -import { Abilities } from "./data/enums/abilities"; +import { initMoves } from "./data/move"; +import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from "./modifier/modifier-type"; +import AbilityBar from "./ui/ability-bar"; +import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, applyAbAttrs, initAbilities } from "./data/ability"; import { allAbilities } from "./data/ability"; -import Battle, { BattleType, FixedBattleConfig, fixedBattles } from './battle'; -import { GameMode, GameModes, gameModes } from './game-mode'; -import FieldSpritePipeline from './pipelines/field-sprite'; -import SpritePipeline from './pipelines/sprite'; -import PartyExpBar from './ui/party-exp-bar'; -import { TrainerSlot, trainerConfigs } from './data/trainer-config'; -import Trainer, { TrainerVariant } from './field/trainer'; -import TrainerData from './system/trainer-data'; -import SoundFade from 'phaser3-rex-plugins/plugins/soundfade'; -import { pokemonPrevolutions } from './data/pokemon-evolutions'; -import PokeballTray from './ui/pokeball-tray'; -import { Setting, settingOptions } from './system/settings'; -import SettingsUiHandler from './ui/settings-ui-handler'; -import MessageUiHandler from './ui/message-ui-handler'; -import { Species } from './data/enums/species'; -import InvertPostFX from './pipelines/invert'; -import { Achv, ModifierAchv, MoneyAchv, achvs } from './system/achv'; -import { Voucher, vouchers } from './system/voucher'; -import { Gender } from './data/gender'; -import UIPlugin from 'phaser3-rex-plugins/templates/ui/ui-plugin'; -import { addUiThemeOverrides } from './ui/ui-theme'; -import PokemonData from './system/pokemon-data'; -import { Nature } from './data/nature'; -import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from './data/pokemon-forms'; -import { FormChangePhase, QuietFormChangePhase } from './form-change-phase'; -import { BattleSpec } from './enums/battle-spec'; -import { getTypeRgb } from './data/type'; -import PokemonSpriteSparkleHandler from './field/pokemon-sprite-sparkle-handler'; -import CharSprite from './ui/char-sprite'; -import DamageNumberHandler from './field/damage-number-handler'; -import PokemonInfoContainer from './ui/pokemon-info-container'; -import { biomeDepths, getBiomeName } from './data/biomes'; -import { UiTheme } from './enums/ui-theme'; -import { SceneBase } from './scene-base'; -import CandyBar from './ui/candy-bar'; -import { Variant, variantData } from './data/variant'; -import { Localizable } from './plugins/i18n'; -import * as Overrides from './overrides'; +import Battle, { BattleType, FixedBattleConfig, fixedBattles } from "./battle"; +import { GameMode, GameModes, gameModes } from "./game-mode"; +import FieldSpritePipeline from "./pipelines/field-sprite"; +import SpritePipeline from "./pipelines/sprite"; +import PartyExpBar from "./ui/party-exp-bar"; +import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; +import Trainer, { TrainerVariant } from "./field/trainer"; +import TrainerData from "./system/trainer-data"; +import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import { pokemonPrevolutions } from "./data/pokemon-evolutions"; +import PokeballTray from "./ui/pokeball-tray"; +import { Species } from "./data/enums/species"; +import InvertPostFX from "./pipelines/invert"; +import { Achv, ModifierAchv, MoneyAchv, achvs } from "./system/achv"; +import { Voucher, vouchers } from "./system/voucher"; +import { Gender } from "./data/gender"; +import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; +import { addUiThemeOverrides } from "./ui/ui-theme"; +import PokemonData from "./system/pokemon-data"; +import { Nature } from "./data/nature"; +import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; +import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; +import { BattleSpec } from "./enums/battle-spec"; +import { getTypeRgb } from "./data/type"; +import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; +import CharSprite from "./ui/char-sprite"; +import DamageNumberHandler from "./field/damage-number-handler"; +import PokemonInfoContainer from "./ui/pokemon-info-container"; +import { biomeDepths, getBiomeName } from "./data/biomes"; +import { UiTheme } from "./enums/ui-theme"; +import { SceneBase } from "./scene-base"; +import CandyBar from "./ui/candy-bar"; +import { Variant, variantData } from "./data/variant"; +import { Localizable } from "./plugins/i18n"; +import * as Overrides from "./overrides"; import {InputsController} from "./inputs-controller"; import {UiInputs} from "./ui-inputs"; @@ -83,26 +78,26 @@ export interface PokeballCounts { export type AnySound = Phaser.Sound.WebAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.NoAudioSound; export default class BattleScene extends SceneBase { - public rexUI: UIPlugin; - public inputController: InputsController; - public uiInputs: UiInputs; - - public sessionPlayTime: integer = null; - public lastSavePlayTime: integer = null; - public masterVolume: number = 0.5; - public bgmVolume: number = 1; - public seVolume: number = 1; - public gameSpeed: integer = 1; - public damageNumbersMode: integer = 0; - public showLevelUpStats: boolean = true; - public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; - public enableRetries: boolean = false; - public uiTheme: UiTheme = UiTheme.DEFAULT; - public windowType: integer = 0; - public experimentalSprites: boolean = false; - public moveAnimations: boolean = true; - public expGainsSpeed: integer = 0; - /** + public rexUI: UIPlugin; + public inputController: InputsController; + public uiInputs: UiInputs; + + public sessionPlayTime: integer = null; + public lastSavePlayTime: integer = null; + public masterVolume: number = 0.5; + public bgmVolume: number = 1; + public seVolume: number = 1; + public gameSpeed: integer = 1; + public damageNumbersMode: integer = 0; + public showLevelUpStats: boolean = true; + public enableTutorials: boolean = import.meta.env.VITE_BYPASS_TUTORIAL === "1"; + public enableRetries: boolean = false; + public uiTheme: UiTheme = UiTheme.DEFAULT; + public windowType: integer = 0; + public experimentalSprites: boolean = false; + public moveAnimations: boolean = true; + public expGainsSpeed: integer = 0; + /** * Defines the experience gain display mode. * * @remarks @@ -114,429 +109,445 @@ export default class BattleScene extends SceneBase { * Modes `1` and `2` are still compatible with stats display, level up, new move, etc. * @default 0 - Uses the default normal experience gain display. */ - public expParty: integer = 0; - public hpBarSpeed: integer = 0; - public fusionPaletteSwaps: boolean = true; - public enableTouchControls: boolean = false; - public enableVibration: boolean = false; - public abSwapped: boolean = false; - - public disableMenu: boolean = false; - - public gameData: GameData; - public sessionSlotId: integer; - - private phaseQueue: Phase[]; - private phaseQueuePrepend: Phase[]; - private phaseQueuePrependSpliceIndex: integer; - private nextCommandPhaseQueue: Phase[]; - private currentPhase: Phase; - private standbyPhase: Phase; - public field: Phaser.GameObjects.Container; - public fieldUI: Phaser.GameObjects.Container; - public charSprite: CharSprite; - public pbTray: PokeballTray; - public pbTrayEnemy: PokeballTray; - public abilityBar: AbilityBar; - public partyExpBar: PartyExpBar; - public candyBar: CandyBar; - public arenaBg: Phaser.GameObjects.Sprite; - public arenaBgTransition: Phaser.GameObjects.Sprite; - public arenaPlayer: ArenaBase; - public arenaPlayerTransition: ArenaBase; - public arenaEnemy: ArenaBase; - public arenaNextEnemy: ArenaBase; - public arena: Arena; - public gameMode: GameMode; - public score: integer; - public lockModifierTiers: boolean; - public trainer: Phaser.GameObjects.Sprite; - public lastEnemyTrainer: Trainer; - public currentBattle: Battle; - public pokeballCounts: PokeballCounts; - public money: integer; - public pokemonInfoContainer: PokemonInfoContainer; - private party: PlayerPokemon[]; - private waveCountText: Phaser.GameObjects.Text; - private moneyText: Phaser.GameObjects.Text; - private scoreText: Phaser.GameObjects.Text; - private luckLabelText: Phaser.GameObjects.Text; - private luckText: Phaser.GameObjects.Text; - private modifierBar: ModifierBar; - private enemyModifierBar: ModifierBar; - private fieldOverlay: Phaser.GameObjects.Rectangle; - private modifiers: PersistentModifier[]; - private enemyModifiers: PersistentModifier[]; - public uiContainer: Phaser.GameObjects.Container; - public ui: UI; - - public seed: string; - public waveSeed: string; - public waveCycleOffset: integer; - public offsetGym: boolean; - - public damageNumberHandler: DamageNumberHandler - private spriteSparkleHandler: PokemonSpriteSparkleHandler; - - public fieldSpritePipeline: FieldSpritePipeline; - public spritePipeline: SpritePipeline; - - private bgm: AnySound; - private bgmResumeTimer: Phaser.Time.TimerEvent; - private bgmCache: Set = new Set(); - private playTimeTimer: Phaser.Time.TimerEvent; - - public rngCounter: integer = 0; - public rngSeedOverride: string = ''; - public rngOffset: integer = 0; - - constructor() { - super('battle'); - - initSpecies(); - initMoves(); - initAbilities(); + public expParty: integer = 0; + public hpBarSpeed: integer = 0; + public fusionPaletteSwaps: boolean = true; + public enableTouchControls: boolean = false; + public enableVibration: boolean = false; + public abSwapped: boolean = false; + + public disableMenu: boolean = false; + + public gameData: GameData; + public sessionSlotId: integer; + + private phaseQueue: Phase[]; + private phaseQueuePrepend: Phase[]; + private phaseQueuePrependSpliceIndex: integer; + private nextCommandPhaseQueue: Phase[]; + private currentPhase: Phase; + private standbyPhase: Phase; + public field: Phaser.GameObjects.Container; + public fieldUI: Phaser.GameObjects.Container; + public charSprite: CharSprite; + public pbTray: PokeballTray; + public pbTrayEnemy: PokeballTray; + public abilityBar: AbilityBar; + public partyExpBar: PartyExpBar; + public candyBar: CandyBar; + public arenaBg: Phaser.GameObjects.Sprite; + public arenaBgTransition: Phaser.GameObjects.Sprite; + public arenaPlayer: ArenaBase; + public arenaPlayerTransition: ArenaBase; + public arenaEnemy: ArenaBase; + public arenaNextEnemy: ArenaBase; + public arena: Arena; + public gameMode: GameMode; + public score: integer; + public lockModifierTiers: boolean; + public trainer: Phaser.GameObjects.Sprite; + public lastEnemyTrainer: Trainer; + public currentBattle: Battle; + public pokeballCounts: PokeballCounts; + public money: integer; + public pokemonInfoContainer: PokemonInfoContainer; + private party: PlayerPokemon[]; + private waveCountText: Phaser.GameObjects.Text; + private moneyText: Phaser.GameObjects.Text; + private scoreText: Phaser.GameObjects.Text; + private luckLabelText: Phaser.GameObjects.Text; + private luckText: Phaser.GameObjects.Text; + private modifierBar: ModifierBar; + private enemyModifierBar: ModifierBar; + private fieldOverlay: Phaser.GameObjects.Rectangle; + private modifiers: PersistentModifier[]; + private enemyModifiers: PersistentModifier[]; + public uiContainer: Phaser.GameObjects.Container; + public ui: UI; + + public seed: string; + public waveSeed: string; + public waveCycleOffset: integer; + public offsetGym: boolean; + + public damageNumberHandler: DamageNumberHandler; + private spriteSparkleHandler: PokemonSpriteSparkleHandler; + + public fieldSpritePipeline: FieldSpritePipeline; + public spritePipeline: SpritePipeline; + + private bgm: AnySound; + private bgmResumeTimer: Phaser.Time.TimerEvent; + private bgmCache: Set = new Set(); + private playTimeTimer: Phaser.Time.TimerEvent; + + public rngCounter: integer = 0; + public rngSeedOverride: string = ""; + public rngOffset: integer = 0; + + constructor() { + super("battle"); + + initSpecies(); + initMoves(); + initAbilities(); - this.phaseQueue = []; - this.phaseQueuePrepend = []; - this.phaseQueuePrependSpliceIndex = -1; - this.nextCommandPhaseQueue = []; - this.updateGameInfo(); - } - - loadPokemonAtlas(key: string, atlasPath: string, experimental?: boolean) { - if (experimental === undefined) - experimental = this.experimentalSprites; - let variant = atlasPath.includes('variant/') || /_[0-3]$/.test(atlasPath); - if (experimental) - experimental = this.hasExpSprite(key); - if (variant) - atlasPath = atlasPath.replace('variant/', ''); - this.load.atlas(key, `images/pokemon/${variant ? 'variant/' : ''}${experimental ? 'exp/' : ''}${atlasPath}.png`, `images/pokemon/${variant ? 'variant/' : ''}${experimental ? 'exp/' : ''}${atlasPath}.json`); - } - - async preload() { - if (DEBUG_RNG) { - const scene = this; - const originalRealInRange = Phaser.Math.RND.realInRange; - Phaser.Math.RND.realInRange = function (min: number, max: number): number { - const ret = originalRealInRange.apply(this, [ min, max ]); - const args = [ 'RNG', ++scene.rngCounter, ret / (max - min), `min: ${min} / max: ${max}` ]; - args.push(`seed: ${scene.rngSeedOverride || scene.waveSeed || scene.seed}`); - if (scene.rngOffset) - args.push(`offset: ${scene.rngOffset}`); - console.log(...args); - return ret; - }; - } - - populateAnims(); - - await this.initVariantData(); - } - - create() { - initGameSpeed.apply(this); - this.inputController = new InputsController(this); - this.uiInputs = new UiInputs(this, this.inputController); - - this.gameData = new GameData(this); - - addUiThemeOverrides(this); - - this.load.setBaseURL(); - - this.spritePipeline = new SpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add('Sprite', this.spritePipeline); - - this.fieldSpritePipeline = new FieldSpritePipeline(this.game); - (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add('FieldSprite', this.fieldSpritePipeline); - - this.time.delayedCall(20, () => this.launchBattle()); - } - - update() { - this.inputController.update(); - this.ui?.update(); - } - - launchBattle() { - this.arenaBg = this.add.sprite(0, 0, 'plains_bg'); - this.arenaBgTransition = this.add.sprite(0, 0, 'plains_bg'); - - [ this.arenaBgTransition, this.arenaBg ].forEach(a => { - a.setPipeline(this.fieldSpritePipeline); - a.setScale(6); - a.setOrigin(0); - a.setSize(320, 240); - }); - - const field = this.add.container(0, 0); - field.setScale(6); - - this.field = field; - - const fieldUI = this.add.container(0, this.game.canvas.height); - fieldUI.setDepth(1); - fieldUI.setScale(6); - - this.fieldUI = fieldUI; - - const transition = this.make.rexTransitionImagePack({ - x: 0, - y: 0, - scale: 6, - key: 'loading_bg', - origin: { x: 0, y: 0 } - }, true); + this.phaseQueue = []; + this.phaseQueuePrepend = []; + this.phaseQueuePrependSpliceIndex = -1; + this.nextCommandPhaseQueue = []; + this.updateGameInfo(); + } + + loadPokemonAtlas(key: string, atlasPath: string, experimental?: boolean) { + if (experimental === undefined) { + experimental = this.experimentalSprites; + } + const variant = atlasPath.includes("variant/") || /_[0-3]$/.test(atlasPath); + if (experimental) { + experimental = this.hasExpSprite(key); + } + if (variant) { + atlasPath = atlasPath.replace("variant/", ""); + } + this.load.atlas(key, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`); + } + + async preload() { + if (DEBUG_RNG) { + const scene = this; + const originalRealInRange = Phaser.Math.RND.realInRange; + Phaser.Math.RND.realInRange = function (min: number, max: number): number { + const ret = originalRealInRange.apply(this, [ min, max ]); + const args = [ "RNG", ++scene.rngCounter, ret / (max - min), `min: ${min} / max: ${max}` ]; + args.push(`seed: ${scene.rngSeedOverride || scene.waveSeed || scene.seed}`); + if (scene.rngOffset) { + args.push(`offset: ${scene.rngOffset}`); + } + console.log(...args); + return ret; + }; + } + + populateAnims(); + + await this.initVariantData(); + } + + create() { + initGameSpeed.apply(this); + this.inputController = new InputsController(this); + this.uiInputs = new UiInputs(this, this.inputController); + + this.gameData = new GameData(this); + + addUiThemeOverrides(this); + + this.load.setBaseURL(); + + this.spritePipeline = new SpritePipeline(this.game); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("Sprite", this.spritePipeline); + + this.fieldSpritePipeline = new FieldSpritePipeline(this.game); + (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); + + this.time.delayedCall(20, () => this.launchBattle()); + } + + update() { + this.inputController.update(); + this.ui?.update(); + } + + launchBattle() { + this.arenaBg = this.add.sprite(0, 0, "plains_bg"); + this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); + + [ this.arenaBgTransition, this.arenaBg ].forEach(a => { + a.setPipeline(this.fieldSpritePipeline); + a.setScale(6); + a.setOrigin(0); + a.setSize(320, 240); + }); + + const field = this.add.container(0, 0); + field.setScale(6); + + this.field = field; + + const fieldUI = this.add.container(0, this.game.canvas.height); + fieldUI.setDepth(1); + fieldUI.setScale(6); + + this.fieldUI = fieldUI; + + const transition = this.make.rexTransitionImagePack({ + x: 0, + y: 0, + scale: 6, + key: "loading_bg", + origin: { x: 0, y: 0 } + }, true); + + transition.transit({ + mode: "blinds", + ease: "Cubic.easeInOut", + duration: 1250, + oncomplete: () => transition.destroy() + }); - transition.transit({ - mode: 'blinds', - ease: 'Cubic.easeInOut', - duration: 1250, - oncomplete: () => transition.destroy() - }); + this.add.existing(transition); - this.add.existing(transition); + const uiContainer = this.add.container(0, 0); + uiContainer.setDepth(2); + uiContainer.setScale(6); - const uiContainer = this.add.container(0, 0); - uiContainer.setDepth(2); - uiContainer.setScale(6); + this.uiContainer = uiContainer; - this.uiContainer = uiContainer; + const overlayWidth = this.game.canvas.width / 6; + const overlayHeight = (this.game.canvas.height / 6) - 48; + this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); + this.fieldOverlay.setOrigin(0, 0); + this.fieldOverlay.setAlpha(0); + this.fieldUI.add(this.fieldOverlay); - const overlayWidth = this.game.canvas.width / 6; - const overlayHeight = (this.game.canvas.height / 6) - 48; - this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); - this.fieldOverlay.setOrigin(0, 0); - this.fieldOverlay.setAlpha(0); - this.fieldUI.add(this.fieldOverlay); + this.modifiers = []; + this.enemyModifiers = []; - this.modifiers = []; - this.enemyModifiers = []; + this.modifierBar = new ModifierBar(this); + this.add.existing(this.modifierBar); + uiContainer.add(this.modifierBar); - this.modifierBar = new ModifierBar(this); - this.add.existing(this.modifierBar); - uiContainer.add(this.modifierBar); + this.enemyModifierBar = new ModifierBar(this, true); + this.add.existing(this.enemyModifierBar); + uiContainer.add(this.enemyModifierBar); - this.enemyModifierBar = new ModifierBar(this, true); - this.add.existing(this.enemyModifierBar); - uiContainer.add(this.enemyModifierBar); + this.charSprite = new CharSprite(this); + this.charSprite.setup(); - this.charSprite = new CharSprite(this); - this.charSprite.setup(); + this.fieldUI.add(this.charSprite); - this.fieldUI.add(this.charSprite); + this.pbTray = new PokeballTray(this, true); + this.pbTray.setup(); - this.pbTray = new PokeballTray(this, true); - this.pbTray.setup(); + this.pbTrayEnemy = new PokeballTray(this, false); + this.pbTrayEnemy.setup(); - this.pbTrayEnemy = new PokeballTray(this, false); - this.pbTrayEnemy.setup(); + this.fieldUI.add(this.pbTray); + this.fieldUI.add(this.pbTrayEnemy); - this.fieldUI.add(this.pbTray); - this.fieldUI.add(this.pbTrayEnemy); + this.abilityBar = new AbilityBar(this); + this.abilityBar.setup(); + this.fieldUI.add(this.abilityBar); - this.abilityBar = new AbilityBar(this); - this.abilityBar.setup(); - this.fieldUI.add(this.abilityBar); + this.partyExpBar = new PartyExpBar(this); + this.partyExpBar.setup(); + this.fieldUI.add(this.partyExpBar); - this.partyExpBar = new PartyExpBar(this); - this.partyExpBar.setup(); - this.fieldUI.add(this.partyExpBar); + this.candyBar = new CandyBar(this); + this.candyBar.setup(); + this.fieldUI.add(this.candyBar); - this.candyBar = new CandyBar(this); - this.candyBar.setup(); - this.fieldUI.add(this.candyBar); + this.waveCountText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); + this.waveCountText.setOrigin(1, 0); + this.fieldUI.add(this.waveCountText); - this.waveCountText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); - this.waveCountText.setOrigin(1, 0); - this.fieldUI.add(this.waveCountText); + this.moneyText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.MONEY); + this.moneyText.setOrigin(1, 0); + this.fieldUI.add(this.moneyText); - this.moneyText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, '', TextStyle.MONEY); - this.moneyText.setOrigin(1, 0); - this.fieldUI.add(this.moneyText); + this.scoreText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.scoreText.setOrigin(1, 0); + this.fieldUI.add(this.scoreText); - this.scoreText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, '', TextStyle.PARTY, { fontSize: '54px' }); - this.scoreText.setOrigin(1, 0); - this.fieldUI.add(this.scoreText); + this.luckText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.luckText.setOrigin(1, 0); + this.luckText.setVisible(false); + this.fieldUI.add(this.luckText); - this.luckText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, '', TextStyle.PARTY, { fontSize: '54px' }); - this.luckText.setOrigin(1, 0); - this.luckText.setVisible(false); - this.fieldUI.add(this.luckText); + this.luckLabelText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "Luck:", TextStyle.PARTY, { fontSize: "54px" }); + this.luckLabelText.setOrigin(1, 0); + this.luckLabelText.setVisible(false); + this.fieldUI.add(this.luckLabelText); - this.luckLabelText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, 'Luck:', TextStyle.PARTY, { fontSize: '54px' }); - this.luckLabelText.setOrigin(1, 0); - this.luckLabelText.setVisible(false); - this.fieldUI.add(this.luckLabelText); + this.updateUIPositions(); - this.updateUIPositions(); + this.damageNumberHandler = new DamageNumberHandler(); - this.damageNumberHandler = new DamageNumberHandler(); + this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); + this.spriteSparkleHandler.setup(this); - this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); - this.spriteSparkleHandler.setup(this); + this.pokemonInfoContainer = new PokemonInfoContainer(this, (this.game.canvas.width / 6) + 52, -(this.game.canvas.height / 6) + 66); + this.pokemonInfoContainer.setup(); - this.pokemonInfoContainer = new PokemonInfoContainer(this, (this.game.canvas.width / 6) + 52, -(this.game.canvas.height / 6) + 66); - this.pokemonInfoContainer.setup(); + this.fieldUI.add(this.pokemonInfoContainer); - this.fieldUI.add(this.pokemonInfoContainer); + this.party = []; - this.party = []; + const loadPokemonAssets = []; - let loadPokemonAssets = []; + this.arenaPlayer = new ArenaBase(this, true); + this.arenaPlayerTransition = new ArenaBase(this, true); + this.arenaEnemy = new ArenaBase(this, false); + this.arenaNextEnemy = new ArenaBase(this, false); - this.arenaPlayer = new ArenaBase(this, true); - this.arenaPlayerTransition = new ArenaBase(this, true); - this.arenaEnemy = new ArenaBase(this, false); - this.arenaNextEnemy = new ArenaBase(this, false); + this.arenaBgTransition.setVisible(false); + this.arenaPlayerTransition.setVisible(false); + this.arenaNextEnemy.setVisible(false); - this.arenaBgTransition.setVisible(false); - this.arenaPlayerTransition.setVisible(false); - this.arenaNextEnemy.setVisible(false); + [ this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy ].forEach(a => { + if (a instanceof Phaser.GameObjects.Sprite) { + a.setOrigin(0, 0); + } + field.add(a); + }); - [ this.arenaPlayer, this.arenaPlayerTransition, this.arenaEnemy, this.arenaNextEnemy ].forEach(a => { - if (a instanceof Phaser.GameObjects.Sprite) - a.setOrigin(0, 0); - field.add(a); - }); + const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + trainer.setOrigin(0.5, 1); - const trainer = this.addFieldSprite(0, 0, `trainer_${this.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back`); - trainer.setOrigin(0.5, 1); + field.add(trainer); - field.add(trainer); + this.trainer = trainer; - this.trainer = trainer; + this.anims.create({ + key: "prompt", + frames: this.anims.generateFrameNumbers("prompt", { start: 1, end: 4 }), + frameRate: 6, + repeat: -1, + showOnStart: true + }); - this.anims.create({ - key: 'prompt', - frames: this.anims.generateFrameNumbers('prompt', { start: 1, end: 4 }), - frameRate: 6, - repeat: -1, - showOnStart: true - }); + this.anims.create({ + key: "tera_sparkle", + frames: this.anims.generateFrameNumbers("tera_sparkle", { start: 0, end: 12 }), + frameRate: 18, + repeat: 0, + showOnStart: true, + hideOnComplete: true + }); - this.anims.create({ - key: 'tera_sparkle', - frames: this.anims.generateFrameNumbers('tera_sparkle', { start: 0, end: 12 }), - frameRate: 18, - repeat: 0, - showOnStart: true, - hideOnComplete: true - }); + this.reset(false, false, true); - this.reset(false, false, true); + const ui = new UI(this); + this.uiContainer.add(ui); - const ui = new UI(this); - this.uiContainer.add(ui); + this.ui = ui; - this.ui = ui; + ui.setup(); - ui.setup(); + const defaultMoves = [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ]; - const defaultMoves = [ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ]; + Promise.all([ + Promise.all(loadPokemonAssets), + initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), + Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), + this.initStarterColors() + ]).then(() => { + this.pushPhase(new LoginPhase(this)); + this.pushPhase(new TitlePhase(this)); - Promise.all([ - Promise.all(loadPokemonAssets), - initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), - Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), - this.initStarterColors() - ]).then(() => { - this.pushPhase(new LoginPhase(this)); - this.pushPhase(new TitlePhase(this)); + this.shiftPhase(); + }); + } - this.shiftPhase(); - }); - } + initSession(): void { + if (this.sessionPlayTime === null) { + this.sessionPlayTime = 0; + } + if (this.lastSavePlayTime === null) { + this.lastSavePlayTime = 0; + } - initSession(): void { - if (this.sessionPlayTime === null) - this.sessionPlayTime = 0; - if (this.lastSavePlayTime === null) - this.lastSavePlayTime = 0; + if (this.playTimeTimer) { + this.playTimeTimer.destroy(); + } - if (this.playTimeTimer) - this.playTimeTimer.destroy(); - - this.playTimeTimer = this.time.addEvent({ - delay: Utils.fixedInt(1000), - repeat: -1, + this.playTimeTimer = this.time.addEvent({ + delay: Utils.fixedInt(1000), + repeat: -1, callback: () => { - if (this.gameData) - this.gameData.gameStats.playTime++; - if (this.sessionPlayTime !== null) - this.sessionPlayTime++; - if (this.lastSavePlayTime !== null) - this.lastSavePlayTime++; - } - }); - - this.updateWaveCountText(); - this.updateMoneyText(); - this.updateScoreText(); - } - - async initExpSprites(): Promise { - if (expSpriteKeys.length) - return; - this.cachedFetch('./exp-sprites.json').then(res => res.json()).then(keys => { - if (Array.isArray(keys)) - expSpriteKeys.push(...keys); - Promise.resolve(); - }); - } - - async initVariantData(): Promise { - Object.keys(variantData).forEach(key => delete variantData[key]); - await this.cachedFetch('./images/pokemon/variant/_masterlist.json').then(res => res.json()) - .then(v => { - Object.keys(v).forEach(k => variantData[k] = v[k]); - if (this.experimentalSprites) { - const expVariantData = variantData['exp']; - const traverseVariantData = (keys: string[]) => { - let variantTree = variantData; - let expTree = expVariantData; - keys.map((k: string, i: integer) => { - if (i < keys.length - 1) { - variantTree = variantTree[k]; - expTree = expTree[k]; - } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { - if ([ 'back', 'female' ].includes(k)) - traverseVariantData(keys.concat(k)); - else - variantTree[k] = expTree[k]; - } - }); - }; - Object.keys(expVariantData).forEach(ek => traverseVariantData([ ek ])); - } - Promise.resolve(); - }); - } - - cachedFetch(url: string, init?: RequestInit): Promise { - const manifest = this.game['manifest']; - if (manifest) { - const timestamp = manifest[`/${url.replace('./', '')}`]; - if (timestamp) - url += `?t=${timestamp}`; - } - return fetch(url, init); - } - - initStarterColors(): Promise { - return new Promise(resolve => { - if (starterColors) - return resolve(); - - this.cachedFetch('./starter-colors.json').then(res => res.json()).then(sc => { - starterColors = {}; - Object.keys(sc).forEach(key => { - starterColors[key] = sc[key]; - }); - - /*const loadPokemonAssets: Promise[] = []; + if (this.gameData) { + this.gameData.gameStats.playTime++; + } + if (this.sessionPlayTime !== null) { + this.sessionPlayTime++; + } + if (this.lastSavePlayTime !== null) { + this.lastSavePlayTime++; + } + } + }); + + this.updateWaveCountText(); + this.updateMoneyText(); + this.updateScoreText(); + } + + async initExpSprites(): Promise { + if (expSpriteKeys.length) { + return; + } + this.cachedFetch("./exp-sprites.json").then(res => res.json()).then(keys => { + if (Array.isArray(keys)) { + expSpriteKeys.push(...keys); + } + Promise.resolve(); + }); + } + + async initVariantData(): Promise { + Object.keys(variantData).forEach(key => delete variantData[key]); + await this.cachedFetch("./images/pokemon/variant/_masterlist.json").then(res => res.json()) + .then(v => { + Object.keys(v).forEach(k => variantData[k] = v[k]); + if (this.experimentalSprites) { + const expVariantData = variantData["exp"]; + const traverseVariantData = (keys: string[]) => { + let variantTree = variantData; + let expTree = expVariantData; + keys.map((k: string, i: integer) => { + if (i < keys.length - 1) { + variantTree = variantTree[k]; + expTree = expTree[k]; + } else if (variantTree.hasOwnProperty(k) && expTree.hasOwnProperty(k)) { + if ([ "back", "female" ].includes(k)) { + traverseVariantData(keys.concat(k)); + } else { + variantTree[k] = expTree[k]; + } + } + }); + }; + Object.keys(expVariantData).forEach(ek => traverseVariantData([ ek ])); + } + Promise.resolve(); + }); + } + + cachedFetch(url: string, init?: RequestInit): Promise { + const manifest = this.game["manifest"]; + if (manifest) { + const timestamp = manifest[`/${url.replace("./", "")}`]; + if (timestamp) { + url += `?t=${timestamp}`; + } + } + return fetch(url, init); + } + + initStarterColors(): Promise { + return new Promise(resolve => { + if (starterColors) { + return resolve(); + } + + this.cachedFetch("./starter-colors.json").then(res => res.json()).then(sc => { + starterColors = {}; + Object.keys(sc).forEach(key => { + starterColors[key] = sc[key]; + }); + + /*const loadPokemonAssets: Promise[] = []; for (let s of Object.keys(speciesStarters)) { const species = getPokemonSpecies(parseInt(s)); @@ -558,1448 +569,1557 @@ export default class BattleScene extends SceneBase { resolve(); });*/ - resolve(); - }); - }); - } - - hasExpSprite(key: string): boolean { - const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); - let k = keyMatch[4]; - if (keyMatch[2]) - k += 's'; - if (keyMatch[1]) - k += 'b'; - if (keyMatch[3]) - k += 'f'; - if (keyMatch[5]) - k += keyMatch[5]; - if (!expSpriteKeys.includes(k)) - return false; - return true; - } - - getParty(): PlayerPokemon[] { - return this.party; - } - - getPlayerPokemon(): PlayerPokemon { - return this.getPlayerField().find(p => p.isActive()); - } - - getPlayerField(): PlayerPokemon[] { - const party = this.getParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); - } - - getEnemyParty(): EnemyPokemon[] { - return this.currentBattle?.enemyParty || []; - } - - getEnemyPokemon(): EnemyPokemon { - return this.getEnemyField().find(p => p.isActive()); - } - - getEnemyField(): EnemyPokemon[] { - const party = this.getEnemyParty(); - return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); - } - - getField(activeOnly: boolean = false): Pokemon[] { - const ret = new Array(4).fill(null); - const playerField = this.getPlayerField(); - const enemyField = this.getEnemyField(); - ret.splice(0, playerField.length, ...playerField); - ret.splice(2, enemyField.length, ...enemyField); - return activeOnly - ? ret.filter(p => p?.isActive()) - : ret; - } - - getPokemonById(pokemonId: integer): Pokemon { - const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); - return findInParty(this.getParty()) || findInParty(this.getEnemyParty()); - } - - addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { - const pokemon = new PlayerPokemon(this, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); - if (postProcess) - postProcess(pokemon); - pokemon.init(); - return pokemon; - } - - addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { - if (Overrides.OPP_SPECIES_OVERRIDE) - species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); - const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); - overrideModifiers(this, false); - overrideHeldItems(this, pokemon, false); - if (boss && !dataSource) { - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); - - for (let s = 0; s < pokemon.ivs.length; s++) - pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); - } - if (postProcess) - postProcess(pokemon); - pokemon.init(); - return pokemon; - } - - addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { - const container = this.add.container(x, y); + resolve(); + }); + }); + } + + hasExpSprite(key: string): boolean { + const keyMatch = /^pkmn__?(back__)?(shiny__)?(female__)?(\d+)(\-.*?)?(?:_[1-3])?$/g.exec(key); + let k = keyMatch[4]; + if (keyMatch[2]) { + k += "s"; + } + if (keyMatch[1]) { + k += "b"; + } + if (keyMatch[3]) { + k += "f"; + } + if (keyMatch[5]) { + k += keyMatch[5]; + } + if (!expSpriteKeys.includes(k)) { + return false; + } + return true; + } + + getParty(): PlayerPokemon[] { + return this.party; + } + + getPlayerPokemon(): PlayerPokemon { + return this.getPlayerField().find(p => p.isActive()); + } + + getPlayerField(): PlayerPokemon[] { + const party = this.getParty(); + return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + } + + getEnemyParty(): EnemyPokemon[] { + return this.currentBattle?.enemyParty || []; + } + + getEnemyPokemon(): EnemyPokemon { + return this.getEnemyField().find(p => p.isActive()); + } + + getEnemyField(): EnemyPokemon[] { + const party = this.getEnemyParty(); + return party.slice(0, Math.min(party.length, this.currentBattle?.double ? 2 : 1)); + } + + getField(activeOnly: boolean = false): Pokemon[] { + const ret = new Array(4).fill(null); + const playerField = this.getPlayerField(); + const enemyField = this.getEnemyField(); + ret.splice(0, playerField.length, ...playerField); + ret.splice(2, enemyField.length, ...enemyField); + return activeOnly + ? ret.filter(p => p?.isActive()) + : ret; + } + + getPokemonById(pokemonId: integer): Pokemon { + const findInParty = (party: Pokemon[]) => party.find(p => p.id === pokemonId); + return findInParty(this.getParty()) || findInParty(this.getEnemyParty()); + } + + addPlayerPokemon(species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData, postProcess?: (playerPokemon: PlayerPokemon) => void): PlayerPokemon { + const pokemon = new PlayerPokemon(this, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); + if (postProcess) { + postProcess(pokemon); + } + pokemon.init(); + return pokemon; + } + + addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { + if (Overrides.OPP_SPECIES_OVERRIDE) { + species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE); + } + const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + overrideModifiers(this, false); + overrideHeldItems(this, pokemon, false); + if (boss && !dataSource) { + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + + for (let s = 0; s < pokemon.ivs.length; s++) { + pokemon.ivs[s] = Math.round(Phaser.Math.Linear(Math.min(pokemon.ivs[s], secondaryIvs[s]), Math.max(pokemon.ivs[s], secondaryIvs[s]), 0.75)); + } + } + if (postProcess) { + postProcess(pokemon); + } + pokemon.init(); + return pokemon; + } + + addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { + const container = this.add.container(x, y); - const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); + const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); icon.setFrame(pokemon.getIconId(true)); - // Temporary fix to show pokemon's default icon if variant icon doesn't exist - if (icon.frame.name != pokemon.getIconId(true)) { - console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`) - const temp = pokemon.shiny; - pokemon.shiny = false; - icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride)); - icon.setFrame(pokemon.getIconId(true)); - pokemon.shiny = temp; - } - icon.setOrigin(0.5, 0); - - container.add(icon); - - if (pokemon.isFusion()) { - const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); - fusionIcon.setOrigin(0.5, 0) - fusionIcon.setFrame(pokemon.getFusionIconId(true)); - - const originalWidth = icon.width; - const originalHeight = icon.height; - const originalFrame = icon.frame; - - const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); + // Temporary fix to show pokemon's default icon if variant icon doesn't exist + if (icon.frame.name !== pokemon.getIconId(true)) { + console.log(`${pokemon.name}'s variant icon does not exist. Replacing with default.`); + const temp = pokemon.shiny; + pokemon.shiny = false; + icon.setTexture(pokemon.getIconAtlasKey(ignoreOverride)); + icon.setFrame(pokemon.getIconId(true)); + pokemon.shiny = temp; + } + icon.setOrigin(0.5, 0); + + container.add(icon); + + if (pokemon.isFusion()) { + const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + fusionIcon.setOrigin(0.5, 0); + fusionIcon.setFrame(pokemon.getFusionIconId(true)); + + const originalWidth = icon.width; + const originalHeight = icon.height; + const originalFrame = icon.frame; + + const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); - // Inefficient, but for some reason didn't work with only the unique properties as part of the name - const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; - - if (!icon.frame.texture.has(iconFrameId)) - icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight); - - icon.setFrame(iconFrameId); - - fusionIcon.y = icon.frame.cutHeight; - - const originalFusionFrame = fusionIcon.frame; - - const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight; - const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight; - - // Inefficient, but for some reason didn't work with only the unique properties as part of the name - const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; - - if (!fusionIcon.frame.texture.has(fusionIconFrameId)) - fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight); - fusionIcon.setFrame(fusionIconFrameId); - - const frameY = (originalFrame.y + originalFusionFrame.y) / 2; - icon.frame.y = fusionIcon.frame.y = frameY; - - container.add(fusionIcon); - - if (originX !== 0.5) - container.x -= originalWidth * (originX - 0.5); - if (originY !== 0) - container.y -= (originalHeight) * originY; - } else { - if (originX !== 0.5) - container.x -= icon.width * (originX - 0.5); - if (originY !== 0) - container.y -= icon.height * originY; - } - - return container; - } - - setSeed(seed: string): void { - this.seed = seed; - this.rngCounter = 0; - this.waveCycleOffset = this.getGeneratedWaveCycleOffset(); - this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym(); - } - - randBattleSeedInt(range: integer, min: integer = 0): integer { - return this.currentBattle.randSeedInt(this, range, min); - } - - reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { - if (clearData) - this.gameData = new GameData(this); - - this.gameMode = gameModes[GameModes.CLASSIC]; + // Inefficient, but for some reason didn't work with only the unique properties as part of the name + const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; + + if (!icon.frame.texture.has(iconFrameId)) { + icon.frame.texture.add(iconFrameId, icon.frame.sourceIndex, icon.frame.cutX, icon.frame.cutY, icon.frame.cutWidth, iconHeight); + } + + icon.setFrame(iconFrameId); + + fusionIcon.y = icon.frame.cutHeight; + + const originalFusionFrame = fusionIcon.frame; + + const fusionIconY = fusionIcon.frame.cutY + icon.frame.cutHeight; + const fusionIconHeight = fusionIcon.frame.cutHeight - icon.frame.cutHeight; + + // Inefficient, but for some reason didn't work with only the unique properties as part of the name + const fusionIconFrameId = `${fusionIcon.frame.name}f${icon.frame.name}`; + + if (!fusionIcon.frame.texture.has(fusionIconFrameId)) { + fusionIcon.frame.texture.add(fusionIconFrameId, fusionIcon.frame.sourceIndex, fusionIcon.frame.cutX, fusionIconY, fusionIcon.frame.cutWidth, fusionIconHeight); + } + fusionIcon.setFrame(fusionIconFrameId); + + const frameY = (originalFrame.y + originalFusionFrame.y) / 2; + icon.frame.y = fusionIcon.frame.y = frameY; + + container.add(fusionIcon); + + if (originX !== 0.5) { + container.x -= originalWidth * (originX - 0.5); + } + if (originY !== 0) { + container.y -= (originalHeight) * originY; + } + } else { + if (originX !== 0.5) { + container.x -= icon.width * (originX - 0.5); + } + if (originY !== 0) { + container.y -= icon.height * originY; + } + } + + return container; + } + + setSeed(seed: string): void { + this.seed = seed; + this.rngCounter = 0; + this.waveCycleOffset = this.getGeneratedWaveCycleOffset(); + this.offsetGym = this.gameMode.isClassic && this.getGeneratedOffsetGym(); + } + + randBattleSeedInt(range: integer, min: integer = 0): integer { + return this.currentBattle.randSeedInt(this, range, min); + } + + reset(clearScene: boolean = false, clearData: boolean = false, reloadI18n: boolean = false): void { + if (clearData) { + this.gameData = new GameData(this); + } + + this.gameMode = gameModes[GameModes.CLASSIC]; - this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24)); - console.log('Seed:', this.seed); - - this.disableMenu = false; - - this.score = 0; - this.money = 0; - - this.lockModifierTiers = false; - - this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); - this.pokeballCounts[PokeballType.POKEBALL] += 5; - if (Overrides.POKEBALL_OVERRIDE.active) { - this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; - } - - this.modifiers = []; - this.enemyModifiers = []; - this.modifierBar.removeAll(true); - this.enemyModifierBar.removeAll(true); - - for (let p of this.getParty()) - p.destroy(); - this.party = []; - for (let p of this.getEnemyParty()) - p.destroy(); + this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24)); + console.log("Seed:", this.seed); + + this.disableMenu = false; + + this.score = 0; + this.money = 0; + + this.lockModifierTiers = false; + + this.pokeballCounts = Object.fromEntries(Utils.getEnumValues(PokeballType).filter(p => p <= PokeballType.MASTER_BALL).map(t => [ t, 0 ])); + this.pokeballCounts[PokeballType.POKEBALL] += 5; + if (Overrides.POKEBALL_OVERRIDE.active) { + this.pokeballCounts = Overrides.POKEBALL_OVERRIDE.pokeballs; + } + + this.modifiers = []; + this.enemyModifiers = []; + this.modifierBar.removeAll(true); + this.enemyModifierBar.removeAll(true); + + for (const p of this.getParty()) { + p.destroy(); + } + this.party = []; + for (const p of this.getEnemyParty()) { + p.destroy(); + } - this.currentBattle = null; + this.currentBattle = null; - this.waveCountText.setText(startingWave.toString()); - this.waveCountText.setVisible(false); + this.waveCountText.setText(startingWave.toString()); + this.waveCountText.setVisible(false); - this.updateMoneyText(); - this.moneyText.setVisible(false); + this.updateMoneyText(); + this.moneyText.setVisible(false); - this.updateScoreText(); - this.scoreText.setVisible(false); + this.updateScoreText(); + this.scoreText.setVisible(false); - [ this.luckLabelText, this.luckText ].map(t => t.setVisible(false)); + [ this.luckLabelText, this.luckText ].map(t => t.setVisible(false)); - this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); + this.newArena(Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN); - this.field.setVisible(true); + this.field.setVisible(true); - this.arenaBgTransition.setPosition(0, 0); - this.arenaPlayer.setPosition(300, 0); - this.arenaPlayerTransition.setPosition(0, 0); - [ this.arenaEnemy, this.arenaNextEnemy ].forEach(a => a.setPosition(-280, 0)); - this.arenaNextEnemy.setVisible(false); + this.arenaBgTransition.setPosition(0, 0); + this.arenaPlayer.setPosition(300, 0); + this.arenaPlayerTransition.setPosition(0, 0); + [ this.arenaEnemy, this.arenaNextEnemy ].forEach(a => a.setPosition(-280, 0)); + this.arenaNextEnemy.setVisible(false); - this.arena.init(); + this.arena.init(); - this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back`); - this.trainer.setPosition(406, 186); - this.trainer.setVisible(true); + this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + this.trainer.setPosition(406, 186); + this.trainer.setVisible(true); - this.updateGameInfo(); - - if (reloadI18n) { - const localizable: Localizable[] = [ - ...allSpecies, - ...allMoves, - ...allAbilities, - ...Utils.getEnumValues(ModifierPoolType).map(mpt => getModifierPoolForType(mpt)).map(mp => Object.values(mp).flat().map(mt => mt.modifierType).filter(mt => 'localize' in mt).map(lpb => lpb as unknown as Localizable)).flat() - ]; - for (let item of localizable) - item.localize(); - } - - if (clearScene) { - // Reload variant data in case sprite set has changed - this.initVariantData(); - - this.fadeOutBgm(250, false); - this.tweens.add({ - targets: [ this.uiContainer ], - alpha: 0, - duration: 250, - ease: 'Sine.easeInOut', - onComplete: () => { - this.clearPhaseQueue(); - - this.children.removeAll(true); - this.game.domContainer.innerHTML = ''; - this.launchBattle(); - } - }); - } - } - - newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle { - let newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (startingWave - 1)) + 1); - let newDouble: boolean; - let newBattleType: BattleType; - let newTrainer: Trainer; - - let battleConfig: FixedBattleConfig = null; - - this.resetSeed(newWaveIndex); - - const playerField = this.getPlayerField(); + this.updateGameInfo(); + + if (reloadI18n) { + const localizable: Localizable[] = [ + ...allSpecies, + ...allMoves, + ...allAbilities, + ...Utils.getEnumValues(ModifierPoolType).map(mpt => getModifierPoolForType(mpt)).map(mp => Object.values(mp).flat().map(mt => mt.modifierType).filter(mt => "localize" in mt).map(lpb => lpb as unknown as Localizable)).flat() + ]; + for (const item of localizable) { + item.localize(); + } + } + + if (clearScene) { + // Reload variant data in case sprite set has changed + this.initVariantData(); + + this.fadeOutBgm(250, false); + this.tweens.add({ + targets: [ this.uiContainer ], + alpha: 0, + duration: 250, + ease: "Sine.easeInOut", + onComplete: () => { + this.clearPhaseQueue(); + + this.children.removeAll(true); + this.game.domContainer.innerHTML = ""; + this.launchBattle(); + } + }); + } + } + + newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean): Battle { + const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (startingWave - 1)) + 1); + let newDouble: boolean; + let newBattleType: BattleType; + let newTrainer: Trainer; + + let battleConfig: FixedBattleConfig = null; + + this.resetSeed(newWaveIndex); + + const playerField = this.getPlayerField(); - if (this.gameMode.hasFixedBattles && fixedBattles.hasOwnProperty(newWaveIndex) && trainerData === undefined) { - battleConfig = fixedBattles[newWaveIndex]; - newDouble = battleConfig.double; - newBattleType = battleConfig.battleType; - this.executeWithSeedOffset(() => newTrainer = battleConfig.getTrainer(this), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); - if (newTrainer) - this.field.add(newTrainer); - } else { - if (!this.gameMode.hasTrainers) - newBattleType = BattleType.WILD; - else if (battleType === undefined) - newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; - else - newBattleType = battleType; - - if (newBattleType === BattleType.TRAINER) { - const trainerType = this.arena.randomTrainerType(newWaveIndex); - let doubleTrainer = false; - if (trainerConfigs[trainerType].doubleOnly) - doubleTrainer = true; - else if (trainerConfigs[trainerType].hasDouble) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); - this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); - doubleTrainer = !Utils.randSeedInt(doubleChance.value); - } - newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); - this.field.add(newTrainer); - } - } - - if (double === undefined && newWaveIndex > 1) { - if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); - this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); - newDouble = !Utils.randSeedInt(doubleChance.value); - } else if (newBattleType === BattleType.TRAINER) - newDouble = newTrainer.variant === TrainerVariant.DOUBLE; - } else if (!battleConfig) - newDouble = !!double; - - if (Overrides.DOUBLE_BATTLE_OVERRIDE) - newDouble = true; - - const lastBattle = this.currentBattle; - - if (lastBattle?.double && !newDouble) - this.tryRemovePhase(p => p instanceof SwitchPhase); - - const maxExpLevel = this.getMaxExpLevel(); - - this.lastEnemyTrainer = lastBattle?.trainer ?? null; - - this.executeWithSeedOffset(() => { - this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); - }, newWaveIndex << 3, this.waveSeed); - this.currentBattle.incrementTurn(this); - - //this.pushPhase(new TrainerMessageTestPhase(this, TrainerType.RIVAL, TrainerType.RIVAL_2, TrainerType.RIVAL_3, TrainerType.RIVAL_4, TrainerType.RIVAL_5, TrainerType.RIVAL_6)); - - if (!waveIndex && lastBattle) { - let isNewBiome = !(lastBattle.waveIndex % 10) || ((this.gameMode.hasShortBiomes || this.gameMode.isDaily) && (lastBattle.waveIndex % 50) === 49); - if (!isNewBiome && this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 10) < 9) { - let w = lastBattle.waveIndex - ((lastBattle.waveIndex % 10) - 1); - let biomeWaves = 1; - while (w < lastBattle.waveIndex) { - let wasNewBiome = false; - this.executeWithSeedOffset(() => { - wasNewBiome = !Utils.randSeedInt(6 - biomeWaves); - }, w << 4); - if (wasNewBiome) - biomeWaves = 1; - else - biomeWaves++; - w++; - } - - this.executeWithSeedOffset(() => { - isNewBiome = !Utils.randSeedInt(6 - biomeWaves); - }, lastBattle.waveIndex << 4); - } - const resetArenaState = isNewBiome || this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; - this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); - this.trySpreadPokerus(); - if (!isNewBiome && (newWaveIndex % 10) == 5) - this.arena.updatePoolsForTimeOfDay(); - if (resetArenaState) { - this.arena.removeAllTags(); - playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); - this.unshiftPhase(new ShowTrainerPhase(this)); - } - for (let pokemon of this.getParty()) { - if (pokemon) { - if (resetArenaState) - pokemon.resetBattleData(); - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); - } - } - if (!this.gameMode.hasRandomBiomes && !isNewBiome) - this.pushPhase(new NextEncounterPhase(this)); - else { - this.pushPhase(new SelectBiomePhase(this)); - this.pushPhase(new NewBiomeEncounterPhase(this)); - - const newMaxExpLevel = this.getMaxExpLevel(); - if (newMaxExpLevel > maxExpLevel) - this.pushPhase(new LevelCapPhase(this)); - } - } + if (this.gameMode.hasFixedBattles && fixedBattles.hasOwnProperty(newWaveIndex) && trainerData === undefined) { + battleConfig = fixedBattles[newWaveIndex]; + newDouble = battleConfig.double; + newBattleType = battleConfig.battleType; + this.executeWithSeedOffset(() => newTrainer = battleConfig.getTrainer(this), (battleConfig.seedOffsetWaveIndex || newWaveIndex) << 8); + if (newTrainer) { + this.field.add(newTrainer); + } + } else { + if (!this.gameMode.hasTrainers) { + newBattleType = BattleType.WILD; + } else if (battleType === undefined) { + newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD; + } else { + newBattleType = battleType; + } + + if (newBattleType === BattleType.TRAINER) { + const trainerType = this.arena.randomTrainerType(newWaveIndex); + let doubleTrainer = false; + if (trainerConfigs[trainerType].doubleOnly) { + doubleTrainer = true; + } else if (trainerConfigs[trainerType].hasDouble) { + const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); + this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); + playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); + doubleTrainer = !Utils.randSeedInt(doubleChance.value); + } + newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); + this.field.add(newTrainer); + } + } + + if (double === undefined && newWaveIndex > 1) { + if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { + const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); + this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); + playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); + newDouble = !Utils.randSeedInt(doubleChance.value); + } else if (newBattleType === BattleType.TRAINER) { + newDouble = newTrainer.variant === TrainerVariant.DOUBLE; + } + } else if (!battleConfig) { + newDouble = !!double; + } + + if (Overrides.DOUBLE_BATTLE_OVERRIDE) { + newDouble = true; + } + + const lastBattle = this.currentBattle; + + if (lastBattle?.double && !newDouble) { + this.tryRemovePhase(p => p instanceof SwitchPhase); + } + + const maxExpLevel = this.getMaxExpLevel(); + + this.lastEnemyTrainer = lastBattle?.trainer ?? null; + + this.executeWithSeedOffset(() => { + this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); + }, newWaveIndex << 3, this.waveSeed); + this.currentBattle.incrementTurn(this); + + //this.pushPhase(new TrainerMessageTestPhase(this, TrainerType.RIVAL, TrainerType.RIVAL_2, TrainerType.RIVAL_3, TrainerType.RIVAL_4, TrainerType.RIVAL_5, TrainerType.RIVAL_6)); + + if (!waveIndex && lastBattle) { + let isNewBiome = !(lastBattle.waveIndex % 10) || ((this.gameMode.hasShortBiomes || this.gameMode.isDaily) && (lastBattle.waveIndex % 50) === 49); + if (!isNewBiome && this.gameMode.hasShortBiomes && (lastBattle.waveIndex % 10) < 9) { + let w = lastBattle.waveIndex - ((lastBattle.waveIndex % 10) - 1); + let biomeWaves = 1; + while (w < lastBattle.waveIndex) { + let wasNewBiome = false; + this.executeWithSeedOffset(() => { + wasNewBiome = !Utils.randSeedInt(6 - biomeWaves); + }, w << 4); + if (wasNewBiome) { + biomeWaves = 1; + } else { + biomeWaves++; + } + w++; + } + + this.executeWithSeedOffset(() => { + isNewBiome = !Utils.randSeedInt(6 - biomeWaves); + }, lastBattle.waveIndex << 4); + } + const resetArenaState = isNewBiome || this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; + this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); + this.trySpreadPokerus(); + if (!isNewBiome && (newWaveIndex % 10) === 5) { + this.arena.updatePoolsForTimeOfDay(); + } + if (resetArenaState) { + this.arena.removeAllTags(); + playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); + this.unshiftPhase(new ShowTrainerPhase(this)); + } + for (const pokemon of this.getParty()) { + if (pokemon) { + if (resetArenaState) { + pokemon.resetBattleData(); + } + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); + } + } + if (!this.gameMode.hasRandomBiomes && !isNewBiome) { + this.pushPhase(new NextEncounterPhase(this)); + } else { + this.pushPhase(new SelectBiomePhase(this)); + this.pushPhase(new NewBiomeEncounterPhase(this)); + + const newMaxExpLevel = this.getMaxExpLevel(); + if (newMaxExpLevel > maxExpLevel) { + this.pushPhase(new LevelCapPhase(this)); + } + } + } - return this.currentBattle; - } - - newArena(biome: Biome): Arena { - this.arena = new Arena(this, biome, Biome[biome].toLowerCase()); - - this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; - - return this.arena; - } - - updateFieldScale(): Promise { - return new Promise(resolve => { - const fieldScale = Math.floor(Math.pow(1 / this.getField(true) - .map(p => p.getSpriteScale()) - .reduce((highestScale: number, scale: number) => highestScale = Math.max(scale, highestScale), 0), 0.7) * 40 - ) / 40; - this.setFieldScale(fieldScale).then(() => resolve()); - }); - } - - setFieldScale(scale: number, instant: boolean = false): Promise { - return new Promise(resolve => { - scale *= 6; - if (this.field.scale === scale) - return resolve(); - - const defaultWidth = this.arenaBg.width * 6; - const defaultHeight = 132 * 6; - const scaledWidth = this.arenaBg.width * scale; - const scaledHeight = 132 * scale; - - this.tweens.add({ - targets: this.field, - scale: scale, - x: (defaultWidth - scaledWidth) / 2, - y: defaultHeight - scaledHeight, - duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, - ease: 'Sine.easeInOut', - onComplete: () => resolve() - }); - }); - } - - getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): integer { - if (!species.forms?.length) - return 0; - - switch (species.speciesId) { - case Species.UNOWN: - case Species.SHELLOS: - case Species.GASTRODON: - case Species.BASCULIN: - case Species.DEERLING: - case Species.SAWSBUCK: - case Species.FROAKIE: - case Species.FROGADIER: - case Species.SCATTERBUG: - case Species.SPEWPA: - case Species.VIVILLON: - case Species.FLABEBE: - case Species.FLOETTE: - case Species.FLORGES: - case Species.FURFROU: - case Species.ORICORIO: - case Species.MAGEARNA: - case Species.ZARUDE: - case Species.SQUAWKABILLY: - case Species.TATSUGIRI: - case Species.PALDEA_TAUROS: - return Utils.randSeedInt(species.forms.length); - case Species.GRENINJA: - return Utils.randSeedInt(2); - case Species.ZYGARDE: - return Utils.randSeedInt(3); - case Species.MINIOR: - return Utils.randSeedInt(6); - case Species.ALCREMIE: - return Utils.randSeedInt(9); - case Species.MEOWSTIC: - case Species.INDEEDEE: - case Species.BASCULEGION: - case Species.OINKOLOGNE: - return gender === Gender.FEMALE ? 1 : 0; - case Species.TOXTRICITY: - const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; - if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) - return 1; - return 0; - } - - if (ignoreArena) { - switch (species.speciesId) { - case Species.BURMY: - case Species.WORMADAM: - case Species.ROTOM: - case Species.LYCANROC: - return Utils.randSeedInt(species.forms.length); - } - return 0; - } - - return this.arena.getSpeciesFormIndex(species); - } - - private getGeneratedOffsetGym(): boolean { - let ret = false; - this.executeWithSeedOffset(() => { - ret = !Utils.randSeedInt(2); - }, 0, this.seed.toString()); - return ret; - } - - private getGeneratedWaveCycleOffset(): integer { - let ret = 0; - this.executeWithSeedOffset(() => { - ret = Utils.randSeedInt(8) * 5; - }, 0, this.seed.toString()); - return ret; - } - - getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer { - if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) - return 5; - - let isBoss: boolean; - if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) - isBoss = true; - else { - this.executeWithSeedOffset(() => { - isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); - }, waveIndex << 2); - } - if (!isBoss) - return 0; - - let ret: integer = 2; - - if (level >= 100) - ret++; - if (species) { - if (species.baseTotal >= 670) - ret++; - } - ret += Math.floor(waveIndex / 250); - - return ret; - } - - trySpreadPokerus(): void { - const party = this.getParty(); - const infectedIndexes: integer[] = []; - const spread = (index: number, spreadTo: number) => { - const partyMember = party[index + spreadTo]; - if (!partyMember.pokerus && !Utils.randSeedInt(10)) { - partyMember.pokerus = true; - infectedIndexes.push(index + spreadTo); - } - }; - party.forEach((pokemon, p) => { - if (!pokemon.pokerus || infectedIndexes.indexOf(p) > -1) - return; + return this.currentBattle; + } + + newArena(biome: Biome): Arena { + this.arena = new Arena(this, biome, Biome[biome].toLowerCase()); + + this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; + + return this.arena; + } + + updateFieldScale(): Promise { + return new Promise(resolve => { + const fieldScale = Math.floor(Math.pow(1 / this.getField(true) + .map(p => p.getSpriteScale()) + .reduce((highestScale: number, scale: number) => highestScale = Math.max(scale, highestScale), 0), 0.7) * 40 + ) / 40; + this.setFieldScale(fieldScale).then(() => resolve()); + }); + } + + setFieldScale(scale: number, instant: boolean = false): Promise { + return new Promise(resolve => { + scale *= 6; + if (this.field.scale === scale) { + return resolve(); + } + + const defaultWidth = this.arenaBg.width * 6; + const defaultHeight = 132 * 6; + const scaledWidth = this.arenaBg.width * scale; + const scaledHeight = 132 * scale; + + this.tweens.add({ + targets: this.field, + scale: scale, + x: (defaultWidth - scaledWidth) / 2, + y: defaultHeight - scaledHeight, + duration: !instant ? Utils.fixedInt(Math.abs(this.field.scale - scale) * 200) : 0, + ease: "Sine.easeInOut", + onComplete: () => resolve() + }); + }); + } + + getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): integer { + if (!species.forms?.length) { + return 0; + } + + switch (species.speciesId) { + case Species.UNOWN: + case Species.SHELLOS: + case Species.GASTRODON: + case Species.BASCULIN: + case Species.DEERLING: + case Species.SAWSBUCK: + case Species.FROAKIE: + case Species.FROGADIER: + case Species.SCATTERBUG: + case Species.SPEWPA: + case Species.VIVILLON: + case Species.FLABEBE: + case Species.FLOETTE: + case Species.FLORGES: + case Species.FURFROU: + case Species.ORICORIO: + case Species.MAGEARNA: + case Species.ZARUDE: + case Species.SQUAWKABILLY: + case Species.TATSUGIRI: + case Species.PALDEA_TAUROS: + return Utils.randSeedInt(species.forms.length); + case Species.GRENINJA: + return Utils.randSeedInt(2); + case Species.ZYGARDE: + return Utils.randSeedInt(3); + case Species.MINIOR: + return Utils.randSeedInt(6); + case Species.ALCREMIE: + return Utils.randSeedInt(9); + case Species.MEOWSTIC: + case Species.INDEEDEE: + case Species.BASCULEGION: + case Species.OINKOLOGNE: + return gender === Gender.FEMALE ? 1 : 0; + case Species.TOXTRICITY: + const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { + return 1; + } + return 0; + } + + if (ignoreArena) { + switch (species.speciesId) { + case Species.BURMY: + case Species.WORMADAM: + case Species.ROTOM: + case Species.LYCANROC: + return Utils.randSeedInt(species.forms.length); + } + return 0; + } + + return this.arena.getSpeciesFormIndex(species); + } + + private getGeneratedOffsetGym(): boolean { + let ret = false; + this.executeWithSeedOffset(() => { + ret = !Utils.randSeedInt(2); + }, 0, this.seed.toString()); + return ret; + } + + private getGeneratedWaveCycleOffset(): integer { + let ret = 0; + this.executeWithSeedOffset(() => { + ret = Utils.randSeedInt(8) * 5; + }, 0, this.seed.toString()); + return ret; + } + + getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer { + if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) { + return 5; + } + + let isBoss: boolean; + if (forceBoss || (species && (species.subLegendary || species.legendary || species.mythical))) { + isBoss = true; + } else { + this.executeWithSeedOffset(() => { + isBoss = waveIndex % 10 === 0 || (this.gameMode.hasRandomBosses && Utils.randSeedInt(100) < Math.min(Math.max(Math.ceil((waveIndex - 250) / 50), 0) * 2, 30)); + }, waveIndex << 2); + } + if (!isBoss) { + return 0; + } + + let ret: integer = 2; + + if (level >= 100) { + ret++; + } + if (species) { + if (species.baseTotal >= 670) { + ret++; + } + } + ret += Math.floor(waveIndex / 250); + + return ret; + } + + trySpreadPokerus(): void { + const party = this.getParty(); + const infectedIndexes: integer[] = []; + const spread = (index: number, spreadTo: number) => { + const partyMember = party[index + spreadTo]; + if (!partyMember.pokerus && !Utils.randSeedInt(10)) { + partyMember.pokerus = true; + infectedIndexes.push(index + spreadTo); + } + }; + party.forEach((pokemon, p) => { + if (!pokemon.pokerus || infectedIndexes.indexOf(p) > -1) { + return; + } - this.executeWithSeedOffset(() => { - if (p) - spread(p, -1); - if (p < party.length - 1) - spread(p, 1); - }, this.currentBattle.waveIndex + (p << 8)); - }); - } - - resetSeed(waveIndex?: integer): void { - const wave = waveIndex || this.currentBattle?.waveIndex || 0; - this.waveSeed = Utils.shiftCharCodes(this.seed, wave); - Phaser.Math.RND.sow([ this.waveSeed ]); - console.log('Wave Seed:', this.waveSeed, wave); - this.rngCounter = 0; - } - - executeWithSeedOffset(func: Function, offset: integer, seedOverride?: string): void { - if (!func) - return; - const tempRngCounter = this.rngCounter; - const tempRngOffset = this.rngOffset; - const tempRngSeedOverride = this.rngSeedOverride; - const state = Phaser.Math.RND.state(); - Phaser.Math.RND.sow([ Utils.shiftCharCodes(seedOverride || this.seed, offset) ]); - this.rngCounter = 0; - this.rngOffset = offset; - this.rngSeedOverride = seedOverride || ''; - func(); - Phaser.Math.RND.state(state); - this.rngCounter = tempRngCounter; - this.rngOffset = tempRngOffset; - this.rngSeedOverride = tempRngSeedOverride; - } - - addFieldSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, terrainColorRatio: number = 0): Phaser.GameObjects.Sprite { - const ret = this.add.sprite(x, y, texture, frame); - ret.setPipeline(this.fieldSpritePipeline); - if (terrainColorRatio) - ret.pipelineData['terrainColorRatio'] = terrainColorRatio; - - return ret; - } - - addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - const ret = this.addFieldSprite(x, y, texture, frame); - this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); - return ret; - } - - initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { - sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); - this.spriteSparkleHandler.add(sprite); - return sprite; - } - - showFieldOverlay(duration: integer): Promise { - return new Promise(resolve => { - this.tweens.add({ - targets: this.fieldOverlay, - alpha: 0.5, - ease: 'Sine.easeOut', - duration: duration, - onComplete: () => resolve() - }); - }); - } - - hideFieldOverlay(duration: integer): Promise { - return new Promise(resolve => { - this.tweens.add({ - targets: this.fieldOverlay, - alpha: 0, - duration: duration, - ease: 'Cubic.easeIn', - onComplete: () => resolve() - }); - }); - } - - updateWaveCountText(): void { - const isBoss = !(this.currentBattle.waveIndex % 10); - this.waveCountText.setText(this.currentBattle.waveIndex.toString()); - this.waveCountText.setColor(!isBoss ? '#404040' : '#f89890'); - this.waveCountText.setShadowColor(!isBoss ? '#ded6b5' : '#984038'); - this.waveCountText.setVisible(true); - } - - updateMoneyText(): void { - this.moneyText.setText(`₽${Utils.formatLargeNumber(this.money, 1000)}`); - this.moneyText.setVisible(true); - } - - updateScoreText(): void { - this.scoreText.setText(`Score: ${this.score.toString()}`); - this.scoreText.setVisible(this.gameMode.isDaily); - } - - updateAndShowLuckText(duration: integer): void { - const labels = [ this.luckLabelText, this.luckText ]; - labels.map(t => { - t.setAlpha(0); - t.setVisible(true); - }) - const luckValue = getPartyLuckValue(this.getParty()); - this.luckText.setText(getLuckString(luckValue)); - if (luckValue < 14) - this.luckText.setTint(getLuckTextTint(luckValue)); - else - this.luckText.setTint(0x83a55a, 0xee384a, 0x5271cd, 0x7b487b); - this.luckLabelText.setX((this.game.canvas.width / 6) - 2 - (this.luckText.displayWidth + 2)); - this.tweens.add({ - targets: labels, - duration: duration, - alpha: 1 - }); - } - - hideLuckText(duration: integer): void { - const labels = [ this.luckLabelText, this.luckText ]; - this.tweens.add({ - targets: labels, - duration: duration, - alpha: 0, - onComplete: () => { - labels.map(l => l.setVisible(false)); - } - }); - } - - updateUIPositions(): void { - const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible(this)).length; - this.waveCountText.setY(-(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0)); - this.moneyText.setY(this.waveCountText.y + 10); - this.scoreText.setY(this.moneyText.y + 10); - [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); - const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; - this.partyExpBar.setY(offsetY); - this.candyBar.setY(offsetY + 15); - this.ui?.achvBar.setY(this.game.canvas.height / 6 + offsetY); - } - - addFaintedEnemyScore(enemy: EnemyPokemon): void { - let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * ((enemy.ivs.reduce((iv: integer, total: integer) => total += iv, 0) / 93) * 0.2 + 0.8); - this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map(m => scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()); - if (enemy.isBoss()) - scoreIncrease *= Math.sqrt(enemy.bossSegments); - this.currentBattle.battleScore += Math.ceil(scoreIncrease); - } - - getMaxExpLevel(ignoreLevelCap?: boolean): integer { - if (ignoreLevelCap) - return Number.MAX_SAFE_INTEGER; - const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(waveIndex); - const baseLevel = (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * 1.2; - return Math.ceil(baseLevel / 2) * 2 + 2; - } - - randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { - if (fromArenaPool) - return this.arena.randomSpecies(waveIndex, level); - const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { - if (!filterAllEvolutions) { - while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) - s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); - } - return s; - }))] : allSpecies.filter(s => s.isCatchable()); - return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; - } - - generateRandomBiome(waveIndex: integer): Biome { - const relWave = waveIndex % 250; - const biomes = Utils.getEnumValues(Biome).slice(1, Utils.getEnumValues(Biome).filter(b => b >= 40).length * -1); - const maxDepth = biomeDepths[Biome.END][0] - 2; - const depthWeights = new Array(maxDepth + 1).fill(null) - .map((_, i: integer) => ((1 - Math.min(Math.abs((i / (maxDepth - 1)) - (relWave / 250)) + 0.25, 1)) / 0.75) * 250); - const biomeThresholds: integer[] = []; - let totalWeight = 0; - for (let biome of biomes) { - totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); - biomeThresholds.push(totalWeight); - } - - const randInt = Utils.randSeedInt(totalWeight); - - for (let biome of biomes) { - if (randInt < biomeThresholds[biome]) - return biome; - } - - return biomes[Utils.randSeedInt(biomes.length)]; - } - - isBgmPlaying(): boolean { - return this.bgm && this.bgm.isPlaying; - } - - playBgm(bgmName?: string, fadeOut?: boolean): void { - if (bgmName === undefined) - bgmName = this.currentBattle?.getBgmOverride(this) || this.arena?.bgm; - if (this.bgm && bgmName === this.bgm.key) { - if (!this.bgm.isPlaying) { - this.bgm.play({ - volume: this.masterVolume * this.bgmVolume - }); - } - return; - } - if (fadeOut && !this.bgm) - fadeOut = false; - this.bgmCache.add(bgmName); - this.loadBgm(bgmName); - let loopPoint = 0; - loopPoint = bgmName === this.arena.bgm - ? this.arena.getBgmLoopPoint() - : this.getBgmLoopPoint(bgmName); - let loaded = false; - const playNewBgm = () => { - if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { - this.bgm.play({ - volume: this.masterVolume * this.bgmVolume - }); - return; - } - if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPlaying) - this.bgm.stop(); - this.bgm = this.sound.add(bgmName, { loop: true }); - this.bgm.play({ - volume: this.masterVolume * this.bgmVolume - }); - if (loopPoint) - this.bgm.on('looped', () => this.bgm.play({ seek: loopPoint })); - }; - this.load.once(Phaser.Loader.Events.COMPLETE, () => { - loaded = true; - if (!fadeOut || !this.bgm.isPlaying) - playNewBgm(); - }); - if (fadeOut) { - const onBgmFaded = () => { - if (loaded && (!this.bgm.isPlaying || this.bgm.pendingRemove)) - playNewBgm(); - }; - this.time.delayedCall(this.fadeOutBgm(500, true) ? 750 : 250, onBgmFaded); - } - if (!this.load.isLoading()) - this.load.start(); - } - - pauseBgm(): boolean { - if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPlaying) { - this.bgm.pause(); - return true; - } - return false; - } - - resumeBgm(): boolean { - if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPaused) { - this.bgm.resume(); - return true; - } - return false; - } - - updateSoundVolume(): void { - if (this.sound) { - for (let sound of this.sound.getAllPlaying()) - (sound as AnySound).setVolume(this.masterVolume * (this.bgmCache.has(sound.key) ? this.bgmVolume : this.seVolume)); - } - } - - fadeOutBgm(duration: integer = 500, destroy: boolean = true): boolean { - if (!this.bgm) - return false; + this.executeWithSeedOffset(() => { + if (p) { + spread(p, -1); + } + if (p < party.length - 1) { + spread(p, 1); + } + }, this.currentBattle.waveIndex + (p << 8)); + }); + } + + resetSeed(waveIndex?: integer): void { + const wave = waveIndex || this.currentBattle?.waveIndex || 0; + this.waveSeed = Utils.shiftCharCodes(this.seed, wave); + Phaser.Math.RND.sow([ this.waveSeed ]); + console.log("Wave Seed:", this.waveSeed, wave); + this.rngCounter = 0; + } + + executeWithSeedOffset(func: Function, offset: integer, seedOverride?: string): void { + if (!func) { + return; + } + const tempRngCounter = this.rngCounter; + const tempRngOffset = this.rngOffset; + const tempRngSeedOverride = this.rngSeedOverride; + const state = Phaser.Math.RND.state(); + Phaser.Math.RND.sow([ Utils.shiftCharCodes(seedOverride || this.seed, offset) ]); + this.rngCounter = 0; + this.rngOffset = offset; + this.rngSeedOverride = seedOverride || ""; + func(); + Phaser.Math.RND.state(state); + this.rngCounter = tempRngCounter; + this.rngOffset = tempRngOffset; + this.rngSeedOverride = tempRngSeedOverride; + } + + addFieldSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, terrainColorRatio: number = 0): Phaser.GameObjects.Sprite { + const ret = this.add.sprite(x, y, texture, frame); + ret.setPipeline(this.fieldSpritePipeline); + if (terrainColorRatio) { + ret.pipelineData["terrainColorRatio"] = terrainColorRatio; + } + + return ret; + } + + addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + const ret = this.addFieldSprite(x, y, texture, frame); + this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); + return ret; + } + + initPokemonSprite(sprite: Phaser.GameObjects.Sprite, pokemon?: Pokemon, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { + sprite.setPipeline(this.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: hasShadow, ignoreOverride: ignoreOverride, teraColor: pokemon ? getTypeRgb(pokemon.getTeraType()) : undefined }); + this.spriteSparkleHandler.add(sprite); + return sprite; + } + + showFieldOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.fieldOverlay, + alpha: 0.5, + ease: "Sine.easeOut", + duration: duration, + onComplete: () => resolve() + }); + }); + } + + hideFieldOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.fieldOverlay, + alpha: 0, + duration: duration, + ease: "Cubic.easeIn", + onComplete: () => resolve() + }); + }); + } + + updateWaveCountText(): void { + const isBoss = !(this.currentBattle.waveIndex % 10); + this.waveCountText.setText(this.currentBattle.waveIndex.toString()); + this.waveCountText.setColor(!isBoss ? "#404040" : "#f89890"); + this.waveCountText.setShadowColor(!isBoss ? "#ded6b5" : "#984038"); + this.waveCountText.setVisible(true); + } + + updateMoneyText(): void { + this.moneyText.setText(`₽${this.money.toLocaleString("en-US")}`); + this.moneyText.setVisible(true); + } + + updateScoreText(): void { + this.scoreText.setText(`Score: ${this.score.toString()}`); + this.scoreText.setVisible(this.gameMode.isDaily); + } + + updateAndShowLuckText(duration: integer): void { + const labels = [ this.luckLabelText, this.luckText ]; + labels.map(t => { + t.setAlpha(0); + t.setVisible(true); + }); + const luckValue = getPartyLuckValue(this.getParty()); + this.luckText.setText(getLuckString(luckValue)); + if (luckValue < 14) { + this.luckText.setTint(getLuckTextTint(luckValue)); + } else { + this.luckText.setTint(0x83a55a, 0xee384a, 0x5271cd, 0x7b487b); + } + this.luckLabelText.setX((this.game.canvas.width / 6) - 2 - (this.luckText.displayWidth + 2)); + this.tweens.add({ + targets: labels, + duration: duration, + alpha: 1 + }); + } + + hideLuckText(duration: integer): void { + const labels = [ this.luckLabelText, this.luckText ]; + this.tweens.add({ + targets: labels, + duration: duration, + alpha: 0, + onComplete: () => { + labels.map(l => l.setVisible(false)); + } + }); + } + + updateUIPositions(): void { + const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible(this)).length; + this.waveCountText.setY(-(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0)); + this.moneyText.setY(this.waveCountText.y + 10); + this.scoreText.setY(this.moneyText.y + 10); + [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); + const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; + this.partyExpBar.setY(offsetY); + this.candyBar.setY(offsetY + 15); + this.ui?.achvBar.setY(this.game.canvas.height / 6 + offsetY); + } + + addFaintedEnemyScore(enemy: EnemyPokemon): void { + let scoreIncrease = enemy.getSpeciesForm().getBaseExp() * (enemy.level / this.getMaxExpLevel()) * ((enemy.ivs.reduce((iv: integer, total: integer) => total += iv, 0) / 93) * 0.2 + 0.8); + this.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemy.id, false).map(m => scoreIncrease *= (m as PokemonHeldItemModifier).getScoreMultiplier()); + if (enemy.isBoss()) { + scoreIncrease *= Math.sqrt(enemy.bossSegments); + } + this.currentBattle.battleScore += Math.ceil(scoreIncrease); + } + + getMaxExpLevel(ignoreLevelCap?: boolean): integer { + if (ignoreLevelCap) { + return Number.MAX_SAFE_INTEGER; + } + const waveIndex = Math.ceil((this.currentBattle?.waveIndex || 1) / 10) * 10; + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(waveIndex); + const baseLevel = (1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2)) * 1.2; + return Math.ceil(baseLevel / 2) * 2 + 2; + } + + randomSpecies(waveIndex: integer, level: integer, fromArenaPool?: boolean, speciesFilter?: PokemonSpeciesFilter, filterAllEvolutions?: boolean): PokemonSpecies { + if (fromArenaPool) { + return this.arena.randomSpecies(waveIndex, level); + } + const filteredSpecies = speciesFilter ? [...new Set(allSpecies.filter(s => s.isCatchable()).filter(speciesFilter).map(s => { + if (!filterAllEvolutions) { + while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) { + s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); + } + } + return s; + }))] : allSpecies.filter(s => s.isCatchable()); + return filteredSpecies[Utils.randSeedInt(filteredSpecies.length)]; + } + + generateRandomBiome(waveIndex: integer): Biome { + const relWave = waveIndex % 250; + const biomes = Utils.getEnumValues(Biome).slice(1, Utils.getEnumValues(Biome).filter(b => b >= 40).length * -1); + const maxDepth = biomeDepths[Biome.END][0] - 2; + const depthWeights = new Array(maxDepth + 1).fill(null) + .map((_, i: integer) => ((1 - Math.min(Math.abs((i / (maxDepth - 1)) - (relWave / 250)) + 0.25, 1)) / 0.75) * 250); + const biomeThresholds: integer[] = []; + let totalWeight = 0; + for (const biome of biomes) { + totalWeight += Math.ceil(depthWeights[biomeDepths[biome][0] - 1] / biomeDepths[biome][1]); + biomeThresholds.push(totalWeight); + } + + const randInt = Utils.randSeedInt(totalWeight); + + for (const biome of biomes) { + if (randInt < biomeThresholds[biome]) { + return biome; + } + } + + return biomes[Utils.randSeedInt(biomes.length)]; + } + + isBgmPlaying(): boolean { + return this.bgm && this.bgm.isPlaying; + } + + playBgm(bgmName?: string, fadeOut?: boolean): void { + if (bgmName === undefined) { + bgmName = this.currentBattle?.getBgmOverride(this) || this.arena?.bgm; + } + if (this.bgm && bgmName === this.bgm.key) { + if (!this.bgm.isPlaying) { + this.bgm.play({ + volume: this.masterVolume * this.bgmVolume + }); + } + return; + } + if (fadeOut && !this.bgm) { + fadeOut = false; + } + this.bgmCache.add(bgmName); + this.loadBgm(bgmName); + let loopPoint = 0; + loopPoint = bgmName === this.arena.bgm + ? this.arena.getBgmLoopPoint() + : this.getBgmLoopPoint(bgmName); + let loaded = false; + const playNewBgm = () => { + if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { + this.bgm.play({ + volume: this.masterVolume * this.bgmVolume + }); + return; + } + if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPlaying) { + this.bgm.stop(); + } + this.bgm = this.sound.add(bgmName, { loop: true }); + this.bgm.play({ + volume: this.masterVolume * this.bgmVolume + }); + if (loopPoint) { + this.bgm.on("looped", () => this.bgm.play({ seek: loopPoint })); + } + }; + this.load.once(Phaser.Loader.Events.COMPLETE, () => { + loaded = true; + if (!fadeOut || !this.bgm.isPlaying) { + playNewBgm(); + } + }); + if (fadeOut) { + const onBgmFaded = () => { + if (loaded && (!this.bgm.isPlaying || this.bgm.pendingRemove)) { + playNewBgm(); + } + }; + this.time.delayedCall(this.fadeOutBgm(500, true) ? 750 : 250, onBgmFaded); + } + if (!this.load.isLoading()) { + this.load.start(); + } + } + + pauseBgm(): boolean { + if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPlaying) { + this.bgm.pause(); + return true; + } + return false; + } + + resumeBgm(): boolean { + if (this.bgm && !this.bgm.pendingRemove && this.bgm.isPaused) { + this.bgm.resume(); + return true; + } + return false; + } + + updateSoundVolume(): void { + if (this.sound) { + for (const sound of this.sound.getAllPlaying()) { + (sound as AnySound).setVolume(this.masterVolume * (this.bgmCache.has(sound.key) ? this.bgmVolume : this.seVolume)); + } + } + } + + fadeOutBgm(duration: integer = 500, destroy: boolean = true): boolean { + if (!this.bgm) { + return false; + } const bgm = this.sound.getAllPlaying().find(bgm => bgm.key === this.bgm.key); - if (bgm) { - SoundFade.fadeOut(this, this.bgm, duration, destroy); - return true; - } - - return false; - } - - playSound(sound: string | AnySound, config?: object): AnySound { - if (config) { - if (config.hasOwnProperty('volume')) - config['volume'] *= this.masterVolume * this.seVolume; - else - config['volume'] = this.masterVolume * this.seVolume; - } else - config = { volume: this.masterVolume * this.seVolume }; - // PRSFX sounds are mixed too loud - if ((typeof sound === 'string' ? sound : sound.key).startsWith('PRSFX- ')) - config['volume'] *= 0.5; - if (typeof sound === 'string') { - this.sound.play(sound, config); - return this.sound.get(sound) as AnySound; - } else { - sound.play(config); - return sound; - } - } - - playSoundWithoutBgm(soundName: string, pauseDuration?: integer): AnySound { - this.bgmCache.add(soundName); - const resumeBgm = this.pauseBgm(); - this.playSound(soundName); - const sound = this.sound.get(soundName) as AnySound; - if (this.bgmResumeTimer) - this.bgmResumeTimer.destroy(); - if (resumeBgm) { - this.bgmResumeTimer = this.time.delayedCall((pauseDuration || Utils.fixedInt(sound.totalDuration * 1000)), () => { - this.resumeBgm(); - this.bgmResumeTimer = null; - }); - } - return sound; - } - - getBgmLoopPoint(bgmName: string): number { - switch (bgmName) { - case 'battle_kanto_champion': - return 13.950; - case 'battle_johto_champion': - return 23.498; - case 'battle_hoenn_champion': - return 11.328; - case 'battle_sinnoh_champion': - return 12.235; - case 'battle_champion_alder': - return 27.653; - case 'battle_champion_iris': - return 10.145; - case 'battle_elite': - return 17.730; - case 'battle_final_encounter': - return 19.159; - case 'battle_final': - return 16.453; - case 'battle_kanto_gym': - return 13.857; - case 'battle_johto_gym': - return 12.911; - case 'battle_hoenn_gym': - return 12.379; - case 'battle_sinnoh_gym': - return 13.122; - case 'battle_unova_gym': - return 19.145; - case 'battle_legendary_regis': //B2W2 Legendary Titan Battle - return 49.500; - case 'battle_legendary_unova': //BW Unova Legendary Battle - return 13.855; - case 'battle_legendary_kyurem': //BW Kyurem Battle - return 18.314; - case 'battle_legendary_res_zek': //BW Reshiram & Zekrom Battle - return 18.329; - case 'battle_rival': - return 13.689; - case 'battle_rival_2': - return 17.714; - case 'battle_rival_3': - return 17.586; - case 'battle_trainer': - return 13.686; - case 'battle_wild': - return 12.703; - case 'battle_wild_strong': - return 13.940; - case 'end_summit': - return 30.025; - } - - return 0; - } - - toggleInvert(invert: boolean): void { - if (invert) - this.cameras.main.setPostPipeline(InvertPostFX); - else - this.cameras.main.removePostPipeline('InvertPostFX'); - } - - /* Phase Functions */ - getCurrentPhase(): Phase { - return this.currentPhase; - } - - getStandbyPhase(): Phase { - return this.standbyPhase; - } - - pushPhase(phase: Phase, defer: boolean = false): void { - (!defer ? this.phaseQueue : this.nextCommandPhaseQueue).push(phase); - } - - unshiftPhase(phase: Phase): void { - if (this.phaseQueuePrependSpliceIndex === -1) - this.phaseQueuePrepend.push(phase); - else - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase); - } - - clearPhaseQueue(): void { - this.phaseQueue.splice(0, this.phaseQueue.length); - } - - setPhaseQueueSplice(): void { - this.phaseQueuePrependSpliceIndex = this.phaseQueuePrepend.length; - } - - clearPhaseQueueSplice(): void { - this.phaseQueuePrependSpliceIndex = -1; - } - - shiftPhase(): void { - if (this.standbyPhase) { - this.currentPhase = this.standbyPhase; - this.standbyPhase = null; - return; - } - - if (this.phaseQueuePrependSpliceIndex > -1) - this.clearPhaseQueueSplice(); - if (this.phaseQueuePrepend.length) { - while (this.phaseQueuePrepend.length) - this.phaseQueue.unshift(this.phaseQueuePrepend.pop()); - } - if (!this.phaseQueue.length) - this.populatePhaseQueue(); - this.currentPhase = this.phaseQueue.shift(); - this.currentPhase.start(); - } + if (bgm) { + SoundFade.fadeOut(this, this.bgm, duration, destroy); + return true; + } + + return false; + } + + playSound(sound: string | AnySound, config?: object): AnySound { + if (config) { + if (config.hasOwnProperty("volume")) { + config["volume"] *= this.masterVolume * this.seVolume; + } else { + config["volume"] = this.masterVolume * this.seVolume; + } + } else { + config = { volume: this.masterVolume * this.seVolume }; + } + // PRSFX sounds are mixed too loud + if ((typeof sound === "string" ? sound : sound.key).startsWith("PRSFX- ")) { + config["volume"] *= 0.5; + } + if (typeof sound === "string") { + this.sound.play(sound, config); + return this.sound.get(sound) as AnySound; + } else { + sound.play(config); + return sound; + } + } + + playSoundWithoutBgm(soundName: string, pauseDuration?: integer): AnySound { + this.bgmCache.add(soundName); + const resumeBgm = this.pauseBgm(); + this.playSound(soundName); + const sound = this.sound.get(soundName) as AnySound; + if (this.bgmResumeTimer) { + this.bgmResumeTimer.destroy(); + } + if (resumeBgm) { + this.bgmResumeTimer = this.time.delayedCall((pauseDuration || Utils.fixedInt(sound.totalDuration * 1000)), () => { + this.resumeBgm(); + this.bgmResumeTimer = null; + }); + } + return sound; + } + + getBgmLoopPoint(bgmName: string): number { + switch (bgmName) { + case "battle_kanto_champion": + return 13.950; + case "battle_johto_champion": + return 23.498; + case "battle_hoenn_champion": + return 11.328; + case "battle_sinnoh_champion": + return 12.235; + case "battle_champion_alder": + return 27.653; + case "battle_champion_iris": + return 10.145; + case "battle_elite": + return 17.730; + case "battle_final_encounter": + return 19.159; + case "battle_final": + return 16.453; + case "battle_kanto_gym": + return 13.857; + case "battle_johto_gym": + return 12.911; + case "battle_hoenn_gym": + return 12.379; + case "battle_sinnoh_gym": + return 13.122; + case "battle_unova_gym": + return 19.145; + case "battle_legendary_regis": //B2W2 Legendary Titan Battle + return 49.500; + case "battle_legendary_unova": //BW Unova Legendary Battle + return 13.855; + case "battle_legendary_kyurem": //BW Kyurem Battle + return 18.314; + case "battle_legendary_res_zek": //BW Reshiram & Zekrom Battle + return 18.329; + case "battle_rival": + return 13.689; + case "battle_rival_2": + return 17.714; + case "battle_rival_3": + return 17.586; + case "battle_trainer": + return 13.686; + case "battle_wild": + return 12.703; + case "battle_wild_strong": + return 13.940; + case "end_summit": + return 30.025; + } + + return 0; + } + + toggleInvert(invert: boolean): void { + if (invert) { + this.cameras.main.setPostPipeline(InvertPostFX); + } else { + this.cameras.main.removePostPipeline("InvertPostFX"); + } + } + + /* Phase Functions */ + getCurrentPhase(): Phase { + return this.currentPhase; + } + + getStandbyPhase(): Phase { + return this.standbyPhase; + } + + pushPhase(phase: Phase, defer: boolean = false): void { + (!defer ? this.phaseQueue : this.nextCommandPhaseQueue).push(phase); + } + + unshiftPhase(phase: Phase): void { + if (this.phaseQueuePrependSpliceIndex === -1) { + this.phaseQueuePrepend.push(phase); + } else { + this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase); + } + } + + clearPhaseQueue(): void { + this.phaseQueue.splice(0, this.phaseQueue.length); + } + + setPhaseQueueSplice(): void { + this.phaseQueuePrependSpliceIndex = this.phaseQueuePrepend.length; + } + + clearPhaseQueueSplice(): void { + this.phaseQueuePrependSpliceIndex = -1; + } + + shiftPhase(): void { + if (this.standbyPhase) { + this.currentPhase = this.standbyPhase; + this.standbyPhase = null; + return; + } + + if (this.phaseQueuePrependSpliceIndex > -1) { + this.clearPhaseQueueSplice(); + } + if (this.phaseQueuePrepend.length) { + while (this.phaseQueuePrepend.length) { + this.phaseQueue.unshift(this.phaseQueuePrepend.pop()); + } + } + if (!this.phaseQueue.length) { + this.populatePhaseQueue(); + } + this.currentPhase = this.phaseQueue.shift(); + this.currentPhase.start(); + } - overridePhase(phase: Phase): boolean { - if (this.standbyPhase) - return false; - - this.standbyPhase = this.currentPhase; - this.currentPhase = phase; - phase.start(); - - return true; - } - - findPhase(phaseFilter: (phase: Phase) => boolean): Phase { - return this.phaseQueue.find(phaseFilter); - } - - tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { - const phaseIndex = this.phaseQueue.findIndex(phaseFilter); - if (phaseIndex > -1) { - this.phaseQueue[phaseIndex] = phase; - return true; - } - return false; - } - - tryRemovePhase(phaseFilter: (phase: Phase) => boolean): boolean { - const phaseIndex = this.phaseQueue.findIndex(phaseFilter); - if (phaseIndex > -1) { - this.phaseQueue.splice(phaseIndex, 1); - return true; - } - return false; - } - - pushMovePhase(movePhase: MovePhase, priorityOverride?: integer): void { - const movePriority = new Utils.IntegerHolder(priorityOverride !== undefined ? priorityOverride : movePhase.move.getMove().priority); - applyAbAttrs(IncrementMovePriorityAbAttr, movePhase.pokemon, null, movePhase.move.getMove(), movePriority); - const lowerPriorityPhase = this.phaseQueue.find(p => p instanceof MovePhase && p.move.getMove().priority < movePriority.value); - if (lowerPriorityPhase) - this.phaseQueue.splice(this.phaseQueue.indexOf(lowerPriorityPhase), 0, movePhase); - else - this.pushPhase(movePhase); - } - - queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) { - const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); - if (!defer) - this.unshiftPhase(phase); - else - this.pushPhase(phase); - } - - populatePhaseQueue(): void { - if (this.nextCommandPhaseQueue.length) { - this.phaseQueue.push(...this.nextCommandPhaseQueue); - this.nextCommandPhaseQueue.splice(0, this.nextCommandPhaseQueue.length); - } - this.phaseQueue.push(new TurnInitPhase(this)); - } - - addMoney(amount: integer): void { - this.money = Math.min(this.money + amount, Number.MAX_SAFE_INTEGER); - this.updateMoneyText(); - this.validateAchvs(MoneyAchv); - } - - getWaveMoneyAmount(moneyMultiplier: number): integer { - const waveIndex = this.currentBattle.waveIndex; - const waveSetIndex = Math.ceil(waveIndex / 10) - 1; - const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; - return Math.floor(moneyValue / 10) * 10; - } - - addModifier(modifier: Modifier, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean): Promise { - return new Promise(resolve => { - let success = false; - const soundName = modifier.type.soundName; - this.validateAchvs(ModifierAchv, modifier); - const modifiersToRemove: PersistentModifier[] = []; - const modifierPromises: Promise[] = []; - if (modifier instanceof PersistentModifier) { - if (modifier instanceof TerastallizeModifier) - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); - if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) - success = modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); - if (playSound && !this.sound.get(soundName)) - this.playSound(soundName); - } else if (!virtual) { - const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); - this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, null, true); - return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); - } + overridePhase(phase: Phase): boolean { + if (this.standbyPhase) { + return false; + } + + this.standbyPhase = this.currentPhase; + this.currentPhase = phase; + phase.start(); + + return true; + } + + findPhase(phaseFilter: (phase: Phase) => boolean): Phase { + return this.phaseQueue.find(phaseFilter); + } + + tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { + const phaseIndex = this.phaseQueue.findIndex(phaseFilter); + if (phaseIndex > -1) { + this.phaseQueue[phaseIndex] = phase; + return true; + } + return false; + } + + tryRemovePhase(phaseFilter: (phase: Phase) => boolean): boolean { + const phaseIndex = this.phaseQueue.findIndex(phaseFilter); + if (phaseIndex > -1) { + this.phaseQueue.splice(phaseIndex, 1); + return true; + } + return false; + } + + pushMovePhase(movePhase: MovePhase, priorityOverride?: integer): void { + const movePriority = new Utils.IntegerHolder(priorityOverride !== undefined ? priorityOverride : movePhase.move.getMove().priority); + applyAbAttrs(IncrementMovePriorityAbAttr, movePhase.pokemon, null, movePhase.move.getMove(), movePriority); + const lowerPriorityPhase = this.phaseQueue.find(p => p instanceof MovePhase && p.move.getMove().priority < movePriority.value); + if (lowerPriorityPhase) { + this.phaseQueue.splice(this.phaseQueue.indexOf(lowerPriorityPhase), 0, movePhase); + } else { + this.pushPhase(movePhase); + } + } + + queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) { + const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); + if (!defer) { + this.unshiftPhase(phase); + } else { + this.pushPhase(phase); + } + } + + populatePhaseQueue(): void { + if (this.nextCommandPhaseQueue.length) { + this.phaseQueue.push(...this.nextCommandPhaseQueue); + this.nextCommandPhaseQueue.splice(0, this.nextCommandPhaseQueue.length); + } + this.phaseQueue.push(new TurnInitPhase(this)); + } + + addMoney(amount: integer): void { + this.money = Math.min(this.money + amount, Number.MAX_SAFE_INTEGER); + this.updateMoneyText(); + this.validateAchvs(MoneyAchv); + } + + getWaveMoneyAmount(moneyMultiplier: number): integer { + const waveIndex = this.currentBattle.waveIndex; + const waveSetIndex = Math.ceil(waveIndex / 10) - 1; + const moneyValue = Math.pow((waveSetIndex + 1 + (0.75 + (((waveIndex - 1) % 10) + 1) / 10)) * 100, 1 + 0.005 * waveSetIndex) * moneyMultiplier; + return Math.floor(moneyValue / 10) * 10; + } + + addModifier(modifier: Modifier, ignoreUpdate?: boolean, playSound?: boolean, virtual?: boolean, instant?: boolean): Promise { + return new Promise(resolve => { + let success = false; + const soundName = modifier.type.soundName; + this.validateAchvs(ModifierAchv, modifier); + const modifiersToRemove: PersistentModifier[] = []; + const modifierPromises: Promise[] = []; + if (modifier instanceof PersistentModifier) { + if (modifier instanceof TerastallizeModifier) { + modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId))); + } + if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) { + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + success = modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); + } + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + } else if (!virtual) { + const defaultModifierType = getDefaultModifierTypeForTier(modifier.type.tier); + this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, null, true); + return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); + } - for (let rm of modifiersToRemove) - this.removeModifier(rm); - - if (!ignoreUpdate && !virtual) - return this.updateModifiers(true, instant).then(() => resolve(success)); - } else if (modifier instanceof ConsumableModifier) { - if (playSound && !this.sound.get(soundName)) - this.playSound(soundName); - - if (modifier instanceof ConsumablePokemonModifier) { - for (let p in this.party) { - const pokemon = this.party[p]; - - const args: any[] = [ pokemon ]; - if (modifier instanceof PokemonHpRestoreModifier) { - if (!(modifier as PokemonHpRestoreModifier).fainted) { - const hpRestoreMultiplier = new Utils.IntegerHolder(1); - this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); - args.push(hpRestoreMultiplier.value); - } else - args.push(1); - } else if (modifier instanceof FusePokemonModifier) - args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); + for (const rm of modifiersToRemove) { + this.removeModifier(rm); + } + + if (!ignoreUpdate && !virtual) { + return this.updateModifiers(true, instant).then(() => resolve(success)); + } + } else if (modifier instanceof ConsumableModifier) { + if (playSound && !this.sound.get(soundName)) { + this.playSound(soundName); + } + + if (modifier instanceof ConsumablePokemonModifier) { + for (const p in this.party) { + const pokemon = this.party[p]; + + const args: any[] = [ pokemon ]; + if (modifier instanceof PokemonHpRestoreModifier) { + if (!(modifier as PokemonHpRestoreModifier).fainted) { + const hpRestoreMultiplier = new Utils.IntegerHolder(1); + this.applyModifiers(HealingBoosterModifier, true, hpRestoreMultiplier); + args.push(hpRestoreMultiplier.value); + } else { + args.push(1); + } + } else if (modifier instanceof FusePokemonModifier) { + args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); + } - if (modifier.shouldApply(args)) { - const result = modifier.apply(args); - if (result instanceof Promise) - modifierPromises.push(result.then(s => success ||= s)); - else - success ||= result; - } - } + if (modifier.shouldApply(args)) { + const result = modifier.apply(args); + if (result instanceof Promise) { + modifierPromises.push(result.then(s => success ||= s)); + } else { + success ||= result; + } + } + } - return Promise.allSettled([this.party.map(p => p.updateInfo(instant)), ...modifierPromises]).then(() => resolve(success)); - } else { - const args = [ this ]; - if (modifier.shouldApply(args)) { - const result = modifier.apply(args); - if (result instanceof Promise) { - return result.then(success => resolve(success)); - } else - success ||= result; - } - } - } - - resolve(success); - }); - } - - addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { - return new Promise(resolve => { - const modifiersToRemove: PersistentModifier[] = []; - if (modifier instanceof TerastallizeModifier) - modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); - if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) { - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) - modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); - for (let rm of modifiersToRemove) - this.removeModifier(rm, true); - } - if (!ignoreUpdate) - this.updateModifiers(false, instant).then(() => resolve()); - else - resolve(); - }); - } - - tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferStack: boolean, playSound: boolean, instant?: boolean, ignoreUpdate?: boolean): Promise { - return new Promise(resolve => { - const source = itemModifier.pokemonId ? itemModifier.getPokemon(target.scene) : null; - const cancelled = new Utils.BooleanHolder(false); - Utils.executeIf(source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source, cancelled)).then(() => { - if (cancelled.value) - return resolve(false); - const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; - newItemModifier.pokemonId = target.id; - const matchingModifier = target.scene.findModifier(m => m instanceof PokemonHeldItemModifier + return Promise.allSettled([this.party.map(p => p.updateInfo(instant)), ...modifierPromises]).then(() => resolve(success)); + } else { + const args = [ this ]; + if (modifier.shouldApply(args)) { + const result = modifier.apply(args); + if (result instanceof Promise) { + return result.then(success => resolve(success)); + } else { + success ||= result; + } + } + } + } + + resolve(success); + }); + } + + addEnemyModifier(modifier: PersistentModifier, ignoreUpdate?: boolean, instant?: boolean): Promise { + return new Promise(resolve => { + const modifiersToRemove: PersistentModifier[] = []; + if (modifier instanceof TerastallizeModifier) { + modifiersToRemove.push(...(this.findModifiers(m => m instanceof TerastallizeModifier && m.pokemonId === modifier.pokemonId, false))); + } + if ((modifier as PersistentModifier).add(this.enemyModifiers, false, this)) { + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + modifier.apply([ this.getPokemonById(modifier.pokemonId), true ]); + } + for (const rm of modifiersToRemove) { + this.removeModifier(rm, true); + } + } + if (!ignoreUpdate) { + this.updateModifiers(false, instant).then(() => resolve()); + } else { + resolve(); + } + }); + } + + tryTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferStack: boolean, playSound: boolean, instant?: boolean, ignoreUpdate?: boolean): Promise { + return new Promise(resolve => { + const source = itemModifier.pokemonId ? itemModifier.getPokemon(target.scene) : null; + const cancelled = new Utils.BooleanHolder(false); + Utils.executeIf(source && source.isPlayer() !== target.isPlayer(), () => applyAbAttrs(BlockItemTheftAbAttr, source, cancelled)).then(() => { + if (cancelled.value) { + return resolve(false); + } + const newItemModifier = itemModifier.clone() as PokemonHeldItemModifier; + newItemModifier.pokemonId = target.id; + const matchingModifier = target.scene.findModifier(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).matchType(itemModifier) && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier; - let removeOld = true; - if (matchingModifier) { - const maxStackCount = matchingModifier.getMaxStackCount(target.scene); - if (matchingModifier.stackCount >= maxStackCount) - return resolve(false); - const countTaken = transferStack ? Math.min(itemModifier.stackCount, maxStackCount - matchingModifier.stackCount) : 1; - itemModifier.stackCount -= countTaken; - newItemModifier.stackCount = matchingModifier.stackCount + countTaken; - removeOld = !itemModifier.stackCount; - } else if (!transferStack) { - newItemModifier.stackCount = 1; - removeOld = !(--itemModifier.stackCount); - } - if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { - const addModifier = () => { - if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { - if (target.isPlayer()) - this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => resolve(true)); - else - this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => resolve(true)); - } else - resolve(false); - }; - if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) - this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); - else - addModifier(); - return; - } - resolve(false); - }); - }); - } - - removePartyMemberModifiers(partyMemberIndex: integer): Promise { - return new Promise(resolve => { - const pokemonId = this.getParty()[partyMemberIndex].id; - const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); - for (let m of modifiersToRemove) - this.modifiers.splice(this.modifiers.indexOf(m), 1); - this.updateModifiers().then(() => resolve()); - }); - } - - generateEnemyModifiers(): Promise { - return new Promise(resolve => { - if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) - return resolve(); - const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); - const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); - let chances = Math.ceil(difficultyWaveIndex / 10); - if (isFinalBoss) - chances = Math.ceil(chances * 2.5); - - const party = this.getEnemyParty(); - - if (this.currentBattle.trainer) { - const modifiers = this.currentBattle.trainer.genModifiers(party); - for (let modifier of modifiers) - this.addEnemyModifier(modifier, true, true); - } - - party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); - let upgradeChance = 32; - if (isBoss) - upgradeChance /= 2; - if (isFinalBoss) - upgradeChance /= 8; - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); - let count = 0; - for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) - count++; - } - if (isBoss) - count = Math.max(count, Math.floor(chances / 2)); - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); - }); - - this.updateModifiers(false).then(() => resolve()); - }); - } - - /** + let removeOld = true; + if (matchingModifier) { + const maxStackCount = matchingModifier.getMaxStackCount(target.scene); + if (matchingModifier.stackCount >= maxStackCount) { + return resolve(false); + } + const countTaken = transferStack ? Math.min(itemModifier.stackCount, maxStackCount - matchingModifier.stackCount) : 1; + itemModifier.stackCount -= countTaken; + newItemModifier.stackCount = matchingModifier.stackCount + countTaken; + removeOld = !itemModifier.stackCount; + } else if (!transferStack) { + newItemModifier.stackCount = 1; + removeOld = !(--itemModifier.stackCount); + } + if (!removeOld || !source || this.removeModifier(itemModifier, !source.isPlayer())) { + const addModifier = () => { + if (!matchingModifier || this.removeModifier(matchingModifier, !target.isPlayer())) { + if (target.isPlayer()) { + this.addModifier(newItemModifier, ignoreUpdate, playSound, false, instant).then(() => resolve(true)); + } else { + this.addEnemyModifier(newItemModifier, ignoreUpdate, instant).then(() => resolve(true)); + } + } else { + resolve(false); + } + }; + if (source && source.isPlayer() !== target.isPlayer() && !ignoreUpdate) { + this.updateModifiers(source.isPlayer(), instant).then(() => addModifier()); + } else { + addModifier(); + } + return; + } + resolve(false); + }); + }); + } + + removePartyMemberModifiers(partyMemberIndex: integer): Promise { + return new Promise(resolve => { + const pokemonId = this.getParty()[partyMemberIndex].id; + const modifiersToRemove = this.modifiers.filter(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemonId); + for (const m of modifiersToRemove) { + this.modifiers.splice(this.modifiers.indexOf(m), 1); + } + this.updateModifiers().then(() => resolve()); + }); + } + + generateEnemyModifiers(): Promise { + return new Promise(resolve => { + if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + return resolve(); + } + const difficultyWaveIndex = this.gameMode.getWaveForDifficulty(this.currentBattle.waveIndex); + const isFinalBoss = this.gameMode.isWaveFinal(this.currentBattle.waveIndex); + let chances = Math.ceil(difficultyWaveIndex / 10); + if (isFinalBoss) { + chances = Math.ceil(chances * 2.5); + } + + const party = this.getEnemyParty(); + + if (this.currentBattle.trainer) { + const modifiers = this.currentBattle.trainer.genModifiers(party); + for (const modifier of modifiers) { + this.addEnemyModifier(modifier, true, true); + } + } + + party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { + const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); + let upgradeChance = 32; + if (isBoss) { + upgradeChance /= 2; + } + if (isFinalBoss) { + upgradeChance /= 8; + } + const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); + let pokemonModifierChance = modifierChance; + if (this.currentBattle.battleType === BattleType.TRAINER) + pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line + let count = 0; + for (let c = 0; c < chances; c++) { + if (!Utils.randSeedInt(modifierChance)) { + count++; + } + } + if (isBoss) { + count = Math.max(count, Math.floor(chances / 2)); + } + getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) + .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + }); + + this.updateModifiers(false).then(() => resolve()); + }); + } + + /** * Removes all modifiers from enemy of PersistentModifier type */ - clearEnemyModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); - for (let m of modifiersToRemove) - this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); - this.updateModifiers(false).then(() => this.updateUIPositions()); - } - - /** + clearEnemyModifiers(): void { + const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PersistentModifier); + for (const m of modifiersToRemove) { + this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); + } + this.updateModifiers(false).then(() => this.updateUIPositions()); + } + + /** * Removes all modifiers from enemy of PokemonHeldItemModifier type */ - clearEnemyHeldItemModifiers(): void { - const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier); - for (let m of modifiersToRemove) - this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); - this.updateModifiers(false).then(() => this.updateUIPositions()); - } - - setModifiersVisible(visible: boolean) { - [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); - } - - updateModifiers(player?: boolean, instant?: boolean): Promise { - if (player === undefined) - player = true; - return new Promise(resolve => { - const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; - for (let m = 0; m < modifiers.length; m++) { - const modifier = modifiers[m]; - if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) - modifiers.splice(m--, 1); - } - for (let modifier of modifiers) { - if (modifier instanceof PersistentModifier) - (modifier as PersistentModifier).virtualStackCount = 0; - } - - const modifiersClone = modifiers.slice(0); - for (let modifier of modifiersClone) { - if (!modifier.getStackCount()) - modifiers.splice(modifiers.indexOf(modifier), 1); - } - - this.updatePartyForModifiers(player ? this.getParty() : this.getEnemyParty(), instant).then(() => { - (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); - if (!player) - this.updateUIPositions(); - resolve(); - }); - }); - } - - updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { - return new Promise(resolve => { - Promise.allSettled(party.map(p => { - if (p.scene) - p.calculateStats(); - return p.updateInfo(instant); - })).then(() => resolve()); - }); - } - - removeModifier(modifier: PersistentModifier, enemy?: boolean): boolean { - const modifiers = !enemy ? this.modifiers : this.enemyModifiers; - const modifierIndex = modifiers.indexOf(modifier); - if (modifierIndex > -1) { - modifiers.splice(modifierIndex, 1); - if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) - modifier.apply([ this.getPokemonById(modifier.pokemonId), false ]); - return true; - } - - return false; - } - - getModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true): PersistentModifier[] { - return (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType); - } - - findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] { - return (player ? this.modifiers : this.enemyModifiers).filter(m => (modifierFilter as ModifierPredicate)(m)); - } - - findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier { - return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m)); - } - - applyShuffledModifiers(scene: BattleScene, modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { - let modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); - scene.executeWithSeedOffset(() => { - const shuffleModifiers = mods => { - if (mods.length < 1) - return mods; - const rand = Math.floor(Utils.randSeedInt(mods.length)); - return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; - }; - modifiers = shuffleModifiers(modifiers); - }, scene.currentBattle.turn << 4, scene.waveSeed); - return this.applyModifiersInternal(modifiers, player, args); - } - - applyModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); - return this.applyModifiersInternal(modifiers, player, args); - } - - applyModifiersInternal(modifiers: PersistentModifier[], player: boolean, args: any[]): PersistentModifier[] { - const appliedModifiers: PersistentModifier[] = []; - for (let modifier of modifiers) { - if (modifier.apply(args)) { - console.log('Applied', modifier.type.name, !player ? '(enemy)' : ''); - appliedModifiers.push(modifier); - } - } - - return appliedModifiers; - } - - applyModifier(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier { - const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); - for (let modifier of modifiers) { - if (modifier.apply(args)) { - console.log('Applied', modifier.type.name, !player ? '(enemy)' : ''); - return modifier; - } - } - - return null; - } - - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: { new(...args: any[]): SpeciesFormChangeTrigger }, delayed: boolean = false, modal: boolean = false): boolean { - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { - const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); - if (matchingFormChange) { - let phase: Phase; - if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet) - phase = new FormChangePhase(this, pokemon, matchingFormChange, modal); - else - phase = new QuietFormChangePhase(this, pokemon, matchingFormChange); - if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) - this.overridePhase(phase); - else if (delayed) - this.pushPhase(phase); - else - this.unshiftPhase(phase); - return true; - } - } - - return false; - } - - validateAchvs(achvType: { new(...args: any[]): Achv }, ...args: any[]): void { - const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); - for (let achv of filteredAchvs) - this.validateAchv(achv, args); - } - - validateAchv(achv: Achv, args?: any[]): boolean { - if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) { - this.gameData.achvUnlocks[achv.id] = new Date().getTime(); - this.ui.achvBar.showAchv(achv); - if (vouchers.hasOwnProperty(achv.id)) - this.validateVoucher(vouchers[achv.id]); - return true; - } - - return false; - } - - validateVoucher(voucher: Voucher, args?: any[]): boolean { - if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(this, args)) { - this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); - this.ui.achvBar.showAchv(voucher); - this.gameData.voucherCounts[voucher.voucherType]++; - return true; - } - - return false; - } + clearEnemyHeldItemModifiers(): void { + const modifiersToRemove = this.enemyModifiers.filter(m => m instanceof PokemonHeldItemModifier); + for (const m of modifiersToRemove) { + this.enemyModifiers.splice(this.enemyModifiers.indexOf(m), 1); + } + this.updateModifiers(false).then(() => this.updateUIPositions()); + } + + setModifiersVisible(visible: boolean) { + [ this.modifierBar, this.enemyModifierBar ].map(m => m.setVisible(visible)); + } + + updateModifiers(player?: boolean, instant?: boolean): Promise { + if (player === undefined) { + player = true; + } + return new Promise(resolve => { + const modifiers = player ? this.modifiers : this.enemyModifiers as PersistentModifier[]; + for (let m = 0; m < modifiers.length; m++) { + const modifier = modifiers[m]; + if (modifier instanceof PokemonHeldItemModifier && !this.getPokemonById((modifier as PokemonHeldItemModifier).pokemonId)) { + modifiers.splice(m--, 1); + } + } + for (const modifier of modifiers) { + if (modifier instanceof PersistentModifier) { + (modifier as PersistentModifier).virtualStackCount = 0; + } + } + + const modifiersClone = modifiers.slice(0); + for (const modifier of modifiersClone) { + if (!modifier.getStackCount()) { + modifiers.splice(modifiers.indexOf(modifier), 1); + } + } + + this.updatePartyForModifiers(player ? this.getParty() : this.getEnemyParty(), instant).then(() => { + (player ? this.modifierBar : this.enemyModifierBar).updateModifiers(modifiers); + if (!player) { + this.updateUIPositions(); + } + resolve(); + }); + }); + } + + updatePartyForModifiers(party: Pokemon[], instant?: boolean): Promise { + return new Promise(resolve => { + Promise.allSettled(party.map(p => { + if (p.scene) { + p.calculateStats(); + } + return p.updateInfo(instant); + })).then(() => resolve()); + }); + } + + removeModifier(modifier: PersistentModifier, enemy?: boolean): boolean { + const modifiers = !enemy ? this.modifiers : this.enemyModifiers; + const modifierIndex = modifiers.indexOf(modifier); + if (modifierIndex > -1) { + modifiers.splice(modifierIndex, 1); + if (modifier instanceof PokemonFormChangeItemModifier || modifier instanceof TerastallizeModifier) { + modifier.apply([ this.getPokemonById(modifier.pokemonId), false ]); + } + return true; + } + + return false; + } + + getModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true): PersistentModifier[] { + return (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType); + } + + findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] { + return (player ? this.modifiers : this.enemyModifiers).filter(m => (modifierFilter as ModifierPredicate)(m)); + } + + findModifier(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier { + return (player ? this.modifiers : this.enemyModifiers).find(m => (modifierFilter as ModifierPredicate)(m)); + } + + applyShuffledModifiers(scene: BattleScene, modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { + let modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); + scene.executeWithSeedOffset(() => { + const shuffleModifiers = mods => { + if (mods.length < 1) { + return mods; + } + const rand = Math.floor(Utils.randSeedInt(mods.length)); + return [mods[rand], ...shuffleModifiers(mods.filter((_, i) => i !== rand))]; + }; + modifiers = shuffleModifiers(modifiers); + }, scene.currentBattle.turn << 4, scene.waveSeed); + return this.applyModifiersInternal(modifiers, player, args); + } + + applyModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); + return this.applyModifiersInternal(modifiers, player, args); + } + + applyModifiersInternal(modifiers: PersistentModifier[], player: boolean, args: any[]): PersistentModifier[] { + const appliedModifiers: PersistentModifier[] = []; + for (const modifier of modifiers) { + if (modifier.apply(args)) { + console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); + appliedModifiers.push(modifier); + } + } + + return appliedModifiers; + } + + applyModifier(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier { + const modifiers = (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType && m.shouldApply(args)); + for (const modifier of modifiers) { + if (modifier.apply(args)) { + console.log("Applied", modifier.type.name, !player ? "(enemy)" : ""); + return modifier; + } + } + + return null; + } + + triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: { new(...args: any[]): SpeciesFormChangeTrigger }, delayed: boolean = false, modal: boolean = false): boolean { + if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { + const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + if (matchingFormChange) { + let phase: Phase; + if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet) { + phase = new FormChangePhase(this, pokemon, matchingFormChange, modal); + } else { + phase = new QuietFormChangePhase(this, pokemon, matchingFormChange); + } + if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet && modal) { + this.overridePhase(phase); + } else if (delayed) { + this.pushPhase(phase); + } else { + this.unshiftPhase(phase); + } + return true; + } + } + + return false; + } + + validateAchvs(achvType: { new(...args: any[]): Achv }, ...args: any[]): void { + const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); + for (const achv of filteredAchvs) { + this.validateAchv(achv, args); + } + } + + validateAchv(achv: Achv, args?: any[]): boolean { + if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) { + this.gameData.achvUnlocks[achv.id] = new Date().getTime(); + this.ui.achvBar.showAchv(achv); + if (vouchers.hasOwnProperty(achv.id)) { + this.validateVoucher(vouchers[achv.id]); + } + return true; + } + + return false; + } + + validateVoucher(voucher: Voucher, args?: any[]): boolean { + if (!this.gameData.voucherUnlocks.hasOwnProperty(voucher.id) && voucher.validate(this, args)) { + this.gameData.voucherUnlocks[voucher.id] = new Date().getTime(); + this.ui.achvBar.showAchv(voucher); + this.gameData.voucherCounts[voucher.voucherType]++; + return true; + } + + return false; + } - updateGameInfo(): void { - const gameInfo = { - playTime: this.sessionPlayTime ? this.sessionPlayTime : 0, - gameMode: this.currentBattle ? this.gameMode.getName() : 'Title', - biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : '', - wave: this.currentBattle?.waveIndex || 0, - party: this.party ? this.party.map(p => { - return { name: p.name, level: p.level }; - }) : [] - }; - (window as any).gameInfo = gameInfo; - } -} \ No newline at end of file + updateGameInfo(): void { + const gameInfo = { + playTime: this.sessionPlayTime ? this.sessionPlayTime : 0, + gameMode: this.currentBattle ? this.gameMode.getName() : "Title", + biome: this.currentBattle ? getBiomeName(this.arena.biomeType) : "", + wave: this.currentBattle?.waveIndex || 0, + party: this.party ? this.party.map(p => { + return { name: p.name, level: p.level }; + }) : [] + }; + (window as any).gameInfo = gameInfo; + } +} diff --git a/src/battle.ts b/src/battle.ts index 56186b2570da..0312cf2c3b6c 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -10,7 +10,6 @@ import { GameMode } from "./game-mode"; import { BattleSpec } from "./enums/battle-spec"; import { PlayerGender } from "./system/game-data"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; -import { MoneyAchv } from "./system/achv"; import { PokeballType } from "./data/pokeball"; export enum BattleType { @@ -34,268 +33,284 @@ export interface TurnCommand { targets?: BattlerIndex[]; skip?: boolean; args?: any[]; -}; +} interface TurnCommands { [key: integer]: TurnCommand } export default class Battle { - protected gameMode: GameMode; - public waveIndex: integer; - public battleType: BattleType; - public battleSpec: BattleSpec; - public trainer: Trainer; - public enemyLevels: integer[]; - public enemyParty: EnemyPokemon[]; - public seenEnemyPartyMemberIds: Set; - public double: boolean; - public started: boolean; - public enemySwitchCounter: integer; - public turn: integer; - public turnCommands: TurnCommands; - public playerParticipantIds: Set; - public battleScore: integer; - public postBattleLoot: PokemonHeldItemModifier[]; - public escapeAttempts: integer; - public lastMove: Moves; - public battleSeed: string; - private battleSeedState: string; - public moneyScattered: number; - public lastUsedPokeball: PokeballType; - - private rngCounter: integer = 0; - - constructor(gameMode: GameMode, waveIndex: integer, battleType: BattleType, trainer: Trainer, double: boolean) { - this.gameMode = gameMode; - this.waveIndex = waveIndex; - this.battleType = battleType; - this.trainer = trainer; - this.initBattleSpec(); - this.enemyLevels = battleType !== BattleType.TRAINER - ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) - : trainer.getPartyLevels(this.waveIndex); - this.enemyParty = []; - this.seenEnemyPartyMemberIds = new Set(); - this.double = double; - this.enemySwitchCounter = 0; - this.turn = 0; - this.playerParticipantIds = new Set(); - this.battleScore = 0; - this.postBattleLoot = []; - this.escapeAttempts = 0; - this.started = false; - this.battleSeed = Utils.randomString(16, true); - this.battleSeedState = null; - this.moneyScattered = 0; - this.lastUsedPokeball = null; + protected gameMode: GameMode; + public waveIndex: integer; + public battleType: BattleType; + public battleSpec: BattleSpec; + public trainer: Trainer; + public enemyLevels: integer[]; + public enemyParty: EnemyPokemon[]; + public seenEnemyPartyMemberIds: Set; + public double: boolean; + public started: boolean; + public enemySwitchCounter: integer; + public turn: integer; + public turnCommands: TurnCommands; + public playerParticipantIds: Set; + public battleScore: integer; + public postBattleLoot: PokemonHeldItemModifier[]; + public escapeAttempts: integer; + public lastMove: Moves; + public battleSeed: string; + private battleSeedState: string; + public moneyScattered: number; + public lastUsedPokeball: PokeballType; + + private rngCounter: integer = 0; + + constructor(gameMode: GameMode, waveIndex: integer, battleType: BattleType, trainer: Trainer, double: boolean) { + this.gameMode = gameMode; + this.waveIndex = waveIndex; + this.battleType = battleType; + this.trainer = trainer; + this.initBattleSpec(); + this.enemyLevels = battleType !== BattleType.TRAINER + ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) + : trainer.getPartyLevels(this.waveIndex); + this.enemyParty = []; + this.seenEnemyPartyMemberIds = new Set(); + this.double = double; + this.enemySwitchCounter = 0; + this.turn = 0; + this.playerParticipantIds = new Set(); + this.battleScore = 0; + this.postBattleLoot = []; + this.escapeAttempts = 0; + this.started = false; + this.battleSeed = Utils.randomString(16, true); + this.battleSeedState = null; + this.moneyScattered = 0; + this.lastUsedPokeball = null; + } + + private initBattleSpec(): void { + let spec = BattleSpec.DEFAULT; + if (this.gameMode.isWaveFinal(this.waveIndex) && this.gameMode.isClassic) { + spec = BattleSpec.FINAL_BOSS; } - - private initBattleSpec(): void { - let spec = BattleSpec.DEFAULT; - if (this.gameMode.isWaveFinal(this.waveIndex) && this.gameMode.isClassic) - spec = BattleSpec.FINAL_BOSS; - this.battleSpec = spec; + this.battleSpec = spec; + } + + private getLevelForWave(): integer { + const levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex); + const baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2); + const bossMultiplier = 1.2; + + if (this.gameMode.isBoss(this.waveIndex)) { + const ret = Math.floor(baseLevel * bossMultiplier); + if (this.battleSpec === BattleSpec.FINAL_BOSS || !(this.waveIndex % 250)) { + return Math.ceil(ret / 25) * 25; + } + let levelOffset = 0; + if (!this.gameMode.isWaveFinal(this.waveIndex)) { + levelOffset = Math.round(Phaser.Math.RND.realInRange(-1, 1) * Math.floor(levelWaveIndex / 10)); + } + return ret + levelOffset; } - private getLevelForWave(): integer { - let levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex); - let baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2); - const bossMultiplier = 1.2; - - if (this.gameMode.isBoss(this.waveIndex)) { - const ret = Math.floor(baseLevel * bossMultiplier); - if (this.battleSpec === BattleSpec.FINAL_BOSS || !(this.waveIndex % 250)) - return Math.ceil(ret / 25) * 25; - let levelOffset = 0; - if (!this.gameMode.isWaveFinal(this.waveIndex)) - levelOffset = Math.round(Phaser.Math.RND.realInRange(-1, 1) * Math.floor(levelWaveIndex / 10)); - return ret + levelOffset; - } - - let levelOffset = 0; + let levelOffset = 0; - const deviation = 10 / levelWaveIndex; - levelOffset = Math.abs(this.randSeedGaussForLevel(deviation)); + const deviation = 10 / levelWaveIndex; + levelOffset = Math.abs(this.randSeedGaussForLevel(deviation)); - return Math.max(Math.round(baseLevel + levelOffset), 1); - } - - randSeedGaussForLevel(value: number): number { - let rand = 0; - for (let i = value; i > 0; i--) - rand += Phaser.Math.RND.realInRange(0, 1); - return rand / value; - } - - getBattlerCount(): integer { - return this.double ? 2 : 1; - } + return Math.max(Math.round(baseLevel + levelOffset), 1); + } - incrementTurn(scene: BattleScene): void { - this.turn++; - this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); - this.battleSeedState = null; + randSeedGaussForLevel(value: number): number { + let rand = 0; + for (let i = value; i > 0; i--) { + rand += Phaser.Math.RND.realInRange(0, 1); } + return rand / value; + } + + getBattlerCount(): integer { + return this.double ? 2 : 1; + } + + incrementTurn(scene: BattleScene): void { + this.turn++; + this.turnCommands = Object.fromEntries(Utils.getEnumValues(BattlerIndex).map(bt => [ bt, null ])); + this.battleSeedState = null; + } + + addParticipant(playerPokemon: PlayerPokemon): void { + this.playerParticipantIds.add(playerPokemon.id); + } + + removeFaintedParticipant(playerPokemon: PlayerPokemon): void { + this.playerParticipantIds.delete(playerPokemon.id); + } + + addPostBattleLoot(enemyPokemon: EnemyPokemon): void { + this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.getTransferrable(false), false).map(i => { + const ret = i as PokemonHeldItemModifier; + ret.pokemonId = null; + return ret; + })); + } + + pickUpScatteredMoney(scene: BattleScene): void { + const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); + scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + + scene.addMoney(moneyAmount.value); + + scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); - addParticipant(playerPokemon: PlayerPokemon): void { - this.playerParticipantIds.add(playerPokemon.id); - } + scene.currentBattle.moneyScattered = 0; + } - removeFaintedParticipant(playerPokemon: PlayerPokemon): void { - this.playerParticipantIds.delete(playerPokemon.id); + addBattleScore(scene: BattleScene): void { + let partyMemberTurnMultiplier = scene.getEnemyParty().length / 2 + 0.5; + if (this.double) { + partyMemberTurnMultiplier /= 1.5; } - - addPostBattleLoot(enemyPokemon: EnemyPokemon): void { - this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.getTransferrable(false), false).map(i => { - const ret = i as PokemonHeldItemModifier; - ret.pokemonId = null; - return ret; - })); + for (const p of scene.getEnemyParty()) { + if (p.isBoss()) { + partyMemberTurnMultiplier *= (p.bossSegments / 1.5) / scene.getEnemyParty().length; + } } - - pickUpScatteredMoney(scene: BattleScene): void { - const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); - scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - - scene.addMoney(moneyAmount.value); - - scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString('en-US')}!`, null, true); - - scene.currentBattle.moneyScattered = 0; + const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier)); + const finalBattleScore = Math.ceil(this.battleScore * turnMultiplier); + scene.score += finalBattleScore; + console.log(`Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`); + console.log(`Total Score: ${scene.score}`); + scene.updateScoreText(); + } + + getBgmOverride(scene: BattleScene): string { + const battlers = this.enemyParty.slice(0, this.getBattlerCount()); + if (this.battleType === BattleType.TRAINER) { + if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages()?.length) { + return `encounter_${this.trainer.getEncounterBgm()}`; + } + return this.trainer.getBattleBgm(); + } else if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) { + return "end_summit"; } - - addBattleScore(scene: BattleScene): void { - let partyMemberTurnMultiplier = scene.getEnemyParty().length / 2 + 0.5; - if (this.double) - partyMemberTurnMultiplier /= 1.5; - for (let p of scene.getEnemyParty()) { - if (p.isBoss()) - partyMemberTurnMultiplier *= (p.bossSegments / 1.5) / scene.getEnemyParty().length; + for (const pokemon of battlers) { + if (this.battleSpec === BattleSpec.FINAL_BOSS) { + if (pokemon.formIndex) { + return "battle_final"; + } + return "battle_final_encounter"; + } + if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) { + if (pokemon.species.speciesId === Species.REGIROCK || pokemon.species.speciesId === Species.REGICE || pokemon.species.speciesId === Species.REGISTEEL || pokemon.species.speciesId === Species.REGIGIGAS || pokemon.species.speciesId === Species.REGIELEKI || pokemon.species.speciesId === Species.REGIDRAGO) { + return "battle_legendary_regis"; + } + if (pokemon.species.speciesId === Species.COBALION || pokemon.species.speciesId === Species.TERRAKION || pokemon.species.speciesId === Species.VIRIZION || pokemon.species.speciesId === Species.TORNADUS || pokemon.species.speciesId === Species.THUNDURUS || pokemon.species.speciesId === Species.LANDORUS || pokemon.species.speciesId === Species.KELDEO || pokemon.species.speciesId === Species.MELOETTA || pokemon.species.speciesId === Species.GENESECT) { + return "battle_legendary_unova"; } - const turnMultiplier = Phaser.Tweens.Builders.GetEaseFunction('Sine.easeIn')(1 - Math.min(this.turn - 2, 10 * partyMemberTurnMultiplier) / (10 * partyMemberTurnMultiplier)); - const finalBattleScore = Math.ceil(this.battleScore * turnMultiplier); - scene.score += finalBattleScore; - console.log(`Battle Score: ${finalBattleScore} (${this.turn - 1} Turns x${Math.floor(turnMultiplier * 100) / 100})`); - console.log(`Total Score: ${scene.score}`); - scene.updateScoreText(); + if (pokemon.species.speciesId === Species.RESHIRAM || pokemon.species.speciesId === Species.ZEKROM) { + return "battle_legendary_res_zek"; + } + if (pokemon.species.speciesId === Species.KYUREM) { + return "battle_legendary_kyurem"; + } + if (pokemon.species.legendary) { + return "battle_legendary_res_zek"; + } + return "battle_legendary_unova"; + } } - getBgmOverride(scene: BattleScene): string { - const battlers = this.enemyParty.slice(0, this.getBattlerCount()); - if (this.battleType === BattleType.TRAINER) { - if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages()?.length) - return `encounter_${this.trainer.getEncounterBgm()}`; - return this.trainer.getBattleBgm(); - } else if (this.gameMode.isClassic && this.waveIndex > 195 && this.battleSpec !== BattleSpec.FINAL_BOSS) - return 'end_summit'; - for (let pokemon of battlers) { - if (this.battleSpec === BattleSpec.FINAL_BOSS) { - if (pokemon.formIndex) - return 'battle_final'; - return 'battle_final_encounter'; - } - if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) { - if (pokemon.species.speciesId === Species.REGIROCK || pokemon.species.speciesId === Species.REGICE || pokemon.species.speciesId === Species.REGISTEEL || pokemon.species.speciesId === Species.REGIGIGAS || pokemon.species.speciesId === Species.REGIELEKI || pokemon.species.speciesId === Species.REGIDRAGO) - return 'battle_legendary_regis'; - if (pokemon.species.speciesId === Species.COBALION || pokemon.species.speciesId === Species.TERRAKION || pokemon.species.speciesId === Species.VIRIZION || pokemon.species.speciesId === Species.TORNADUS || pokemon.species.speciesId === Species.THUNDURUS || pokemon.species.speciesId === Species.LANDORUS || pokemon.species.speciesId === Species.KELDEO || pokemon.species.speciesId === Species.MELOETTA || pokemon.species.speciesId === Species.GENESECT) - return 'battle_legendary_unova'; - if (pokemon.species.speciesId === Species.RESHIRAM || pokemon.species.speciesId === Species.ZEKROM) - return 'battle_legendary_res_zek'; - if (pokemon.species.speciesId === Species.KYUREM) - return 'battle_legendary_kyurem'; - if (pokemon.species.legendary) - return 'battle_legendary_res_zek'; - return 'battle_legendary_unova'; - } - } + if (scene.gameMode.isClassic && this.waveIndex <= 4) { + return "battle_wild"; + } - if (scene.gameMode.isClassic && this.waveIndex <= 4) - return 'battle_wild'; + return null; + } - return null; + randSeedInt(scene: BattleScene, range: integer, min: integer = 0): integer { + if (range <= 1) { + return min; } - - randSeedInt(scene: BattleScene, range: integer, min: integer = 0): integer { - if (range <= 1) - return min; - let ret: integer; - const tempRngCounter = scene.rngCounter; - const tempSeedOverride = scene.rngSeedOverride; - const state = Phaser.Math.RND.state(); - if (this.battleSeedState) - Phaser.Math.RND.state(this.battleSeedState); - else { - Phaser.Math.RND.sow([ Utils.shiftCharCodes(this.battleSeed, this.turn << 6) ]); - console.log('Battle Seed:', this.battleSeed); - } - scene.rngCounter = this.rngCounter++; - scene.rngSeedOverride = this.battleSeed; - ret = Utils.randSeedInt(range, min); - this.battleSeedState = Phaser.Math.RND.state(); - Phaser.Math.RND.state(state); - scene.rngCounter = tempRngCounter; - scene.rngSeedOverride = tempSeedOverride; - return ret; + const tempRngCounter = scene.rngCounter; + const tempSeedOverride = scene.rngSeedOverride; + const state = Phaser.Math.RND.state(); + if (this.battleSeedState) { + Phaser.Math.RND.state(this.battleSeedState); + } else { + Phaser.Math.RND.sow([ Utils.shiftCharCodes(this.battleSeed, this.turn << 6) ]); + console.log("Battle Seed:", this.battleSeed); } + scene.rngCounter = this.rngCounter++; + scene.rngSeedOverride = this.battleSeed; + const ret = Utils.randSeedInt(range, min); + this.battleSeedState = Phaser.Math.RND.state(); + Phaser.Math.RND.state(state); + scene.rngCounter = tempRngCounter; + scene.rngSeedOverride = tempSeedOverride; + return ret; + } } export class FixedBattle extends Battle { - constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) { - super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : null, config.double); - if (config.getEnemyParty) - this.enemyParty = config.getEnemyParty(scene); + constructor(scene: BattleScene, waveIndex: integer, config: FixedBattleConfig) { + super(scene.gameMode, waveIndex, config.battleType, config.battleType === BattleType.TRAINER ? config.getTrainer(scene) : null, config.double); + if (config.getEnemyParty) { + this.enemyParty = config.getEnemyParty(scene); } + } } type GetTrainerFunc = (scene: BattleScene) => Trainer; type GetEnemyPartyFunc = (scene: BattleScene) => EnemyPokemon[]; export class FixedBattleConfig { - public battleType: BattleType; - public double: boolean; - public getTrainer: GetTrainerFunc; - public getEnemyParty: GetEnemyPartyFunc; - public seedOffsetWaveIndex: integer; - - setBattleType(battleType: BattleType): FixedBattleConfig { - this.battleType = battleType; - return this; - } - - setDouble(double: boolean): FixedBattleConfig { - this.double = double; - return this; - } - - setGetTrainerFunc(getTrainerFunc: GetTrainerFunc): FixedBattleConfig { - this.getTrainer = getTrainerFunc; - return this; - } - - setGetEnemyPartyFunc(getEnemyPartyFunc: GetEnemyPartyFunc): FixedBattleConfig { - this.getEnemyParty = getEnemyPartyFunc; - return this; - } - - setSeedOffsetWave(seedOffsetWaveIndex: integer): FixedBattleConfig { - this.seedOffsetWaveIndex = seedOffsetWaveIndex; - return this; - } + public battleType: BattleType; + public double: boolean; + public getTrainer: GetTrainerFunc; + public getEnemyParty: GetEnemyPartyFunc; + public seedOffsetWaveIndex: integer; + + setBattleType(battleType: BattleType): FixedBattleConfig { + this.battleType = battleType; + return this; + } + + setDouble(double: boolean): FixedBattleConfig { + this.double = double; + return this; + } + + setGetTrainerFunc(getTrainerFunc: GetTrainerFunc): FixedBattleConfig { + this.getTrainer = getTrainerFunc; + return this; + } + + setGetEnemyPartyFunc(getEnemyPartyFunc: GetEnemyPartyFunc): FixedBattleConfig { + this.getEnemyParty = getEnemyPartyFunc; + return this; + } + + setSeedOffsetWave(seedOffsetWaveIndex: integer): FixedBattleConfig { + this.seedOffsetWaveIndex = seedOffsetWaveIndex; + return this; + } } function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): GetTrainerFunc { - return (scene: BattleScene) => { - const rand = Utils.randSeedInt(trainerPool.length); - const trainerTypes: TrainerType[] = []; - for (let trainerPoolEntry of trainerPool) { - const trainerType = Array.isArray(trainerPoolEntry) - ? Utils.randSeedItem(trainerPoolEntry) - : trainerPoolEntry; - trainerTypes.push(trainerType); - } - return new Trainer(scene, trainerTypes[rand], TrainerVariant.DEFAULT); - }; + return (scene: BattleScene) => { + const rand = Utils.randSeedInt(trainerPool.length); + const trainerTypes: TrainerType[] = []; + for (const trainerPoolEntry of trainerPool) { + const trainerType = Array.isArray(trainerPoolEntry) + ? Utils.randSeedItem(trainerPoolEntry) + : trainerPoolEntry; + trainerTypes.push(trainerType); + } + return new Trainer(scene, trainerTypes[rand], TrainerVariant.DEFAULT); + }; } interface FixedBattleConfigs { @@ -303,28 +318,28 @@ interface FixedBattleConfigs { } export const fixedBattles: FixedBattleConfigs = { - [5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [8]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.RIKA, TrainerType.CRISPIN ])), - [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.POPPY, TrainerType.AMARYS ])), - [186]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, TrainerType.LARRY_ELITE, TrainerType.LACEY ])), - [188]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.HASSEL, TrainerType.DRAYTON ])), - [190]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN, TrainerType.LEON ])), - [195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) -}; \ No newline at end of file + [5]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.YOUNGSTER, Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [8]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [25]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_2, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), + [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.RIKA, TrainerType.CRISPIN ])), + [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.POPPY, TrainerType.AMARYS ])), + [186]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, TrainerType.LARRY_ELITE, TrainerType.LACEY ])), + [188]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.HASSEL, TrainerType.DRAYTON ])), + [190]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN, TrainerType.LEON ])), + [195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) +}; diff --git a/src/configs/pad_dualshock.ts b/src/configs/pad_dualshock.ts index 4f66ff8c00a7..4700e8e6c000 100644 --- a/src/configs/pad_dualshock.ts +++ b/src/configs/pad_dualshock.ts @@ -2,28 +2,28 @@ * Dualshock mapping */ const pad_dualshock = { - padID: 'Dualshock', - padType: 'Sony', - gamepadMapping: { - RC_S: 0, - RC_E: 1, - RC_W: 2, - RC_N: 3, - START: 9, // Options - SELECT: 8, // Share - LB: 4, - RB: 5, - LT: 6, - RT: 7, - LS: 10, - RS: 11, - LC_N: 12, - LC_S: 13, - LC_W: 14, - LC_E: 15, - MENU: 16, - TOUCH: 17 - }, + padID: "Dualshock", + padType: "Sony", + gamepadMapping: { + RC_S: 0, + RC_E: 1, + RC_W: 2, + RC_N: 3, + START: 9, // Options + SELECT: 8, // Share + LB: 4, + RB: 5, + LT: 6, + RT: 7, + LS: 10, + RS: 11, + LC_N: 12, + LC_S: 13, + LC_W: 14, + LC_E: 15, + MENU: 16, + TOUCH: 17 + }, }; export default pad_dualshock; diff --git a/src/configs/pad_generic.ts b/src/configs/pad_generic.ts index 19b5d3df16e7..22e8c6e0579d 100644 --- a/src/configs/pad_generic.ts +++ b/src/configs/pad_generic.ts @@ -2,26 +2,26 @@ * Generic pad mapping */ const pad_generic = { - padID: 'Generic', - padType: 'generic', - gamepadMapping: { - RC_S: 0, - RC_E: 1, - RC_W: 2, - RC_N: 3, - START: 9, - SELECT: 8, - LB: 4, - RB: 5, - LT: 6, - RT: 7, - LS: 10, - RS: 11, - LC_N: 12, - LC_S: 13, - LC_W: 14, - LC_E: 15 - }, + padID: "Generic", + padType: "generic", + gamepadMapping: { + RC_S: 0, + RC_E: 1, + RC_W: 2, + RC_N: 3, + START: 9, + SELECT: 8, + LB: 4, + RB: 5, + LT: 6, + RT: 7, + LS: 10, + RS: 11, + LC_N: 12, + LC_S: 13, + LC_W: 14, + LC_E: 15 + }, }; export default pad_generic; diff --git a/src/configs/pad_unlicensedSNES.ts b/src/configs/pad_unlicensedSNES.ts index ba8ee538d30c..808e30cb6b4c 100644 --- a/src/configs/pad_unlicensedSNES.ts +++ b/src/configs/pad_unlicensedSNES.ts @@ -2,22 +2,22 @@ * 081f-e401 - UnlicensedSNES */ const pad_unlicensedSNES = { - padID: '081f-e401', - padType: 'snes', - gamepadMapping : { - RC_S: 2, - RC_E: 1, - RC_W: 3, - RC_N: 0, - START: 9, - SELECT: 8, - LB: 4, - RB: 5, - LC_N: 12, - LC_S: 13, - LC_W: 14, - LC_E: 15 - } + padID: "081f-e401", + padType: "snes", + gamepadMapping : { + RC_S: 2, + RC_E: 1, + RC_W: 3, + RC_N: 0, + START: 9, + SELECT: 8, + LB: 4, + RB: 5, + LC_N: 12, + LC_S: 13, + LC_W: 14, + LC_E: 15 + } }; export default pad_unlicensedSNES; diff --git a/src/configs/pad_xbox360.ts b/src/configs/pad_xbox360.ts index e44ebb54b64a..50ec4f71c673 100644 --- a/src/configs/pad_xbox360.ts +++ b/src/configs/pad_xbox360.ts @@ -2,27 +2,27 @@ * Generic pad mapping */ const pad_xbox360 = { - padID: 'Xbox 360 controller (XInput STANDARD GAMEPAD)', - padType: 'xbox', - gamepadMapping: { - RC_S: 0, - RC_E: 1, - RC_W: 2, - RC_N: 3, - START: 9, - SELECT: 8, - LB: 4, - RB: 5, - LT: 6, - RT: 7, - LS: 10, - RS: 11, - LC_N: 12, - LC_S: 13, - LC_W: 14, - LC_E: 15, - MENU: 16 - }, + padID: "Xbox 360 controller (XInput STANDARD GAMEPAD)", + padType: "xbox", + gamepadMapping: { + RC_S: 0, + RC_E: 1, + RC_W: 2, + RC_N: 3, + START: 9, + SELECT: 8, + LB: 4, + RB: 5, + LT: 6, + RT: 7, + LS: 10, + RS: 11, + LC_N: 12, + LC_S: 13, + LC_W: 14, + LC_E: 15, + MENU: 16 + }, }; export default pad_xbox360; diff --git a/src/data/ability.ts b/src/data/ability.ts index 459bd4bcbf7b..00790749648b 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -9,7 +9,7 @@ import { BattlerTag } from "./battler-tags"; import { BattlerTagType } from "./enums/battler-tag-type"; import { StatusEffect, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, RecoilAttr, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagType } from "./enums/arena-tag-type"; import { Stat } from "./pokemon-stat"; @@ -20,9 +20,7 @@ import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; import { Abilities } from "./enums/abilities"; import i18next, { Localizable } from "#app/plugins/i18n.js"; import { Command } from "../ui/command-ui-handler"; -import Battle from "#app/battle.js"; -import { ability } from "#app/locales/en/ability.js"; -import { PokeballType, getPokeballName } from "./pokeball"; +import { getPokeballName } from "./pokeball"; import { BerryModifierType } from "#app/modifier/modifier-type"; export class Ability implements Localizable { @@ -40,7 +38,7 @@ export class Ability implements Localizable { constructor(id: Abilities, generation: integer) { this.id = id; - this.nameAppend = ''; + this.nameAppend = ""; this.generation = generation; this.attrs = []; this.conditions = []; @@ -49,10 +47,10 @@ export class Ability implements Localizable { } localize(): void { - const i18nKey = Abilities[this.id].split('_').filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join('') as string; + const i18nKey = Abilities[this.id].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as string; - this.name = this.id ? `${i18next.t(`ability:${i18nKey}.name`) as string}${this.nameAppend}` : ''; - this.description = this.id ? i18next.t(`ability:${i18nKey}.description`) as string : ''; + this.name = this.id ? `${i18next.t(`ability:${i18nKey}.name`) as string}${this.nameAppend}` : ""; + this.description = this.id ? i18next.t(`ability:${i18nKey}.description`) as string : ""; } getAttrs(attrType: { new(...args: any[]): AbAttr }): AbAttr[] { @@ -95,12 +93,12 @@ export class Ability implements Localizable { } partial(): this { - this.nameAppend += ' (P)'; + this.nameAppend += " (P)"; return this; } unimplemented(): this { - this.nameAppend += ' (N)'; + this.nameAppend += " (N)"; return this; } } @@ -146,7 +144,7 @@ export class BlockRecoilDamageAttr extends AbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { - return i18next.t('abilityTriggers:blockRecoilDamage', {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName}); + return i18next.t("abilityTriggers:blockRecoilDamage", {pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, abilityName: abilityName}); } } @@ -179,8 +177,9 @@ export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr { applyPostBattleInit(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) + if (formIndex !== pokemon.formIndex) { return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + } return false; } @@ -194,7 +193,7 @@ export class PostBattleInitStatChangeAbAttr extends PostBattleInitAbAttr { constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean) { super(); - this.stats = typeof(stats) === 'number' + this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; this.levels = levels; @@ -204,18 +203,20 @@ export class PostBattleInitStatChangeAbAttr extends PostBattleInitAbAttr { applyPostBattleInit(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const statChangePhases: StatChangePhase[] = []; - if (this.selfTarget) + if (this.selfTarget) { statChangePhases.push(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels)); - else { - for (let opponent of pokemon.getOpponents()) + } else { + for (const opponent of pokemon.getOpponents()) { statChangePhases.push(new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels)); + } } - for (let statChangePhase of statChangePhases) { - if (!this.selfTarget && !statChangePhase.getPokemon().summonData) - pokemon.scene.pushPhase(statChangePhase); // TODO: This causes the ability bar to be shown at the wrong time - else + for (const statChangePhase of statChangePhases) { + if (!this.selfTarget && !statChangePhase.getPokemon().summonData) { + pokemon.scene.pushPhase(statChangePhase); + } else { // TODO: This causes the ability bar to be shown at the wrong time pokemon.scene.unshiftPhase(statChangePhase); + } } return true; @@ -257,7 +258,7 @@ export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { return pokemon.addTag(BattlerTagType.STURDY, 1); } - return false + return false; } } @@ -392,8 +393,9 @@ class TypeImmunityStatChangeAbAttr extends TypeImmunityAbAttr { if (ret) { cancelled.value = true; const simulated = args.length > 1 && args[1]; - if (!simulated) + if (!simulated) { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); + } } return ret; @@ -417,8 +419,9 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { if (ret) { cancelled.value = true; const simulated = args.length > 1 && args[1]; - if (!simulated) + if (!simulated) { pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); + } } return ret; @@ -454,14 +457,15 @@ export class PostDefendAbAttr extends AbAttr { export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (pokemon.formIndex == 0 && pokemon.battleData.hitCount != 0 && (move.getMove().category == MoveCategory.SPECIAL || move.getMove().category == MoveCategory.PHYSICAL)) { + if (pokemon.formIndex === 0 && pokemon.battleData.hitCount !== 0 && (move.getMove().category === MoveCategory.SPECIAL || move.getMove().category === MoveCategory.PHYSICAL)) { const recoilDamage = Math.ceil((pokemon.getMaxHp() / 8) - attacker.turnData.damageDealt); - if (!recoilDamage) + if (!recoilDamage) { return false; + } pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER); pokemon.turnData.damageTaken += recoilDamage; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, '\'s disguise was busted!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s disguise was busted!")); return true; } @@ -491,18 +495,18 @@ export class PostDefendFormChangeAbAttr extends PostDefendAbAttr { export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const attackPriority = new Utils.IntegerHolder(move.getMove().priority); - applyMoveAttrs(IncrementMovePriorityAttr,attacker,null,move.getMove(),attackPriority); - applyAbAttrs(IncrementMovePriorityAbAttr, attacker, null, move.getMove(), attackPriority); + const attackPriority = new Utils.IntegerHolder(move.getMove().priority); + applyMoveAttrs(IncrementMovePriorityAttr,attacker,null,move.getMove(),attackPriority); + applyAbAttrs(IncrementMovePriorityAbAttr, attacker, null, move.getMove(), attackPriority); - if(move.getMove().moveTarget===MoveTarget.USER) { - return false; - } + if(move.getMove().moveTarget===MoveTarget.USER) { + return false; + } - if(attackPriority.value > 0 && !move.getMove().isMultiTarget()) { - cancelled.value = true; - return true; - } + if(attackPriority.value > 0 && !move.getMove().isMultiTarget()) { + cancelled.value = true; + return true; + } return false; } @@ -548,7 +552,7 @@ export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr { } applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args) + const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); if (ret) { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); } @@ -560,7 +564,7 @@ export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr { export class ReverseDrainAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (!!move.getMove().getAttrs(HitHealAttr).length || !!move.getMove().getAttrs(StrengthSapHealAttr).length ) { - pokemon.scene.queueMessage(getPokemonMessage(attacker, ` sucked up the liquid ooze!`)); + pokemon.scene.queueMessage(getPokemonMessage(attacker, " sucked up the liquid ooze!")); return true; } return false; @@ -587,8 +591,8 @@ export class PostDefendStatChangeAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (this.condition(pokemon, attacker, move.getMove())) { if (this.allOthers) { - let otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); - for (let other of otherPokemon) { + const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents(); + for (const other of otherPokemon) { other.scene.unshiftPhase(new StatChangePhase(other.scene, (other).getBattlerIndex(), false, [ this.stat ], this.levels)); } return true; @@ -619,8 +623,8 @@ export class PostDefendHpGatedStatChangeAbAttr extends PostDefendAbAttr { } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - const hpGateFlat: integer = Math.ceil(pokemon.getMaxHp() * this.hpGate) - const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1] + const hpGateFlat: integer = Math.ceil(pokemon.getMaxHp() * this.hpGate); + const lastAttackReceived = pokemon.turnData.attacksReceived[pokemon.turnData.attacksReceived.length - 1]; if (this.condition(pokemon, attacker, move.getMove()) && (pokemon.hp <= hpGateFlat && (pokemon.hp + lastAttackReceived.damage) > hpGateFlat)) { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.levels)); return true; @@ -701,8 +705,9 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr { } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (hitResult < HitResult.NO_EFFECT) + if (hitResult < HitResult.NO_EFFECT) { return pokemon.scene.arena.trySetTerrain(this.terrainType, true); + } return false; } @@ -756,8 +761,9 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance) + if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && pokemon.randSeedInt(100) < this.chance) { return attacker.addTag(this.tagType, this.turnCount, move.moveId, attacker.id); + } return false; } @@ -819,8 +825,9 @@ export class PostDefendWeatherChangeAbAttr extends PostDefendAbAttr { } applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (!pokemon.scene.arena.weather?.isImmutable()) + if (!pokemon.scene.arena.weather?.isImmutable()) { return pokemon.scene.arena.trySetWeather(this.weatherType, true); + } return false; } @@ -843,7 +850,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` swapped\nabilities with its target!`); + return getPokemonMessage(pokemon, " swapped\nabilities with its target!"); } } @@ -957,7 +964,7 @@ export class MoveTypeChangePowerMultiplierAbAttr extends VariableMoveTypeAbAttr apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const type = (args[0] as Utils.IntegerHolder); - if (type.value == this.matchType) { + if (type.value === this.matchType) { type.value = this.newType; (args[1] as Utils.NumberHolder).value *= this.powerMultiplier; return true; @@ -1027,10 +1034,10 @@ export class DamageBoostAbAttr extends PreAttackAbAttr { if (this.condition(pokemon, defender, move.getMove())) { const power = args[0] as Utils.NumberHolder; power.value = Math.floor(power.value * this.damageMultiplier); - return true; - } + return true; + } - return false; + return false; } } @@ -1119,7 +1126,7 @@ export class BattleStatMultiplierAbAttr extends AbAttr { } applyBattleStat(pokemon: Pokemon, passive: boolean, battleStat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise { - const move = (args[0] as Move); + const move = (args[0] as Move); if (battleStat === this.battleStat && (!this.condition || this.condition(pokemon, null, move))) { statValue.value *= this.multiplier; return true; @@ -1151,8 +1158,9 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false, false).then(success => { - if (success) + if (success) { pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${defender.name}'s ${stolenItem.type.name}!`)); + } resolve(success); }); return; @@ -1182,7 +1190,7 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { } applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (pokemon != attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { + if (pokemon !== attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; return attacker.trySetStatus(effect, true, pokemon); } @@ -1212,7 +1220,7 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { } applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { - if (pokemon != attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { + if (pokemon !== attacker && (!this.contactRequired || move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; @@ -1239,8 +1247,9 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false, false).then(success => { - if (success) + if (success) { pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${attacker.name}'s ${stolenItem.type.name}!`)); + } resolve(success); }); return; @@ -1274,7 +1283,7 @@ class PostVictoryStatChangeAbAttr extends PostVictoryAbAttr { } applyPostVictory(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - const stat = typeof this.stat === 'function' + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); @@ -1321,7 +1330,7 @@ export class PostKnockOutStatChangeAbAttr extends PostKnockOutAbAttr { } applyPostKnockOut(pokemon: Pokemon, passive: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { - const stat = typeof this.stat === 'function' + const stat = typeof this.stat === "function" ? this.stat(pokemon) : this.stat; pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); @@ -1401,10 +1410,10 @@ export class PostIntimidateStatChangeAbAttr extends AbAttr { private overwrites: boolean; constructor(stats: BattleStat[], levels: integer, overwrites?: boolean) { - super(true) - this.stats = stats - this.levels = levels - this.overwrites = !!overwrites + super(true); + this.stats = stats; + this.levels = levels; + this.overwrites = !!overwrites; } apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { @@ -1478,7 +1487,7 @@ export class PostSummonStatChangeAbAttr extends PostSummonAbAttr { constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, intimidate?: boolean) { super(false); - this.stats = typeof(stats) === 'number' + this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; this.levels = levels; @@ -1492,8 +1501,8 @@ export class PostSummonStatChangeAbAttr extends PostSummonAbAttr { pokemon.scene.pushPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels)); return true; } - for (let opponent of pokemon.getOpponents()) { - const cancelled = new Utils.BooleanHolder(false) + for (const opponent of pokemon.getOpponents()) { + const cancelled = new Utils.BooleanHolder(false); if (this.intimidate) { applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled); applyAbAttrs(PostIntimidateStatChangeAbAttr, opponent, cancelled); @@ -1546,10 +1555,11 @@ export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const target = pokemon.getAlly(); if (target?.isActive(true)) { - for (let s = 0; s < target.summonData.battleStats.length; s++) + for (let s = 0; s < target.summonData.battleStats.length; s++) { target.summonData.battleStats[s] = 0; + } - target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere removed!`)); + target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere removed!")); return true; } @@ -1567,15 +1577,16 @@ export class DownloadAbAttr extends PostSummonAbAttr { this.enemyDef = 0; this.enemySpDef = 0; - for (let opponent of pokemon.getOpponents()) { + for (const opponent of pokemon.getOpponents()) { this.enemyDef += opponent.stats[BattleStat.DEF]; this.enemySpDef += opponent.stats[BattleStat.SPDEF]; } - if (this.enemyDef < this.enemySpDef) + if (this.enemyDef < this.enemySpDef) { this.stats = [BattleStat.ATK]; - else + } else { this.stats = [BattleStat.SPATK]; + } if (this.enemyDef > 0 && this.enemySpDef > 0) { // only activate if there's actually an enemy to download from pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1)); @@ -1596,8 +1607,9 @@ export class PostSummonWeatherChangeAbAttr extends PostSummonAbAttr { } applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - if (!pokemon.scene.arena.weather?.isImmutable()) + if (!pokemon.scene.arena.weather?.isImmutable()) { return pokemon.scene.arena.trySetWeather(this.weatherType, true); + } return false; } @@ -1628,8 +1640,9 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const formIndex = this.formFunc(pokemon); - if (formIndex !== pokemon.formIndex) + if (formIndex !== pokemon.formIndex) { return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + } return false; } @@ -1638,18 +1651,21 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { export class TraceAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); - if (!targets.length) + if (!targets.length) { return false; + } let target: Pokemon; - if (targets.length > 1) + if (targets.length > 1) { pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); - else + } else { target = targets[0]; + } // Wonder Guard is normally uncopiable so has the attribute, but trace specifically can copy it - if (target.getAbility().hasAttr(UncopiableAbilityAbAttr) && target.getAbility().id !== Abilities.WONDER_GUARD) + if (target.getAbility().hasAttr(UncopiableAbilityAbAttr) && target.getAbility().id !== Abilities.WONDER_GUARD) { return false; + } pokemon.summonData.ability = target.getAbility().id; @@ -1666,14 +1682,16 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); - if (!targets.length) + if (!targets.length) { return false; + } let target: Pokemon; - if (targets.length > 1) + if (targets.length > 1) { pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); - else + } else { target = targets[0]; + } pokemon.summonData.speciesForm = target.getSpeciesForm(); pokemon.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); @@ -1685,7 +1703,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); pokemon.summonData.types = target.getTypes(); - pokemon.scene.playSound('PRSFX- Transform'); + pokemon.scene.playSound("PRSFX- Transform"); pokemon.loadAssets(false).then(() => pokemon.playAnim()); @@ -1755,7 +1773,7 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : 'stats'}!`); + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats"}!`); } } @@ -1784,7 +1802,7 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : 'status problems'}!`); + return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : "status problems"}!`); } } @@ -1874,8 +1892,9 @@ export class ConditionalCritAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const target = (args[1] as Pokemon); const move = (args[2] as Move); - if(!this.condition(pokemon,target,move)) + if(!this.condition(pokemon,target,move)) { return false; + } (args[0] as Utils.BooleanHolder).value = true; return true; @@ -1908,8 +1927,9 @@ export class IncrementMovePriorityAbAttr extends AbAttr { } apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.moveIncrementFunc(pokemon, args[0] as Move)) + if (!this.moveIncrementFunc(pokemon, args[0] as Move)) { return false; + } (args[1] as Utils.IntegerHolder).value += this.increaseAmount; return true; @@ -1936,8 +1956,9 @@ export class BlockWeatherDamageAttr extends PreWeatherDamageAbAttr { } applyPreWeatherEffect(pokemon: Pokemon, passive: boolean, weather: Weather, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1) + if (!this.weatherTypes.length || this.weatherTypes.indexOf(weather?.weatherType) > -1) { cancelled.value = true; + } return true; } @@ -1964,8 +1985,9 @@ export class SuppressWeatherEffectAbAttr extends PreWeatherEffectAbAttr { function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { return (pokemon: Pokemon) => { - if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) + if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) { return false; + } const weatherType = pokemon.scene.arena.weather?.weatherType; return weatherType && weatherTypes.indexOf(weatherType) > -1; }; @@ -1973,36 +1995,36 @@ function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { function getAnticipationCondition(): AbAttrCondition { return (pokemon: Pokemon) => { - for (let opponent of pokemon.getOpponents()) { - for (let move of opponent.moveset) { - // move is super effective - if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent) >= 2) { - return true; - } - // move is a OHKO - if (move.getMove().findAttr(attr => attr instanceof OneHitKOAttr)) { - return true; - } - // edge case for hidden power, type is computed - if (move.getMove().id === Moves.HIDDEN_POWER) { - const iv_val = Math.floor(((opponent.ivs[Stat.HP] & 1) + for (const opponent of pokemon.getOpponents()) { + for (const move of opponent.moveset) { + // move is super effective + if (move.getMove() instanceof AttackMove && pokemon.getAttackTypeEffectiveness(move.getMove().type, opponent) >= 2) { + return true; + } + // move is a OHKO + if (move.getMove().findAttr(attr => attr instanceof OneHitKOAttr)) { + return true; + } + // edge case for hidden power, type is computed + if (move.getMove().id === Moves.HIDDEN_POWER) { + const iv_val = Math.floor(((opponent.ivs[Stat.HP] & 1) +(opponent.ivs[Stat.ATK] & 1) * 2 +(opponent.ivs[Stat.DEF] & 1) * 4 +(opponent.ivs[Stat.SPD] & 1) * 8 +(opponent.ivs[Stat.SPATK] & 1) * 16 +(opponent.ivs[Stat.SPDEF] & 1) * 32) * 15/63); - const type = [ - Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, - Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, - Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, - Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK][iv_val]; - - if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) { - return true; - } + const type = [ + Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, + Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, + Type.FIRE, Type.WATER, Type.GRASS, Type.ELECTRIC, + Type.PSYCHIC, Type.ICE, Type.DRAGON, Type.DARK][iv_val]; + + if (pokemon.getAttackTypeEffectiveness(type, opponent) >= 2) { + return true; } } + } } return false; }; @@ -2018,7 +2040,7 @@ function getAnticipationCondition(): AbAttrCondition { function getOncePerBattleCondition(ability: Abilities): AbAttrCondition { return (pokemon: Pokemon) => { return !pokemon.battleData?.abilitiesApplied.includes(ability); - } + }; } export class ForewarnAbAttr extends PostSummonAbAttr { @@ -2030,8 +2052,8 @@ export class ForewarnAbAttr extends PostSummonAbAttr { let maxPowerSeen = 0; let maxMove = ""; let movePower = 0; - for (let opponent of pokemon.getOpponents()) { - for (let move of opponent.moveset) { + for (const opponent of pokemon.getOpponents()) { + for (const move of opponent.moveset) { if (move.getMove() instanceof StatusMove) { movePower = 1; } else if (move.getMove().findAttr(attr => attr instanceof OneHitKOAttr)) { @@ -2061,8 +2083,8 @@ export class FriskAbAttr extends PostSummonAbAttr { } applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - for (let opponent of pokemon.getOpponents()) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "\'s " + opponent.getAbility().name + "!")); + for (const opponent of pokemon.getOpponents()) { + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "'s " + opponent.getAbility().name + "!")); } return true; } @@ -2089,8 +2111,9 @@ export class PostWeatherChangeAddBattlerTagAttr extends PostWeatherChangeAbAttr applyPostWeatherChange(pokemon: Pokemon, passive: boolean, weather: WeatherType, args: any[]): boolean { console.log(this.weatherTypes.find(w => weather === w), WeatherType[weather]); - if (!this.weatherTypes.find(w => weather === w)) + if (!this.weatherTypes.find(w => weather === w)) { return false; + } return pokemon.addTag(this.tagType, this.turnCount); } @@ -2178,8 +2201,9 @@ export class PostTerrainChangeAddBattlerTagAttr extends PostTerrainChangeAbAttr } applyPostTerrainChange(pokemon: Pokemon, passive: boolean, terrain: TerrainType, args: any[]): boolean { - if (!this.terrainTypes.find(t => t === terrain)) + if (!this.terrainTypes.find(t => t === terrain)) { return false; + } return pokemon.addTag(this.tagType, this.turnCount); } @@ -2273,9 +2297,9 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { } const randomIdx = Utils.randSeedInt(berriesEaten.length); - const chosenBerryType = berriesEaten[randomIdx] + const chosenBerryType = berriesEaten[randomIdx]; const chosenBerry = new BerryModifierType(chosenBerryType); - berriesEaten.splice(randomIdx) // Remove berry from memory + berriesEaten.splice(randomIdx); // Remove berry from memory const berryModifier = pokemon.scene.findModifier( (m) => m instanceof BerryModifier && m.berryType === chosenBerryType, @@ -2301,17 +2325,17 @@ export class MoodyAbAttr extends PostTurnAbAttr { } applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - let selectableStats = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD]; - let increaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] < 6); + const selectableStats = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD]; + const increaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] < 6); let decreaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] > -6); if (increaseStatArray.length > 0) { - let increaseStat = increaseStatArray[Utils.randInt(increaseStatArray.length)]; + const increaseStat = increaseStatArray[Utils.randInt(increaseStatArray.length)]; decreaseStatArray = decreaseStatArray.filter(s => s !== increaseStat); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [increaseStat], 2)); } if (decreaseStatArray.length > 0) { - let decreaseStat = selectableStats[Utils.randInt(selectableStats.length)]; + const decreaseStat = selectableStats[Utils.randInt(selectableStats.length)]; pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [decreaseStat], -1)); } return true; @@ -2386,10 +2410,10 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { let hadEffect: boolean = false; - for(let opp of pokemon.getOpponents()) { + for(const opp of pokemon.getOpponents()) { if(opp.status !== undefined && opp.status.effect === StatusEffect.SLEEP) { opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER); - pokemon.scene.queueMessage(i18next.t('abilityTriggers:badDreams', {pokemonName: `${getPokemonPrefix(opp)}${opp.name}`})); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: `${getPokemonPrefix(opp)}${opp.name}`})); hadEffect = true; } @@ -2415,8 +2439,8 @@ export class FetchBallAbAttr extends PostTurnAbAttr { * @returns true if player has used a pokeball and this pokemon is owned by the player */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - let lastUsed = pokemon.scene.currentBattle.lastUsedPokeball; - if(lastUsed != null && pokemon.isPlayer) { + const lastUsed = pokemon.scene.currentBattle.lastUsedPokeball; + if(lastUsed !== null && pokemon.isPlayer) { pokemon.scene.pokeballCounts[lastUsed]++; pokemon.scene.currentBattle.lastUsedPokeball = null; pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` found a\n${getPokeballName(lastUsed)}!`)); @@ -2438,8 +2462,9 @@ export class PostBiomeChangeWeatherChangeAbAttr extends PostBiomeChangeAbAttr { } apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (!pokemon.scene.arena.weather?.isImmutable()) + if (!pokemon.scene.arena.weather?.isImmutable()) { return pokemon.scene.arena.trySetWeather(this.weatherType, true); + } return false; } @@ -2615,7 +2640,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { applyPostFaint(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { const cancelled = new Utils.BooleanHolder(false); - pokemon.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)) + pokemon.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); if (cancelled) { return false; } @@ -2897,10 +2922,11 @@ function applyAbAttrsInternal(attrType: { new(...args: any pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { return new Promise(resolve => { if (!pokemon.canApplyAbility(passive)) { - if (!passive) + if (!passive) { return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - else + } else { return resolve(); + } } const ability = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()); @@ -2908,51 +2934,58 @@ function applyAbAttrsInternal(attrType: { new(...args: any const clearSpliceQueueAndResolve = () => { pokemon.scene.clearPhaseQueueSplice(); - if (!passive) + if (!passive) { return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - else + } else { return resolve(); + } }; const applyNextAbAttr = () => { - if (attrs.length) + if (attrs.length) { applyAbAttr(attrs.shift()); - else + } else { clearSpliceQueueAndResolve(); + } }; const applyAbAttr = (attr: TAttr) => { - if (!canApplyAttr(pokemon, attr)) + if (!canApplyAttr(pokemon, attr)) { return applyNextAbAttr(); + } pokemon.scene.setPhaseQueueSplice(); const onApplySuccess = () => { if (pokemon.battleData && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { pokemon.battleData.abilitiesApplied.push(ability.id); } if (attr.showAbility && !quiet) { - if (showAbilityInstant) + if (showAbilityInstant) { pokemon.scene.abilityBar.showAbility(pokemon, passive); - else + } else { queueShowAbility(pokemon, passive); + } } if (!quiet) { const message = attr.getTriggerMessage(pokemon, (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name, args); if (message) { - if (isAsync) + if (isAsync) { pokemon.scene.ui.showText(message, null, () => pokemon.scene.ui.showText(null, 0), null, true); - else + } else { pokemon.scene.queueMessage(message); + } } } }; const result = applyFunc(attr, passive); if (result instanceof Promise) { result.then(success => { - if (success) + if (success) { onApplySuccess(); + } applyNextAbAttr(); }); } else { - if (result) + if (result) { onApplySuccess(); + } applyNextAbAttr(); } }; @@ -3227,7 +3260,7 @@ export function initAbilities() { .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SANDSTORM), new Ability(Abilities.PRESSURE, 3) .attr(IncreasePpAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is exerting its Pressure!')), + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is exerting its Pressure!")), new Ability(Abilities.THICK_FAT, 3) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.ICE, 0.5) @@ -3250,8 +3283,8 @@ export function initAbilities() { new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) - .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category == MoveCategory.PHYSICAL) - .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category == MoveCategory.PHYSICAL), + .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category === MoveCategory.PHYSICAL) + .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category === MoveCategory.PHYSICAL), new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), new Ability(Abilities.PLUS, 3) @@ -3377,7 +3410,7 @@ export function initAbilities() { .attr(MovePowerBoostAbAttr, (user, target, move) => { const power = new Utils.NumberHolder(move.power); applyMoveAttrs(VariablePowerAttr, user, target, move, power); - return power.value <= 60 + return power.value <= 60; }, 1.5), new Ability(Abilities.LEAF_GUARD, 4) .attr(StatusEffectImmunityAbAttr) @@ -3386,7 +3419,7 @@ export function initAbilities() { new Ability(Abilities.KLUTZ, 4) .unimplemented(), new Ability(Abilities.MOLD_BREAKER, 4) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' breaks the mold!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " breaks the mold!")) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.SUPER_LUCK, 4) .attr(BonusCritAbAttr) @@ -3395,7 +3428,7 @@ export function initAbilities() { .attr(PostFaintContactDamageAbAttr,4) .bypassFaint(), new Ability(Abilities.ANTICIPATION, 4) - .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' shuddered!')), + .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " shuddered!")), new Ability(Abilities.FOREWARN, 4) .attr(ForewarnAbAttr), new Ability(Abilities.UNAWARE, 4) @@ -3504,7 +3537,7 @@ export function initAbilities() { new Ability(Abilities.POISON_TOUCH, 5) .attr(PostAttackContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON), new Ability(Abilities.REGENERATOR, 5) - .attr(PreSwitchOutHealAbAttr), + .attr(PreSwitchOutHealAbAttr), new Ability(Abilities.BIG_PECKS, 5) .attr(ProtectStatAbAttr, BattleStat.DEF) .ignorable(), @@ -3566,10 +3599,10 @@ export function initAbilities() { .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.1) .partial(), new Ability(Abilities.TURBOBLAZE, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is radiating a blazing aura!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a blazing aura!")) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.TERAVOLT, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is radiating a bursting aura!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a bursting aura!")) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) .ignorable() @@ -3625,10 +3658,10 @@ export function initAbilities() { new Ability(Abilities.PARENTAL_BOND, 6) .unimplemented(), new Ability(Abilities.DARK_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is radiating a Dark Aura!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Dark Aura!")) .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), new Ability(Abilities.FAIRY_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is radiating a Fairy Aura!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Fairy Aura!")) .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() @@ -3694,7 +3727,7 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.DISGUISE, 7) - .attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex == 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) + .attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) .attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) .attr(PostBattleInitFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) .attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) @@ -3714,9 +3747,9 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.POWER_CONSTRUCT, 7) // TODO: 10% Power Construct Zygarde isn't accounted for yet. If changed, update Zygarde's getSpeciesFormIndex entry accordingly - .attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2) - .attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2) - .attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === 'complete' ? 4 : 2) + .attr(PostBattleInitFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2) + .attr(PostSummonFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2) + .attr(PostTurnFormChangeAbAttr, p => p.getHpRatio() <= 0.5 || p.getFormKey() === "complete" ? 4 : 2) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr) @@ -3865,7 +3898,7 @@ export function initAbilities() { .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, '\'s Neutralizing Gas filled the area!')) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, "'s Neutralizing Gas filled the area!")) .partial(), new Ability(Abilities.PASTEL_VEIL, 8) .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) diff --git a/src/data/api.ts b/src/data/api.ts index fcfe956710af..80097e1acc0c 100644 --- a/src/data/api.ts +++ b/src/data/api.ts @@ -1,60 +1,60 @@ -import { MainClient, NamedAPIResource } from 'pokenode-ts'; -import { MoveTarget, allMoves } from './move'; -import * as Utils from '../utils'; -import fs from 'vite-plugin-fs/browser'; -import PokemonSpecies, { PokemonForm, SpeciesFormKey, allSpecies } from './pokemon-species'; -import { GrowthRate } from './exp'; -import { Type } from './type'; -import { allAbilities } from './ability'; +import { MainClient, NamedAPIResource } from "pokenode-ts"; +import { MoveTarget, allMoves } from "./move"; +import * as Utils from "../utils"; +import fs from "vite-plugin-fs/browser"; +import PokemonSpecies, { PokemonForm, SpeciesFormKey, allSpecies } from "./pokemon-species"; +import { GrowthRate } from "./exp"; +import { Type } from "./type"; +import { allAbilities } from "./ability"; import { Abilities } from "./enums/abilities"; -import { Species } from './enums/species'; -import { pokemonFormLevelMoves } from './pokemon-level-moves'; -import { tmSpecies } from './tms'; -import { Moves } from './enums/moves'; +import { Species } from "./enums/species"; +import { pokemonFormLevelMoves } from "./pokemon-level-moves"; +import { tmSpecies } from "./tms"; +import { Moves } from "./enums/moves"; const targetMap = { - 'specific-move': MoveTarget.ATTACKER, - 'selected-pokemon-me-first': MoveTarget.NEAR_ENEMY, - 'ally': MoveTarget.NEAR_ALLY, - 'users-field': MoveTarget.USER_SIDE, - 'user-or-ally': MoveTarget.USER_OR_NEAR_ALLY, - 'opponents-field': MoveTarget.ENEMY_SIDE, - 'user': MoveTarget.USER, - 'random-opponent': MoveTarget.RANDOM_NEAR_ENEMY, - 'all-other-pokemon': MoveTarget.ALL_NEAR_OTHERS, - 'selected-pokemon': MoveTarget.NEAR_OTHER, - 'all-opponents': MoveTarget.ALL_NEAR_ENEMIES, - 'entire-field': MoveTarget.BOTH_SIDES, - 'user-and-allies': MoveTarget.USER_AND_ALLIES, - 'all-pokemon': MoveTarget.ALL, - 'all-allies': MoveTarget.NEAR_ALLY, - 'fainting-pokemon': MoveTarget.NEAR_OTHER + "specific-move": MoveTarget.ATTACKER, + "selected-pokemon-me-first": MoveTarget.NEAR_ENEMY, + "ally": MoveTarget.NEAR_ALLY, + "users-field": MoveTarget.USER_SIDE, + "user-or-ally": MoveTarget.USER_OR_NEAR_ALLY, + "opponents-field": MoveTarget.ENEMY_SIDE, + "user": MoveTarget.USER, + "random-opponent": MoveTarget.RANDOM_NEAR_ENEMY, + "all-other-pokemon": MoveTarget.ALL_NEAR_OTHERS, + "selected-pokemon": MoveTarget.NEAR_OTHER, + "all-opponents": MoveTarget.ALL_NEAR_ENEMIES, + "entire-field": MoveTarget.BOTH_SIDES, + "user-and-allies": MoveTarget.USER_AND_ALLIES, + "all-pokemon": MoveTarget.ALL, + "all-allies": MoveTarget.NEAR_ALLY, + "fainting-pokemon": MoveTarget.NEAR_OTHER }; const generationMap = { - 'generation-i': 1, - 'generation-ii': 2, - 'generation-iii': 3, - 'generation-iv': 4, - 'generation-v': 5, - 'generation-vi': 6, - 'generation-vii': 7, - 'generation-viii': 8, - 'generation-ix': 9 + "generation-i": 1, + "generation-ii": 2, + "generation-iii": 3, + "generation-iv": 4, + "generation-v": 5, + "generation-vi": 6, + "generation-vii": 7, + "generation-viii": 8, + "generation-ix": 9 }; const growthRateMap = { - 'slow-then-very-fast': GrowthRate.ERRATIC, - 'fast': GrowthRate.FAST, - 'medium': GrowthRate.MEDIUM_FAST, - 'medium-slow': GrowthRate.MEDIUM_SLOW, - 'slow': GrowthRate.SLOW, - 'fast-then-very-slow': GrowthRate.FLUCTUATING + "slow-then-very-fast": GrowthRate.ERRATIC, + "fast": GrowthRate.FAST, + "medium": GrowthRate.MEDIUM_FAST, + "medium-slow": GrowthRate.MEDIUM_SLOW, + "slow": GrowthRate.SLOW, + "fast-then-very-slow": GrowthRate.FLUCTUATING }; -const regionalForms = [ 'alola', 'galar', 'hisui', 'paldea' ]; +const regionalForms = [ "alola", "galar", "hisui", "paldea" ]; -const ignoredForms = [ 'gmax', 'totem', 'cap', 'starter' ]; +const ignoredForms = [ "gmax", "totem", "cap", "starter" ]; const generationDexNumbers = { 1: 151, @@ -68,7 +68,7 @@ const generationDexNumbers = { 9: 1010 }; -const versions = [ 'scarlet-violet', 'sword-shield', 'sun-moon' ]; +const versions = [ "scarlet-violet", "sword-shield", "sun-moon" ]; type LevelMove = [level: integer, moveId: integer]; @@ -93,57 +93,60 @@ export async function printPokemon() { const useExistingTmList = true; - let enumStr = `export enum Species {\n`; - let pokemonSpeciesStr = `\tallSpecies.push(\n`; + let enumStr = "export enum Species {\n"; + let pokemonSpeciesStr = "\tallSpecies.push(\n"; const speciesLevelMoves: SpeciesLevelMoves = {}; const speciesFormLevelMoves: SpeciesFormLevelMoves = {}; const moveTmSpecies: TmSpecies = {}; let pokemonArr: NamedAPIResource[] = []; - let offset = 0; - let pokemonResponse = await api.pokemon.listPokemons(offset, 2000) + const offset = 0; + const pokemonResponse = await api.pokemon.listPokemons(offset, 2000); pokemonArr = pokemonResponse.results; const types = Utils.getEnumKeys(Type).map(t => t.toLowerCase()); - const abilities = Utils.getEnumKeys(Abilities).map(a => a.toLowerCase().replace(/\_/g, '-')); + const abilities = Utils.getEnumKeys(Abilities).map(a => a.toLowerCase().replace(/\_/g, "-")); const pokemonSpeciesList: PokemonSpecies[] = []; - for (let p of pokemonArr) { + for (const p of pokemonArr) { const pokemon = await api.pokemon.getPokemonByName(p.name); - let region: string = ''; + let region: string = ""; if (pokemon.id > 10000) { const dexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!dexIdMatch) + if (!dexIdMatch) { continue; + } const matchingSpecies = pokemonSpeciesList[parseInt(dexIdMatch[1]) - 1]; - if (!matchingSpecies) + if (!matchingSpecies) { continue; + } const speciesKey = (matchingSpecies as any).key as string; const formName = pokemon.name.slice(speciesKey.length + 1); - if (ignoredForms.filter(f => formName.indexOf(f) > -1).length) + if (ignoredForms.filter(f => formName.indexOf(f) > -1).length) { continue; + } - let shortFormName = formName.indexOf('-') > -1 - ? formName.slice(0, formName.indexOf('-')) + const shortFormName = formName.indexOf("-") > -1 + ? formName.slice(0, formName.indexOf("-")) : formName; - if (regionalForms.indexOf(shortFormName) > -1) + if (regionalForms.indexOf(shortFormName) > -1) { region = shortFormName.toUpperCase(); - else { + } else { const formBaseStats: integer[] = []; let formBaseTotal = 0; // Assume correct stat order in API result - for (let stat of pokemon.stats) { + for (const stat of pokemon.stats) { formBaseStats.push(stat.base_stat); formBaseTotal += stat.base_stat; } @@ -164,12 +167,13 @@ export async function printPokemon() { let moveVer: string; - if (!speciesFormLevelMoves.hasOwnProperty(speciesKey)) + if (!speciesFormLevelMoves.hasOwnProperty(speciesKey)) { speciesFormLevelMoves[speciesKey] = []; + } speciesFormLevelMoves[speciesKey][pokemonForm.formIndex] = []; - for (let version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === 'level-up'))) { + for (const version of versions) { + if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { moveVer = version; break; } @@ -180,30 +184,34 @@ export async function printPokemon() { moveData.version_group_details.filter(v => versions.indexOf(v.version_group.name) > -1).forEach(verData => { const isMoveVer = verData.version_group.name === moveVer; - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, '').replace(/\-/g, '_'); + const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); const learnMethod = verData.move_learn_method.name; - if (isMoveVer && learnMethod === 'level-up') - speciesFormLevelMoves[speciesKey][pokemonForm.formIndex].push([ verData.level_learned_at, moveId ]); + if (isMoveVer && learnMethod === "level-up") { + speciesFormLevelMoves[speciesKey][pokemonForm.formIndex].push([ verData.level_learned_at, moveId ]); + } - if ([ 'machine', 'tutor' ].indexOf(learnMethod) > -1 || (useExistingTmList && tmSpecies.hasOwnProperty(moveId as Moves) && learnMethod === 'level-up')) { - if (!moveTmSpecies.hasOwnProperty(moveId)) + if ([ "machine", "tutor" ].indexOf(learnMethod) > -1 || (useExistingTmList && tmSpecies.hasOwnProperty(moveId as Moves) && learnMethod === "level-up")) { + if (!moveTmSpecies.hasOwnProperty(moveId)) { moveTmSpecies[moveId] = []; + } const speciesIndex = moveTmSpecies[moveId].findIndex(s => s[0] === speciesKey); - if (speciesIndex === -1) + if (speciesIndex === -1) { moveTmSpecies[moveId].push([ speciesKey, formName ]); - else + } else { (moveTmSpecies[moveId][speciesIndex] as string[]).push(formName); + } } }); }); if (JSON.stringify(speciesLevelMoves[speciesKey]) === JSON.stringify(speciesFormLevelMoves[speciesKey][pokemonForm.formIndex])) { delete speciesFormLevelMoves[speciesKey][pokemonForm.formIndex]; - if (!Object.keys(speciesFormLevelMoves[speciesKey]).length) + if (!Object.keys(speciesFormLevelMoves[speciesKey]).length) { delete speciesFormLevelMoves[speciesKey]; + } } } @@ -214,7 +222,7 @@ export async function printPokemon() { const species = await api.pokemon.getPokemonSpeciesByName(pokemon.species.name); - let speciesKey = species.name.toUpperCase().replace(/\-/g, '_'); + let speciesKey = species.name.toUpperCase().replace(/\-/g, "_"); const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === speciesKey); @@ -227,15 +235,16 @@ export async function printPokemon() { let generationIndex = 0; - if (!region) - while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]); - else + if (!region) { + while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]){} + } else { generationIndex = regionalForms.indexOf(region.toLowerCase()) + 6; + } const baseStats: integer[] = []; let baseTotal = 0; // Assume correct stat order in API result - for (let stat of pokemon.stats) { + for (const stat of pokemon.stats) { baseStats.push(stat.base_stat); baseTotal += stat.base_stat; } @@ -250,7 +259,7 @@ export async function printPokemon() { ]; const pokemonSpecies = new PokemonSpecies(dexId, generationIndex, species.is_legendary && baseTotal < 660, species.is_legendary && baseTotal >= 660, species.is_mythical, - species.genera.find(g => g.language.name === 'en')?.genus, type1 as Type, type2 > -1 ? type2 as Type : null, pokemon.height / 10, pokemon.weight / 10, ability1 as Abilities, ability2 as Abilities, abilityHidden as Abilities, + species.genera.find(g => g.language.name === "en")?.genus, type1 as Type, type2 > -1 ? type2 as Type : null, pokemon.height / 10, pokemon.weight / 10, ability1 as Abilities, ability2 as Abilities, abilityHidden as Abilities, baseTotal, baseStats[0], baseStats[1], baseStats[2], baseStats[3], baseStats[4], baseStats[5], species.capture_rate, species.base_happiness, pokemon.base_experience, growthRateMap[species.growth_rate.name], species.gender_rate < 9 ? 100 - (species.gender_rate * 12.5) : null, species.has_gender_differences, species.forms_switchable); @@ -262,8 +271,8 @@ export async function printPokemon() { speciesLevelMoves[speciesKey] = []; - for (let version of versions) { - if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === 'level-up'))) { + for (const version of versions) { + if (pokemon.moves.find(m => m.version_group_details.find(v => v.version_group.name === version && v.move_learn_method.name === "level-up"))) { moveVer = version; break; } @@ -274,31 +283,34 @@ export async function printPokemon() { if (moveVer) { pokemon.moves.forEach(moveData => { const verData = moveData.version_group_details.find(v => v.version_group.name === moveVer); - if (!verData) + if (!verData) { return; + } - const moveName = moveData.move.name.toUpperCase().replace(/\_/g, '').replace(/\-/g, '_'); + const moveName = moveData.move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); const moveId = Math.max(Utils.getEnumKeys(Moves).indexOf(moveName), 0); switch (verData.move_learn_method.name) { - case 'level-up': - speciesLevelMoves[speciesKey].push([ verData.level_learned_at, moveId ]); - break; - case 'machine': - case 'tutor': - if (moveId > 0) { - if (!moveTmSpecies.hasOwnProperty(moveId)) - moveTmSpecies[moveId] = []; - if (moveTmSpecies[moveId].indexOf(speciesKey) === -1) - moveTmSpecies[moveId].push(speciesKey); - speciesTmMoves.push(moveId); + case "level-up": + speciesLevelMoves[speciesKey].push([ verData.level_learned_at, moveId ]); + break; + case "machine": + case "tutor": + if (moveId > 0) { + if (!moveTmSpecies.hasOwnProperty(moveId)) { + moveTmSpecies[moveId] = []; } - break; + if (moveTmSpecies[moveId].indexOf(speciesKey) === -1) { + moveTmSpecies[moveId].push(speciesKey); + } + speciesTmMoves.push(moveId); + } + break; } }); } - for (let f of pokemon.forms) { + for (const f of pokemon.forms) { const form = await api.pokemon.getPokemonFormByName(f.name); const formIndex = pokemonSpecies.forms.length; @@ -307,7 +319,7 @@ export async function printPokemon() { : null; const formName = matchingForm ? matchingForm.formName - : form.form_names.find(fn => fn.language.name === 'en')?.name || form.form_name; + : form.form_names.find(fn => fn.language.name === "en")?.name || form.form_name; const formKey = matchingForm ? matchingForm.formKey : form.form_name; @@ -321,7 +333,7 @@ export async function printPokemon() { pokemonForm.generation = pokemonSpecies.generation; if (!pokemonForm.formIndex && speciesTmMoves.length) { - for (let moveId of speciesTmMoves) { + for (const moveId of speciesTmMoves) { const speciesIndex = moveTmSpecies[moveId].findIndex(s => s === speciesKey); moveTmSpecies[moveId][speciesIndex] = [ speciesKey, @@ -336,86 +348,92 @@ export async function printPokemon() { console.log(pokemonSpecies.name, pokemonSpecies); } - for (let pokemonSpecies of pokemonSpeciesList) { + for (const pokemonSpecies of pokemonSpeciesList) { const speciesKey = (pokemonSpecies as any).key as string; - enumStr += ` ${speciesKey}${pokemonSpecies.speciesId >= 2000 ? ` = ${pokemonSpecies.speciesId}` : ''},\n`; - pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.subLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : 'null'}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`; + enumStr += ` ${speciesKey}${pokemonSpecies.speciesId >= 2000 ? ` = ${pokemonSpecies.speciesId}` : ""},\n`; + pokemonSpeciesStr += ` new PokemonSpecies(Species.${speciesKey}, "${pokemonSpecies.name}", ${pokemonSpecies.generation}, ${pokemonSpecies.subLegendary}, ${pokemonSpecies.legendary}, ${pokemonSpecies.mythical}, "${pokemonSpecies.species}", Type.${Type[pokemonSpecies.type1]}, ${pokemonSpecies.type2 ? `Type.${Type[pokemonSpecies.type2]}` : "null"}, ${pokemonSpecies.height}, ${pokemonSpecies.weight}, Abilities.${Abilities[pokemonSpecies.ability1]}, Abilities.${Abilities[pokemonSpecies.ability2]}, Abilities.${Abilities[pokemonSpecies.abilityHidden]}, ${pokemonSpecies.baseTotal}, ${pokemonSpecies.baseStats[0]}, ${pokemonSpecies.baseStats[1]}, ${pokemonSpecies.baseStats[2]}, ${pokemonSpecies.baseStats[3]}, ${pokemonSpecies.baseStats[4]}, ${pokemonSpecies.baseStats[5]}, ${pokemonSpecies.catchRate}, ${pokemonSpecies.baseFriendship}, ${pokemonSpecies.baseExp}, GrowthRate.${GrowthRate[pokemonSpecies.growthRate]}, ${pokemonSpecies.malePercent}, ${pokemonSpecies.genderDiffs}`; if (pokemonSpecies.forms.length > 1) { pokemonSpeciesStr += `, ${pokemonSpecies.canChangeForm},`; - for (let form of pokemonSpecies.forms) - pokemonSpeciesStr += `\n new PokemonForm("${form.formName}", "${form.formName}", Type.${Type[form.type1]}, ${form.type2 ? `Type.${Type[form.type2]}` : 'null'}, ${form.height}, ${form.weight}, Abilities.${Abilities[form.ability1]}, Abilities.${Abilities[form.ability2]}, Abilities.${Abilities[form.abilityHidden]}, ${form.baseTotal}, ${form.baseStats[0]}, ${form.baseStats[1]}, ${form.baseStats[2]}, ${form.baseStats[3]}, ${form.baseStats[4]}, ${form.baseStats[5]}, ${form.catchRate}, ${form.baseFriendship}, ${form.baseExp}${form.genderDiffs ? ', true' : ''}),`; - pokemonSpeciesStr += '\n '; + for (const form of pokemonSpecies.forms) { + pokemonSpeciesStr += `\n new PokemonForm("${form.formName}", "${form.formName}", Type.${Type[form.type1]}, ${form.type2 ? `Type.${Type[form.type2]}` : "null"}, ${form.height}, ${form.weight}, Abilities.${Abilities[form.ability1]}, Abilities.${Abilities[form.ability2]}, Abilities.${Abilities[form.abilityHidden]}, ${form.baseTotal}, ${form.baseStats[0]}, ${form.baseStats[1]}, ${form.baseStats[2]}, ${form.baseStats[3]}, ${form.baseStats[4]}, ${form.baseStats[5]}, ${form.catchRate}, ${form.baseFriendship}, ${form.baseExp}${form.genderDiffs ? ", true" : ""}),`; + } + pokemonSpeciesStr += "\n "; } - pokemonSpeciesStr += `),\n`; + pokemonSpeciesStr += "),\n"; } - let speciesLevelMovesStr = `export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {\n`; - let speciesFormLevelMovesStr = `export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {\n`; - let tmSpeciesStr = `export const tmSpecies: TmSpecies = {\n`; + let speciesLevelMovesStr = "export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {\n"; + let speciesFormLevelMovesStr = "export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {\n"; + let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - for (let species of Object.keys(speciesLevelMoves)) { + for (const species of Object.keys(speciesLevelMoves)) { speciesLevelMovesStr += ` [Species.${species}]: [\n`; const orderedLevelMoves = speciesLevelMoves[species].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) + if (a[0] !== b[0]) { return a[0] < b[0] ? -1 : 1; + } return a[1] < b[1] ? -1 : 1; }); - for (let lm of orderedLevelMoves) + for (const lm of orderedLevelMoves) { speciesLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; + } - speciesLevelMovesStr += ` ],\n`; + speciesLevelMovesStr += " ],\n"; } - for (let species of Object.keys(speciesFormLevelMoves)) { + for (const species of Object.keys(speciesFormLevelMoves)) { speciesFormLevelMovesStr += ` [Species.${species}]: {\n`; - for (let f of Object.keys(speciesFormLevelMoves[species])) { + for (const f of Object.keys(speciesFormLevelMoves[species])) { speciesFormLevelMovesStr += ` ${f}: [\n`; const orderedLevelMoves = speciesFormLevelMoves[species][f].sort((a: LevelMove, b: LevelMove) => { - if (a[0] !== b[0]) + if (a[0] !== b[0]) { return a[0] < b[0] ? -1 : 1; + } return a[1] < b[1] ? -1 : 1; }); - for (let lm of orderedLevelMoves) + for (const lm of orderedLevelMoves) { speciesFormLevelMovesStr += ` [ ${lm[0]}, Moves.${Moves[lm[1]]} ],\n`; + } - speciesFormLevelMovesStr += ` ],\n`; + speciesFormLevelMovesStr += " ],\n"; } - speciesFormLevelMovesStr += ` },\n`; + speciesFormLevelMovesStr += " },\n"; } - for (let moveId of Object.keys(moveTmSpecies)) { + for (const moveId of Object.keys(moveTmSpecies)) { tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (let species of moveTmSpecies[moveId]) { - if (typeof species === 'string') + for (const species of moveTmSpecies[moveId]) { + if (typeof species === "string") { tmSpeciesStr += ` Species.${species},\n`; - else { + } else { const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) + if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { tmSpeciesStr += ` Species.${species[0]},\n`; - else { + } else { tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (let form of forms) + for (const form of forms) { tmSpeciesStr += ` '${form}',\n`; - tmSpeciesStr += ` ],\n`; + } + tmSpeciesStr += " ],\n"; } } } - tmSpeciesStr += ` ],\n`; + tmSpeciesStr += " ],\n"; } - enumStr += `\n};`; - pokemonSpeciesStr += ` );`; - speciesLevelMovesStr += `\n};`; - speciesFormLevelMovesStr += `\n};`; - tmSpeciesStr += `\n};`; + enumStr += "\n};"; + pokemonSpeciesStr += " );"; + speciesLevelMovesStr += "\n};"; + speciesFormLevelMovesStr += "\n};"; + tmSpeciesStr += "\n};"; console.log(enumStr); console.log(pokemonSpeciesStr); @@ -423,39 +441,40 @@ export async function printPokemon() { console.log(speciesFormLevelMovesStr); console.log(tmSpeciesStr); - console.log(moveTmSpecies) + console.log(moveTmSpecies); } export async function printAbilities() { const replaceText = true; - let abilityContent: string = await fs.readFile('./src/data/ability.ts'); + let abilityContent: string = await fs.readFile("./src/data/ability.ts"); const api = new MainClient(); - let enumStr = `export enum Abilities {\n NONE,`; - let abilityStr = ' allAbilities.push('; + let enumStr = "export enum Abilities {\n NONE,"; + let abilityStr = " allAbilities.push("; abilityContent = abilityContent.slice(abilityContent.indexOf(abilityStr)); let abilities: NamedAPIResource[] = []; - let offset = 0; - let abilitiesResponse = await api.pokemon.listAbilities(offset, 2000); + const offset = 0; + const abilitiesResponse = await api.pokemon.listAbilities(offset, 2000); abilities = abilitiesResponse.results; - for (let a of abilities) { + for (const a of abilities) { const ability = await api.pokemon.getAbilityByName(a.name); - const abilityEnumName = ability.name.toUpperCase().replace(/\_/g, '').replace(/\-/g, '_'); + const abilityEnumName = ability.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); enumStr += `\n ${abilityEnumName},`; console.log(ability.name, ability); const matchingLineIndex = abilityContent.search(new RegExp(`new Ability\\\(Abilities.${abilityEnumName},`)); let matchingLine = matchingLineIndex > -1 ? abilityContent.slice(matchingLineIndex) : null; - if (matchingLine) + if (matchingLine) { matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); + } - let abilityName = ability.names.find(ln => ln.language.name === 'en').name; - [ 'N', 'P' ].every(s => { + let abilityName = ability.names.find(ln => ln.language.name === "en").name; + [ "N", "P" ].every(s => { if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { abilityName += ` (${s})`; return false; @@ -465,26 +484,29 @@ export async function printAbilities() { let flavorText: string; if (!matchingLine || replaceText) { - for (let version of versions) { - if ((flavorText = ability.flavor_text_entries.find(fte => fte.language.name === 'en' && fte.version_group.name === version)?.flavor_text) || '') { - if (flavorText.indexOf('forgotten') > -1) + for (const version of versions) { + if ((flavorText = ability.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { + if (flavorText.indexOf("forgotten") > -1) { continue; + } break; } } - } else if (matchingLine) + } else if (matchingLine) { flavorText = allAbilities[ability.id].description; - abilityStr += `\n new Ability(Abilities.${abilityEnumName}, "${abilityName}", "${flavorText?.replace(/\n/g, '\\n').replace(/ /g, ' ').replace(/’/g, '\'') || ''}", ${generationMap[ability.generation.name]})`; + } + abilityStr += `\n new Ability(Abilities.${abilityEnumName}, "${abilityName}", "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${generationMap[ability.generation.name]})`; if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf('\n'); - if (newLineIndex > -1) + const newLineIndex = matchingLine.indexOf("\n"); + if (newLineIndex > -1) { abilityStr += matchingLine.slice(newLineIndex); + } } - abilityStr += ','; + abilityStr += ","; } - enumStr += `\n};`; - abilityStr += `\n);`; + enumStr += "\n};"; + abilityStr += "\n);"; console.log(enumStr); console.log(abilityStr); @@ -493,35 +515,36 @@ export async function printAbilities() { export async function printMoves() { const replaceText = true; - let moveContent: string = await fs.readFile('./src/data/move.ts'); + let moveContent: string = await fs.readFile("./src/data/move.ts"); const api = new MainClient(); - let enumStr = `export enum Moves {\n NONE,`; - let moveStr = ' allMoves.push('; + let enumStr = "export enum Moves {\n NONE,"; + let moveStr = " allMoves.push("; moveContent = moveContent.slice(moveContent.indexOf(moveStr)); let moves: NamedAPIResource[] = []; - let offset = 0; - let movesResponse = await api.move.listMoves(offset, 2000); + const offset = 0; + const movesResponse = await api.move.listMoves(offset, 2000); moves = movesResponse.results; console.log(moves); - for (let m of moves) { + for (const m of moves) { const move = await api.move.getMoveByName(m.name); - const moveEnumName = move.name.toUpperCase().replace(/\_/g, '').replace(/\-/g, '_'); + const moveEnumName = move.name.toUpperCase().replace(/\_/g, "").replace(/\-/g, "_"); enumStr += `\n ${moveEnumName},`; console.log(move.name, move); const matchingLineIndex = moveContent.search(new RegExp(`new (?:Attack|(?:Self)?Status)Move\\\(Moves.${Moves[move.id]},`)); let matchingLine = matchingLineIndex > -1 ? moveContent.slice(matchingLineIndex) : null; - if (matchingLine) + if (matchingLine) { matchingLine = matchingLine.slice(0, matchingLine.search(/,(?: \/\/.*?)?(?:\r)?\n[ \t]+(?:new|\);)/)); + } - let moveName = move.names.find(ln => ln.language.name === 'en').name; - [ 'N', 'P' ].every(s => { + let moveName = move.names.find(ln => ln.language.name === "en").name; + [ "N", "P" ].every(s => { if (!matchingLine || matchingLine.indexOf(` (${s})`) > -1) { moveName += ` (${s})`; return false; @@ -531,32 +554,35 @@ export async function printMoves() { let flavorText: string; if (!matchingLine || replaceText) { - for (let version of versions) { - if ((flavorText = move.flavor_text_entries.find(fte => fte.language.name === 'en' && fte.version_group.name === version)?.flavor_text) || '') { - if (flavorText.indexOf('forgotten') > -1) + for (const version of versions) { + if ((flavorText = move.flavor_text_entries.find(fte => fte.language.name === "en" && fte.version_group.name === version)?.flavor_text) || "") { + if (flavorText.indexOf("forgotten") > -1) { continue; + } break; } } - } else if (matchingLine) + } else if (matchingLine) { flavorText = allMoves[move.id].effect; + } const moveTarget = targetMap[move.target.name]; - moveStr += `\n new ${move.damage_class.name !== 'status' ? 'Attack' : (moveTarget === MoveTarget.USER ? 'Self' : '') + 'Status'}Move(Moves.${moveEnumName}, "${moveName}", Type.${move.type.name.toUpperCase()}${move.damage_class.name !== 'status' ? `, MoveCategory.${move.damage_class.name.toUpperCase()}` : ''}${move.damage_class.name !== 'status' ? `, ${move.power || -1}` : ''}, ${move.accuracy || -1}, ${move.pp}, "${flavorText?.replace(/\n/g, '\\n').replace(/ /g, ' ').replace(/’/g, '\'') || ''}", ${move.effect_chance || -1}, ${move.priority}, ${generationMap[move.generation.name]})`; - const expectedTarget = move.damage_class.name !== 'status' || moveTarget !== MoveTarget.USER ? MoveTarget.NEAR_OTHER : MoveTarget.USER; + moveStr += `\n new ${move.damage_class.name !== "status" ? "Attack" : (moveTarget === MoveTarget.USER ? "Self" : "") + "Status"}Move(Moves.${moveEnumName}, "${moveName}", Type.${move.type.name.toUpperCase()}${move.damage_class.name !== "status" ? `, MoveCategory.${move.damage_class.name.toUpperCase()}` : ""}${move.damage_class.name !== "status" ? `, ${move.power || -1}` : ""}, ${move.accuracy || -1}, ${move.pp}, "${flavorText?.replace(/\n/g, "\\n").replace(/ /g, " ").replace(/’/g, "'") || ""}", ${move.effect_chance || -1}, ${move.priority}, ${generationMap[move.generation.name]})`; + const expectedTarget = move.damage_class.name !== "status" || moveTarget !== MoveTarget.USER ? MoveTarget.NEAR_OTHER : MoveTarget.USER; if (matchingLine && matchingLine.length > 1) { - const newLineIndex = matchingLine.indexOf('\n'); + const newLineIndex = matchingLine.indexOf("\n"); if (newLineIndex > -1) { - console.log(matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ''), newLineIndex) - moveStr += matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ''); + console.log(matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""), newLineIndex); + moveStr += matchingLine.slice(newLineIndex).replace(/(?:\r)?\n[ \t]+.target\(.*?\)/g, ""); } } - if (moveTarget !== expectedTarget) + if (moveTarget !== expectedTarget) { moveStr += `\n .target(MoveTarget.${MoveTarget[moveTarget]})`; - moveStr += ','; + } + moveStr += ","; } - enumStr += `\n};`; - moveStr += `\n);`; + enumStr += "\n};"; + moveStr += "\n);"; console.log(enumStr); console.log(moveStr); @@ -569,31 +595,33 @@ export async function printTmSpecies() { const moveIds = Object.keys(tmSpecies).map(k => parseInt(k) as Moves); - for (let moveId of moveIds) { + for (const moveId of moveIds) { const move = await api.move.getMoveById(moveId); moveTmSpecies[moveId] = []; - for (let species of move.learned_by_pokemon) { + for (const species of move.learned_by_pokemon) { const dexIdMatch = /\/(\d+)\//.exec(species.url); - if (!dexIdMatch) + if (!dexIdMatch) { continue; + } - let dexId = parseInt(dexIdMatch[1]); + const dexId = parseInt(dexIdMatch[1]); let matchingSpecies: PokemonSpecies; - let formKey = ''; + let formKey = ""; console.log(species.name); - if (dexId < 10000) + if (dexId < 10000) { matchingSpecies = allSpecies[dexId - 1]; - else { + } else { const pokemon = await api.pokemon.getPokemonById(dexId); const speciesDexIdMatch = /\/(\d+)\//.exec(pokemon.species.url); - if (!speciesDexIdMatch) + if (!speciesDexIdMatch) { continue; + } const speciesDexId = parseInt(speciesDexIdMatch[1]); @@ -606,12 +634,13 @@ export async function printTmSpecies() { if (regionKey) { formKey = formKey.slice(regionKey.length + 1); matchingSpecies = allSpecies.find(s => Species[s.speciesId] === `${regionKey.toUpperCase()}_${speciesKey}`); - } else + } else { matchingSpecies = allSpecies[speciesDexId - 1]; + } } if (!matchingSpecies) { - console.log('NO MATCH', species.name); + console.log("NO MATCH", species.name); continue; } @@ -619,40 +648,42 @@ export async function printTmSpecies() { const matchingIndex = moveTmSpecies[moveId].findIndex(s => Array.isArray(s) ? s[0] === speciesKey : s === speciesKey); - if (matchingIndex === -1) + if (matchingIndex === -1) { moveTmSpecies[moveId].push(!formKey ? speciesKey : [ speciesKey, formKey ]); - else { - if (!Array.isArray(moveTmSpecies[moveId][matchingIndex])) - moveTmSpecies[moveId][matchingIndex] = [ moveTmSpecies[moveId][matchingIndex] as string, '' ]; + } else { + if (!Array.isArray(moveTmSpecies[moveId][matchingIndex])) { + moveTmSpecies[moveId][matchingIndex] = [ moveTmSpecies[moveId][matchingIndex] as string, "" ]; + } (moveTmSpecies[moveId][matchingIndex] as string[]).push(formKey); } } } - let tmSpeciesStr = `export const tmSpecies: TmSpecies = {\n`; + let tmSpeciesStr = "export const tmSpecies: TmSpecies = {\n"; - for (let moveId of Object.keys(moveTmSpecies)) { + for (const moveId of Object.keys(moveTmSpecies)) { tmSpeciesStr += ` [Moves.${Moves[parseInt(moveId)]}]: [\n`; - for (let species of moveTmSpecies[moveId]) { - if (typeof species === 'string') + for (const species of moveTmSpecies[moveId]) { + if (typeof species === "string") { tmSpeciesStr += ` Species.${species},\n`; - else { + } else { const matchingExistingSpecies = allSpecies.find(s => Species[s.speciesId] === species[0]); const forms = (species as string[]).slice(1); - if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) + if (matchingExistingSpecies && (!pokemonFormLevelMoves.hasOwnProperty(matchingExistingSpecies.speciesId) || matchingExistingSpecies.forms.length <= 1 || (matchingExistingSpecies.forms.length === 2 && matchingExistingSpecies.forms[1].formKey.indexOf(SpeciesFormKey.MEGA) > -1) || matchingExistingSpecies.forms.length === forms.length)) { tmSpeciesStr += ` Species.${species[0]},\n`; - else { + } else { tmSpeciesStr += ` [\n Species.${species[0]},\n`; - for (let form of forms) + for (const form of forms) { tmSpeciesStr += ` '${form}',\n`; - tmSpeciesStr += ` ],\n`; + } + tmSpeciesStr += " ],\n"; } } } - tmSpeciesStr += ` ],\n`; + tmSpeciesStr += " ],\n"; } - tmSpeciesStr += `\n};`; + tmSpeciesStr += "\n};"; console.log(tmSpeciesStr); -} \ No newline at end of file +} diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 63ed157b5977..c96164ac2a1e 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -40,7 +40,7 @@ export abstract class ArenaTag { onAdd(arena: Arena): void { } onRemove(arena: Arena): void { - arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? '\non your side' : this.side === ArenaTagSide.ENEMY ? '\non the foe\'s side' : ''}.`); + arena.scene.queueMessage(`${this.getMoveName()}\'s effect wore off${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); } onOverlap(arena: Arena): void { } @@ -65,13 +65,13 @@ export class MistTag extends ArenaTag { super.onAdd(arena); const source = arena.scene.getPokemonById(this.sourceId); - arena.scene.queueMessage(getPokemonMessage(source, `'s team became\nshrouded in mist!`)); + arena.scene.queueMessage(getPokemonMessage(source, "'s team became\nshrouded in mist!")); } apply(arena: Arena, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; - arena.scene.queueMessage('The mist prevented\nthe lowering of stats!'); + arena.scene.queueMessage("The mist prevented\nthe lowering of stats!"); return true; } @@ -110,7 +110,7 @@ class ReflectTag extends WeakenMoveScreenTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? '\non your side' : this.side === ArenaTagSide.ENEMY ? '\non the foe\'s side' : ''}.`); + arena.scene.queueMessage(`Reflect reduced the damage of physical moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); } } @@ -132,7 +132,7 @@ class LightScreenTag extends WeakenMoveScreenTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? '\non your side' : this.side === ArenaTagSide.ENEMY ? '\non the foe\'s side' : ''}.`); + arena.scene.queueMessage(`Light Screen reduced the damage of special moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); } } @@ -142,7 +142,7 @@ class AuroraVeilTag extends WeakenMoveScreenTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? '\non your side' : this.side === ArenaTagSide.ENEMY ? '\non the foe\'s side' : ''}.`); + arena.scene.queueMessage(`Aurora Veil reduced the damage of moves${this.side === ArenaTagSide.PLAYER ? "\non your side" : this.side === ArenaTagSide.ENEMY ? "\non the foe's side" : ""}.`); } } @@ -158,7 +158,7 @@ class WishTag extends ArenaTag { onAdd(arena: Arena): void { const user = arena.scene.getPokemonById(this.sourceId); this.battlerIndex = user.getBattlerIndex(); - this.triggerMessage = getPokemonMessage(user, '\'s wish\ncame true!'); + this.triggerMessage = getPokemonMessage(user, "'s wish\ncame true!"); this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); } @@ -196,11 +196,11 @@ class MudSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage('Electricity\'s power was weakened!'); + arena.scene.queueMessage("Electricity's power was weakened!"); } onRemove(arena: Arena): void { - arena.scene.queueMessage('The effects of Mud Sport\nhave faded.'); + arena.scene.queueMessage("The effects of Mud Sport\nhave faded."); } } @@ -210,11 +210,11 @@ class WaterSportTag extends WeakenMoveTypeTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage('Fire\'s power was weakened!'); + arena.scene.queueMessage("Fire's power was weakened!"); } onRemove(arena: Arena): void { - arena.scene.queueMessage('The effects of Water Sport\nhave faded.'); + arena.scene.queueMessage("The effects of Water Sport\nhave faded."); } } @@ -239,8 +239,9 @@ export class ArenaTrapTag extends ArenaTag { apply(arena: Arena, args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (this.sourceId === pokemon.id || (this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) + if (this.sourceId === pokemon.id || (this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) { return false; + } return this.activateTrap(pokemon); } @@ -275,9 +276,11 @@ class SpikesTag extends ArenaTrapTag { const damageHpRatio = 1 / (10 - 2 * this.layers); const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is hurt\nby the spikes!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is hurt\nby the spikes!")); pokemon.damageAndUpdate(damage, HitResult.OTHER); - if (pokemon.turnData) pokemon.turnData.damageTaken += damage; + if (pokemon.turnData) { + pokemon.turnData.damageTaken += damage; + } return true; } } @@ -302,8 +305,9 @@ class ToxicSpikesTag extends ArenaTrapTag { } onRemove(arena: Arena): void { - if (!this.neutralized) + if (!this.neutralized) { super.onRemove(arena); + } } activateTrap(pokemon: Pokemon): boolean { @@ -316,8 +320,9 @@ class ToxicSpikesTag extends ArenaTrapTag { } } else if (!pokemon.status) { const toxic = this.layers > 1; - if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`)) - return true; + if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`)) { + return true; + } } } @@ -325,10 +330,12 @@ class ToxicSpikesTag extends ArenaTrapTag { } getMatchupScoreMultiplier(pokemon: Pokemon): number { - if (pokemon.isGrounded() || !pokemon.canSetStatus(StatusEffect.POISON, true)) + if (pokemon.isGrounded() || !pokemon.canSetStatus(StatusEffect.POISON, true)) { return 1; - if (pokemon.isOfType(Type.POISON)) + } + if (pokemon.isOfType(Type.POISON)) { return 1.25; + } return super.getMatchupScoreMultiplier(pokemon); } } @@ -345,8 +352,9 @@ class DelayedAttackTag extends ArenaTag { lapse(arena: Arena): boolean { const ret = super.lapse(arena); - if (!ret) + if (!ret) { arena.scene.unshiftPhase(new MoveEffectPhase(arena.scene, this.sourceId, [ this.targetIndex ], new PokemonMove(this.sourceMove, 0, 0, true))); + } return ret; } @@ -372,24 +380,24 @@ class StealthRockTag extends ArenaTrapTag { let damageHpRatio: number; switch (effectiveness) { - case 0: - damageHpRatio = 0; - break; - case 0.25: - damageHpRatio = 0.03125; - break; - case 0.5: - damageHpRatio = 0.0625; - break; - case 1: - damageHpRatio = 0.125; - break; - case 2: - damageHpRatio = 0.25; - break; - case 4: - damageHpRatio = 0.5; - break; + case 0: + damageHpRatio = 0; + break; + case 0.25: + damageHpRatio = 0.03125; + break; + case 0.5: + damageHpRatio = 0.0625; + break; + case 1: + damageHpRatio = 0.125; + break; + case 2: + damageHpRatio = 0.25; + break; + case 4: + damageHpRatio = 0.5; + break; } return damageHpRatio; @@ -399,8 +407,9 @@ class StealthRockTag extends ArenaTrapTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (cancelled.value) + if (cancelled.value) { return false; + } const damageHpRatio = this.getDamageHpRatio(pokemon); @@ -408,7 +417,9 @@ class StealthRockTag extends ArenaTrapTag { const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); pokemon.scene.queueMessage(`Pointed stones dug into\n${pokemon.name}!`); pokemon.damageAndUpdate(damage, HitResult.OTHER); - if (pokemon.turnData) pokemon.turnData.damageTaken += damage; + if (pokemon.turnData) { + pokemon.turnData.damageTaken += damage; + } } return false; @@ -427,7 +438,9 @@ class StickyWebTag extends ArenaTrapTag { onAdd(arena: Arena): void { super.onAdd(arena); - + + // does not seem to be used anywhere + // eslint-disable-next-line @typescript-eslint/no-unused-vars const source = arena.scene.getPokemonById(this.sourceId); arena.scene.queueMessage(`A ${this.getMoveName()} has been laid out on the ground around the opposing team!`); } @@ -460,11 +473,11 @@ export class TrickRoomTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(getPokemonMessage(arena.scene.getPokemonById(this.sourceId), ' twisted\nthe dimensions!')); + arena.scene.queueMessage(getPokemonMessage(arena.scene.getPokemonById(this.sourceId), " twisted\nthe dimensions!")); } onRemove(arena: Arena): void { - arena.scene.queueMessage('The twisted dimensions\nreturned to normal!'); + arena.scene.queueMessage("The twisted dimensions\nreturned to normal!"); } } @@ -474,11 +487,11 @@ export class GravityTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage('Gravity intensified!'); + arena.scene.queueMessage("Gravity intensified!"); } onRemove(arena: Arena): void { - arena.scene.queueMessage('Gravity returned to normal!'); + arena.scene.queueMessage("Gravity returned to normal!"); } } @@ -488,46 +501,46 @@ class TailwindTag extends ArenaTag { } onAdd(arena: Arena): void { - arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? '\nyour' : this.side === ArenaTagSide.ENEMY ? '\nthe opposing' : ''} team!`); + arena.scene.queueMessage(`The Tailwind blew from behind${this.side === ArenaTagSide.PLAYER ? "\nyour" : this.side === ArenaTagSide.ENEMY ? "\nthe opposing" : ""} team!`); } onRemove(arena: Arena): void { - arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? 'Your' : this.side === ArenaTagSide.ENEMY ? 'The opposing' : ''} team's Tailwind petered out!`); + arena.scene.queueMessage(`${this.side === ArenaTagSide.PLAYER ? "Your" : this.side === ArenaTagSide.ENEMY ? "The opposing" : ""} team's Tailwind petered out!`); } } export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { switch (tagType) { - case ArenaTagType.MIST: - return new MistTag(turnCount, sourceId, side); - case ArenaTagType.MUD_SPORT: - return new MudSportTag(turnCount, sourceId); - case ArenaTagType.WATER_SPORT: - return new WaterSportTag(turnCount, sourceId); - case ArenaTagType.SPIKES: - return new SpikesTag(sourceId, side); - case ArenaTagType.TOXIC_SPIKES: - return new ToxicSpikesTag(sourceId, side); - case ArenaTagType.FUTURE_SIGHT: - case ArenaTagType.DOOM_DESIRE: - return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex); - case ArenaTagType.WISH: - return new WishTag(turnCount, sourceId, side); - case ArenaTagType.STEALTH_ROCK: - return new StealthRockTag(sourceId, side); - case ArenaTagType.STICKY_WEB: - return new StickyWebTag(sourceId, side); - case ArenaTagType.TRICK_ROOM: - return new TrickRoomTag(turnCount, sourceId); - case ArenaTagType.GRAVITY: - return new GravityTag(turnCount); - case ArenaTagType.REFLECT: - return new ReflectTag(turnCount, sourceId, side); - case ArenaTagType.LIGHT_SCREEN: - return new LightScreenTag(turnCount, sourceId, side); - case ArenaTagType.AURORA_VEIL: - return new AuroraVeilTag(turnCount, sourceId, side); - case ArenaTagType.TAILWIND: - return new TailwindTag(turnCount, sourceId, side); + case ArenaTagType.MIST: + return new MistTag(turnCount, sourceId, side); + case ArenaTagType.MUD_SPORT: + return new MudSportTag(turnCount, sourceId); + case ArenaTagType.WATER_SPORT: + return new WaterSportTag(turnCount, sourceId); + case ArenaTagType.SPIKES: + return new SpikesTag(sourceId, side); + case ArenaTagType.TOXIC_SPIKES: + return new ToxicSpikesTag(sourceId, side); + case ArenaTagType.FUTURE_SIGHT: + case ArenaTagType.DOOM_DESIRE: + return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex); + case ArenaTagType.WISH: + return new WishTag(turnCount, sourceId, side); + case ArenaTagType.STEALTH_ROCK: + return new StealthRockTag(sourceId, side); + case ArenaTagType.STICKY_WEB: + return new StickyWebTag(sourceId, side); + case ArenaTagType.TRICK_ROOM: + return new TrickRoomTag(turnCount, sourceId); + case ArenaTagType.GRAVITY: + return new GravityTag(turnCount); + case ArenaTagType.REFLECT: + return new ReflectTag(turnCount, sourceId, side); + case ArenaTagType.LIGHT_SCREEN: + return new LightScreenTag(turnCount, sourceId, side); + case ArenaTagType.AURORA_VEIL: + return new AuroraVeilTag(turnCount, sourceId, side); + case ArenaTagType.TAILWIND: + return new TailwindTag(turnCount, sourceId, side); } } diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index a5d3993f59fd..ff5b9889b497 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -4,9 +4,8 @@ import { AttackMove, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, a import Pokemon from "../field/pokemon"; import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; -import stringify, { Element } from "json-stable-stringify"; +import { Element } from "json-stable-stringify"; import { Moves } from "./enums/moves"; -import { getTypeRgb } from "./type"; //import fs from 'vite-plugin-fs/browser'; export enum AnimFrameTarget { @@ -104,188 +103,204 @@ export enum CommonAnim { } export class AnimConfig { - public id: integer; - public graphic: string; - public frames: AnimFrame[][]; - public frameTimedEvents: Map; - public position: integer; - public hue: integer; - - constructor(source?: any) { - this.frameTimedEvents = new Map; - - if (source) { - this.id = source.id; - this.graphic = source.graphic; - const frames: any[][] = source.frames; - frames.map(animFrames => { - for (let f = 0; f < animFrames.length; f++) - animFrames[f] = new ImportedAnimFrame(animFrames[f]); - }); - this.frames = frames; - - const frameTimedEvents = source.frameTimedEvents; - for (let fte of Object.keys(frameTimedEvents)) { - const timedEvents: AnimTimedEvent[] = []; - for (let te of frameTimedEvents[fte]) { - let timedEvent: AnimTimedEvent; - switch (te.eventType) { - case 'AnimTimedSoundEvent': - timedEvent = new AnimTimedSoundEvent(te.frameIndex, te.resourceName, te); - break; - case 'AnimTimedAddBgEvent': - timedEvent = new AnimTimedAddBgEvent(te.frameIndex, te.resourceName, te); - break; - case 'AnimTimedUpdateBgEvent': - timedEvent = new AnimTimedUpdateBgEvent(te.frameIndex, te.resourceName, te); - break; - } - timedEvents.push(timedEvent); - } - this.frameTimedEvents.set(parseInt(fte), timedEvents); - } + public id: integer; + public graphic: string; + public frames: AnimFrame[][]; + public frameTimedEvents: Map; + public position: integer; + public hue: integer; + + constructor(source?: any) { + this.frameTimedEvents = new Map; + + if (source) { + this.id = source.id; + this.graphic = source.graphic; + const frames: any[][] = source.frames; + frames.map(animFrames => { + for (let f = 0; f < animFrames.length; f++) { + animFrames[f] = new ImportedAnimFrame(animFrames[f]); + } + }); + this.frames = frames; + + const frameTimedEvents = source.frameTimedEvents; + for (const fte of Object.keys(frameTimedEvents)) { + const timedEvents: AnimTimedEvent[] = []; + for (const te of frameTimedEvents[fte]) { + let timedEvent: AnimTimedEvent; + switch (te.eventType) { + case "AnimTimedSoundEvent": + timedEvent = new AnimTimedSoundEvent(te.frameIndex, te.resourceName, te); + break; + case "AnimTimedAddBgEvent": + timedEvent = new AnimTimedAddBgEvent(te.frameIndex, te.resourceName, te); + break; + case "AnimTimedUpdateBgEvent": + timedEvent = new AnimTimedUpdateBgEvent(te.frameIndex, te.resourceName, te); + break; + } + timedEvents.push(timedEvent); + } + this.frameTimedEvents.set(parseInt(fte), timedEvents); + } - this.position = source.position; - this.hue = source.hue; - } else - this.frames = []; + this.position = source.position; + this.hue = source.hue; + } else { + this.frames = []; } + } - getSoundResourceNames(): string[] { - const sounds = new Set(); + getSoundResourceNames(): string[] { + const sounds = new Set(); - for (let ftes of this.frameTimedEvents.values()) { - for (let fte of ftes) { - if (fte instanceof AnimTimedSoundEvent && fte.resourceName) - sounds.add(fte.resourceName); - } + for (const ftes of this.frameTimedEvents.values()) { + for (const fte of ftes) { + if (fte instanceof AnimTimedSoundEvent && fte.resourceName) { + sounds.add(fte.resourceName); } - - return Array.from(sounds.values()); + } } - getBackgroundResourceNames(): string[] { - const backgrounds = new Set(); + return Array.from(sounds.values()); + } - for (let ftes of this.frameTimedEvents.values()) { - for (let fte of ftes) { - if (fte instanceof AnimTimedAddBgEvent && fte.resourceName) - backgrounds.add(fte.resourceName); - } - } + getBackgroundResourceNames(): string[] { + const backgrounds = new Set(); - return Array.from(backgrounds.values()); + for (const ftes of this.frameTimedEvents.values()) { + for (const fte of ftes) { + if (fte instanceof AnimTimedAddBgEvent && fte.resourceName) { + backgrounds.add(fte.resourceName); + } + } } + + return Array.from(backgrounds.values()); + } } class AnimFrame { - public x: number; - public y: number; - public zoomX: number; - public zoomY: number; - public angle: number; - public mirror: boolean; - public visible: boolean; - public blendType: AnimBlendType; - public target: AnimFrameTarget; - public graphicFrame: integer; - public opacity: integer; - public color: integer[]; - public tone: integer[]; - public flash: integer[]; - public locked: boolean; - public priority: integer; - public focus: AnimFocus; - - constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: AnimBlendType, pattern: integer, - opacity: integer, colorR: integer, colorG: integer, colorB: integer, colorA: integer, toneR: integer, toneG: integer, toneB: integer, toneA: integer, - flashR: integer, flashG: integer, flashB: integer, flashA: integer, locked: boolean, priority: integer, focus: AnimFocus, init?: boolean) { - this.x = !init ? ((x || 0) - 128) * 0.5 : x; - this.y = !init ? ((y || 0) - 224) * 0.5 : y; - if (zoomX) - this.zoomX = zoomX; - else if (init) - this.zoomX = 0; - if (zoomY) - this.zoomY = zoomY; - else if (init) - this.zoomY = 0; - if (angle) - this.angle = angle; - else if (init) - this.angle = 0; - if (mirror) - this.mirror = mirror; - else if (init) - this.mirror = false; - if (visible) - this.visible = visible; - else if (init) - this.visible = false; - if (blendType) - this.blendType = blendType; - else if (init) - this.blendType = AnimBlendType.NORMAL; - if (!init) { - let target = AnimFrameTarget.GRAPHIC; - switch (pattern) { - case -2: - target = AnimFrameTarget.TARGET; - break; - case -1: - target = AnimFrameTarget.USER; - break; - } - this.target = target; - this.graphicFrame = pattern >= 0 ? pattern : 0; - } - if (opacity) - this.opacity = opacity; - else if (init) - this.opacity = 0; - if (colorR || colorG || colorB || colorA) - this.color = [ colorR || 0, colorG || 0, colorB || 0, colorA || 0 ]; - else if (init) - this.color = [ 0, 0, 0, 0 ]; - if (toneR || toneG || toneB || toneA) - this.tone = [ toneR || 0, toneG || 0, toneB || 0, toneA || 0 ]; - else if (init) - this.tone = [ 0, 0, 0, 0 ]; - if (flashR || flashG || flashB || flashA) - this.flash = [ flashR || 0, flashG || 0, flashB || 0, flashA || 0 ]; - else if (init) - this.flash = [ 0, 0, 0, 0 ]; - if (locked) - this.locked = locked; - else if (init) - this.locked = false; - if (priority) - this.priority = priority; - else if (init) - this.priority = 0; - this.focus = focus || AnimFocus.TARGET; + public x: number; + public y: number; + public zoomX: number; + public zoomY: number; + public angle: number; + public mirror: boolean; + public visible: boolean; + public blendType: AnimBlendType; + public target: AnimFrameTarget; + public graphicFrame: integer; + public opacity: integer; + public color: integer[]; + public tone: integer[]; + public flash: integer[]; + public locked: boolean; + public priority: integer; + public focus: AnimFocus; + + constructor(x: number, y: number, zoomX: number, zoomY: number, angle: number, mirror: boolean, visible: boolean, blendType: AnimBlendType, pattern: integer, + opacity: integer, colorR: integer, colorG: integer, colorB: integer, colorA: integer, toneR: integer, toneG: integer, toneB: integer, toneA: integer, + flashR: integer, flashG: integer, flashB: integer, flashA: integer, locked: boolean, priority: integer, focus: AnimFocus, init?: boolean) { + this.x = !init ? ((x || 0) - 128) * 0.5 : x; + this.y = !init ? ((y || 0) - 224) * 0.5 : y; + if (zoomX) { + this.zoomX = zoomX; + } else if (init) { + this.zoomX = 0; + } + if (zoomY) { + this.zoomY = zoomY; + } else if (init) { + this.zoomY = 0; + } + if (angle) { + this.angle = angle; + } else if (init) { + this.angle = 0; + } + if (mirror) { + this.mirror = mirror; + } else if (init) { + this.mirror = false; + } + if (visible) { + this.visible = visible; + } else if (init) { + this.visible = false; } + if (blendType) { + this.blendType = blendType; + } else if (init) { + this.blendType = AnimBlendType.NORMAL; + } + if (!init) { + let target = AnimFrameTarget.GRAPHIC; + switch (pattern) { + case -2: + target = AnimFrameTarget.TARGET; + break; + case -1: + target = AnimFrameTarget.USER; + break; + } + this.target = target; + this.graphicFrame = pattern >= 0 ? pattern : 0; + } + if (opacity) { + this.opacity = opacity; + } else if (init) { + this.opacity = 0; + } + if (colorR || colorG || colorB || colorA) { + this.color = [ colorR || 0, colorG || 0, colorB || 0, colorA || 0 ]; + } else if (init) { + this.color = [ 0, 0, 0, 0 ]; + } + if (toneR || toneG || toneB || toneA) { + this.tone = [ toneR || 0, toneG || 0, toneB || 0, toneA || 0 ]; + } else if (init) { + this.tone = [ 0, 0, 0, 0 ]; + } + if (flashR || flashG || flashB || flashA) { + this.flash = [ flashR || 0, flashG || 0, flashB || 0, flashA || 0 ]; + } else if (init) { + this.flash = [ 0, 0, 0, 0 ]; + } + if (locked) { + this.locked = locked; + } else if (init) { + this.locked = false; + } + if (priority) { + this.priority = priority; + } else if (init) { + this.priority = 0; + } + this.focus = focus || AnimFocus.TARGET; + } } class ImportedAnimFrame extends AnimFrame { - constructor(source: any) { - const color: integer[] = source.color || [ 0, 0, 0, 0 ]; - const tone: integer[] = source.tone || [ 0, 0, 0, 0 ]; - const flash: integer[] = source.flash || [ 0, 0, 0, 0 ]; - super(source.x, source.y, source.zoomX, source.zoomY, source.angle, source.mirror, source.visible, source.blendType, source.graphicFrame, source.opacity, color[0], color[1], color[2], color[3], tone[0], tone[1], tone[2], tone[3], flash[0], flash[1], flash[2], flash[3], source.locked, source.priority, source.focus, true); - this.target = source.target; - this.graphicFrame = source.graphicFrame; - } + constructor(source: any) { + const color: integer[] = source.color || [ 0, 0, 0, 0 ]; + const tone: integer[] = source.tone || [ 0, 0, 0, 0 ]; + const flash: integer[] = source.flash || [ 0, 0, 0, 0 ]; + super(source.x, source.y, source.zoomX, source.zoomY, source.angle, source.mirror, source.visible, source.blendType, source.graphicFrame, source.opacity, color[0], color[1], color[2], color[3], tone[0], tone[1], tone[2], tone[3], flash[0], flash[1], flash[2], flash[3], source.locked, source.priority, source.focus, true); + this.target = source.target; + this.graphicFrame = source.graphicFrame; + } } abstract class AnimTimedEvent { - public frameIndex: integer; - public resourceName: string; + public frameIndex: integer; + public resourceName: string; - constructor(frameIndex: integer, resourceName: string) { - this.frameIndex = frameIndex; - this.resourceName = resourceName; - } + constructor(frameIndex: integer, resourceName: string) { + this.frameIndex = frameIndex; + this.resourceName = resourceName; + } abstract execute(scene: BattleScene, battleAnim: BattleAnim): integer; @@ -293,131 +308,137 @@ abstract class AnimTimedEvent { } class AnimTimedSoundEvent extends AnimTimedEvent { - public volume: number = 100; - public pitch: number = 100; + public volume: number = 100; + public pitch: number = 100; - constructor(frameIndex: integer, resourceName: string, source?: any) { - super(frameIndex, resourceName); + constructor(frameIndex: integer, resourceName: string, source?: any) { + super(frameIndex, resourceName); - if (source) { - this.volume = source.volume; - this.pitch = source.pitch; - } + if (source) { + this.volume = source.volume; + this.pitch = source.pitch; } - - execute(scene: BattleScene, battleAnim: BattleAnim): integer { - const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; - if (this.resourceName) { - try { - scene.playSound(this.resourceName, soundConfig); - } catch (err) { - console.error(err); - } - return Math.ceil((scene.sound.get(this.resourceName).totalDuration * 1000) / 33.33); - } else - return Math.ceil((battleAnim.user.cry(soundConfig).totalDuration * 1000) / 33.33); + } + + execute(scene: BattleScene, battleAnim: BattleAnim): integer { + const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; + if (this.resourceName) { + try { + scene.playSound(this.resourceName, soundConfig); + } catch (err) { + console.error(err); + } + return Math.ceil((scene.sound.get(this.resourceName).totalDuration * 1000) / 33.33); + } else { + return Math.ceil((battleAnim.user.cry(soundConfig).totalDuration * 1000) / 33.33); } + } - getEventType(): string { - return 'AnimTimedSoundEvent'; - } + getEventType(): string { + return "AnimTimedSoundEvent"; + } } abstract class AnimTimedBgEvent extends AnimTimedEvent { - public bgX: number = 0; - public bgY: number = 0; - public opacity: integer = 0; - /*public colorRed: integer = 0; + public bgX: number = 0; + public bgY: number = 0; + public opacity: integer = 0; + /*public colorRed: integer = 0; public colorGreen: integer = 0; public colorBlue: integer = 0; public colorAlpha: integer = 0;*/ - public duration: integer = 0; - /*public flashScope: integer = 0; + public duration: integer = 0; + /*public flashScope: integer = 0; public flashRed: integer = 0; public flashGreen: integer = 0; public flashBlue: integer = 0; public flashAlpha: integer = 0; public flashDuration: integer = 0;*/ - constructor(frameIndex: integer, resourceName: string, source: any) { - super(frameIndex, resourceName); + constructor(frameIndex: integer, resourceName: string, source: any) { + super(frameIndex, resourceName); - if (source) { - this.bgX = source.bgX; - this.bgY = source.bgY; - this.opacity = source.opacity; - /*this.colorRed = source.colorRed; + if (source) { + this.bgX = source.bgX; + this.bgY = source.bgY; + this.opacity = source.opacity; + /*this.colorRed = source.colorRed; this.colorGreen = source.colorGreen; this.colorBlue = source.colorBlue; this.colorAlpha = source.colorAlpha;*/ - this.duration = source.duration; - /*this.flashScope = source.flashScope; + this.duration = source.duration; + /*this.flashScope = source.flashScope; this.flashRed = source.flashRed; this.flashGreen = source.flashGreen; this.flashBlue = source.flashBlue; this.flashAlpha = source.flashAlpha; this.flashDuration = source.flashDuration;*/ - } } + } } class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: integer, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); + constructor(frameIndex: integer, resourceName: string, source?: any) { + super(frameIndex, resourceName, source); + } + + execute(scene: BattleScene, moveAnim: MoveAnim): integer { + const tweenProps = {}; + if (this.bgX !== undefined) { + tweenProps["x"] = (this.bgX * 0.5) - 320; } - - execute(scene: BattleScene, moveAnim: MoveAnim): integer { - const tweenProps = {}; - if (this.bgX !== undefined) - tweenProps['x'] = (this.bgX * 0.5) - 320; - if (this.bgY !== undefined) - tweenProps['y'] = (this.bgY * 0.5) - 284; - if (this.opacity !== undefined) - tweenProps['alpha'] = (this.opacity || 0) / 255; - if (Object.keys(tweenProps).length) { - scene.tweens.add(Object.assign({ - targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) - }, tweenProps)); - } - return this.duration * 2; + if (this.bgY !== undefined) { + tweenProps["y"] = (this.bgY * 0.5) - 284; } - - getEventType(): string { - return 'AnimTimedUpdateBgEvent'; + if (this.opacity !== undefined) { + tweenProps["alpha"] = (this.opacity || 0) / 255; + } + if (Object.keys(tweenProps).length) { + scene.tweens.add(Object.assign({ + targets: moveAnim.bgSprite, + duration: Utils.getFrameMs(this.duration * 3) + }, tweenProps)); } + return this.duration * 2; + } + + getEventType(): string { + return "AnimTimedUpdateBgEvent"; + } } class AnimTimedAddBgEvent extends AnimTimedBgEvent { - constructor(frameIndex: integer, resourceName: string, source?: any) { - super(frameIndex, resourceName, source); + constructor(frameIndex: integer, resourceName: string, source?: any) { + super(frameIndex, resourceName, source); + } + + execute(scene: BattleScene, moveAnim: MoveAnim): integer { + if (moveAnim.bgSprite) { + moveAnim.bgSprite.destroy(); + } + moveAnim.bgSprite = this.resourceName + ? scene.add.tileSprite(this.bgX - 320, this.bgY - 284, 896, 576, this.resourceName) + : scene.add.rectangle(this.bgX - 320, this.bgY - 284, 896, 576, 0); + moveAnim.bgSprite.setOrigin(0, 0); + moveAnim.bgSprite.setScale(1.25); + moveAnim.bgSprite.setAlpha(this.opacity / 255); + scene.field.add(moveAnim.bgSprite); + const fieldPokemon = scene.getEnemyPokemon() || scene.getPlayerPokemon(); + if (fieldPokemon?.isOnField()) { + scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); } - execute(scene: BattleScene, moveAnim: MoveAnim): integer { - if (moveAnim.bgSprite) - moveAnim.bgSprite.destroy(); - moveAnim.bgSprite = this.resourceName - ? scene.add.tileSprite(this.bgX - 320, this.bgY - 284, 896, 576, this.resourceName) - : scene.add.rectangle(this.bgX - 320, this.bgY - 284, 896, 576, 0); - moveAnim.bgSprite.setOrigin(0, 0); - moveAnim.bgSprite.setScale(1.25); - moveAnim.bgSprite.setAlpha(this.opacity / 255); - scene.field.add(moveAnim.bgSprite); - const fieldPokemon = scene.getEnemyPokemon() || scene.getPlayerPokemon(); - if (fieldPokemon?.isOnField()) - scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); - - scene.tweens.add({ - targets: moveAnim.bgSprite, - duration: Utils.getFrameMs(this.duration * 3) - }); + scene.tweens.add({ + targets: moveAnim.bgSprite, + duration: Utils.getFrameMs(this.duration * 3) + }); - return this.duration * 2; - } + return this.duration * 2; + } - getEventType(): string { - return 'AnimTimedAddBgEvent'; - } + getEventType(): string { + return "AnimTimedAddBgEvent"; + } } export const moveAnims = new Map(); @@ -425,164 +446,177 @@ export const chargeAnims = new Map(); export function initCommonAnims(scene: BattleScene): Promise { - return new Promise(resolve => { - const commonAnimNames = Utils.getEnumKeys(CommonAnim); - const commonAnimIds = Utils.getEnumValues(CommonAnim); - const commonAnimFetches = []; - for (let ca = 0; ca < commonAnimIds.length; ca++) { - const commonAnimId = commonAnimIds[ca]; - commonAnimFetches.push(scene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, '-')}.json`) - .then(response => response.json()) - .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas)))); - } - Promise.allSettled(commonAnimFetches).then(() => resolve()); - }); + return new Promise(resolve => { + const commonAnimNames = Utils.getEnumKeys(CommonAnim); + const commonAnimIds = Utils.getEnumValues(CommonAnim); + const commonAnimFetches = []; + for (let ca = 0; ca < commonAnimIds.length; ca++) { + const commonAnimId = commonAnimIds[ca]; + commonAnimFetches.push(scene.cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas)))); + } + Promise.allSettled(commonAnimFetches).then(() => resolve()); + }); } export function initMoveAnim(scene: BattleScene, move: Moves): Promise { - return new Promise(resolve => { - if (moveAnims.has(move)) { - if (moveAnims.get(move) !== null) - resolve(); - else { - let loadedCheckTimer = setInterval(() => { - if (moveAnims.get(move) !== null) { - const chargeAttr = allMoves[move].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[move].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; - if (chargeAttr && chargeAnims.get(chargeAttr.chargeAnim) === null) - return; - clearInterval(loadedCheckTimer); - resolve(); - } - }, 50); + return new Promise(resolve => { + if (moveAnims.has(move)) { + if (moveAnims.get(move) !== null) { + resolve(); + } else { + const loadedCheckTimer = setInterval(() => { + if (moveAnims.get(move) !== null) { + const chargeAttr = allMoves[move].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[move].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; + if (chargeAttr && chargeAnims.get(chargeAttr.chargeAnim) === null) { + return; } - } else { - moveAnims.set(move, null); - const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; - const moveName = Moves[move].toLowerCase().replace(/\_/g, '-'); - const fetchAnimAndResolve = (move: Moves) => { - scene.cachedFetch(`./battle-anims/${moveName}.json`) - .then(response => { - if (!response.ok) { - console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); - populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); - return resolve(); - } - return response.json(); - }) - .then(ba => { - if (Array.isArray(ba)) { - populateMoveAnim(move, ba[0]); - populateMoveAnim(move, ba[1]); - } else - populateMoveAnim(move, ba); - const chargeAttr = allMoves[move].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[move].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; - if (chargeAttr) - initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); - else - resolve(); - }); - }; - fetchAnimAndResolve(move); - } - }); + clearInterval(loadedCheckTimer); + resolve(); + } + }, 50); + } + } else { + moveAnims.set(move, null); + const defaultMoveAnim = allMoves[move] instanceof AttackMove ? Moves.TACKLE : allMoves[move] instanceof SelfStatusMove ? Moves.FOCUS_ENERGY : Moves.TAIL_WHIP; + const moveName = Moves[move].toLowerCase().replace(/\_/g, "-"); + const fetchAnimAndResolve = (move: Moves) => { + scene.cachedFetch(`./battle-anims/${moveName}.json`) + .then(response => { + if (!response.ok) { + console.error(`Could not load animation file for move '${moveName}'`, response.status, response.statusText); + populateMoveAnim(move, moveAnims.get(defaultMoveAnim)); + return resolve(); + } + return response.json(); + }) + .then(ba => { + if (Array.isArray(ba)) { + populateMoveAnim(move, ba[0]); + populateMoveAnim(move, ba[1]); + } else { + populateMoveAnim(move, ba); + } + const chargeAttr = allMoves[move].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[move].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; + if (chargeAttr) { + initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); + } else { + resolve(); + } + }); + }; + fetchAnimAndResolve(move); + } + }); } export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): Promise { - return new Promise(resolve => { - if (chargeAnims.has(chargeAnim)) { - if (chargeAnims.get(chargeAnim) !== null) - resolve(); - else { - let loadedCheckTimer = setInterval(() => { - if (chargeAnims.get(chargeAnim) !== null) { - clearInterval(loadedCheckTimer); - resolve(); - } - }, 50); - } - } else { - chargeAnims.set(chargeAnim, null); - scene.cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, '-')}.json`) - .then(response => response.json()) - .then(ca => { - if (Array.isArray(ca)) { - populateMoveChargeAnim(chargeAnim, ca[0]); - populateMoveChargeAnim(chargeAnim, ca[1]); - } else - populateMoveChargeAnim(chargeAnim, ca); - resolve(); - }); - } - }); + return new Promise(resolve => { + if (chargeAnims.has(chargeAnim)) { + if (chargeAnims.get(chargeAnim) !== null) { + resolve(); + } else { + const loadedCheckTimer = setInterval(() => { + if (chargeAnims.get(chargeAnim) !== null) { + clearInterval(loadedCheckTimer); + resolve(); + } + }, 50); + } + } else { + chargeAnims.set(chargeAnim, null); + scene.cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(ca => { + if (Array.isArray(ca)) { + populateMoveChargeAnim(chargeAnim, ca[0]); + populateMoveChargeAnim(chargeAnim, ca[1]); + } else { + populateMoveChargeAnim(chargeAnim, ca); + } + resolve(); + }); + } + }); } function populateMoveAnim(move: Moves, animSource: any): void { - const moveAnim = new AnimConfig(animSource); - if (moveAnims.get(move) === null) { - moveAnims.set(move, moveAnim); - return; - } - moveAnims.set(move, [ moveAnims.get(move) as AnimConfig, moveAnim ]); + const moveAnim = new AnimConfig(animSource); + if (moveAnims.get(move) === null) { + moveAnims.set(move, moveAnim); + return; + } + moveAnims.set(move, [ moveAnims.get(move) as AnimConfig, moveAnim ]); } function populateMoveChargeAnim(chargeAnim: ChargeAnim, animSource: any) { - const moveChargeAnim = new AnimConfig(animSource); - if (chargeAnims.get(chargeAnim) === null) { - chargeAnims.set(chargeAnim, moveChargeAnim); - return; - } - chargeAnims.set(chargeAnim, [ chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim ]); + const moveChargeAnim = new AnimConfig(animSource); + if (chargeAnims.get(chargeAnim) === null) { + chargeAnims.set(chargeAnim, moveChargeAnim); + return; + } + chargeAnims.set(chargeAnim, [ chargeAnims.get(chargeAnim) as AnimConfig, moveChargeAnim ]); } export function loadCommonAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { - return new Promise(resolve => { - loadAnimAssets(scene, Array.from(commonAnims.values()), startLoad).then(() => resolve()); - }); + return new Promise(resolve => { + loadAnimAssets(scene, Array.from(commonAnims.values()), startLoad).then(() => resolve()); + }); } export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise { - return new Promise(resolve => { - const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); - for (let moveId of moveIds) { - const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[moveId].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; - if (chargeAttr) { - const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim); - moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims[0]); - if (Array.isArray(moveChargeAnims)) - moveAnimations.push(moveChargeAnims[1]); - } + return new Promise(resolve => { + const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); + for (const moveId of moveIds) { + const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr).find(() => true) as ChargeAttr || allMoves[moveId].getAttrs(DelayedAttackAttr).find(() => true) as DelayedAttackAttr; + if (chargeAttr) { + const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim); + moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims[0]); + if (Array.isArray(moveChargeAnims)) { + moveAnimations.push(moveChargeAnims[1]); } - loadAnimAssets(scene, moveAnimations, startLoad).then(() => resolve()); - }); + } + } + loadAnimAssets(scene, moveAnimations, startLoad).then(() => resolve()); + }); } function loadAnimAssets(scene: BattleScene, anims: AnimConfig[], startLoad?: boolean): Promise { - return new Promise(resolve => { - const backgrounds = new Set(); - const sounds = new Set(); - for (let a of anims) { - if (!a.frames?.length) - continue; - const animSounds = a.getSoundResourceNames(); - for (let ms of animSounds) - sounds.add(ms); - const animBackgrounds = a.getBackgroundResourceNames(); - for (let abg of animBackgrounds) - backgrounds.add(abg); - if (a.graphic) - scene.loadSpritesheet(a.graphic, 'battle_anims', 96); - } - for (let bg of backgrounds) - scene.loadImage(bg, 'battle_anims'); - for (let s of sounds) - scene.loadSe(s, 'battle_anims', s); - if (startLoad) { - scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); - if (!scene.load.isLoading()) - scene.load.start(); - } else - resolve(); - }); + return new Promise(resolve => { + const backgrounds = new Set(); + const sounds = new Set(); + for (const a of anims) { + if (!a.frames?.length) { + continue; + } + const animSounds = a.getSoundResourceNames(); + for (const ms of animSounds) { + sounds.add(ms); + } + const animBackgrounds = a.getBackgroundResourceNames(); + for (const abg of animBackgrounds) { + backgrounds.add(abg); + } + if (a.graphic) { + scene.loadSpritesheet(a.graphic, "battle_anims", 96); + } + } + for (const bg of backgrounds) { + scene.loadImage(bg, "battle_anims"); + } + for (const s of sounds) { + scene.loadSe(s, "battle_anims", s); + } + if (startLoad) { + scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); + if (!scene.load.isLoading()) { + scene.load.start(); + } + } else { + resolve(); + } + }); } interface GraphicFrameData { @@ -599,32 +633,34 @@ const targetFocusX = 234; const targetFocusY = 84 - 32; function transformPoint(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number, px: number, py: number): [ x: number, y: number ] { - const yIntersect = yAxisIntersect(x1, y1, x2, y2, px, py); - return repositionY(x3, y3, x4, y4, yIntersect[0], yIntersect[1]); + const yIntersect = yAxisIntersect(x1, y1, x2, y2, px, py); + return repositionY(x3, y3, x4, y4, yIntersect[0], yIntersect[1]); } function yAxisIntersect(x1: number, y1: number, x2: number, y2: number, px: number, py: number): [ x: number, y: number ] { - const dx = x2 - x1; - const dy = y2 - y1; - const x = dx === 0 ? 0 : (px - x1) / dx; - const y = dy === 0 ? 0 : (py - y1) / dy; - return [ x, y ]; + const dx = x2 - x1; + const dy = y2 - y1; + const x = dx === 0 ? 0 : (px - x1) / dx; + const y = dy === 0 ? 0 : (py - y1) / dy; + return [ x, y ]; } function repositionY(x1: number, y1: number, x2: number, y2: number, tx: number, ty: number): [ x: number, y: number ] { - const dx = x2 - x1; - const dy = y2 - y1; - const x = x1 + (tx * dx); - const y = y1 + (ty * dy); - return [ x, y ]; + const dx = x2 - x1; + const dy = y2 - y1; + const x = x1 + (tx * dx); + const y = y1 + (ty * dy); + return [ x, y ]; } function isReversed(src1: number, src2: number, dst1: number, dst2: number) { - if (src1 === src2) - return false; - if (src1 < src2) - return dst1 > dst2; - return dst1 < dst2; + if (src1 === src2) { + return false; + } + if (src1 < src2) { + return dst1 > dst2; + } + return dst1 < dst2; } interface SpriteCache { @@ -632,556 +668,583 @@ interface SpriteCache { } export abstract class BattleAnim { - public user: Pokemon; - public target: Pokemon; - public sprites: Phaser.GameObjects.Sprite[]; - public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle; - - private srcLine: number[]; - private dstLine: number[]; - - constructor(user: Pokemon, target: Pokemon) { - this.user = user; - this.target = target; - this.sprites = []; - } + public user: Pokemon; + public target: Pokemon; + public sprites: Phaser.GameObjects.Sprite[]; + public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle; + + private srcLine: number[]; + private dstLine: number[]; + + constructor(user: Pokemon, target: Pokemon) { + this.user = user; + this.target = target; + this.sprites = []; + } abstract getAnim(): AnimConfig; abstract isOppAnim(): boolean; protected isHideUser(): boolean { - return false; + return false; } protected isHideTarget(): boolean { - return false; + return false; } private getGraphicFrameData(scene: BattleScene, frames: AnimFrame[]): Map> { - const ret: Map> = new Map([ - [AnimFrameTarget.GRAPHIC, new Map() ], - [AnimFrameTarget.USER, new Map() ], - [AnimFrameTarget.TARGET, new Map() ] - ]); - - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user : this.target; - const target = !isOppAnim ? this.target : this.user; - - const userInitialX = user.x; - const userInitialY = user.y; - const userHalfHeight = user.getSprite().displayHeight / 2; - const targetInitialX = target.x; - const targetInitialY = target.y; - const targetHalfHeight = target.getSprite().displayHeight / 2; - - let g = 0; - let u = 0; - let t = 0; - - for (let frame of frames) { - let x = frame.x + 106; - let y = frame.y + 116; - let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); - let scaleY = (frame.zoomY / 100); - switch (frame.focus) { - case AnimFocus.TARGET: - x += targetInitialX - targetFocusX; - y += (targetInitialY - targetHalfHeight) - targetFocusY; - break; - case AnimFocus.USER: - x += userInitialX - userFocusX; - y += (userInitialY - userHalfHeight) - userFocusY; - break; - case AnimFocus.USER_TARGET: - const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], - this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); - x = point[0]; - y = point[1]; - if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) - scaleX = scaleX * -1; - break; - } - const angle = -frame.angle; - const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map() ], + [AnimFrameTarget.USER, new Map() ], + [AnimFrameTarget.TARGET, new Map() ] + ]); + + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user : this.target; + const target = !isOppAnim ? this.target : this.user; + + const userInitialX = user.x; + const userInitialY = user.y; + const userHalfHeight = user.getSprite().displayHeight / 2; + const targetInitialX = target.x; + const targetInitialY = target.y; + const targetHalfHeight = target.getSprite().displayHeight / 2; + + let g = 0; + let u = 0; + let t = 0; + + for (const frame of frames) { + let x = frame.x + 106; + let y = frame.y + 116; + let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = (frame.zoomY / 100); + switch (frame.focus) { + case AnimFocus.TARGET: + x += targetInitialX - targetFocusX; + y += (targetInitialY - targetHalfHeight) - targetFocusY; + break; + case AnimFocus.USER: + x += userInitialX - userFocusX; + y += (userInitialY - userHalfHeight) - userFocusY; + break; + case AnimFocus.USER_TARGET: + const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], + this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); + x = point[0]; + y = point[1]; + if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { + scaleX = scaleX * -1; + } + break; } + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + } - return ret; + return ret; } play(scene: BattleScene, callback?: Function) { - const isOppAnim = this.isOppAnim(); - const user = !isOppAnim ? this.user : this.target; - const target = !isOppAnim ? this.target : this.user; - - if (!target.isOnField()) { - if (callback) - callback(); - return; - } + const isOppAnim = this.isOppAnim(); + const user = !isOppAnim ? this.user : this.target; + const target = !isOppAnim ? this.target : this.user; - const userSprite = user.getSprite(); - const targetSprite = target.getSprite(); - - const spriteCache: SpriteCache = { - [AnimFrameTarget.GRAPHIC]: [], - [AnimFrameTarget.USER]: [], - [AnimFrameTarget.TARGET]: [] - }; - const spritePriorities: integer[] = []; - - const cleanUpAndComplete = () => { - userSprite.setPosition(0, 0); - userSprite.setScale(1); - userSprite.setAlpha(1); - userSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; - userSprite.setAngle(0); - targetSprite.setPosition(0, 0); - targetSprite.setScale(1); - targetSprite.setAlpha(1); - targetSprite.pipelineData['tone'] = [ 0.0, 0.0, 0.0, 0.0 ]; - targetSprite.setAngle(0); - if (!this.isHideUser()) - userSprite.setVisible(true); - if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) - targetSprite.setVisible(true); - for (let ms of Object.values(spriteCache).flat()) { - if (ms) - ms.destroy(); - } - if (this.bgSprite) - this.bgSprite.destroy(); - if (callback) - callback(); - }; + if (!target.isOnField()) { + if (callback) { + callback(); + } + return; + } + + const userSprite = user.getSprite(); + const targetSprite = target.getSprite(); + + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [] + }; + const spritePriorities: integer[] = []; + + const cleanUpAndComplete = () => { + userSprite.setPosition(0, 0); + userSprite.setScale(1); + userSprite.setAlpha(1); + userSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; + userSprite.setAngle(0); + targetSprite.setPosition(0, 0); + targetSprite.setScale(1); + targetSprite.setAlpha(1); + targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ]; + targetSprite.setAngle(0); + if (!this.isHideUser()) { + userSprite.setVisible(true); + } + if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) { + targetSprite.setVisible(true); + } + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; - if (!scene.moveAnimations) - return cleanUpAndComplete(); + if (!scene.moveAnimations) { + return cleanUpAndComplete(); + } - const anim = this.getAnim(); + const anim = this.getAnim(); - const userInitialX = user.x; - const userInitialY = user.y; - const targetInitialX = target.x; - const targetInitialY = target.y; + const userInitialX = user.x; + const userInitialY = user.y; + const targetInitialX = target.x; + const targetInitialY = target.y; - this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; - this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; + this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; + this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; - let r = anim.frames.length; - let f = 0; - - scene.tweens.addCounter({ - duration: Utils.getFrameMs(3), - repeat: anim.frames.length, - onRepeat: () => { - if (!f) { - userSprite.setVisible(false); - targetSprite.setVisible(false); - } - - const spriteFrames = anim.frames[f]; - const frameData = this.getGraphicFrameData(scene, anim.frames[f]); - let u = 0; - let t = 0; - let g = 0; - for (let frame of spriteFrames) { - if (frame.target !== AnimFrameTarget.GRAPHIC) { - const isUser = frame.target === AnimFrameTarget.USER; - if (isUser && target === user) - continue; - const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; - const spriteSource = isUser ? userSprite : targetSprite; - if ((isUser ? u : t) === sprites.length) { - let sprite: Phaser.GameObjects.Sprite; - sprite = scene.addPokemonSprite(isUser ? user : target, 0, 0, spriteSource.texture, spriteSource.frame.name, true); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => sprite.pipelineData[k] = (isUser ? user : target).getSprite().pipelineData[k]); - sprite.setPipelineData('spriteKey', (isUser ? user : target).getBattleSpriteKey()); - sprite.setPipelineData('shiny', (isUser ? user : target).shiny); - sprite.setPipelineData('variant', (isUser ? user : target).variant); - sprite.setPipelineData('ignoreFieldPos', true); - spriteSource.on('animationupdate', (_anim, frame) => sprite.setFrame(frame.textureFrame)); - scene.field.add(sprite); - sprites.push(sprite); - } - - const spriteIndex = isUser ? u++ : t++; - const pokemonSprite = sprites[spriteIndex]; - const graphicFrameData = frameData.get(frame.target).get(spriteIndex); - pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSource.parentContainer.scale - 1))); - - pokemonSprite.setAngle(graphicFrameData.angle); - pokemonSprite.setScale(graphicFrameData.scaleX * spriteSource.parentContainer.scale, graphicFrameData.scaleY * spriteSource.parentContainer.scale); - - pokemonSprite.setData('locked', frame.locked); - - pokemonSprite.setAlpha(frame.opacity / 255); - pokemonSprite.pipelineData['tone'] = frame.tone; - pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); - pokemonSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); - } else { - const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; - if (g === sprites.length) { - let newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim.graphic, 1); - sprites.push(newSprite); - scene.field.add(newSprite); - spritePriorities.push(1); - } + let r = anim.frames.length; + let f = 0; + + scene.tweens.addCounter({ + duration: Utils.getFrameMs(3), + repeat: anim.frames.length, + onRepeat: () => { + if (!f) { + userSprite.setVisible(false); + targetSprite.setVisible(false); + } + + const spriteFrames = anim.frames[f]; + const frameData = this.getGraphicFrameData(scene, anim.frames[f]); + let u = 0; + let t = 0; + let g = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + const isUser = frame.target === AnimFrameTarget.USER; + if (isUser && target === user) { + continue; + } + const sprites = spriteCache[isUser ? AnimFrameTarget.USER : AnimFrameTarget.TARGET]; + const spriteSource = isUser ? userSprite : targetSprite; + if ((isUser ? u : t) === sprites.length) { + const sprite = scene.addPokemonSprite(isUser ? user : target, 0, 0, spriteSource.texture, spriteSource.frame.name, true); + [ "spriteColors", "fusionSpriteColors" ].map(k => sprite.pipelineData[k] = (isUser ? user : target).getSprite().pipelineData[k]); + sprite.setPipelineData("spriteKey", (isUser ? user : target).getBattleSpriteKey()); + sprite.setPipelineData("shiny", (isUser ? user : target).shiny); + sprite.setPipelineData("variant", (isUser ? user : target).variant); + sprite.setPipelineData("ignoreFieldPos", true); + spriteSource.on("animationupdate", (_anim, frame) => sprite.setFrame(frame.textureFrame)); + scene.field.add(sprite); + sprites.push(sprite); + } + + const spriteIndex = isUser ? u++ : t++; + const pokemonSprite = sprites[spriteIndex]; + const graphicFrameData = frameData.get(frame.target).get(spriteIndex); + pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSource.parentContainer.scale - 1))); - const graphicIndex = g++; - const moveSprite = sprites[graphicIndex]; - if (spritePriorities[graphicIndex] !== frame.priority) { - spritePriorities[graphicIndex] = frame.priority; - const setSpritePriority = (priority: integer) => { - switch (priority) { - case 0: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getEnemyPokemon() || scene.getPlayerPokemon()); - break; - case 1: - scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); - break; - case 2: - switch (frame.focus) { - case AnimFocus.USER: - if (this.bgSprite) - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); - else - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user); - break; - case AnimFocus.TARGET: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target); - break; - default: - setSpritePriority(1); - break; - } - break; - case 3: - switch (frame.focus) { - case AnimFocus.USER: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user); - break; - case AnimFocus.TARGET: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target); - break; - default: - setSpritePriority(1); - break; - } - break; - default: - setSpritePriority(1); - } - }; - setSpritePriority(frame.priority); - } - moveSprite.setFrame(frame.graphicFrame); - //console.log(AnimFocus[frame.focus]); + pokemonSprite.setAngle(graphicFrameData.angle); + pokemonSprite.setScale(graphicFrameData.scaleX * spriteSource.parentContainer.scale, graphicFrameData.scaleY * spriteSource.parentContainer.scale); + + pokemonSprite.setData("locked", frame.locked); + + pokemonSprite.setAlpha(frame.opacity / 255); + pokemonSprite.pipelineData["tone"] = frame.tone; + pokemonSprite.setVisible(frame.visible && (isUser ? user.visible : target.visible)); + pokemonSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + } else { + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (g === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim.graphic, 1); + sprites.push(newSprite); + scene.field.add(newSprite); + spritePriorities.push(1); + } - const graphicFrameData = frameData.get(frame.target).get(graphicIndex); - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + const graphicIndex = g++; + const moveSprite = sprites[graphicIndex]; + if (spritePriorities[graphicIndex] !== frame.priority) { + spritePriorities[graphicIndex] = frame.priority; + const setSpritePriority = (priority: integer) => { + switch (priority) { + case 0: + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getEnemyPokemon() || scene.getPlayerPokemon()); + break; + case 1: + scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); + break; + case 2: + switch (frame.focus) { + case AnimFocus.USER: + if (this.bgSprite) { + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); + } else { + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user); + } + break; + case AnimFocus.TARGET: + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target); + break; + default: + setSpritePriority(1); + break; } - } - if (anim.frameTimedEvents.has(f)) { - for (let event of anim.frameTimedEvents.get(f)) - r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); - } - const targets = Utils.getEnumValues(AnimFrameTarget); - for (let i of targets) { - const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; - if (count < spriteCache[i].length) { - const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); - for (let rs of spritesToRemove) { - if (!rs.getData('locked') as boolean) { - const spriteCacheIndex = spriteCache[i].indexOf(rs); - spriteCache[i].splice(spriteCacheIndex, 1); - if (i === AnimFrameTarget.GRAPHIC) - spritePriorities.splice(spriteCacheIndex, 1); - rs.destroy(); - } - } + break; + case 3: + switch (frame.focus) { + case AnimFocus.USER: + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user); + break; + case AnimFocus.TARGET: + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target); + break; + default: + setSpritePriority(1); + break; } + break; + default: + setSpritePriority(1); + } + }; + setSpritePriority(frame.priority); + } + moveSprite.setFrame(frame.graphicFrame); + //console.log(AnimFocus[frame.focus]); + + const graphicFrameData = frameData.get(frame.target).get(graphicIndex); + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + } + } + if (anim.frameTimedEvents.has(f)) { + for (const event of anim.frameTimedEvents.get(f)) { + r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); + } + } + const targets = Utils.getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const rs of spritesToRemove) { + if (!rs.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(rs); + spriteCache[i].splice(spriteCacheIndex, 1); + if (i === AnimFrameTarget.GRAPHIC) { + spritePriorities.splice(spriteCacheIndex, 1); + } + rs.destroy(); } - f++; - r--; - }, - onComplete: () => { - for (let ms of Object.values(spriteCache).flat()) { - if (ms && !ms.getData('locked')) - ms.destroy(); - } - if (r) { - scene.tweens.addCounter({ - duration: Utils.getFrameMs(r), - onComplete: () => cleanUpAndComplete() - }); - } else - cleanUpAndComplete(); + } } - }); + } + f++; + r--; + }, + onComplete: () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms && !ms.getData("locked")) { + ms.destroy(); + } + } + if (r) { + scene.tweens.addCounter({ + duration: Utils.getFrameMs(r), + onComplete: () => cleanUpAndComplete() + }); + } else { + cleanUpAndComplete(); + } + } + }); } } export class CommonBattleAnim extends BattleAnim { - public commonAnim: CommonAnim; + public commonAnim: CommonAnim; - constructor(commonAnim: CommonAnim, user: Pokemon, target?: Pokemon) { - super(user, target || user); + constructor(commonAnim: CommonAnim, user: Pokemon, target?: Pokemon) { + super(user, target || user); - this.commonAnim = commonAnim; - } + this.commonAnim = commonAnim; + } - getAnim(): AnimConfig { - return commonAnims.get(this.commonAnim); - } + getAnim(): AnimConfig { + return commonAnims.get(this.commonAnim); + } - isOppAnim(): boolean { - return false; - } + isOppAnim(): boolean { + return false; + } } export class MoveAnim extends BattleAnim { - public move: Moves; + public move: Moves; - constructor(move: Moves, user: Pokemon, target: BattlerIndex) { - super(user, user.scene.getField()[target]); + constructor(move: Moves, user: Pokemon, target: BattlerIndex) { + super(user, user.scene.getField()[target]); - this.move = move; - } + this.move = move; + } - getAnim(): AnimConfig { - return moveAnims.get(this.move) instanceof AnimConfig - ? moveAnims.get(this.move) as AnimConfig - : moveAnims.get(this.move)[this.user.isPlayer() ? 0 : 1] as AnimConfig; - } + getAnim(): AnimConfig { + return moveAnims.get(this.move) instanceof AnimConfig + ? moveAnims.get(this.move) as AnimConfig + : moveAnims.get(this.move)[this.user.isPlayer() ? 0 : 1] as AnimConfig; + } - isOppAnim(): boolean { - return !this.user.isPlayer() && Array.isArray(moveAnims.get(this.move)); - } + isOppAnim(): boolean { + return !this.user.isPlayer() && Array.isArray(moveAnims.get(this.move)); + } - protected isHideUser(): boolean { - return allMoves[this.move].hasFlag(MoveFlags.HIDE_USER); - } + protected isHideUser(): boolean { + return allMoves[this.move].hasFlag(MoveFlags.HIDE_USER); + } - protected isHideTarget(): boolean { - return allMoves[this.move].hasFlag(MoveFlags.HIDE_TARGET); - } + protected isHideTarget(): boolean { + return allMoves[this.move].hasFlag(MoveFlags.HIDE_TARGET); + } } export class MoveChargeAnim extends MoveAnim { - private chargeAnim: ChargeAnim; + private chargeAnim: ChargeAnim; - constructor(chargeAnim: ChargeAnim, move: Moves, user: Pokemon) { - super(move, user, 0); + constructor(chargeAnim: ChargeAnim, move: Moves, user: Pokemon) { + super(move, user, 0); - this.chargeAnim = chargeAnim; - } + this.chargeAnim = chargeAnim; + } - isOppAnim(): boolean { - return !this.user.isPlayer() && Array.isArray(chargeAnims.get(this.chargeAnim)); - } + isOppAnim(): boolean { + return !this.user.isPlayer() && Array.isArray(chargeAnims.get(this.chargeAnim)); + } - getAnim(): AnimConfig { - return chargeAnims.get(this.chargeAnim) instanceof AnimConfig - ? chargeAnims.get(this.chargeAnim) as AnimConfig - : chargeAnims.get(this.chargeAnim)[this.user.isPlayer() ? 0 : 1] as AnimConfig; - } + getAnim(): AnimConfig { + return chargeAnims.get(this.chargeAnim) instanceof AnimConfig + ? chargeAnims.get(this.chargeAnim) as AnimConfig + : chargeAnims.get(this.chargeAnim)[this.user.isPlayer() ? 0 : 1] as AnimConfig; + } } export async function populateAnims() { - const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); - const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, '')); - const commonAnimIds = Utils.getEnumValues(CommonAnim) as CommonAnim[]; - const chargeAnimNames = Utils.getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); - const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, ' ')); - const chargeAnimIds = Utils.getEnumValues(ChargeAnim) as ChargeAnim[]; - const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; - const moveNameToId = {}; - for (let move of Utils.getEnumValues(Moves).slice(1)) { - const moveName = Moves[move].toUpperCase().replace(/\_/g, ''); - moveNameToId[moveName] = move; - } - - const seNames = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); + const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); + const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); + const commonAnimIds = Utils.getEnumValues(CommonAnim) as CommonAnim[]; + const chargeAnimNames = Utils.getEnumKeys(ChargeAnim).map(k => k.toLowerCase()); + const chargeAnimMatchNames = chargeAnimNames.map(k => k.replace(/\_/g, " ")); + const chargeAnimIds = Utils.getEnumValues(ChargeAnim) as ChargeAnim[]; + const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; + const moveNameToId = {}; + for (const move of Utils.getEnumValues(Moves).slice(1)) { + const moveName = Moves[move].toUpperCase().replace(/\_/g, ""); + moveNameToId[moveName] = move; + } + + const seNames = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); - const animsData = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); - for (let a = 0; a < animsData.length; a++) { - const fields = animsData[a].split('@').slice(1); + const animsData = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); + for (let a = 0; a < animsData.length; a++) { + const fields = animsData[a].split("@").slice(1); - const nameField = fields.find(f => f.startsWith('name: ')); + const nameField = fields.find(f => f.startsWith("name: ")); - let isOppMove: boolean; - let commonAnimId: CommonAnim; - let chargeAnimId: ChargeAnim; - if (!nameField.startsWith('name: Move:') && !(isOppMove = nameField.startsWith('name: OppMove:'))) { - const nameMatch = commonNamePattern.exec(nameField); - const name = nameMatch[2].toLowerCase(); - if (commonAnimMatchNames.indexOf(name) > -1) - commonAnimId = commonAnimIds[commonAnimMatchNames.indexOf(name)]; - else if (chargeAnimMatchNames.indexOf(name) > -1) { - isOppMove = nameField.startsWith('name: Opp '); - chargeAnimId = chargeAnimIds[chargeAnimMatchNames.indexOf(name)]; - } + let isOppMove: boolean; + let commonAnimId: CommonAnim; + let chargeAnimId: ChargeAnim; + if (!nameField.startsWith("name: Move:") && !(isOppMove = nameField.startsWith("name: OppMove:"))) { + const nameMatch = commonNamePattern.exec(nameField); + const name = nameMatch[2].toLowerCase(); + if (commonAnimMatchNames.indexOf(name) > -1) { + commonAnimId = commonAnimIds[commonAnimMatchNames.indexOf(name)]; + } else if (chargeAnimMatchNames.indexOf(name) > -1) { + isOppMove = nameField.startsWith("name: Opp "); + chargeAnimId = chargeAnimIds[chargeAnimMatchNames.indexOf(name)]; + } + } + const nameIndex = nameField.indexOf(":", 5) + 1; + const animName = nameField.slice(nameIndex, nameField.indexOf("\n", nameIndex)); + if (!moveNameToId.hasOwnProperty(animName) && !commonAnimId && !chargeAnimId) { + continue; + } + const anim = commonAnimId || chargeAnimId ? new AnimConfig() : new AnimConfig(); + if (anim instanceof AnimConfig) { + (anim as AnimConfig).id = moveNameToId[animName]; + } + if (commonAnimId) { + commonAnims.set(commonAnimId, anim); + } else if (chargeAnimId) { + chargeAnims.set(chargeAnimId, !isOppMove ? anim : [ chargeAnims.get(chargeAnimId) as AnimConfig, anim ]); + } else { + moveAnims.set(moveNameToId[animName], !isOppMove ? anim as AnimConfig : [ moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig ]); + } + for (let f = 0; f < fields.length; f++) { + const field = fields[f]; + const fieldName = field.slice(0, field.indexOf(":")); + const fieldData = field.slice(fieldName.length + 1, field.lastIndexOf("\n")).trim(); + switch (fieldName) { + case "array": + const framesData = fieldData.split(" - - - ").slice(1); + for (let fd = 0; fd < framesData.length; fd++) { + anim.frames.push([]); + const frameData = framesData[fd]; + const focusFramesData = frameData.split(" - - "); + for (let tf = 0; tf < focusFramesData.length; tf++) { + const values = focusFramesData[tf].replace(/ \- /g, "").split("\n"); + const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), + parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), + parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), + parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); + anim.frames[fd].push(targetFrame); + } } - const nameIndex = nameField.indexOf(':', 5) + 1; - const animName = nameField.slice(nameIndex, nameField.indexOf('\n', nameIndex)); - if (!moveNameToId.hasOwnProperty(animName) && !commonAnimId && !chargeAnimId) + break; + case "graphic": + const graphic = fieldData !== "''" ? fieldData : ""; + anim.graphic = graphic.indexOf(".") > -1 + ? graphic.slice(0, fieldData.indexOf(".")) + : graphic; + break; + case "timing": + const timingEntries = fieldData.split("- !ruby/object:PBAnimTiming ").slice(1); + for (let t = 0; t < timingEntries.length; t++) { + const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") + .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); + const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)[1]); + let resourceName = /name: "(.*?)"/.exec(timingData)[1].replace("''", ""); + const timingType = parseInt(/timingType: (\d)/.exec(timingData)[1]); + let timedEvent: AnimTimedEvent; + switch (timingType) { + case 0: + if (resourceName && resourceName.indexOf(".") === -1) { + let ext: string; + [ "wav", "mp3", "m4a" ].every(e => { + if (seNames.indexOf(`${resourceName}.${e}`) > -1) { + ext = e; + return false; + } + return true; + }); + if (!ext) { + ext = ".wav"; + } + resourceName += `.${ext}`; + } + timedEvent = new AnimTimedSoundEvent(frameIndex, resourceName); + break; + case 1: + timedEvent = new AnimTimedAddBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); + break; + case 2: + timedEvent = new AnimTimedUpdateBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); + break; + } + if (!timedEvent) { continue; - let anim = commonAnimId || chargeAnimId ? new AnimConfig() : new AnimConfig(); - if (anim instanceof AnimConfig) - (anim as AnimConfig).id = moveNameToId[animName]; - if (commonAnimId) - commonAnims.set(commonAnimId, anim); - else if (chargeAnimId) - chargeAnims.set(chargeAnimId, !isOppMove ? anim : [ chargeAnims.get(chargeAnimId) as AnimConfig, anim ]); - else - moveAnims.set(moveNameToId[animName], !isOppMove ? anim as AnimConfig : [ moveAnims.get(moveNameToId[animName]) as AnimConfig, anim as AnimConfig ]); - for (let f = 0; f < fields.length; f++) { - const field = fields[f]; - const fieldName = field.slice(0, field.indexOf(':')); - const fieldData = field.slice(fieldName.length + 1, field.lastIndexOf('\n')).trim(); - switch (fieldName) { - case 'array': - const framesData = fieldData.split(' - - - ').slice(1); - for (let fd = 0; fd < framesData.length; fd++) { - anim.frames.push([]); - const frameData = framesData[fd]; - const focusFramesData = frameData.split(' - - '); - for (let tf = 0; tf < focusFramesData.length; tf++) { - const values = focusFramesData[tf].replace(/ \- /g, '').split('\n'); - const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), - parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), - parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), - parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); - anim.frames[fd].push(targetFrame); - } - } - break; - case 'graphic': - const graphic = fieldData !== "''" ? fieldData : ''; - anim.graphic = graphic.indexOf('.') > -1 - ? graphic.slice(0, fieldData.indexOf('.')) - : graphic; - break; - case 'timing': - const timingEntries = fieldData.split('- !ruby/object:PBAnimTiming ').slice(1); - for (let t = 0; t < timingEntries.length; t++) { - const timingData = timingEntries[t].replace(/\n/g, ' ').replace(/[ ]{2,}/g, ' ').replace(/[a-z]+: ! '', /ig, '').replace(/name: (.*?),/, 'name: "$1",') - .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, 'flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1'); - const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)[1]); - let resourceName = /name: "(.*?)"/.exec(timingData)[1].replace("''", ''); - const timingType = parseInt(/timingType: (\d)/.exec(timingData)[1]); - let timedEvent: AnimTimedEvent; - switch (timingType) { - case 0: - if (resourceName && resourceName.indexOf('.') === -1) { - let ext: string; - [ 'wav', 'mp3', 'm4a' ].every(e => { - if (seNames.indexOf(`${resourceName}.${e}`) > -1) { - ext = e; - return false; - } - return true; - }); - if (!ext) - ext = '.wav'; - resourceName += `.${ext}`; - } - timedEvent = new AnimTimedSoundEvent(frameIndex, resourceName); - break; - case 1: - timedEvent = new AnimTimedAddBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf('.'))); - break; - case 2: - timedEvent = new AnimTimedUpdateBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf('.'))); - break; - } - if (!timedEvent) - continue; - const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; - let propMatch: RegExpExecArray; - while ((propMatch = propPattern.exec(timingData))) { - const prop = propMatch[1]; - let value: any = propMatch[2]; - switch (prop) { - case 'bgX': - case 'bgY': - value = parseFloat(value); - break; - case 'volume': - case 'pitch': - case 'opacity': - case 'colorRed': - case 'colorGreen': - case 'colorBlue': - case 'colorAlpha': - case 'duration': - case 'flashScope': - case 'flashRed': - case 'flashGreen': - case 'flashBlue': - case 'flashAlpha': - case 'flashDuration': - value = parseInt(value); - break; - } - if (timedEvent.hasOwnProperty(prop)) - timedEvent[prop] = value; - } - if (!anim.frameTimedEvents.has(frameIndex)) - anim.frameTimedEvents.set(frameIndex, []); - anim.frameTimedEvents.get(frameIndex).push(timedEvent); - } - break; - case 'position': - anim.position = parseInt(fieldData); - break; - case 'hue': - anim.hue = parseInt(fieldData); - break; + } + const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; + let propMatch: RegExpExecArray; + while ((propMatch = propPattern.exec(timingData))) { + const prop = propMatch[1]; + let value: any = propMatch[2]; + switch (prop) { + case "bgX": + case "bgY": + value = parseFloat(value); + break; + case "volume": + case "pitch": + case "opacity": + case "colorRed": + case "colorGreen": + case "colorBlue": + case "colorAlpha": + case "duration": + case "flashScope": + case "flashRed": + case "flashGreen": + case "flashBlue": + case "flashAlpha": + case "flashDuration": + value = parseInt(value); + break; } + if (timedEvent.hasOwnProperty(prop)) { + timedEvent[prop] = value; + } + } + if (!anim.frameTimedEvents.has(frameIndex)) { + anim.frameTimedEvents.set(frameIndex, []); + } + anim.frameTimedEvents.get(frameIndex).push(timedEvent); } + break; + case "position": + anim.position = parseInt(fieldData); + break; + case "hue": + anim.hue = parseInt(fieldData); + break; + } } + } - const animReplacer = (k, v) => { - if (k === 'id' && !v) - return undefined; - if (v instanceof Map) - return Object.fromEntries(v); - if (v instanceof AnimTimedEvent) - v['eventType'] = v.getEventType(); - return v; - }; - - const animConfigProps = [ 'id', 'graphic', 'frames', 'frameTimedEvents', 'position', 'hue' ]; - const animFrameProps = [ 'x', 'y', 'zoomX', 'zoomY', 'angle', 'mirror', 'visible', 'blendType', 'target', 'graphicFrame', 'opacity', 'color', 'tone', 'flash', 'locked', 'priority', 'focus' ]; - const propSets = [ animConfigProps, animFrameProps ]; - - const animComparator = (a: Element, b: Element) => { - let props: string[]; - let p = 0; - for (let p = 0; p < propSets.length; p++) { - props = propSets[p]; - let ai = props.indexOf(a.key); - if (ai === -1) - continue; - let bi = props.indexOf(b.key); - - return ai < bi ? -1 : ai > bi ? 1 : 0; - } + // used in commented code + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const animReplacer = (k, v) => { + if (k === "id" && !v) { + return undefined; + } + if (v instanceof Map) { + return Object.fromEntries(v); + } + if (v instanceof AnimTimedEvent) { + v["eventType"] = v.getEventType(); + } + return v; + }; + + const animConfigProps = [ "id", "graphic", "frames", "frameTimedEvents", "position", "hue" ]; + const animFrameProps = [ "x", "y", "zoomX", "zoomY", "angle", "mirror", "visible", "blendType", "target", "graphicFrame", "opacity", "color", "tone", "flash", "locked", "priority", "focus" ]; + const propSets = [ animConfigProps, animFrameProps ]; + + // used in commented code + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const animComparator = (a: Element, b: Element) => { + let props: string[]; + for (let p = 0; p < propSets.length; p++) { + props = propSets[p]; + const ai = props.indexOf(a.key); + if (ai === -1) { + continue; + } + const bi = props.indexOf(b.key); + + return ai < bi ? -1 : ai > bi ? 1 : 0; + } - return 0; - }; + return 0; + }; - /*for (let ma of moveAnims.keys()) { + /*for (let ma of moveAnims.keys()) { const data = moveAnims.get(ma); (async () => { await fs.writeFile(`../public/battle-anims/${Moves[ma].toLowerCase().replace(/\_/g, '-')}.json`, stringify(data, { replacer: animReplacer, cmp: animComparator, space: ' ' })); @@ -1201,4 +1264,4 @@ export async function populateAnims() { await fs.writeFile(`../public/battle-anims/common-${commonAnimNames[commonAnimIds.indexOf(cma)].replace(/\_/g, '-')}.json`, stringify(data, { replacer: animReplacer, cmp: animComparator, space: ' ' })); })(); }*/ -} \ No newline at end of file +} diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index e0cb6fb53f0c..3971b8503107 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -11,53 +11,53 @@ export enum BattleStat { export function getBattleStatName(stat: BattleStat) { switch (stat) { - case BattleStat.ATK: - return 'Attack'; - case BattleStat.DEF: - return 'Defense'; - case BattleStat.SPATK: - return 'Sp. Atk'; - case BattleStat.SPDEF: - return 'Sp. Def'; - case BattleStat.SPD: - return 'Speed'; - case BattleStat.ACC: - return 'Accuracy'; - case BattleStat.EVA: - return 'Evasiveness'; - default: - return '???'; + case BattleStat.ATK: + return "Attack"; + case BattleStat.DEF: + return "Defense"; + case BattleStat.SPATK: + return "Sp. Atk"; + case BattleStat.SPDEF: + return "Sp. Def"; + case BattleStat.SPD: + return "Speed"; + case BattleStat.ACC: + return "Accuracy"; + case BattleStat.EVA: + return "Evasiveness"; + default: + return "???"; } } export function getBattleStatLevelChangeDescription(levels: integer, up: boolean) { if (up) { switch (levels) { - case 1: - return 'rose'; - case 2: - return 'sharply rose'; - case 3: - case 4: - case 5: - case 6: - return 'rose drastically'; - default: - return 'won\'t go any higher'; + case 1: + return "rose"; + case 2: + return "sharply rose"; + case 3: + case 4: + case 5: + case 6: + return "rose drastically"; + default: + return "won't go any higher"; } } else { switch (levels) { - case 1: - return 'fell'; - case 2: - return 'harshly fell'; - case 3: - case 4: - case 5: - case 6: - return 'severely fell'; - default: - return 'won\'t go any lower'; + case 1: + return "fell"; + case 2: + return "harshly fell"; + case 3: + case 4: + case 5: + case 6: + return "severely fell"; + default: + return "won't go any lower"; } } -} \ No newline at end of file +} diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 849128517d23..cc8cc2e24de7 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -56,7 +56,7 @@ export class BattlerTag { } getDescriptor(): string { - return ''; + return ""; } isSourceLinked(): boolean { @@ -97,13 +97,13 @@ export class RechargingTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] }) + pokemon.getMoveQueue().push({ move: Moves.NONE, targets: [] }); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { super.lapse(pokemon, lapseType); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' must\nrecharge!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " must\nrecharge!")); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); pokemon.getMoveQueue().shift(); @@ -136,7 +136,7 @@ export class TrappedTag extends BattlerTag { } getDescriptor(): string { - return 'trapping'; + return "trapping"; } isSourceLinked(): boolean { @@ -144,7 +144,7 @@ export class TrappedTag extends BattlerTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ' can no\nlonger escape!'); + return getPokemonMessage(pokemon, " can no\nlonger escape!"); } } @@ -167,36 +167,36 @@ export class FlinchedTag extends BattlerTag { super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' flinched!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " flinched!")); return true; } getDescriptor(): string { - return 'flinching'; + return "flinching"; } } export class InterruptedTag extends BattlerTag { constructor(sourceMove: Moves){ - super(BattlerTagType.INTERRUPTED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove) + super(BattlerTagType.INTERRUPTED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove); } canAdd(pokemon: Pokemon): boolean { - return !!pokemon.getTag(BattlerTagType.FLYING) + return !!pokemon.getTag(BattlerTagType.FLYING); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.getMoveQueue().shift() - pokemon.pushMoveHistory({move: Moves.NONE, result: MoveResult.OTHER}) + pokemon.getMoveQueue().shift(); + pokemon.pushMoveHistory({move: Moves.NONE, result: MoveResult.OTHER}); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - return true + return true; } } @@ -213,33 +213,33 @@ export class ConfusedTag extends BattlerTag { super.onAdd(pokemon); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' became\nconfused!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became\nconfused!")); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' snapped\nout of confusion!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " snapped\nout of confusion!")); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nalready confused!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready confused!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM && super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nconfused!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nconfused!")); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); if (pokemon.randSeedInt(3)) { const atk = pokemon.getBattleStat(Stat.ATK); const def = pokemon.getBattleStat(Stat.DEF); const damage = Math.ceil(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedInt(15, 85) / 100)); - pokemon.scene.queueMessage('It hurt itself in its\nconfusion!'); + pokemon.scene.queueMessage("It hurt itself in its\nconfusion!"); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); @@ -250,7 +250,7 @@ export class ConfusedTag extends BattlerTag { } getDescriptor(): string { - return 'confusion'; + return "confusion"; } } @@ -272,7 +272,7 @@ export class InfatuatedTag extends BattlerTag { onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nalready in love!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready in love!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -283,7 +283,7 @@ export class InfatuatedTag extends BattlerTag { pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); if (pokemon.randSeedInt(2)) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nimmobilized by love!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nimmobilized by love!")); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); } } @@ -294,7 +294,7 @@ export class InfatuatedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' got over\nits infatuation.')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " got over\nits infatuation.")); } isSourceLinked(): boolean { @@ -302,7 +302,7 @@ export class InfatuatedTag extends BattlerTag { } getDescriptor(): string { - return 'infatuation'; + return "infatuation"; } } @@ -329,7 +329,7 @@ export class SeedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' was seeded!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was seeded!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -349,7 +349,7 @@ export class SeedTag extends BattlerTag { const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), !reverseDrain ? damage : damage * -1, - !reverseDrain ? getPokemonMessage(pokemon, '\'s health is\nsapped by Leech Seed!') : getPokemonMessage(source, '\'s Leech Seed\nsucked up the liquid ooze!'), + !reverseDrain ? getPokemonMessage(pokemon, "'s health is\nsapped by Leech Seed!") : getPokemonMessage(source, "'s Leech Seed\nsucked up the liquid ooze!"), false, true)); } } @@ -359,7 +359,7 @@ export class SeedTag extends BattlerTag { } getDescriptor(): string { - return 'seeding'; + return "seeding"; } } @@ -371,34 +371,35 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' began\nhaving a Nightmare!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " began\nhaving a Nightmare!")); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nalready locked in a Nightmare!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready locked in a Nightmare!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is locked\nin a Nightmare!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is locked\nin a Nightmare!")); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (!cancelled.value) + if (!cancelled.value) { pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 4)); + } } return ret; } getDescriptor(): string { - return 'nightmares'; + return "nightmares"; } } @@ -437,31 +438,35 @@ export class EncoreTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - if (pokemon.isMax()) + if (pokemon.isMax()) { return false; + } const lastMoves = pokemon.getLastXMoves(1); - if (!lastMoves.length) + if (!lastMoves.length) { return false; + } const repeatableMove = lastMoves[0]; - if (!repeatableMove.move || repeatableMove.virtual) + if (!repeatableMove.move || repeatableMove.virtual) { return false; + } switch (repeatableMove.move) { - case Moves.MIMIC: - case Moves.MIRROR_MOVE: - case Moves.TRANSFORM: - case Moves.STRUGGLE: - case Moves.SKETCH: - case Moves.SLEEP_TALK: - case Moves.ENCORE: - return false; + case Moves.MIMIC: + case Moves.MIRROR_MOVE: + case Moves.TRANSFORM: + case Moves.STRUGGLE: + case Moves.SKETCH: + case Moves.SLEEP_TALK: + case Moves.ENCORE: + return false; } - if (allMoves[repeatableMove.move].getAttrs(ChargeAttr).length && repeatableMove.result === MoveResult.OTHER) + if (allMoves[repeatableMove.move].getAttrs(ChargeAttr).length && repeatableMove.result === MoveResult.OTHER) { return false; + } this.moveId = repeatableMove.move; @@ -471,7 +476,7 @@ export class EncoreTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' got\nan Encore!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " got\nan Encore!")); const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { @@ -487,7 +492,7 @@ export class EncoreTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, '\'s Encore\nended!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s Encore\nended!")); } } @@ -524,19 +529,20 @@ export class IngrainTag extends TrappedTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); - if (ret) + if (ret) { pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), - getPokemonMessage(pokemon, ` absorbed\nnutrients with its roots!`), true)); + getPokemonMessage(pokemon, " absorbed\nnutrients with its roots!"), true)); + } return ret; } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ' planted its roots!'); + return getPokemonMessage(pokemon, " planted its roots!"); } getDescriptor(): string { - return 'roots'; + return "roots"; } } @@ -548,15 +554,16 @@ export class AquaRingTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' surrounded\nitself with a veil of water!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " surrounded\nitself with a veil of water!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); - if (ret) + if (ret) { pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), `${this.getMoveName()} restored\n${pokemon.name}\'s HP!`, true)); + } return ret; } @@ -579,7 +586,7 @@ export class MinimizeTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { //If a pokemon dynamaxes they lose minimized status if(pokemon.isMax()){ - return false + return false; } return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); } @@ -601,7 +608,7 @@ export class DrowsyTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' grew drowsy!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " grew drowsy!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -614,7 +621,7 @@ export class DrowsyTag extends BattlerTag { } getDescriptor(): string { - return 'drowsiness'; + return "drowsiness"; } } @@ -650,8 +657,9 @@ export abstract class DamagingTrapTag extends TrappedTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (!cancelled.value) - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 8)) + if (!cancelled.value) { + pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 8)); + } } return ret; @@ -684,7 +692,7 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ' was trapped\nin the vortex!'); + return getPokemonMessage(pokemon, " was trapped\nin the vortex!"); } } @@ -726,7 +734,7 @@ export class MagmaStormTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` became trapped\nby swirling magma!`); + return getPokemonMessage(pokemon, " became trapped\nby swirling magma!"); } } @@ -736,7 +744,7 @@ export class SnapTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` got trapped\nby a snap trap!`); + return getPokemonMessage(pokemon, " got trapped\nby a snap trap!"); } } @@ -769,13 +777,13 @@ export class ProtectedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, '\nprotected itself!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, "\nprotected itself!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { new CommonBattleAnim(CommonAnim.PROTECT, pokemon).play(pokemon.scene); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, '\nprotected itself!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, "\nprotected itself!")); return true; } @@ -900,12 +908,12 @@ export class EnduringTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' braced\nitself!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " braced\nitself!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' endured\nthe hit!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " endured\nthe hit!")); return true; } @@ -920,7 +928,7 @@ export class SturdyTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' endured\nthe hit!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " endured\nthe hit!")); return true; } @@ -940,10 +948,11 @@ export class PerishSongTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = super.lapse(pokemon, lapseType); - if (ret) + if (ret) { pokemon.scene.queueMessage(getPokemonMessage(pokemon, `\'s perish count fell to ${this.turnCount}.`)); - else + } else { pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); + } return ret; } @@ -974,8 +983,9 @@ export class TruantTag extends AbilityBattlerTag { } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - if (!pokemon.hasAbility(Abilities.TRUANT)) + if (!pokemon.hasAbility(Abilities.TRUANT)) { return super.lapse(pokemon, lapseType); + } const passive = pokemon.getAbility().id !== Abilities.TRUANT; const lastMove = pokemon.getLastXMoves().find(() => true); @@ -983,7 +993,7 @@ export class TruantTag extends AbilityBattlerTag { if (lastMove && lastMove.move !== Moves.NONE) { (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is\nloafing around!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nloafing around!")); } return true; @@ -998,12 +1008,13 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' can\'t\nget it going!'), null, false, null, true); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " can't\nget it going!"), null, false, null, true); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - if (!pokemon.hasAbility(this.ability)) + if (!pokemon.hasAbility(this.ability)) { this.turnCount = 1; + } return super.lapse(pokemon, lapseType); } @@ -1011,7 +1022,7 @@ export class SlowStartTag extends AbilityBattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' finally\ngot its act together!'), null, false, null); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " finally\ngot its act together!"), null, false, null); } } @@ -1049,12 +1060,12 @@ export class HighestStatBoostTag extends AbilityBattlerTag { this.stat = highestStat; switch (this.stat) { - case Stat.SPD: - this.multiplier = 1.5; - break; - default: - this.multiplier = 1.3; - break; + case Stat.SPD: + this.multiplier = 1.5; + break; + default: + this.multiplier = 1.3; + break; } pokemon.scene.queueMessage(getPokemonMessage(pokemon, `'s ${getStatName(highestStat)}\nwas heightened!`), null, false, null, true); @@ -1182,7 +1193,7 @@ export class CritBoostTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is getting\npumped!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is getting\npumped!")); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1192,7 +1203,7 @@ export class CritBoostTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' relaxed.')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " relaxed.")); } } @@ -1227,7 +1238,7 @@ export class SaltCuredTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' is being salt cured!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is being salt cured!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1271,7 +1282,7 @@ export class CursedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ' has been cursed!')); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " has been cursed!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1296,118 +1307,118 @@ export class CursedTag extends BattlerTag { export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves, sourceId: integer): BattlerTag { switch (tagType) { - case BattlerTagType.RECHARGING: - return new RechargingTag(sourceMove); - case BattlerTagType.FLINCHED: - return new FlinchedTag(sourceMove); - case BattlerTagType.INTERRUPTED: - return new InterruptedTag(sourceMove); - case BattlerTagType.CONFUSED: - return new ConfusedTag(turnCount, sourceMove); - case BattlerTagType.INFATUATED: - return new InfatuatedTag(sourceMove, sourceId); - case BattlerTagType.SEEDED: - return new SeedTag(sourceId); - case BattlerTagType.NIGHTMARE: - return new NightmareTag(); - case BattlerTagType.FRENZY: - return new FrenzyTag(sourceMove, sourceId); - case BattlerTagType.CHARGING: - return new ChargingTag(sourceMove, sourceId); - case BattlerTagType.ENCORE: - return new EncoreTag(sourceId); - case BattlerTagType.HELPING_HAND: - return new HelpingHandTag(sourceId); - case BattlerTagType.INGRAIN: - return new IngrainTag(sourceId); - case BattlerTagType.AQUA_RING: - return new AquaRingTag(); - case BattlerTagType.DROWSY: - return new DrowsyTag(); - case BattlerTagType.TRAPPED: - return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); - case BattlerTagType.BIND: - return new BindTag(turnCount, sourceId); - case BattlerTagType.WRAP: - return new WrapTag(turnCount, sourceId); - case BattlerTagType.FIRE_SPIN: - return new FireSpinTag(turnCount, sourceId); - case BattlerTagType.WHIRLPOOL: - return new WhirlpoolTag(turnCount, sourceId); - case BattlerTagType.CLAMP: - return new ClampTag(turnCount, sourceId); - case BattlerTagType.SAND_TOMB: - return new SandTombTag(turnCount, sourceId); - case BattlerTagType.MAGMA_STORM: - return new MagmaStormTag(turnCount, sourceId); - case BattlerTagType.SNAP_TRAP: - return new SnapTrapTag(turnCount, sourceId); - case BattlerTagType.THUNDER_CAGE: - return new ThunderCageTag(turnCount, sourceId); - case BattlerTagType.INFESTATION: - return new InfestationTag(turnCount, sourceId); - case BattlerTagType.PROTECTED: - return new ProtectedTag(sourceMove); - case BattlerTagType.SPIKY_SHIELD: - return new ContactDamageProtectedTag(sourceMove, 8); - case BattlerTagType.KINGS_SHIELD: - return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.ATK, -1); - case BattlerTagType.OBSTRUCT: - return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.DEF, -2); - case BattlerTagType.SILK_TRAP: - return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.SPD, -1); - case BattlerTagType.BANEFUL_BUNKER: - return new ContactPoisonProtectedTag(sourceMove); - case BattlerTagType.BURNING_BULWARK: - return new ContactBurnProtectedTag(sourceMove); - case BattlerTagType.ENDURING: - return new EnduringTag(sourceMove); - case BattlerTagType.STURDY: - return new SturdyTag(sourceMove); - case BattlerTagType.PERISH_SONG: - return new PerishSongTag(turnCount); - case BattlerTagType.TRUANT: - return new TruantTag(); - case BattlerTagType.SLOW_START: - return new SlowStartTag(); - case BattlerTagType.PROTOSYNTHESIS: - return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); - case BattlerTagType.QUARK_DRIVE: - return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); - case BattlerTagType.FLYING: - case BattlerTagType.UNDERGROUND: - case BattlerTagType.UNDERWATER: - case BattlerTagType.HIDDEN: - return new HideSpriteTag(tagType, turnCount, sourceMove); - case BattlerTagType.FIRE_BOOST: - return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); - case BattlerTagType.CRIT_BOOST: - return new CritBoostTag(tagType, sourceMove); - case BattlerTagType.ALWAYS_CRIT: - return new AlwaysCritTag(sourceMove); - case BattlerTagType.NO_CRIT: - return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); - case BattlerTagType.IGNORE_ACCURACY: - return new IgnoreAccuracyTag(sourceMove); - case BattlerTagType.BYPASS_SLEEP: - return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); - case BattlerTagType.IGNORE_FLYING: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); - case BattlerTagType.GROUNDED: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount - 1, sourceMove); - case BattlerTagType.SALT_CURED: - return new SaltCuredTag(sourceId); - case BattlerTagType.CURSED: - return new CursedTag(sourceId); - case BattlerTagType.CHARGED: - return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); - case BattlerTagType.MAGNET_RISEN: - return new MagnetRisenTag(tagType, sourceMove); - case BattlerTagType.MINIMIZED: - return new MinimizeTag(); - case BattlerTagType.NONE: - default: - return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); + case BattlerTagType.RECHARGING: + return new RechargingTag(sourceMove); + case BattlerTagType.FLINCHED: + return new FlinchedTag(sourceMove); + case BattlerTagType.INTERRUPTED: + return new InterruptedTag(sourceMove); + case BattlerTagType.CONFUSED: + return new ConfusedTag(turnCount, sourceMove); + case BattlerTagType.INFATUATED: + return new InfatuatedTag(sourceMove, sourceId); + case BattlerTagType.SEEDED: + return new SeedTag(sourceId); + case BattlerTagType.NIGHTMARE: + return new NightmareTag(); + case BattlerTagType.FRENZY: + return new FrenzyTag(sourceMove, sourceId); + case BattlerTagType.CHARGING: + return new ChargingTag(sourceMove, sourceId); + case BattlerTagType.ENCORE: + return new EncoreTag(sourceId); + case BattlerTagType.HELPING_HAND: + return new HelpingHandTag(sourceId); + case BattlerTagType.INGRAIN: + return new IngrainTag(sourceId); + case BattlerTagType.AQUA_RING: + return new AquaRingTag(); + case BattlerTagType.DROWSY: + return new DrowsyTag(); + case BattlerTagType.TRAPPED: + return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); + case BattlerTagType.BIND: + return new BindTag(turnCount, sourceId); + case BattlerTagType.WRAP: + return new WrapTag(turnCount, sourceId); + case BattlerTagType.FIRE_SPIN: + return new FireSpinTag(turnCount, sourceId); + case BattlerTagType.WHIRLPOOL: + return new WhirlpoolTag(turnCount, sourceId); + case BattlerTagType.CLAMP: + return new ClampTag(turnCount, sourceId); + case BattlerTagType.SAND_TOMB: + return new SandTombTag(turnCount, sourceId); + case BattlerTagType.MAGMA_STORM: + return new MagmaStormTag(turnCount, sourceId); + case BattlerTagType.SNAP_TRAP: + return new SnapTrapTag(turnCount, sourceId); + case BattlerTagType.THUNDER_CAGE: + return new ThunderCageTag(turnCount, sourceId); + case BattlerTagType.INFESTATION: + return new InfestationTag(turnCount, sourceId); + case BattlerTagType.PROTECTED: + return new ProtectedTag(sourceMove); + case BattlerTagType.SPIKY_SHIELD: + return new ContactDamageProtectedTag(sourceMove, 8); + case BattlerTagType.KINGS_SHIELD: + return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.ATK, -1); + case BattlerTagType.OBSTRUCT: + return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.DEF, -2); + case BattlerTagType.SILK_TRAP: + return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.SPD, -1); + case BattlerTagType.BANEFUL_BUNKER: + return new ContactPoisonProtectedTag(sourceMove); + case BattlerTagType.BURNING_BULWARK: + return new ContactBurnProtectedTag(sourceMove); + case BattlerTagType.ENDURING: + return new EnduringTag(sourceMove); + case BattlerTagType.STURDY: + return new SturdyTag(sourceMove); + case BattlerTagType.PERISH_SONG: + return new PerishSongTag(turnCount); + case BattlerTagType.TRUANT: + return new TruantTag(); + case BattlerTagType.SLOW_START: + return new SlowStartTag(); + case BattlerTagType.PROTOSYNTHESIS: + return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); + case BattlerTagType.QUARK_DRIVE: + return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); + case BattlerTagType.FLYING: + case BattlerTagType.UNDERGROUND: + case BattlerTagType.UNDERWATER: + case BattlerTagType.HIDDEN: + return new HideSpriteTag(tagType, turnCount, sourceMove); + case BattlerTagType.FIRE_BOOST: + return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); + case BattlerTagType.CRIT_BOOST: + return new CritBoostTag(tagType, sourceMove); + case BattlerTagType.ALWAYS_CRIT: + return new AlwaysCritTag(sourceMove); + case BattlerTagType.NO_CRIT: + return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); + case BattlerTagType.IGNORE_ACCURACY: + return new IgnoreAccuracyTag(sourceMove); + case BattlerTagType.BYPASS_SLEEP: + return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); + case BattlerTagType.IGNORE_FLYING: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); + case BattlerTagType.GROUNDED: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount - 1, sourceMove); + case BattlerTagType.SALT_CURED: + return new SaltCuredTag(sourceId); + case BattlerTagType.CURSED: + return new CursedTag(sourceId); + case BattlerTagType.CHARGED: + return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); + case BattlerTagType.MAGNET_RISEN: + return new MagnetRisenTag(tagType, sourceMove); + case BattlerTagType.MINIMIZED: + return new MinimizeTag(); + case BattlerTagType.NONE: + default: + return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } } diff --git a/src/data/berry.ts b/src/data/berry.ts index e13d4532b3e2..ddc8a0d2821a 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,13 +1,12 @@ import { PokemonHealPhase, StatChangePhase } from "../phases"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult } from "../field/pokemon"; -import { getBattleStatName } from "./battle-stat"; import { BattleStat } from "./battle-stat"; import { BattlerTagType } from "./enums/battler-tag-type"; import { getStatusEffectHealText } from "./status-effect"; import * as Utils from "../utils"; import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export enum BerryType { SITRUS, @@ -35,41 +34,41 @@ export type BerryPredicate = (pokemon: Pokemon) => boolean; export function getBerryPredicate(berryType: BerryType): BerryPredicate { switch (berryType) { - case BerryType.SITRUS: - return (pokemon: Pokemon) => pokemon.getHpRatio() < 0.5; - case BerryType.LUM: - return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); - case BerryType.ENIGMA: - return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; - case BerryType.LIECHI: - case BerryType.GANLON: - case BerryType.PETAYA: - case BerryType.APICOT: - case BerryType.SALAC: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - const battleStat = (berryType - BerryType.LIECHI) as BattleStat; - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6; - }; - case BerryType.LANSAT: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST); - }; - case BerryType.STARF: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return pokemon.getHpRatio() < 0.25; - }; - case BerryType.LEPPA: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); - return !!pokemon.getMoveset().find(m => !m.getPpRatio()); - }; + case BerryType.SITRUS: + return (pokemon: Pokemon) => pokemon.getHpRatio() < 0.5; + case BerryType.LUM: + return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); + case BerryType.ENIGMA: + return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; + case BerryType.LIECHI: + case BerryType.GANLON: + case BerryType.PETAYA: + case BerryType.APICOT: + case BerryType.SALAC: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + const battleStat = (berryType - BerryType.LIECHI) as BattleStat; + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + return pokemon.getHpRatio() < threshold.value && pokemon.summonData.battleStats[battleStat] < 6; + }; + case BerryType.LANSAT: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST); + }; + case BerryType.STARF: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + return pokemon.getHpRatio() < 0.25; + }; + case BerryType.LEPPA: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, threshold); + return !!pokemon.getMoveset().find(m => !m.getPpRatio()); + }; } } @@ -77,64 +76,71 @@ export type BerryEffectFunc = (pokemon: Pokemon) => void; export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { switch (berryType) { - case BerryType.SITRUS: - case BerryType.ENIGMA: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, getPokemonMessage(pokemon, `'s ${getBerryName(berryType)}\nrestored its HP!`), true)); - }; - case BerryType.LUM: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - if (pokemon.status) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); - pokemon.resetStatus(); - pokemon.updateInfo(); - } - if (pokemon.getTag(BattlerTagType.CONFUSED)) - pokemon.lapseTag(BattlerTagType.CONFUSED); - }; - case BerryType.LIECHI: - case BerryType.GANLON: - case BerryType.PETAYA: - case BerryType.APICOT: - case BerryType.SALAC: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - const battleStat = (berryType - BerryType.LIECHI) as BattleStat; - const statLevels = new Utils.NumberHolder(1); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value)); - }; - case BerryType.LANSAT: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - pokemon.addTag(BattlerTagType.CRIT_BOOST); - }; - case BerryType.STARF: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - const statLevels = new Utils.NumberHolder(2); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); - }; - case BerryType.LEPPA: - return (pokemon: Pokemon) => { - if (pokemon.battleData) - pokemon.battleData.berriesEaten.push(berryType); - const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); - if(ppRestoreMove !== undefined){ - ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); - } - }; + case BerryType.SITRUS: + case BerryType.ENIGMA: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); + pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), + hpHealed.value, getPokemonMessage(pokemon, `'s ${getBerryName(berryType)}\nrestored its HP!`), true)); + }; + case BerryType.LUM: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + if (pokemon.status) { + pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.resetStatus(); + pokemon.updateInfo(); + } + if (pokemon.getTag(BattlerTagType.CONFUSED)) { + pokemon.lapseTag(BattlerTagType.CONFUSED); + } + }; + case BerryType.LIECHI: + case BerryType.GANLON: + case BerryType.PETAYA: + case BerryType.APICOT: + case BerryType.SALAC: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const battleStat = (berryType - BerryType.LIECHI) as BattleStat; + const statLevels = new Utils.NumberHolder(1); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value)); + }; + case BerryType.LANSAT: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + pokemon.addTag(BattlerTagType.CRIT_BOOST); + }; + case BerryType.STARF: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const statLevels = new Utils.NumberHolder(2); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, statLevels); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value)); + }; + case BerryType.LEPPA: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); + if(ppRestoreMove !== undefined){ + ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); + pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); + } + }; } -} \ No newline at end of file +} diff --git a/src/data/biomes.ts b/src/data/biomes.ts index c4fb750542da..bd01feffe1c8 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -1,28 +1,29 @@ import { Species } from "./enums/species"; -import { Type } from './type'; -import * as Utils from '../utils'; -import beautify from 'json-beautify'; +import { Type } from "./type"; +import * as Utils from "../utils"; +import beautify from "json-beautify"; import { TrainerType } from "./enums/trainer-type"; import { TimeOfDay } from "./enums/time-of-day"; import { Biome } from "./enums/biome"; import { SpeciesFormEvolution } from "./pokemon-evolutions"; export function getBiomeName(biome: Biome | -1) { - if (biome === -1) - return 'Somewhere you can\'t remember'; + if (biome === -1) { + return "Somewhere you can't remember"; + } switch (biome) { - case Biome.GRASS: - return 'Grassy Field'; - case Biome.RUINS: - return 'Ancient Ruins'; - case Biome.ABYSS: - return 'The Abyss'; - case Biome.SPACE: - return 'Stratosphere'; - case Biome.END: - return 'Final Destination'; - default: - return Utils.toReadableString(Biome[biome]); + case Biome.GRASS: + return "Grassy Field"; + case Biome.RUINS: + return "Ancient Ruins"; + case Biome.ABYSS: + return "The Abyss"; + case Biome.SPACE: + return "Stratosphere"; + case Biome.END: + return "Final Destination"; + default: + return Utils.toReadableString(Biome[biome]); } } @@ -83,7 +84,7 @@ export enum BiomePoolTier { BOSS_RARE, BOSS_SUPER_RARE, BOSS_ULTRA_RARE -}; +} export const uncatchableSpecies: Species[] = []; @@ -2014,873 +2015,873 @@ export const biomeTrainerPools: BiomeTrainerPools = { { const pokemonBiomes = [ [ Species.BULBASAUR, Type.GRASS, Type.POISON, [ - [ Biome.GRASS, BiomePoolTier.RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ] + ] ], [ Species.IVYSAUR, Type.GRASS, Type.POISON, [ - [ Biome.GRASS, BiomePoolTier.RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ] + ] ], [ Species.VENUSAUR, Type.GRASS, Type.POISON, [ - [ Biome.GRASS, BiomePoolTier.RARE ], - [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ], + [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CHARMANDER, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.CHARMELEON, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.CHARIZARD, Type.FIRE, Type.FLYING, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SQUIRTLE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.WARTORTLE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.BLASTOISE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CATERPIE, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.METAPOD, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BUTTERFREE, Type.BUG, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.WEEDLE, Type.BUG, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.KAKUNA, Type.BUG, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.BEEDRILL, Type.BUG, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PIDGEY, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] + ] ], [ Species.PIDGEOTTO, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] + ] ], [ Species.PIDGEOT, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ Species.RATTATA, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ Species.RATICATE, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ Species.SPEAROW, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] + ] ], [ Species.FEAROW, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ Species.EKANS, Type.POISON, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ARBOK, Type.POISON, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PIKACHU, Type.ELECTRIC, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.RAICHU, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.SANDSHREW, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.COMMON ] + ] ], [ Species.SANDSLASH, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.COMMON ], + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ Species.NIDORAN_F, Type.POISON, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] + ] ], [ Species.NIDORINA, Type.POISON, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] + ] ], [ Species.NIDOQUEEN, Type.POISON, Type.GROUND, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] + ] ], [ Species.NIDORAN_M, Type.POISON, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] + ] ], [ Species.NIDORINO, Type.POISON, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, TimeOfDay.DAY ] + ] ], [ Species.NIDOKING, Type.POISON, Type.GROUND, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS, TimeOfDay.DAY ] + ] ], [ Species.CLEFAIRY, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.SPACE, BiomePoolTier.COMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.SPACE, BiomePoolTier.COMMON ] + ] ], [ Species.CLEFABLE, Type.FAIRY, -1, [ - [ Biome.SPACE, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS ] + ] ], [ Species.VULPIX, Type.FIRE, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.NINETALES, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.JIGGLYPUFF, Type.NORMAL, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.WIGGLYTUFF, Type.NORMAL, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ZUBAT, Type.POISON, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.GOLBAT, Type.POISON, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.ODDISH, Type.GRASS, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.GLOOM, Type.GRASS, Type.POISON, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.VILEPLUME, Type.GRASS, Type.POISON, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PARAS, Type.BUG, Type.GRASS, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.PARASECT, Type.BUG, Type.GRASS, [ - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.VENONAT, Type.BUG, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] + ] ], [ Species.VENOMOTH, Type.BUG, Type.POISON, [ - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] + ] ], [ Species.DIGLETT, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ] + ] ], [ Species.DUGTRIO, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.MEOWTH, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PERSIAN, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PSYDUCK, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.COMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ] + ] ], [ Species.GOLDUCK, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.MANKEY, Type.FIGHTING, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.PRIMEAPE, Type.FIGHTING, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.GROWLITHE, Type.FIRE, -1, [ - [ Biome.GRASS, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.ARCANINE, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.POLIWAG, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.COMMON ] + ] ], [ Species.POLIWHIRL, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.COMMON ] + ] ], [ Species.POLIWRATH, Type.WATER, Type.FIGHTING, [ - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.ABRA, Type.PSYCHIC, -1, [ - [ Biome.TOWN, BiomePoolTier.RARE ], - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TOWN, BiomePoolTier.RARE ], + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.KADABRA, Type.PSYCHIC, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.ALAKAZAM, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ Species.MACHOP, Type.FIGHTING, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.MACHOKE, Type.FIGHTING, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.MACHAMP, Type.FIGHTING, -1, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] + ] ], [ Species.BELLSPROUT, Type.GRASS, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.WEEPINBELL, Type.GRASS, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VICTREEBEL, Type.GRASS, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TENTACOOL, Type.WATER, Type.POISON, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.TENTACRUEL, Type.WATER, Type.POISON, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.SEA, BiomePoolTier.BOSS ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.SEA, BiomePoolTier.BOSS ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GEODUDE, Type.ROCK, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GRAVELER, Type.ROCK, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GOLEM, Type.ROCK, Type.GROUND, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.PONYTA, Type.FIRE, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.RAPIDASH, Type.FIRE, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.SLOWPOKE, Type.WATER, Type.PSYCHIC, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.LAKE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.LAKE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SLOWBRO, Type.WATER, Type.PSYCHIC, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.MAGNEMITE, Type.ELECTRIC, Type.STEEL, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.MAGNETON, Type.ELECTRIC, Type.STEEL, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.FARFETCHD, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DODUO, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.DODRIO, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SEEL, Type.WATER, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.DEWGONG, Type.WATER, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.GRIMER, Type.POISON, -1, [ - [ Biome.SLUM, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.MUK, Type.POISON, -1, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], - [ Biome.SLUM, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.BOSS ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ], + [ Biome.SLUM, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.BOSS ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.SHELLDER, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CLOYSTER, Type.WATER, Type.ICE, [ - [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.GASTLY, Type.GHOST, Type.POISON, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.HAUNTER, Type.GHOST, Type.POISON, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.GENGAR, Type.GHOST, Type.POISON, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.ONIX, Type.ROCK, Type.GROUND, [ - [ Biome.BADLANDS, BiomePoolTier.RARE ], - [ Biome.CAVE, BiomePoolTier.RARE ], - [ Biome.CAVE, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.RARE ], + [ Biome.CAVE, BiomePoolTier.RARE ], + [ Biome.CAVE, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] + ] ], [ Species.DROWZEE, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.COMMON ] - ] + [ Biome.RUINS, BiomePoolTier.COMMON ] + ] ], [ Species.HYPNO, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ Species.KRABBY, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.KINGLER, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.VOLTORB, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.ELECTRODE, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.EXEGGCUTE, Type.GRASS, Type.PSYCHIC, [ - [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.EXEGGUTOR, Type.GRASS, Type.PSYCHIC, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CUBONE, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MAROWAK, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - [ Biome.BADLANDS, BiomePoolTier.BOSS, TimeOfDay.NIGHT ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY, TimeOfDay.DUSK ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + [ Biome.BADLANDS, BiomePoolTier.BOSS, TimeOfDay.NIGHT ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY, TimeOfDay.DUSK ] ] + ] ], [ Species.HITMONLEE, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] + ] ], [ Species.HITMONCHAN, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] + ] ], [ Species.LICKITUNG, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.KOFFING, Type.POISON, -1, [ - [ Biome.SLUM, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.WEEZING, Type.POISON, -1, [ - [ Biome.SLUM, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.RHYHORN, Type.GROUND, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.RHYDON, Type.GROUND, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CHANSEY, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], - [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], + [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.TANGELA, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.KANGASKHAN, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HORSEA, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SEADRA, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GOLDEEN, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.SEA, BiomePoolTier.UNCOMMON ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.SEA, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SEAKING, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ], - [ Biome.SEA, BiomePoolTier.UNCOMMON ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ], + [ Biome.SEA, BiomePoolTier.UNCOMMON ] + ] ], [ Species.STARYU, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.STARMIE, Type.WATER, Type.PSYCHIC, [ - [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BEACH, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.MR_MIME, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.RUINS, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SCYTHER, Type.BUG, Type.FLYING, [ - [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], - [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], + [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.JYNX, Type.ICE, Type.PSYCHIC, [ - [ Biome.ICE_CAVE, BiomePoolTier.RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ELECTABUZZ, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MAGMAR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PINSIR, Type.BUG, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TAUROS, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE ], - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ], + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ Species.MAGIKARP, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ] + ] ], [ Species.GYARADOS, Type.WATER, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.LAPRAS, Type.WATER, Type.ICE, [ - [ Biome.SEA, BiomePoolTier.RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DITTO, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.ULTRA_RARE ], - [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], - [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ], - [ Biome.LABORATORY, BiomePoolTier.RARE ] - ] + [ Biome.TOWN, BiomePoolTier.ULTRA_RARE ], + [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], + [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ], + [ Biome.LABORATORY, BiomePoolTier.RARE ] + ] ], [ Species.EEVEE, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], - [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], + [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ], + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.VAPOREON, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.JOLTEON, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FLAREON, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PORYGON, Type.NORMAL, -1, [ - [ Biome.FACTORY, BiomePoolTier.RARE ], - [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], - [ Biome.LABORATORY, BiomePoolTier.RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.RARE ], + [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], + [ Biome.LABORATORY, BiomePoolTier.RARE ] + ] ], [ Species.OMANYTE, Type.ROCK, Type.WATER, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.OMASTAR, Type.ROCK, Type.WATER, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.KABUTO, Type.ROCK, Type.WATER, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.KABUTOPS, Type.ROCK, Type.WATER, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.AERODACTYL, Type.ROCK, Type.FLYING, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SNORLAX, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ARTICUNO, Type.ICE, Type.FLYING, [ - [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ZAPDOS, Type.ELECTRIC, Type.FLYING, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MOLTRES, Type.FIRE, Type.FLYING, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.DRATINI, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ] + ] ], [ Species.DRAGONAIR, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ] + ] ], [ Species.DRAGONITE, Type.DRAGON, Type.FLYING, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ Species.MEWTWO, Type.PSYCHIC, -1, [ - [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.MEW, Type.PSYCHIC, -1, [ ] ], [ Species.CHIKORITA, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ] + ] ], [ Species.BAYLEEF, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ] + ] ], [ Species.MEGANIUM, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CYNDAQUIL, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.QUILAVA, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.TYPHLOSION, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TOTODILE, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ] + ] ], [ Species.CROCONAW, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ] + ] ], [ Species.FERALIGATR, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.RARE ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SENTRET, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FURRET, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HOOTHOOT, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ] + ] ], [ Species.NOCTOWL, Type.NORMAL, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] + ] ], [ Species.LEDYBA, Type.BUG, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAWN ], - [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAWN ], + [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ] + ] ], [ Species.LEDIAN, Type.BUG, Type.FLYING, [ - [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ], - [ Biome.MEADOW, BiomePoolTier.BOSS, TimeOfDay.DAWN ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON, TimeOfDay.DAWN ], + [ Biome.MEADOW, BiomePoolTier.BOSS, TimeOfDay.DAWN ] + ] ], [ Species.SPINARAK, Type.BUG, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] + ] ], [ Species.ARIADOS, Type.BUG, Type.POISON, [ - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] + ] ], [ Species.CROBAT, Type.POISON, Type.FLYING, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.CHINCHOU, Type.WATER, Type.ELECTRIC, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.LANTURN, Type.WATER, Type.ELECTRIC, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.SEABED, BiomePoolTier.COMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.SEABED, BiomePoolTier.COMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.PICHU, Type.ELECTRIC, -1, [ ] ], @@ -2891,308 +2892,308 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ Species.TOGEPI, Type.FAIRY, -1, [ ] ], [ Species.TOGETIC, Type.FAIRY, Type.FLYING, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.NATU, Type.PSYCHIC, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.XATU, Type.PSYCHIC, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.MAREEP, Type.ELECTRIC, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.RARE ] + ] ], [ Species.FLAAFFY, Type.ELECTRIC, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.RARE ] + ] ], [ Species.AMPHAROS, Type.ELECTRIC, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.BELLOSSOM, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.MARILL, Type.WATER, Type.FAIRY, [ - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.AZUMARILL, Type.WATER, Type.FAIRY, [ - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - ] + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + ] ], [ Species.SUDOWOODO, Type.ROCK, -1, [ - [ Biome.GRASS, BiomePoolTier.SUPER_RARE ], - [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRASS, BiomePoolTier.SUPER_RARE ], + [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.POLITOED, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HOPPIP, Type.GRASS, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SKIPLOOM, Type.GRASS, Type.FLYING, [ - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.JUMPLUFF, Type.GRASS, Type.FLYING, [ - [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.AIPOM, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ Species.SUNKERN, Type.GRASS, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SUNFLORA, Type.GRASS, -1, [ - [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.YANMA, Type.BUG, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.WOOPER, Type.WATER, Type.GROUND, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.QUAGSIRE, Type.WATER, Type.GROUND, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ESPEON, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.SUPER_RARE, TimeOfDay.DAY ], - [ Biome.RUINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ] - ] + [ Biome.RUINS, BiomePoolTier.SUPER_RARE, TimeOfDay.DAY ], + [ Biome.RUINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ] + ] ], [ Species.UMBREON, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.SUPER_RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.SUPER_RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.MURKROW, Type.DARK, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE, TimeOfDay.NIGHT ], - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE, TimeOfDay.NIGHT ], + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.SLOWKING, Type.WATER, Type.PSYCHIC, [ - [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.SUPER_RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.MISDREAVUS, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ] + ] ], [ Species.UNOWN, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.COMMON ] - ] + [ Biome.RUINS, BiomePoolTier.COMMON ] + ] ], [ Species.WOBBUFFET, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GIRAFARIG, Type.NORMAL, Type.PSYCHIC, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ] + ] ], [ Species.PINECO, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.FORRETRESS, Type.BUG, Type.STEEL, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.DUNSPARCE, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.GLIGAR, Type.GROUND, Type.FLYING, [ - [ Biome.BADLANDS, BiomePoolTier.RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.RARE ] + ] ], [ Species.STEELIX, Type.STEEL, Type.GROUND, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SNUBBULL, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GRANBULL, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.QWILFISH, Type.WATER, Type.POISON, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.SCIZOR, Type.BUG, Type.STEEL, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SHUCKLE, Type.BUG, Type.ROCK, [ - [ Biome.CAVE, BiomePoolTier.SUPER_RARE ], - [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.CAVE, BiomePoolTier.SUPER_RARE ], + [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HERACROSS, Type.BUG, Type.FIGHTING, [ - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SNEASEL, Type.DARK, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TEDDIURSA, Type.NORMAL, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.URSARING, Type.NORMAL, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SLUGMA, Type.FIRE, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.MAGCARGO, Type.FIRE, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.SWINUB, Type.ICE, Type.GROUND, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.PILOSWINE, Type.ICE, Type.GROUND, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.CORSOLA, Type.WATER, Type.ROCK, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.REMORAID, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.OCTILLERY, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.DELIBIRD, Type.ICE, Type.FLYING, [ - [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] + ] ], [ Species.MANTINE, Type.WATER, Type.FLYING, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.SKARMORY, Type.STEEL, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ Species.HOUNDOUR, Type.DARK, Type.FIRE, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.HOUNDOOM, Type.DARK, Type.FIRE, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.KINGDRA, Type.WATER, Type.DRAGON, [ - [ Biome.SEA, BiomePoolTier.SUPER_RARE ], - [ Biome.SEA, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEA, BiomePoolTier.SUPER_RARE ], + [ Biome.SEA, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PHANPY, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.DONPHAN, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PORYGON2, Type.NORMAL, -1, [ - [ Biome.FACTORY, BiomePoolTier.RARE ], - [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], - [ Biome.LABORATORY, BiomePoolTier.RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.RARE ], + [ Biome.SPACE, BiomePoolTier.SUPER_RARE ], + [ Biome.LABORATORY, BiomePoolTier.RARE ] + ] ], [ Species.STANTLER, Type.NORMAL, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SMEARGLE, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.TYROGUE, Type.FIGHTING, -1, [ ] ], [ Species.HITMONTOP, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.SMOOCHUM, Type.ICE, Type.PSYCHIC, [ ] ], @@ -3201,950 +3202,950 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ Species.MAGBY, Type.FIRE, -1, [ ] ], [ Species.MILTANK, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE ], - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ], + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ Species.BLISSEY, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.RAIKOU, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ENTEI, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.SUICUNE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.LARVITAR, Type.ROCK, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PUPITAR, Type.ROCK, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.TYRANITAR, Type.ROCK, Type.DARK, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.LUGIA, Type.PSYCHIC, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SEA, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.HO_OH, Type.FIRE, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.CELEBI, Type.PSYCHIC, Type.GRASS, [ ] ], [ Species.TREECKO, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.GROVYLE, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.SCEPTILE, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TORCHIC, Type.FIRE, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ] + ] ], [ Species.COMBUSKEN, Type.FIRE, Type.FIGHTING, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ] + ] ], [ Species.BLAZIKEN, Type.FIRE, Type.FIGHTING, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.MUDKIP, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ] + ] ], [ Species.MARSHTOMP, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ] + ] ], [ Species.SWAMPERT, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.RARE ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.RARE ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.POOCHYENA, Type.DARK, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.MIGHTYENA, Type.DARK, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ZIGZAGOON, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.COMMON ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.COMMON ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ Species.LINOONE, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.BOSS ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.BOSS ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ Species.WURMPLE, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ] + ] ], [ Species.SILCOON, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAY ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.DAY ] + ] ], [ Species.BEAUTIFLY, Type.BUG, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.DAY ], - [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.DAY ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.DAY ], + [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.DAY ] + ] ], [ Species.CASCOON, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] + ] ], [ Species.DUSTOX, Type.BUG, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] + ] ], [ Species.LOTAD, Type.WATER, Type.GRASS, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.LOMBRE, Type.WATER, Type.GRASS, [ - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.LUDICOLO, Type.WATER, Type.GRASS, [ - [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SEEDOT, Type.GRASS, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.NUZLEAF, Type.GRASS, Type.DARK, [ - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SHIFTRY, Type.GRASS, Type.DARK, [ - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.TAILLOW, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SWELLOW, Type.NORMAL, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.WINGULL, Type.WATER, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PELIPPER, Type.WATER, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.RALTS, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TOWN, BiomePoolTier.SUPER_RARE ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.KIRLIA, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GARDEVOIR, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.MEADOW, BiomePoolTier.BOSS ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.BOSS ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SURSKIT, Type.BUG, Type.WATER, [ - [ Biome.TOWN, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TOWN, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MASQUERAIN, Type.BUG, Type.FLYING, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.SHROOMISH, Type.GRASS, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.BRELOOM, Type.GRASS, Type.FIGHTING, [ - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SLAKOTH, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.VIGOROTH, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.SLAKING, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.NINCADA, Type.BUG, Type.GROUND, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ] + ] ], [ Species.NINJASK, Type.BUG, Type.FLYING, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ Species.SHEDINJA, Type.BUG, Type.GHOST, [ - [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.WHISMUR, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.LOUDRED, Type.NORMAL, -1, [ - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.EXPLOUD, Type.NORMAL, -1, [ - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.MAKUHITA, Type.FIGHTING, -1, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.HARIYAMA, Type.FIGHTING, -1, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.AZURILL, Type.NORMAL, Type.FAIRY, [ ] ], [ Species.NOSEPASS, Type.ROCK, -1, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SKITTY, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.DELCATTY, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SABLEYE, Type.DARK, Type.GHOST, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.MAWILE, Type.STEEL, Type.FAIRY, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ARON, Type.STEEL, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.LAIRON, Type.STEEL, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.AGGRON, Type.STEEL, Type.ROCK, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ Species.MEDITITE, Type.FIGHTING, Type.PSYCHIC, [ - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.MEDICHAM, Type.FIGHTING, Type.PSYCHIC, [ - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.ELECTRIKE, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.MANECTRIC, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.PLUSLE, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MINUN, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.VOLBEAT, Type.BUG, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] + ] ], [ Species.ILLUMISE, Type.BUG, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE, TimeOfDay.NIGHT ] + ] ], [ Species.ROSELIA, Type.GRASS, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GULPIN, Type.POISON, -1, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ] + ] ], [ Species.SWALOT, Type.POISON, -1, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.CARVANHA, Type.WATER, Type.DARK, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SHARPEDO, Type.WATER, Type.DARK, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.WAILMER, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.WAILORD, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.NUMEL, Type.FIRE, Type.GROUND, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.CAMERUPT, Type.FIRE, Type.GROUND, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.COMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.COMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.TORKOAL, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.SPOINK, Type.PSYCHIC, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.COMMON ] + ] ], [ Species.GRUMPIG, Type.PSYCHIC, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ], - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ], + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ Species.SPINDA, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.TRAPINCH, Type.GROUND, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VIBRAVA, Type.GROUND, Type.DRAGON, [ - [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ Species.FLYGON, Type.GROUND, Type.DRAGON, [ - [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ], - ] + [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ], + ] ], [ Species.CACNEA, Type.GRASS, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.CACTURNE, Type.GRASS, Type.DARK, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SWABLU, Type.NORMAL, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] + ] ], [ Species.ALTARIA, Type.DRAGON, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] + ] ], [ Species.ZANGOOSE, Type.NORMAL, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ Species.SEVIPER, Type.POISON, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.LUNATONE, Type.ROCK, Type.PSYCHIC, [ - [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] - ] + [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] + ] ], [ Species.SOLROCK, Type.ROCK, Type.PSYCHIC, [ - [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.DAY ], - [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.DAY ] - ] + [ Biome.SPACE, BiomePoolTier.COMMON, TimeOfDay.DAY ], + [ Biome.SPACE, BiomePoolTier.BOSS, TimeOfDay.DAY ] + ] ], [ Species.BARBOACH, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] + ] ], [ Species.WHISCASH, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.CORPHISH, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.CRAWDAUNT, Type.WATER, Type.DARK, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.BALTOY, Type.GROUND, Type.PSYCHIC, [ - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.SPACE, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - ] + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.SPACE, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + ] ], [ Species.CLAYDOL, Type.GROUND, Type.PSYCHIC, [ - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ], - [ Biome.SPACE, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - ] + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ], + [ Biome.SPACE, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + ] ], [ Species.LILEEP, Type.ROCK, Type.GRASS, [ - [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.CRADILY, Type.ROCK, Type.GRASS, [ - [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ANORITH, Type.ROCK, Type.BUG, [ - [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.ARMALDO, Type.ROCK, Type.BUG, [ - [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.SUPER_RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FEEBAS, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.MILOTIC, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CASTFORM, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.ULTRA_RARE ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.ULTRA_RARE ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.KECLEON, Type.NORMAL, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ Species.SHUPPET, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] + ] ], [ Species.BANETTE, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.DUSKULL, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.DUSCLOPS, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.TROPIUS, Type.GRASS, Type.FLYING, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CHIMECHO, Type.PSYCHIC, -1, [ - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.BOSS ] - ] + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.BOSS ] + ] ], [ Species.ABSOL, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.WYNAUT, Type.PSYCHIC, -1, [ ] ], [ Species.SNORUNT, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GLALIE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.SPHEAL, Type.ICE, Type.WATER, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SEALEO, Type.ICE, Type.WATER, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.WALREIN, Type.ICE, Type.WATER, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.CLAMPERL, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.HUNTAIL, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.GOREBYSS, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.RELICANTH, Type.WATER, Type.ROCK, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.LUVDISC, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.BAGON, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SHELGON, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SALAMENCE, Type.DRAGON, Type.FLYING, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BELDUM, Type.STEEL, Type.PSYCHIC, [ - [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], - [ Biome.SPACE, BiomePoolTier.RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], + [ Biome.SPACE, BiomePoolTier.RARE ] + ] ], [ Species.METANG, Type.STEEL, Type.PSYCHIC, [ - [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], - [ Biome.SPACE, BiomePoolTier.RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], + [ Biome.SPACE, BiomePoolTier.RARE ] + ] ], [ Species.METAGROSS, Type.STEEL, Type.PSYCHIC, [ - [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], - [ Biome.SPACE, BiomePoolTier.RARE ], - [ Biome.SPACE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.SUPER_RARE ], + [ Biome.SPACE, BiomePoolTier.RARE ], + [ Biome.SPACE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.REGIROCK, Type.ROCK, -1, [ - [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.REGICE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.ULTRA_RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.REGISTEEL, Type.STEEL, -1, [ - [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], - [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], + [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.LATIAS, Type.DRAGON, Type.PSYCHIC, [ - [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.LATIOS, Type.DRAGON, Type.PSYCHIC, [ - [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.ULTRA_RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.KYOGRE, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.GROUDON, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.RAYQUAZA, Type.DRAGON, Type.FLYING, [ - [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.JIRACHI, Type.STEEL, Type.PSYCHIC, [ ] ], [ Species.DEOXYS, Type.PSYCHIC, -1, [ ] ], [ Species.TURTWIG, Type.GRASS, -1, [ - [ Biome.GRASS, BiomePoolTier.RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ] + ] ], [ Species.GROTLE, Type.GRASS, -1, [ - [ Biome.GRASS, BiomePoolTier.RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ] + ] ], [ Species.TORTERRA, Type.GRASS, Type.GROUND, [ - [ Biome.GRASS, BiomePoolTier.RARE ], - [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRASS, BiomePoolTier.RARE ], + [ Biome.GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CHIMCHAR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.MONFERNO, Type.FIRE, Type.FIGHTING, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.INFERNAPE, Type.FIRE, Type.FIGHTING, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PIPLUP, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ] + ] ], [ Species.PRINPLUP, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ] + ] ], [ Species.EMPOLEON, Type.WATER, Type.STEEL, [ - [ Biome.SEA, BiomePoolTier.RARE ], - [ Biome.SEA, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ], + [ Biome.SEA, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.STARLY, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.STARAVIA, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.STARAPTOR, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BIDOOF, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.COMMON ] + ] ], [ Species.BIBAREL, Type.NORMAL, Type.WATER, [ - [ Biome.PLAINS, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ Species.KRICKETOT, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.KRICKETUNE, Type.BUG, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SHINX, Type.ELECTRIC, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.LUXIO, Type.ELECTRIC, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.LUXRAY, Type.ELECTRIC, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.BUDEW, Type.GRASS, Type.POISON, [ ] ], [ Species.ROSERADE, Type.GRASS, Type.POISON, [ - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CRANIDOS, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.RAMPARDOS, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SHIELDON, Type.ROCK, Type.STEEL, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.BASTIODON, Type.ROCK, Type.STEEL, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.BURMY, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.SLUM, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.SLUM, BiomePoolTier.UNCOMMON ] + ] ], [ Species.WORMADAM, Type.BUG, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.FOREST, BiomePoolTier.BOSS ], - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ], - [ Biome.SLUM, BiomePoolTier.UNCOMMON ], - [ Biome.SLUM, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.FOREST, BiomePoolTier.BOSS ], + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ], + [ Biome.SLUM, BiomePoolTier.UNCOMMON ], + [ Biome.SLUM, BiomePoolTier.BOSS ] + ] ], [ Species.MOTHIM, Type.BUG, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.COMBEE, Type.BUG, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VESPIQUEN, Type.BUG, Type.FLYING, [ - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PACHIRISU, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.BUIZEL, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ] + ] ], [ Species.FLOATZEL, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON ], - [ Biome.SEA, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ], + [ Biome.SEA, BiomePoolTier.BOSS ] + ] ], [ Species.CHERUBI, Type.GRASS, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CHERRIM, Type.GRASS, -1, [ - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SHELLOS, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GASTRODON, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ], - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ], + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.AMBIPOM, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.DRIFLOON, Type.GHOST, Type.FLYING, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] + ] ], [ Species.DRIFBLIM, Type.GHOST, Type.FLYING, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.BUNEARY, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE ] + ] ], [ Species.LOPUNNY, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ Species.MISMAGIUS, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.HONCHKROW, Type.DARK, Type.FLYING, [ - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.GLAMEOW, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PURUGLY, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ Species.CHINGLING, Type.PSYCHIC, -1, [ - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.STUNKY, Type.POISON, Type.DARK, [ - [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SKUNTANK, Type.POISON, Type.DARK, [ - [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.BRONZOR, Type.STEEL, Type.PSYCHIC, [ - [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], - [ Biome.SPACE, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], + [ Biome.SPACE, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.BRONZONG, Type.STEEL, Type.PSYCHIC, [ - [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], - [ Biome.SPACE, BiomePoolTier.COMMON ], - [ Biome.SPACE, BiomePoolTier.BOSS ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], + [ Biome.SPACE, BiomePoolTier.COMMON ], + [ Biome.SPACE, BiomePoolTier.BOSS ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.BONSLY, Type.ROCK, -1, [ ] ], @@ -4153,3050 +4154,3050 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ Species.HAPPINY, Type.NORMAL, -1, [ ] ], [ Species.CHATOT, Type.NORMAL, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.SPIRITOMB, Type.GHOST, Type.DARK, [ - [ Biome.GRAVEYARD, BiomePoolTier.SUPER_RARE ], - [ Biome.ABYSS, BiomePoolTier.RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.SUPER_RARE ], + [ Biome.ABYSS, BiomePoolTier.RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.GIBLE, Type.DRAGON, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ Species.GABITE, Type.DRAGON, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ Species.GARCHOMP, Type.DRAGON, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ Species.MUNCHLAX, Type.NORMAL, -1, [ ] ], [ Species.RIOLU, Type.FIGHTING, -1, [ ] ], [ Species.LUCARIO, Type.FIGHTING, Type.STEEL, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.HIPPOPOTAS, Type.GROUND, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HIPPOWDON, Type.GROUND, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SKORUPI, Type.POISON, Type.BUG, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + ] ], [ Species.DRAPION, Type.POISON, Type.DARK, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.DESERT, BiomePoolTier.BOSS ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.COMMON ], + [ Biome.DESERT, BiomePoolTier.BOSS ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + ] ], [ Species.CROAGUNK, Type.POISON, Type.FIGHTING, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DOJO, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DOJO, BiomePoolTier.UNCOMMON ] + ] ], [ Species.TOXICROAK, Type.POISON, Type.FIGHTING, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DOJO, BiomePoolTier.UNCOMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DOJO, BiomePoolTier.UNCOMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.CARNIVINE, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.FINNEON, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ] + ] ], [ Species.LUMINEON, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], - [ Biome.SEA, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, TimeOfDay.NIGHT ], + [ Biome.SEA, BiomePoolTier.BOSS, TimeOfDay.NIGHT ] + ] ], [ Species.MANTYKE, Type.WATER, Type.FLYING, [ - [ Biome.SEABED, BiomePoolTier.RARE ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ] + ] ], [ Species.SNOVER, Type.GRASS, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.ABOMASNOW, Type.GRASS, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] + ] ], [ Species.WEAVILE, Type.DARK, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.MAGNEZONE, Type.ELECTRIC, Type.STEEL, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.LICKILICKY, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.RHYPERIOR, Type.GROUND, Type.ROCK, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.TANGROWTH, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ELECTIVIRE, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.MAGMORTAR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.TOGEKISS, Type.FAIRY, Type.FLYING, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.YANMEGA, Type.BUG, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.LEAFEON, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GLACEON, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GLISCOR, Type.GROUND, Type.FLYING, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.MAMOSWINE, Type.ICE, Type.GROUND, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.PORYGON_Z, Type.NORMAL, -1, [ - [ Biome.SPACE, BiomePoolTier.BOSS_RARE ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS_RARE ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.GALLADE, Type.PSYCHIC, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.SUPER_RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PROBOPASS, Type.ROCK, Type.STEEL, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.DUSKNOIR, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.FROSLASS, Type.ICE, Type.GHOST, [ - [ Biome.ICE_CAVE, BiomePoolTier.RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ROTOM, Type.ELECTRIC, Type.GHOST, [ - [ Biome.LABORATORY, BiomePoolTier.SUPER_RARE ], - [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ], - [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ], - [ Biome.SEA, BiomePoolTier.SUPER_RARE ], - [ Biome.SEA, BiomePoolTier.BOSS_SUPER_RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.SUPER_RARE ], + [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ], + [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ], + [ Biome.SEA, BiomePoolTier.SUPER_RARE ], + [ Biome.SEA, BiomePoolTier.BOSS_SUPER_RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_SUPER_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.SUPER_RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.UXIE, Type.PSYCHIC, -1, [ - [ Biome.CAVE, BiomePoolTier.ULTRA_RARE ], - [ Biome.CAVE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.CAVE, BiomePoolTier.ULTRA_RARE ], + [ Biome.CAVE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MESPRIT, Type.PSYCHIC, -1, [ - [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.ULTRA_RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.AZELF, Type.PSYCHIC, -1, [ - [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ], - [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ], + [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.DIALGA, Type.STEEL, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.PALKIA, Type.WATER, Type.DRAGON, [ - [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.HEATRAN, Type.FIRE, Type.STEEL, [ - [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.REGIGIGAS, Type.NORMAL, -1, [ - [ Biome.TEMPLE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.TEMPLE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.GIRATINA, Type.GHOST, Type.DRAGON, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.CRESSELIA, Type.PSYCHIC, -1, [ - [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], - [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], + [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.PHIONE, Type.WATER, -1, [ ] ], [ Species.MANAPHY, Type.WATER, -1, [ ] ], [ Species.DARKRAI, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.SHAYMIN, Type.GRASS, -1, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.ARCEUS, Type.NORMAL, -1, [ ] ], [ Species.VICTINI, Type.PSYCHIC, Type.FIRE, [ ] ], [ Species.SNIVY, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.SERVINE, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.SERPERIOR, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TEPIG, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.PIGNITE, Type.FIRE, Type.FIGHTING, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.EMBOAR, Type.FIRE, Type.FIGHTING, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.OSHAWOTT, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.DEWOTT, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.SAMUROTT, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PATRAT, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.WATCHOG, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.LILLIPUP, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ Species.HERDIER, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ Species.STOUTLAND, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ Species.PURRLOIN, Type.DARK, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.LIEPARD, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PANSAGE, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SIMISAGE, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON ], - [ Biome.FOREST, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON ], + [ Biome.FOREST, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PANSEAR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SIMISEAR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PANPOUR, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SIMIPOUR, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SEA, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SEA, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MUNNA, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.COMMON ] - ] + [ Biome.SPACE, BiomePoolTier.COMMON ] + ] ], [ Species.MUSHARNA, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.COMMON ], - [ Biome.SPACE, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.COMMON ], + [ Biome.SPACE, BiomePoolTier.BOSS ] + ] ], [ Species.PIDOVE, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TRANQUILL, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.UNFEZANT, Type.NORMAL, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BLITZLE, Type.ELECTRIC, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ Species.ZEBSTRIKA, Type.ELECTRIC, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ Species.ROGGENROLA, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.BOLDORE, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.GIGALITH, Type.ROCK, -1, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.WOOBAT, Type.PSYCHIC, Type.FLYING, [ - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.SWOOBAT, Type.PSYCHIC, Type.FLYING, [ - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.DRILBUR, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.EXCADRILL, Type.GROUND, Type.STEEL, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.BADLANDS, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.BADLANDS, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.AUDINO, Type.NORMAL, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.TIMBURR, Type.FIGHTING, -1, [ - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.GURDURR, Type.FIGHTING, -1, [ - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ Species.CONKELDURR, Type.FIGHTING, -1, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] + ] ], [ Species.TYMPOLE, Type.WATER, -1, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ] + ] ], [ Species.PALPITOAD, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ] + ] ], [ Species.SEISMITOAD, Type.WATER, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.COMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.THROH, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.SAWK, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.SEWADDLE, Type.BUG, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SWADLOON, Type.BUG, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.LEAVANNY, Type.BUG, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VENIPEDE, Type.BUG, Type.POISON, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.WHIRLIPEDE, Type.BUG, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SCOLIPEDE, Type.BUG, Type.POISON, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.COTTONEE, Type.GRASS, Type.FAIRY, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.WHIMSICOTT, Type.GRASS, Type.FAIRY, [ - [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PETILIL, Type.GRASS, -1, [ - [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.LILLIGANT, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BASCULIN, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.SANDILE, Type.GROUND, Type.DARK, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.KROKOROK, Type.GROUND, Type.DARK, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.KROOKODILE, Type.GROUND, Type.DARK, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.DARUMAKA, Type.FIRE, -1, [ - [ Biome.DESERT, BiomePoolTier.RARE ] - ] + [ Biome.DESERT, BiomePoolTier.RARE ] + ] ], [ Species.DARMANITAN, Type.FIRE, -1, [ - [ Biome.DESERT, BiomePoolTier.RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.DESERT, BiomePoolTier.RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ Species.MARACTUS, Type.GRASS, -1, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ Species.DWEBBLE, Type.BUG, Type.ROCK, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.CRUSTLE, Type.BUG, Type.ROCK, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.SCRAGGY, Type.DARK, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.UNCOMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DOJO, BiomePoolTier.UNCOMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SCRAFTY, Type.DARK, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.UNCOMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DOJO, BiomePoolTier.UNCOMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SIGILYPH, Type.PSYCHIC, Type.FLYING, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ], - [ Biome.SPACE, BiomePoolTier.RARE ] - ] + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ], + [ Biome.SPACE, BiomePoolTier.RARE ] + ] ], [ Species.YAMASK, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.COFAGRIGUS, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.BOSS ] + ] ], [ Species.TIRTOUGA, Type.WATER, Type.ROCK, [ - [ Biome.SEA, BiomePoolTier.SUPER_RARE ], - [ Biome.BEACH, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SEA, BiomePoolTier.SUPER_RARE ], + [ Biome.BEACH, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.CARRACOSTA, Type.WATER, Type.ROCK, [ - [ Biome.SEA, BiomePoolTier.SUPER_RARE ], - [ Biome.BEACH, BiomePoolTier.SUPER_RARE ], - [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEA, BiomePoolTier.SUPER_RARE ], + [ Biome.BEACH, BiomePoolTier.SUPER_RARE ], + [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ARCHEN, Type.ROCK, Type.FLYING, [ - [ Biome.RUINS, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.ARCHEOPS, Type.ROCK, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.RUINS, BiomePoolTier.SUPER_RARE ], - [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.RUINS, BiomePoolTier.SUPER_RARE ], + [ Biome.RUINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TRUBBISH, Type.POISON, -1, [ - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ Species.GARBODOR, Type.POISON, -1, [ - [ Biome.SLUM, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.BOSS ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.BOSS ] + ] ], [ Species.ZORUA, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.RARE ] + ] ], [ Species.ZOROARK, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.MINCCINO, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CINCCINO, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - ] + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + ] ], [ Species.GOTHITA, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.RARE ] - ] + [ Biome.RUINS, BiomePoolTier.RARE ] + ] ], [ Species.GOTHORITA, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.RARE ] - ] + [ Biome.RUINS, BiomePoolTier.RARE ] + ] ], [ Species.GOTHITELLE, Type.PSYCHIC, -1, [ [ Biome.RUINS, BiomePoolTier.RARE ], [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + ] ], [ Species.SOLOSIS, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.RARE ], - [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SPACE, BiomePoolTier.RARE ], + [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] + ] ], [ Species.DUOSION, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.RARE ], - [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SPACE, BiomePoolTier.RARE ], + [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ] + ] ], [ Species.REUNICLUS, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.RARE ], - [ Biome.SPACE, BiomePoolTier.BOSS ], - [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.RARE ], + [ Biome.SPACE, BiomePoolTier.BOSS ], + [ Biome.LABORATORY, BiomePoolTier.UNCOMMON ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.DUCKLETT, Type.WATER, Type.FLYING, [ - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SWANNA, Type.WATER, Type.FLYING, [ - [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VANILLITE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.VANILLISH, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.VANILLUXE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.DEERLING, Type.NORMAL, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SAWSBUCK, Type.NORMAL, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.EMOLGA, Type.ELECTRIC, Type.FLYING, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.KARRABLAST, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.ESCAVALIER, Type.BUG, Type.STEEL, [ - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FOONGUS, Type.GRASS, Type.POISON, [ - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.AMOONGUSS, Type.GRASS, Type.POISON, [ - [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.GRASS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.FRILLISH, Type.WATER, Type.GHOST, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.JELLICENT, Type.WATER, Type.GHOST, [ - [ Biome.SEABED, BiomePoolTier.COMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.ALOMOMOLA, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.JOLTIK, Type.BUG, Type.ELECTRIC, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + ] ], [ Species.GALVANTULA, Type.BUG, Type.ELECTRIC, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.FERROSEED, Type.GRASS, Type.STEEL, [ - [ Biome.CAVE, BiomePoolTier.RARE ] - ] + [ Biome.CAVE, BiomePoolTier.RARE ] + ] ], [ Species.FERROTHORN, Type.GRASS, Type.STEEL, [ - [ Biome.CAVE, BiomePoolTier.RARE ], - [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.CAVE, BiomePoolTier.RARE ], + [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.KLINK, Type.STEEL, -1, [ - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.KLANG, Type.STEEL, -1, [ - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ] - ] + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ] + ] ], [ Species.KLINKLANG, Type.STEEL, -1, [ - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.BOSS ], - [ Biome.LABORATORY, BiomePoolTier.COMMON ], - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.BOSS ], + [ Biome.LABORATORY, BiomePoolTier.COMMON ], + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ Species.TYNAMO, Type.ELECTRIC, -1, [ - [ Biome.SEABED, BiomePoolTier.RARE ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ] + ] ], [ Species.EELEKTRIK, Type.ELECTRIC, -1, [ - [ Biome.SEABED, BiomePoolTier.RARE ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ] + ] ], [ Species.EELEKTROSS, Type.ELECTRIC, -1, [ - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ELGYEM, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.SPACE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.SPACE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.BEHEEYEM, Type.PSYCHIC, -1, [ - [ Biome.RUINS, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ], - [ Biome.SPACE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.RUINS, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ], + [ Biome.SPACE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.LITWICK, Type.GHOST, Type.FIRE, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.LAMPENT, Type.GHOST, Type.FIRE, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CHANDELURE, Type.GHOST, Type.FIRE, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.AXEW, Type.DRAGON, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ Species.FRAXURE, Type.DRAGON, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ Species.HAXORUS, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ Species.CUBCHOO, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.BEARTIC, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.CRYOGONAL, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.SHELMET, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.ACCELGOR, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.STUNFISK, Type.GROUND, Type.ELECTRIC, [ - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.MIENFOO, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DOJO, BiomePoolTier.UNCOMMON ] + ] ], [ Species.MIENSHAO, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.UNCOMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.UNCOMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.DRUDDIGON, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GOLETT, Type.GROUND, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.GOLURK, Type.GROUND, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.BOSS ] - ] + [ Biome.TEMPLE, BiomePoolTier.COMMON ], + [ Biome.TEMPLE, BiomePoolTier.BOSS ] + ] ], [ Species.PAWNIARD, Type.DARK, Type.STEEL, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.BISHARP, Type.DARK, Type.STEEL, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.BOUFFALANT, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.RUFFLET, Type.NORMAL, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BRAVIARY, Type.NORMAL, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VULLABY, Type.DARK, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.MANDIBUZZ, Type.DARK, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.HEATMOR, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.DURANT, Type.BUG, Type.STEEL, [ - [ Biome.FOREST, BiomePoolTier.SUPER_RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.SUPER_RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DEINO, Type.DARK, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ABYSS, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ABYSS, BiomePoolTier.RARE ] + ] ], [ Species.ZWEILOUS, Type.DARK, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ABYSS, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ABYSS, BiomePoolTier.RARE ] + ] ], [ Species.HYDREIGON, Type.DARK, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ABYSS, BiomePoolTier.RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ABYSS, BiomePoolTier.RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.LARVESTA, Type.BUG, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.VOLCARONA, Type.BUG, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.COBALION, Type.STEEL, Type.FIGHTING, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TERRAKION, Type.ROCK, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.VIRIZION, Type.GRASS, Type.FIGHTING, [ - [ Biome.GRASS, BiomePoolTier.ULTRA_RARE ], - [ Biome.GRASS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.GRASS, BiomePoolTier.ULTRA_RARE ], + [ Biome.GRASS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TORNADUS, Type.FLYING, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.THUNDURUS, Type.ELECTRIC, Type.FLYING, [ - [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.RESHIRAM, Type.DRAGON, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.ZEKROM, Type.DRAGON, Type.ELECTRIC, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.LANDORUS, Type.GROUND, Type.FLYING, [ - [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], - [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], + [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.KYUREM, Type.DRAGON, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.KELDEO, Type.WATER, Type.FIGHTING, [ - [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], - [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], + [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MELOETTA, Type.NORMAL, Type.PSYCHIC, [ - [ Biome.MEADOW, BiomePoolTier.ULTRA_RARE ], - [ Biome.MEADOW, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.ULTRA_RARE ], + [ Biome.MEADOW, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.GENESECT, Type.BUG, Type.STEEL, [ - [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], - [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], + [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CHESPIN, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.QUILLADIN, Type.GRASS, -1, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.CHESNAUGHT, Type.GRASS, Type.FIGHTING, [ - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FENNEKIN, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.BRAIXEN, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.DELPHOX, Type.FIRE, Type.PSYCHIC, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FROAKIE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.FROGADIER, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.GRENINJA, Type.WATER, Type.DARK, [ - [ Biome.LAKE, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.BUNNELBY, Type.NORMAL, -1, [ - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.DIGGERSBY, Type.NORMAL, Type.GROUND, [ - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.FLETCHLING, Type.NORMAL, Type.FLYING, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FLETCHINDER, Type.FIRE, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TALONFLAME, Type.FIRE, Type.FLYING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SCATTERBUG, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SPEWPA, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VIVILLON, Type.BUG, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.LITLEO, Type.FIRE, Type.NORMAL, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PYROAR, Type.FIRE, Type.NORMAL, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.FLABEBE, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ Species.FLOETTE, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ Species.FLORGES, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ Species.SKIDDO, Type.GRASS, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ] + ] ], [ Species.GOGOAT, Type.GRASS, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ Species.PANCHAM, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PANGORO, Type.FIGHTING, Type.DARK, [ - [ Biome.DOJO, BiomePoolTier.RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.DOJO, BiomePoolTier.RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS_RARE ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.FURFROU, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ Species.ESPURR, Type.PSYCHIC, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.MEOWSTIC, Type.PSYCHIC, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.HONEDGE, Type.STEEL, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.DOUBLADE, Type.STEEL, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.COMMON ] - ] + [ Biome.TEMPLE, BiomePoolTier.COMMON ] + ] ], [ Species.AEGISLASH, Type.STEEL, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.BOSS ] - ] + [ Biome.TEMPLE, BiomePoolTier.BOSS ] + ] ], [ Species.SPRITZEE, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.AROMATISSE, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.SWIRLIX, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.SLURPUFF, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.INKAY, Type.DARK, Type.PSYCHIC, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.MALAMAR, Type.DARK, Type.PSYCHIC, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.BINACLE, Type.ROCK, Type.WATER, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.BARBARACLE, Type.ROCK, Type.WATER, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.SKRELP, Type.POISON, Type.WATER, [ - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.DRAGALGE, Type.POISON, Type.DRAGON, [ - [ Biome.SEABED, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.CLAUNCHER, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.UNCOMMON ] - ] + [ Biome.BEACH, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CLAWITZER, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.HELIOPTILE, Type.ELECTRIC, Type.NORMAL, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HELIOLISK, Type.ELECTRIC, Type.NORMAL, [ - [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TYRUNT, Type.ROCK, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.TYRANTRUM, Type.ROCK, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.AMAURA, Type.ROCK, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.AURORUS, Type.ROCK, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.SUPER_RARE ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SYLVEON, Type.FAIRY, -1, [ - [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ], - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.SUPER_RARE ], + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HAWLUCHA, Type.FIGHTING, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DEDENNE, Type.ELECTRIC, Type.FAIRY, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.CARBINK, Type.ROCK, Type.FAIRY, [ - [ Biome.CAVE, BiomePoolTier.RARE ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.RARE ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.GOOMY, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SLIGGOO, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GOODRA, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.KLEFKI, Type.STEEL, Type.FAIRY, [ - [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], - [ Biome.FACTORY, BiomePoolTier.BOSS ] - ] + [ Biome.FACTORY, BiomePoolTier.UNCOMMON ], + [ Biome.FACTORY, BiomePoolTier.BOSS ] + ] ], [ Species.PHANTUMP, Type.GHOST, Type.GRASS, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] + ] ], [ Species.TREVENANT, Type.GHOST, Type.GRASS, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.PUMPKABOO, Type.GHOST, Type.GRASS, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] + ] ], [ Species.GOURGEIST, Type.GHOST, Type.GRASS, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.BERGMITE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.AVALUGG, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.NOIBAT, Type.FLYING, Type.DRAGON, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.NOIVERN, Type.FLYING, Type.DRAGON, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.XERNEAS, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.YVELTAL, Type.DARK, Type.FLYING, [ - [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.ZYGARDE, Type.DRAGON, Type.GROUND, [ - [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.DIANCIE, Type.ROCK, Type.FAIRY, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.HOOPA, Type.PSYCHIC, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.VOLCANION, Type.FIRE, Type.WATER, [ - [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ROWLET, Type.GRASS, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.DARTRIX, Type.GRASS, Type.FLYING, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.DECIDUEYE, Type.GRASS, Type.GHOST, [ - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.LITTEN, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.TORRACAT, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.INCINEROAR, Type.FIRE, Type.DARK, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.POPPLIO, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ] + ] ], [ Species.BRIONNE, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ] + ] ], [ Species.PRIMARINA, Type.WATER, Type.FAIRY, [ - [ Biome.SEA, BiomePoolTier.RARE ], - [ Biome.SEA, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEA, BiomePoolTier.RARE ], + [ Biome.SEA, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PIKIPEK, Type.NORMAL, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ Species.TRUMBEAK, Type.NORMAL, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ Species.TOUCANNON, Type.NORMAL, Type.FLYING, [ - [ Biome.JUNGLE, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.YUNGOOS, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GUMSHOOS, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GRUBBIN, Type.BUG, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.CHARJABUG, Type.BUG, Type.ELECTRIC, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.VIKAVOLT, Type.BUG, Type.ELECTRIC, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.CRABRAWLER, Type.FIGHTING, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.CRABOMINABLE, Type.FIGHTING, Type.ICE, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ORICORIO, Type.FIRE, Type.FLYING, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ Species.CUTIEFLY, Type.BUG, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.RIBOMBEE, Type.BUG, Type.FAIRY, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.BOSS ], - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.BOSS ], + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ROCKRUFF, Type.ROCK, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ] + ] ], [ Species.LYCANROC, Type.ROCK, -1, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ], - [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], - [ Biome.CAVE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, TimeOfDay.DAY ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, TimeOfDay.DAY ], + [ Biome.FOREST, BiomePoolTier.UNCOMMON, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON, TimeOfDay.DUSK ], + [ Biome.CAVE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] + ] ], [ Species.WISHIWASHI, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.MAREANIE, Type.POISON, Type.WATER, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ] + ] ], [ Species.TOXAPEX, Type.POISON, Type.WATER, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ], - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ], + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ Species.MUDBRAY, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ] + ] ], [ Species.MUDSDALE, Type.GROUND, -1, [ - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.DEWPIDER, Type.WATER, Type.BUG, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ARAQUANID, Type.WATER, Type.BUG, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.LAKE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FOMANTIS, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.LURANTIS, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.MORELULL, Type.GRASS, Type.FAIRY, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.SHIINOTIC, Type.GRASS, Type.FAIRY, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.SALANDIT, Type.POISON, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.SALAZZLE, Type.POISON, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.COMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.STUFFUL, Type.NORMAL, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.BEWEAR, Type.NORMAL, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.BOUNSWEET, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.STEENEE, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TSAREENA, Type.GRASS, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.COMFEY, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.ORANGURU, Type.NORMAL, Type.PSYCHIC, [ - [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PASSIMIAN, Type.FIGHTING, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.WIMPOD, Type.BUG, Type.WATER, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GOLISOPOD, Type.BUG, Type.WATER, [ - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.SANDYGAST, Type.GHOST, Type.GROUND, [ - [ Biome.BEACH, BiomePoolTier.UNCOMMON ] - ] + [ Biome.BEACH, BiomePoolTier.UNCOMMON ] + ] ], [ Species.PALOSSAND, Type.GHOST, Type.GROUND, [ - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ Species.PYUKUMUKU, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TYPE_NULL, Type.NORMAL, -1, [ - [ Biome.LABORATORY, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.SILVALLY, Type.NORMAL, -1, [ - [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MINIOR, Type.ROCK, Type.FLYING, [ - [ Biome.SPACE, BiomePoolTier.COMMON ], - [ Biome.SPACE, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.COMMON ], + [ Biome.SPACE, BiomePoolTier.BOSS ] + ] ], [ Species.KOMALA, Type.NORMAL, -1, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.JUNGLE, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TURTONATOR, Type.FIRE, Type.DRAGON, [ - [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.UNCOMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.TOGEDEMARU, Type.ELECTRIC, Type.STEEL, [ - [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.UNCOMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.MIMIKYU, Type.GHOST, Type.FAIRY, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.BRUXISH, Type.WATER, Type.PSYCHIC, [ - [ Biome.ISLAND, BiomePoolTier.UNCOMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.ISLAND, BiomePoolTier.UNCOMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ Species.DRAMPA, Type.NORMAL, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ Species.DHELMISE, Type.GHOST, Type.GRASS, [ - [ Biome.SEABED, BiomePoolTier.RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.JANGMO_O, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HAKAMO_O, Type.DRAGON, Type.FIGHTING, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.KOMMO_O, Type.DRAGON, Type.FIGHTING, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TAPU_KOKO, Type.ELECTRIC, Type.FAIRY, [ - [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.TEMPLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.TEMPLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TAPU_LELE, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TAPU_BULU, Type.GRASS, Type.FAIRY, [ - [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TAPU_FINI, Type.WATER, Type.FAIRY, [ - [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], - [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.BEACH, BiomePoolTier.ULTRA_RARE ], + [ Biome.BEACH, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.COSMOG, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.COSMOEM, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.SOLGALEO, Type.PSYCHIC, Type.STEEL, [ - [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.DAY ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.DAY ] + ] ], [ Species.LUNALA, Type.PSYCHIC, Type.GHOST, [ - [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.NIGHT ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE, TimeOfDay.NIGHT ] + ] ], [ Species.NIHILEGO, Type.ROCK, Type.POISON, [ - [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.ULTRA_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.BUZZWOLE, Type.BUG, Type.FIGHTING, [ - [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.PHEROMOSA, Type.BUG, Type.FIGHTING, [ - [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], - [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.DESERT, BiomePoolTier.ULTRA_RARE ], + [ Biome.DESERT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.XURKITREE, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CELESTEELA, Type.STEEL, Type.FLYING, [ - [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ], - [ Biome.SPACE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SPACE, BiomePoolTier.ULTRA_RARE ], + [ Biome.SPACE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.KARTANA, Type.GRASS, Type.STEEL, [ - [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.GUZZLORD, Type.DARK, Type.DRAGON, [ - [ Biome.SLUM, BiomePoolTier.ULTRA_RARE ], - [ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SLUM, BiomePoolTier.ULTRA_RARE ], + [ Biome.SLUM, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.NECROZMA, Type.PSYCHIC, -1, [ - [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.MAGEARNA, Type.STEEL, Type.FAIRY, [ - [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], - [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FACTORY, BiomePoolTier.ULTRA_RARE ], + [ Biome.FACTORY, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MARSHADOW, Type.FIGHTING, Type.GHOST, [ - [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.POIPOLE, Type.POISON, -1, [ - [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.NAGANADEL, Type.POISON, Type.DRAGON, [ - [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.STAKATAKA, Type.ROCK, Type.STEEL, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.ULTRA_RARE ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.BLACEPHALON, Type.FIRE, Type.GHOST, [ - [ Biome.ISLAND, BiomePoolTier.ULTRA_RARE ], - [ Biome.ISLAND, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.ISLAND, BiomePoolTier.ULTRA_RARE ], + [ Biome.ISLAND, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ZERAORA, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MELTAN, Type.STEEL, -1, [ ] ], [ Species.MELMETAL, Type.STEEL, -1, [ ] ], [ Species.GROOKEY, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.THWACKEY, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ] + ] ], [ Species.RILLABOOM, Type.GRASS, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SCORBUNNY, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.RABOOT, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.CINDERACE, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SOBBLE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.DRIZZILE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ] + ] ], [ Species.INTELEON, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.LAKE, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SKWOVET, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GREEDENT, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ROOKIDEE, Type.FLYING, -1, [ - [ Biome.TOWN, BiomePoolTier.RARE ], - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.RARE ], + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CORVISQUIRE, Type.FLYING, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CORVIKNIGHT, Type.FLYING, Type.STEEL, [ - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BLIPBUG, Type.BUG, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.DOTTLER, Type.BUG, Type.PSYCHIC, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ORBEETLE, Type.BUG, Type.PSYCHIC, [ - [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.FOREST, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.NICKIT, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.THIEVUL, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.GOSSIFLEUR, Type.GRASS, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ Species.ELDEGOSS, Type.GRASS, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ Species.WOOLOO, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ Species.DUBWOOL, Type.NORMAL, -1, [ - [ Biome.MEADOW, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ Species.CHEWTLE, Type.WATER, -1, [ - [ Biome.LAKE, BiomePoolTier.COMMON ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON ] + ] ], [ Species.DREDNAW, Type.WATER, Type.ROCK, [ - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ Species.YAMPER, Type.ELECTRIC, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.BOLTUND, Type.ELECTRIC, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ROLYCOLY, Type.ROCK, -1, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.CARKOL, Type.ROCK, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ] - ] + [ Biome.VOLCANO, BiomePoolTier.COMMON ] + ] ], [ Species.COALOSSAL, Type.ROCK, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.COMMON ], - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.COMMON ], + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ Species.APPLIN, Type.GRASS, Type.DRAGON, [ - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.FLAPPLE, Type.GRASS, Type.DRAGON, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.APPLETUN, Type.GRASS, Type.DRAGON, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SILICOBRA, Type.GROUND, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON ] + ] ], [ Species.SANDACONDA, Type.GROUND, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON ], + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ Species.CRAMORANT, Type.FLYING, Type.WATER, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ARROKUDA, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.BARRASKEWDA, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.COMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.TOXEL, Type.ELECTRIC, Type.POISON, [ ] ], [ Species.TOXTRICITY, Type.ELECTRIC, Type.POISON, [ - [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.SIZZLIPEDE, Type.FIRE, Type.BUG, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CENTISKORCH, Type.FIRE, Type.BUG, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.CLOBBOPUS, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.COMMON ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ] + ] ], [ Species.GRAPPLOCT, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.SINISTEA, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] + ] ], [ Species.POLTEAGEIST, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.HATENNA, Type.PSYCHIC, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.HATTREM, Type.PSYCHIC, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.HATTERENE, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.IMPIDIMP, Type.DARK, Type.FAIRY, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.MORGREM, Type.DARK, Type.FAIRY, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.GRIMMSNARL, Type.DARK, Type.FAIRY, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.OBSTAGOON, Type.DARK, Type.NORMAL, [ - [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SLUM, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.PERRSERKER, Type.STEEL, -1, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE, TimeOfDay.DUSK ] + ] ], [ Species.CURSOLA, Type.GHOST, -1, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SIRFETCHD, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.MR_RIME, Type.ICE, Type.PSYCHIC, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.RUNERIGUS, Type.GROUND, Type.GHOST, [ - [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.RUINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.RUINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.MILCERY, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.ALCREMIE, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.FALINKS, Type.FIGHTING, -1, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ Species.PINCURCHIN, Type.ELECTRIC, -1, [ - [ Biome.SEABED, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEABED, BiomePoolTier.UNCOMMON ] + ] ], [ Species.SNOM, Type.ICE, Type.BUG, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.FROSMOTH, Type.ICE, Type.BUG, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.STONJOURNER, Type.ROCK, -1, [ - [ Biome.RUINS, BiomePoolTier.RARE ] - ] + [ Biome.RUINS, BiomePoolTier.RARE ] + ] ], [ Species.EISCUE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.INDEEDEE, Type.PSYCHIC, Type.NORMAL, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.MORPEKO, Type.ELECTRIC, Type.DARK, [ - [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.CUFANT, Type.STEEL, -1, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.COPPERAJAH, Type.STEEL, -1, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ Species.DRACOZOLT, Type.ELECTRIC, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ARCTOZOLT, Type.ELECTRIC, Type.ICE, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DRACOVISH, Type.WATER, Type.DRAGON, [ - [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.SUPER_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ARCTOVISH, Type.WATER, Type.ICE, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ], + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DURALUDON, Type.STEEL, Type.DRAGON, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE ] + ] ], [ Species.DREEPY, Type.DRAGON, Type.GHOST, [ - [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.DRAKLOAK, Type.DRAGON, Type.GHOST, [ - [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.DRAGAPULT, Type.DRAGON, Type.GHOST, [ - [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.WASTELAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ZACIAN, Type.FAIRY, -1, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.ZAMAZENTA, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.ETERNATUS, Type.POISON, Type.DRAGON, [ - [ Biome.END, BiomePoolTier.BOSS ] - ] + [ Biome.END, BiomePoolTier.BOSS ] + ] ], [ Species.KUBFU, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ] + ] ], [ Species.URSHIFU, Type.FIGHTING, Type.DARK, [ - [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ZARUDE, Type.DARK, Type.GRASS, [ - [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.REGIELEKI, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.ULTRA_RARE ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.REGIDRAGO, Type.DRAGON, -1, [ - [ Biome.WASTELAND, BiomePoolTier.ULTRA_RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.ULTRA_RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.GLASTRIER, Type.ICE, -1, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.SPECTRIER, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.ULTRA_RARE ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CALYREX, Type.PSYCHIC, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.WYRDEER, Type.NORMAL, Type.PSYCHIC, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.KLEAVOR, Type.BUG, Type.ROCK, [ - [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.URSALUNA, Type.GROUND, Type.NORMAL, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] + ] ], [ Species.BASCULEGION, Type.WATER, Type.GHOST, [ - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.SNEASLER, Type.FIGHTING, Type.POISON, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.OVERQWIL, Type.DARK, Type.POISON, [ - [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ENAMORUS, Type.FAIRY, Type.FLYING, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.ULTRA_RARE ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.SPRIGATITO, Type.GRASS, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.FLORAGATO, Type.GRASS, -1, [ - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.MEOWSCARADA, Type.GRASS, Type.DARK, [ - [ Biome.MEADOW, BiomePoolTier.RARE ], - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ], + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.FUECOCO, Type.FIRE, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ] + ] ], [ Species.CROCALOR, Type.FIRE, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ] + ] ], [ Species.SKELEDIRGE, Type.FIRE, Type.GHOST, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.QUAXLY, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.RARE ] - ] + [ Biome.BEACH, BiomePoolTier.RARE ] + ] ], [ Species.QUAXWELL, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.RARE ] - ] + [ Biome.BEACH, BiomePoolTier.RARE ] + ] ], [ Species.QUAQUAVAL, Type.WATER, Type.FIGHTING, [ - [ Biome.BEACH, BiomePoolTier.RARE ], - [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.BEACH, BiomePoolTier.RARE ], + [ Biome.BEACH, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.LECHONK, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.COMMON ] + ] ], [ Species.OINKOLOGNE, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ Species.TAROUNTULA, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.SPIDOPS, Type.BUG, -1, [ - [ Biome.FOREST, BiomePoolTier.COMMON ], - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON ], + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ Species.NYMBLE, Type.BUG, -1, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], - [ Biome.FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], + [ Biome.FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.LOKIX, Type.BUG, Type.DARK, [ - [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], - [ Biome.FOREST, BiomePoolTier.COMMON ], - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.COMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ], + [ Biome.FOREST, BiomePoolTier.COMMON ], + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ Species.PAWMI, Type.ELECTRIC, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.PAWMO, Type.ELECTRIC, Type.FIGHTING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.PAWMOT, Type.ELECTRIC, Type.FIGHTING, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.TANDEMAUS, Type.NORMAL, -1, [ - [ Biome.TOWN, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.TOWN, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.MAUSHOLD, Type.NORMAL, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.METROPOLIS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FIDOUGH, Type.FAIRY, -1, [ - [ Biome.TOWN, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.TOWN, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.DACHSBUN, Type.FAIRY, -1, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ Species.SMOLIV, Type.GRASS, Type.NORMAL, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.DOLLIV, Type.GRASS, Type.NORMAL, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ARBOLIVA, Type.GRASS, Type.NORMAL, [ - [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MEADOW, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SQUAWKABILLY, Type.NORMAL, Type.FLYING, [ - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.NACLI, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.NACLSTACK, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ] + ] ], [ Species.GARGANACL, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.CHARCADET, Type.FIRE, -1, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ] + ] ], [ Species.ARMAROUGE, Type.FIRE, Type.PSYCHIC, [ - [ Biome.VOLCANO, BiomePoolTier.RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CERULEDGE, Type.FIRE, Type.GHOST, [ - [ Biome.GRAVEYARD, BiomePoolTier.RARE ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.RARE ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.TADBULB, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ] + ] ], [ Species.BELLIBOLT, Type.ELECTRIC, -1, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ Species.WATTREL, Type.ELECTRIC, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ] + ] ], [ Species.KILOWATTREL, Type.ELECTRIC, Type.FLYING, [ - [ Biome.SEA, BiomePoolTier.UNCOMMON ], - [ Biome.SEA, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.UNCOMMON ], + [ Biome.SEA, BiomePoolTier.BOSS ] + ] ], [ Species.MASCHIFF, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ] + ] ], [ Species.MABOSSTIFF, Type.DARK, -1, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.SHROODLE, Type.POISON, Type.NORMAL, [ - [ Biome.FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON ] + ] ], [ Species.GRAFAIAI, Type.POISON, Type.NORMAL, [ - [ Biome.FOREST, BiomePoolTier.COMMON ], - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.COMMON ], + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ Species.BRAMBLIN, Type.GRASS, Type.GHOST, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.BRAMBLEGHAST, Type.GRASS, Type.GHOST, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON ], - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON ], + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ Species.TOEDSCOOL, Type.GROUND, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ] + ] ], [ Species.TOEDSCRUEL, Type.GROUND, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.KLAWF, Type.ROCK, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.RARE ] + ] ], [ Species.CAPSAKID, Type.GRASS, -1, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.SCOVILLAIN, Type.GRASS, Type.FIRE, [ - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.BADLANDS, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.RELLOR, Type.BUG, -1, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.RABSCA, Type.BUG, Type.PSYCHIC, [ - [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.DESERT, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FLITTLE, Type.PSYCHIC, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ESPATHRA, Type.PSYCHIC, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.TINKATINK, Type.FAIRY, Type.STEEL, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.RUINS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.TINKATUFF, Type.FAIRY, Type.STEEL, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.RUINS, BiomePoolTier.UNCOMMON ] + ] ], [ Species.TINKATON, Type.FAIRY, Type.STEEL, [ - [ Biome.RUINS, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ Species.WIGLETT, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.WUGTRIO, Type.WATER, -1, [ - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ Species.BOMBIRDIER, Type.FLYING, Type.DARK, [ - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.FINIZEN, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PALAFIN, Type.WATER, -1, [ - [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SEA, BiomePoolTier.COMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SEA, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.VAROOM, Type.STEEL, Type.POISON, [ - [ Biome.METROPOLIS, BiomePoolTier.RARE ], - [ Biome.SLUM, BiomePoolTier.RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.RARE ], + [ Biome.SLUM, BiomePoolTier.RARE ] + ] ], [ Species.REVAVROOM, Type.STEEL, Type.POISON, [ - [ Biome.METROPOLIS, BiomePoolTier.RARE ], - [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ], - [ Biome.SLUM, BiomePoolTier.RARE ], - [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.RARE ], + [ Biome.METROPOLIS, BiomePoolTier.BOSS_RARE ], + [ Biome.SLUM, BiomePoolTier.RARE ], + [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.CYCLIZAR, Type.DRAGON, Type.NORMAL, [ - [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] - ] + [ Biome.WASTELAND, BiomePoolTier.UNCOMMON ] + ] ], [ Species.ORTHWORM, Type.STEEL, -1, [ - [ Biome.DESERT, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DESERT, BiomePoolTier.UNCOMMON ] + ] ], [ Species.GLIMMET, Type.ROCK, Type.POISON, [ - [ Biome.CAVE, BiomePoolTier.RARE ] - ] + [ Biome.CAVE, BiomePoolTier.RARE ] + ] ], [ Species.GLIMMORA, Type.ROCK, Type.POISON, [ - [ Biome.CAVE, BiomePoolTier.RARE ], - [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.CAVE, BiomePoolTier.RARE ], + [ Biome.CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GREAVARD, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ] + ] ], [ Species.HOUNDSTONE, Type.GHOST, -1, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ Species.FLAMIGO, Type.FLYING, Type.FIGHTING, [ - [ Biome.LAKE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.LAKE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CETODDLE, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ Species.CETITAN, Type.ICE, -1, [ - [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ Species.VELUZA, Type.WATER, Type.PSYCHIC, [ - [ Biome.SEABED, BiomePoolTier.COMMON ] - ] + [ Biome.SEABED, BiomePoolTier.COMMON ] + ] ], [ Species.DONDOZO, Type.WATER, -1, [ - [ Biome.SEABED, BiomePoolTier.UNCOMMON ], - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.UNCOMMON ], + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ Species.TATSUGIRI, Type.DRAGON, Type.WATER, [ - [ Biome.BEACH, BiomePoolTier.RARE ] - ] + [ Biome.BEACH, BiomePoolTier.RARE ] + ] ], [ Species.ANNIHILAPE, Type.FIGHTING, Type.GHOST, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ Species.CLODSIRE, Type.POISON, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SWAMP, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.FARIGIRAF, Type.NORMAL, Type.PSYCHIC, [ - [ Biome.TALL_GRASS, BiomePoolTier.RARE ], - [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.RARE ], + [ Biome.TALL_GRASS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.DUDUNSPARCE, Type.NORMAL, -1, [ - [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.PLAINS, BiomePoolTier.SUPER_RARE ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.KINGAMBIT, Type.DARK, Type.STEEL, [ - [ Biome.ABYSS, BiomePoolTier.COMMON ], - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.COMMON ], + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ Species.GREAT_TUSK, Type.GROUND, Type.FIGHTING, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.SCREAM_TAIL, Type.FAIRY, Type.PSYCHIC, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.BRUTE_BONNET, Type.GRASS, Type.DARK, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.FLUTTER_MANE, Type.GHOST, Type.FAIRY, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.SLITHER_WING, Type.BUG, Type.FIGHTING, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.SANDY_SHOCKS, Type.ELECTRIC, Type.GROUND, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_TREADS, Type.GROUND, Type.STEEL, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_BUNDLE, Type.ICE, Type.WATER, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_HANDS, Type.FIGHTING, Type.ELECTRIC, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_JUGULIS, Type.DARK, Type.FLYING, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_MOTH, Type.FIRE, Type.POISON, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.IRON_THORNS, Type.ROCK, Type.ELECTRIC, [ - [ Biome.END, BiomePoolTier.COMMON ] - ] + [ Biome.END, BiomePoolTier.COMMON ] + ] ], [ Species.FRIGIBAX, Type.DRAGON, Type.ICE, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ] + ] ], [ Species.ARCTIBAX, Type.DRAGON, Type.ICE, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ] + ] ], [ Species.BAXCALIBUR, Type.DRAGON, Type.ICE, [ - [ Biome.WASTELAND, BiomePoolTier.RARE ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.RARE ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ Species.GIMMIGHOUL, Type.GHOST, -1, [ - [ Biome.TEMPLE, BiomePoolTier.RARE ] - ] + [ Biome.TEMPLE, BiomePoolTier.RARE ] + ] ], [ Species.GHOLDENGO, Type.STEEL, Type.GHOST, [ - [ Biome.TEMPLE, BiomePoolTier.RARE ], - [ Biome.TEMPLE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.TEMPLE, BiomePoolTier.RARE ], + [ Biome.TEMPLE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.WO_CHIEN, Type.DARK, Type.GRASS, [ - [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], - [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.FOREST, BiomePoolTier.ULTRA_RARE ], + [ Biome.FOREST, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CHIEN_PAO, Type.DARK, Type.ICE, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.TING_LU, Type.DARK, Type.GROUND, [ - [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.CHI_YU, Type.DARK, Type.FIRE, [ - [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], - [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.ULTRA_RARE ], + [ Biome.VOLCANO, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ROARING_MOON, Type.DRAGON, Type.DARK, [ - [ Biome.END, BiomePoolTier.UNCOMMON ] - ] + [ Biome.END, BiomePoolTier.UNCOMMON ] + ] ], [ Species.IRON_VALIANT, Type.FAIRY, Type.FIGHTING, [ - [ Biome.END, BiomePoolTier.UNCOMMON ] - ] + [ Biome.END, BiomePoolTier.UNCOMMON ] + ] ], [ Species.KORAIDON, Type.FIGHTING, Type.DRAGON, [ - [ Biome.RUINS, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.MIRAIDON, Type.ELECTRIC, Type.DRAGON, [ - [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.LABORATORY, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.WALKING_WAKE, Type.WATER, Type.DRAGON, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.IRON_LEAVES, Type.GRASS, Type.PSYCHIC, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.DIPPLIN, Type.GRASS, Type.DRAGON, [ - [ Biome.MEADOW, BiomePoolTier.RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.RARE ] + ] ], [ Species.POLTCHAGEIST, Type.GRASS, Type.GHOST, [ - [ Biome.BADLANDS, BiomePoolTier.RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.RARE ] + ] ], [ Species.SINISTCHA, Type.GRASS, Type.GHOST, [ - [ Biome.BADLANDS, BiomePoolTier.RARE ], - [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.RARE ], + [ Biome.BADLANDS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.OKIDOGI, Type.POISON, Type.FIGHTING, [ - [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], - [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.BADLANDS, BiomePoolTier.ULTRA_RARE ], + [ Biome.BADLANDS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.MUNKIDORI, Type.POISON, Type.PSYCHIC, [ - [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.JUNGLE, BiomePoolTier.ULTRA_RARE ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.FEZANDIPITI, Type.POISON, Type.FAIRY, [ - [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], - [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.RUINS, BiomePoolTier.ULTRA_RARE ], + [ Biome.RUINS, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.OGERPON, Type.GRASS, -1, [ - [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.ULTRA_RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_SUPER_RARE ] + ] ], [ Species.ARCHALUDON, Type.STEEL, Type.DRAGON, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HYDRAPPLE, Type.GRASS, Type.DRAGON, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GOUGING_FIRE, Type.FIRE, Type.DRAGON, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.RAGING_BOLT, Type.ELECTRIC, Type.DRAGON, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.IRON_BOULDER, Type.ROCK, Type.PSYCHIC, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.IRON_CROWN, Type.STEEL, Type.PSYCHIC, [ - [ Biome.END, BiomePoolTier.RARE ] - ] + [ Biome.END, BiomePoolTier.RARE ] + ] ], [ Species.TERAPAGOS, Type.NORMAL, -1, [ - [ Biome.CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.PECHARUNT, Type.POISON, Type.GHOST, [ ] ], [ Species.ALOLA_RATTATA, Type.DARK, Type.NORMAL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ALOLA_RATICATE, Type.DARK, Type.NORMAL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ALOLA_RAICHU, Type.ELECTRIC, Type.PSYCHIC, [ - [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ALOLA_SANDSHREW, Type.ICE, Type.STEEL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] + ] ], [ Species.ALOLA_SANDSLASH, Type.ICE, Type.STEEL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ], - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ], + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ALOLA_VULPIX, Type.ICE, -1, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ] + ] ], [ Species.ALOLA_NINETALES, Type.ICE, Type.FAIRY, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ], - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ], + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.ALOLA_DIGLETT, Type.GROUND, Type.STEEL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] ], [ Species.ALOLA_DUGTRIO, Type.GROUND, Type.STEEL, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ Species.ALOLA_MEOWTH, Type.DARK, -1, [ - [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ALOLA_PERSIAN, Type.DARK, -1, [ - [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ALOLA_GEODUDE, Type.ROCK, Type.ELECTRIC, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] ], [ Species.ALOLA_GRAVELER, Type.ROCK, Type.ELECTRIC, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] ], [ Species.ALOLA_GOLEM, Type.ROCK, Type.ELECTRIC, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ Species.ALOLA_GRIMER, Type.POISON, Type.DARK, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ] + ] ], [ Species.ALOLA_MUK, Type.POISON, Type.DARK, [ - [ Biome.ISLAND, BiomePoolTier.COMMON ], - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.ISLAND, BiomePoolTier.COMMON ], + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ Species.ALOLA_EXEGGUTOR, Type.GRASS, Type.DRAGON, [ - [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.ALOLA_MAROWAK, Type.FIRE, Type.GHOST, [ - [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.ISLAND, BiomePoolTier.UNCOMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.ISLAND, BiomePoolTier.BOSS, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.ETERNAL_FLOETTE, Type.FAIRY, -1, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.RARE ], + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GALAR_MEOWTH, Type.STEEL, -1, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.RARE, TimeOfDay.DUSK ] + ] ], [ Species.GALAR_PONYTA, Type.PSYCHIC, -1, [ - [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ] + ] ], [ Species.GALAR_RAPIDASH, Type.PSYCHIC, Type.FAIRY, [ - [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ], - [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, TimeOfDay.DAWN ] - ] + [ Biome.JUNGLE, BiomePoolTier.RARE, TimeOfDay.DAWN ], + [ Biome.JUNGLE, BiomePoolTier.BOSS_RARE, TimeOfDay.DAWN ] + ] ], [ Species.GALAR_SLOWPOKE, Type.PSYCHIC, -1, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GALAR_SLOWBRO, Type.POISON, Type.PSYCHIC, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GALAR_FARFETCHD, Type.FIGHTING, -1, [ - [ Biome.DOJO, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.GALAR_WEEZING, Type.POISON, Type.FAIRY, [ - [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SLUM, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.GALAR_MR_MIME, Type.ICE, Type.PSYCHIC, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.GALAR_ARTICUNO, Type.PSYCHIC, Type.FLYING, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.ULTRA_RARE ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.GALAR_ZAPDOS, Type.FIGHTING, Type.FLYING, [ - [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], - [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.ULTRA_RARE ], + [ Biome.DOJO, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.GALAR_MOLTRES, Type.DARK, Type.FLYING, [ - [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], - [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.ULTRA_RARE ], + [ Biome.ABYSS, BiomePoolTier.BOSS_ULTRA_RARE ] + ] ], [ Species.GALAR_SLOWKING, Type.POISON, Type.PSYCHIC, [ - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GALAR_CORSOLA, Type.GHOST, -1, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.GALAR_ZIGZAGOON, Type.DARK, Type.NORMAL, [ - [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.GALAR_LINOONE, Type.DARK, Type.NORMAL, [ - [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.GALAR_DARUMAKA, Type.ICE, -1, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GALAR_DARMANITAN, Type.ICE, -1, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.GALAR_YAMASK, Type.GROUND, Type.GHOST, [ - [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.RUINS, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.GALAR_STUNFISK, Type.GROUND, Type.STEEL, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HISUI_GROWLITHE, Type.FIRE, Type.ROCK, [ - [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.HISUI_ARCANINE, Type.FIRE, Type.ROCK, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HISUI_VOLTORB, Type.ELECTRIC, Type.GRASS, [ - [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.HISUI_ELECTRODE, Type.ELECTRIC, Type.GRASS, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HISUI_TYPHLOSION, Type.FIRE, Type.GHOST, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HISUI_QWILFISH, Type.DARK, Type.POISON, [ - [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SEABED, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.HISUI_SNEASEL, Type.FIGHTING, Type.POISON, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HISUI_SAMUROTT, Type.WATER, Type.DARK, [ - [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.ABYSS, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.HISUI_LILLIGANT, Type.GRASS, Type.FIGHTING, [ - [ Biome.MEADOW, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HISUI_ZORUA, Type.NORMAL, Type.GHOST, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.HISUI_ZOROARK, Type.NORMAL, Type.GHOST, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ], + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.HISUI_BRAVIARY, Type.PSYCHIC, Type.FLYING, [ - [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HISUI_SLIGGOO, Type.STEEL, Type.DRAGON, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HISUI_GOODRA, Type.STEEL, Type.DRAGON, [ - [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.SWAMP, BiomePoolTier.SUPER_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.SWAMP, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.HISUI_AVALUGG, Type.ICE, Type.ROCK, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.SUPER_RARE ] + ] ], [ Species.HISUI_DECIDUEYE, Type.GRASS, Type.FIGHTING, [ - [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS_RARE ] + ] ], [ Species.PALDEA_TAUROS, Type.FIGHTING, -1, [ - [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], - [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] - ] + [ Biome.PLAINS, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], + [ Biome.PLAINS, BiomePoolTier.BOSS_RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ] + ] ], [ Species.PALDEA_WOOPER, Type.POISON, Type.GROUND, [ - [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] - ] + [ Biome.SWAMP, BiomePoolTier.COMMON, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ] + ] ], [ Species.BLOODMOON_URSALUNA, Type.GROUND, Type.NORMAL, [ - [ Biome.FOREST, BiomePoolTier.SUPER_RARE, TimeOfDay.NIGHT ], - [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ] - ] + [ Biome.FOREST, BiomePoolTier.SUPER_RARE, TimeOfDay.NIGHT ], + [ Biome.FOREST, BiomePoolTier.BOSS_RARE, TimeOfDay.NIGHT ] + ] ] ]; const trainerBiomes = [ [ TrainerType.ACE_TRAINER, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.GRASS, BiomePoolTier.UNCOMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], - [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.UNCOMMON ], - [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], - [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.UNCOMMON ], - [ Biome.ABYSS, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.UNCOMMON ], + [ Biome.MOUNTAIN, BiomePoolTier.UNCOMMON ], + [ Biome.BADLANDS, BiomePoolTier.UNCOMMON ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.UNCOMMON ], + [ Biome.ABYSS, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ] + ] ], [ TrainerType.ARTIST, [ - [ Biome.METROPOLIS, BiomePoolTier.RARE ] - ] + [ Biome.METROPOLIS, BiomePoolTier.RARE ] + ] ], [ TrainerType.BACKERS, [] ], [ TrainerType.BACKPACKER, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ TrainerType.BAKER, [ - [ Biome.SLUM, BiomePoolTier.UNCOMMON ] - ] + [ Biome.SLUM, BiomePoolTier.UNCOMMON ] + ] ], [ TrainerType.BEAUTY, [ [ Biome.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], [ TrainerType.BIKER, [ - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ TrainerType.BLACK_BELT, [ - [ Biome.DOJO, BiomePoolTier.COMMON ], - [ Biome.PLAINS, BiomePoolTier.RARE ], - [ Biome.GRASS, BiomePoolTier.RARE ], - [ Biome.SWAMP, BiomePoolTier.RARE ], - [ Biome.BEACH, BiomePoolTier.RARE ], - [ Biome.LAKE, BiomePoolTier.RARE ], - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.UNCOMMON ], - [ Biome.RUINS, BiomePoolTier.UNCOMMON ] - ] + [ Biome.DOJO, BiomePoolTier.COMMON ], + [ Biome.PLAINS, BiomePoolTier.RARE ], + [ Biome.GRASS, BiomePoolTier.RARE ], + [ Biome.SWAMP, BiomePoolTier.RARE ], + [ Biome.BEACH, BiomePoolTier.RARE ], + [ Biome.LAKE, BiomePoolTier.RARE ], + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.UNCOMMON ], + [ Biome.RUINS, BiomePoolTier.UNCOMMON ] + ] ], [ TrainerType.BREEDER, [ - [ Biome.PLAINS, BiomePoolTier.COMMON ], - [ Biome.GRASS, BiomePoolTier.COMMON ], - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], - [ Biome.BEACH, BiomePoolTier.UNCOMMON ], - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], - [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON ], + [ Biome.GRASS, BiomePoolTier.COMMON ], + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.UNCOMMON ], + [ Biome.BEACH, BiomePoolTier.UNCOMMON ], + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.UNCOMMON ], + [ Biome.FAIRY_CAVE, BiomePoolTier.UNCOMMON ] + ] ], [ TrainerType.CLERK, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] ] ], [ TrainerType.CYCLIST, [ - [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.UNCOMMON ], + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.DANCER, [] ], [ TrainerType.DEPOT_AGENT, [ @@ -7204,9 +7205,9 @@ export const biomeTrainerPools: BiomeTrainerPools = { ] ], [ TrainerType.DOCTOR, [] ], [ TrainerType.FISHERMAN, [ - [ Biome.LAKE, BiomePoolTier.COMMON ], - [ Biome.BEACH, BiomePoolTier.COMMON ] - ] + [ Biome.LAKE, BiomePoolTier.COMMON ], + [ Biome.BEACH, BiomePoolTier.COMMON ] + ] ], [ TrainerType.RICH, [] ], [ TrainerType.GUITARIST, [ @@ -7215,10 +7216,10 @@ export const biomeTrainerPools: BiomeTrainerPools = { ] ], [ TrainerType.HARLEQUIN, [] ], [ TrainerType.HIKER, [ - [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], - [ Biome.CAVE, BiomePoolTier.COMMON ], - [ Biome.BADLANDS, BiomePoolTier.COMMON ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.COMMON ], + [ Biome.CAVE, BiomePoolTier.COMMON ], + [ Biome.BADLANDS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.HOOLIGANS, [] ], [ TrainerType.HOOPSTER, [] ], @@ -7229,376 +7230,376 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ TrainerType.MUSICIAN, [] ], [ TrainerType.NURSERY_AIDE, [] ], [ TrainerType.OFFICER, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ], + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ TrainerType.PARASOL_LADY, [ - [ Biome.BEACH, BiomePoolTier.COMMON ], - [ Biome.MEADOW, BiomePoolTier.COMMON ] - ] + [ Biome.BEACH, BiomePoolTier.COMMON ], + [ Biome.MEADOW, BiomePoolTier.COMMON ] + ] ], [ TrainerType.PILOT, [] ], [ TrainerType.POKEFAN, [] ], [ TrainerType.PRESCHOOLER, [] ], [ TrainerType.PSYCHIC, [ - [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.COMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.RANGER, [ - [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], - [ Biome.FOREST, BiomePoolTier.COMMON ], - [ Biome.JUNGLE, BiomePoolTier.COMMON ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.UNCOMMON ], + [ Biome.FOREST, BiomePoolTier.COMMON ], + [ Biome.JUNGLE, BiomePoolTier.COMMON ] + ] ], [ TrainerType.RICH_KID, [] ], [ TrainerType.ROUGHNECK, [ - [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + [ Biome.SLUM, BiomePoolTier.COMMON ] + ] ], [ TrainerType.SCIENTIST, [ - [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.RUINS, BiomePoolTier.COMMON ] - ] + [ Biome.DESERT, BiomePoolTier.COMMON ], + [ Biome.RUINS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.SMASHER, [] ], [ TrainerType.SNOW_WORKER, [ - [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], - [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], + [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] + ] ], [ TrainerType.STRIKER, [] ], [ TrainerType.SCHOOL_KID, [ - [ Biome.GRASS, BiomePoolTier.COMMON ] - ] + [ Biome.GRASS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.SWIMMER, [ - [ Biome.SEA, BiomePoolTier.COMMON ] - ] + [ Biome.SEA, BiomePoolTier.COMMON ] + ] ], [ TrainerType.TWINS, [ - [ Biome.PLAINS, BiomePoolTier.COMMON ] - ] + [ Biome.PLAINS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.VETERAN, [ - [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + [ Biome.WASTELAND, BiomePoolTier.COMMON ] + ] ], [ TrainerType.WAITER, [ - [ Biome.METROPOLIS, BiomePoolTier.COMMON ] - ] + [ Biome.METROPOLIS, BiomePoolTier.COMMON ] + ] ], [ TrainerType.WORKER, [ - [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], - [ Biome.FACTORY, BiomePoolTier.COMMON ], - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.COMMON ], + [ Biome.FACTORY, BiomePoolTier.COMMON ], + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.COMMON ] + ] ], [ TrainerType.YOUNGSTER, [ - [ Biome.TOWN, BiomePoolTier.COMMON ] - ] + [ Biome.TOWN, BiomePoolTier.COMMON ] + ] ], [ TrainerType.HEX_MANIAC, [ - [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.UNCOMMON ] + ] ], [ TrainerType.BROCK, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MISTY, [ - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ TrainerType.LT_SURGE, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ERIKA, [ - [ Biome.GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.GRASS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.JANINE, [ - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ TrainerType.SABRINA, [ - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.GIOVANNI, [ - [ Biome.LABORATORY, BiomePoolTier.BOSS ] - ] + [ Biome.LABORATORY, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BLAINE, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.FALKNER, [ - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BUGSY, [ - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ TrainerType.WHITNEY, [ - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MORTY, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CHUCK, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.JASMINE, [ - [ Biome.FACTORY, BiomePoolTier.BOSS ] - ] + [ Biome.FACTORY, BiomePoolTier.BOSS ] + ] ], [ TrainerType.PRYCE, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CLAIR, [ - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ROXANNE, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BRAWLY, [ - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.WATTSON, [ - [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] - ] + [ Biome.CONSTRUCTION_SITE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.FLANNERY, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.NORMAN, [ - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.WINONA, [ - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ TrainerType.TATE, [ - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.LIZA, [ - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.JUAN, [ - [ Biome.SEABED, BiomePoolTier.BOSS ] - ] + [ Biome.SEABED, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ROARK, [ - [ Biome.CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.GARDENIA, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CRASHER_WAKE, [ - [ Biome.LAKE, BiomePoolTier.BOSS ] - ] + [ Biome.LAKE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MAYLENE, [ - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.FANTINA, [ - [ Biome.TEMPLE, BiomePoolTier.BOSS ] - ] + [ Biome.TEMPLE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BYRON, [ - [ Biome.FACTORY, BiomePoolTier.BOSS ] - ] + [ Biome.FACTORY, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CANDICE, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] + ] ], [ TrainerType.VOLKNER, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CILAN, [ - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CHILI, [ - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CRESS, [ - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CHEREN, [ - [ Biome.PLAINS, BiomePoolTier.BOSS ] - ] + [ Biome.PLAINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.LENORA, [ - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ROXIE, [ - [ Biome.SWAMP, BiomePoolTier.BOSS ] - ] + [ Biome.SWAMP, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BURGH, [ - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ELESA, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CLAY, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.SKYLA, [ - [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] - ] + [ Biome.MOUNTAIN, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BRYCEN, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.DRAYDEN, [ - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MARLON, [ - [ Biome.SEA, BiomePoolTier.BOSS ] - ] + [ Biome.SEA, BiomePoolTier.BOSS ] + ] ], [ TrainerType.VIOLA, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.GRANT, [ - [ Biome.BADLANDS, BiomePoolTier.BOSS ] - ] + [ Biome.BADLANDS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.KORRINA, [ - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.RAMOS, [ - [ Biome.JUNGLE, BiomePoolTier.BOSS ] - ] + [ Biome.JUNGLE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.CLEMONT, [ - [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] - ] + [ Biome.POWER_PLANT, BiomePoolTier.BOSS ] + ] ], [ TrainerType.VALERIE, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.OLYMPIA, [ - [ Biome.SPACE, BiomePoolTier.BOSS ] - ] + [ Biome.SPACE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.WULFRIC, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MILO, [ - [ Biome.MEADOW, BiomePoolTier.BOSS ] - ] + [ Biome.MEADOW, BiomePoolTier.BOSS ] + ] ], [ TrainerType.NESSA, [ - [ Biome.ISLAND, BiomePoolTier.BOSS ] - ] + [ Biome.ISLAND, BiomePoolTier.BOSS ] + ] ], [ TrainerType.KABU, [ - [ Biome.VOLCANO, BiomePoolTier.BOSS ] - ] + [ Biome.VOLCANO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BEA, [ - [ Biome.DOJO, BiomePoolTier.BOSS ] - ] + [ Biome.DOJO, BiomePoolTier.BOSS ] + ] ], [ TrainerType.ALLISTER, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ TrainerType.OPAL, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BEDE, [ - [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.FAIRY_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.GORDIE, [ - [ Biome.DESERT, BiomePoolTier.BOSS ] - ] + [ Biome.DESERT, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MELONY, [ - [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.SNOWY_FOREST, BiomePoolTier.BOSS ] + ] ], [ TrainerType.PIERS, [ - [ Biome.SLUM, BiomePoolTier.BOSS ] - ] + [ Biome.SLUM, BiomePoolTier.BOSS ] + ] ], [ TrainerType.MARNIE, [ - [ Biome.ABYSS, BiomePoolTier.BOSS ] - ] + [ Biome.ABYSS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.RAIHAN, [ - [ Biome.WASTELAND, BiomePoolTier.BOSS ] - ] + [ Biome.WASTELAND, BiomePoolTier.BOSS ] + ] ], [ TrainerType.KATY, [ - [ Biome.FOREST, BiomePoolTier.BOSS ] - ] + [ Biome.FOREST, BiomePoolTier.BOSS ] + ] ], [ TrainerType.BRASSIUS, [ - [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] - ] + [ Biome.TALL_GRASS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.IONO, [ - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.KOFU, [ - [ Biome.BEACH, BiomePoolTier.BOSS ] - ] + [ Biome.BEACH, BiomePoolTier.BOSS ] + ] ], [ TrainerType.LARRY, [ - [ Biome.METROPOLIS, BiomePoolTier.BOSS ] - ] + [ Biome.METROPOLIS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.RYME, [ - [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] - ] + [ Biome.GRAVEYARD, BiomePoolTier.BOSS ] + ] ], [ TrainerType.TULIP, [ - [ Biome.RUINS, BiomePoolTier.BOSS ] - ] + [ Biome.RUINS, BiomePoolTier.BOSS ] + ] ], [ TrainerType.GRUSHA, [ - [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] - ] + [ Biome.ICE_CAVE, BiomePoolTier.BOSS ] + ] ], [ TrainerType.LORELEI, [] ], [ TrainerType.BRUNO, [] ], @@ -7659,7 +7660,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { const linkedBiomes: (Biome | [ Biome, integer ])[] = Array.isArray(biomeLinks[biome]) ? biomeLinks[biome] as (Biome | [ Biome, integer ])[] : [ biomeLinks[biome] as Biome ]; - for (let linkedBiomeEntry of linkedBiomes) { + for (const linkedBiomeEntry of linkedBiomes) { const linkedBiome = !Array.isArray(linkedBiomeEntry) ? linkedBiomeEntry as Biome : linkedBiomeEntry[0]; @@ -7676,22 +7677,23 @@ export const biomeTrainerPools: BiomeTrainerPools = { traverseBiome(Biome.TOWN, 0); biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: integer, value: integer) => Math.max(max, value), 0) + 1, 1 ]; - import('./pokemon-evolutions').then(pe => { + import("./pokemon-evolutions").then(pe => { const pokemonEvolutions = pe.pokemonEvolutions; - for (let biome of Utils.getEnumValues(Biome)) { + for (const biome of Utils.getEnumValues(Biome)) { biomePokemonPools[biome] = {}; biomeTrainerPools[biome] = {}; - for (let tier of Utils.getEnumValues(BiomePoolTier)) { + for (const tier of Utils.getEnumValues(BiomePoolTier)) { biomePokemonPools[biome][tier] = {}; biomeTrainerPools[biome][tier] = []; - for (let tod of Utils.getEnumValues(TimeOfDay)) + for (const tod of Utils.getEnumValues(TimeOfDay)) { biomePokemonPools[biome][tier][tod] = []; + } } } - for (let pb of pokemonBiomes) { + for (const pb of pokemonBiomes) { const speciesId = pb[0] as Species; const biomeEntries = pb[3] as (Biome | BiomePoolTier)[][]; @@ -7699,10 +7701,11 @@ export const biomeTrainerPools: BiomeTrainerPools = { ? pokemonEvolutions[speciesId] : []; - if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) + if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) { uncatchableSpecies.push(speciesId); + } - for (let b of biomeEntries) { + for (const b of biomeEntries) { const biome = b[0]; const tier = b[1]; const timesOfDay = b.length > 2 @@ -7711,9 +7714,10 @@ export const biomeTrainerPools: BiomeTrainerPools = { : [ b[2] ] : [ TimeOfDay.ALL ]; - for (let tod of timesOfDay) { - if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) + for (const tod of timesOfDay) { + if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) { continue; + } const biomeTierPool = biomePokemonPools[biome][tier][tod]; @@ -7734,28 +7738,30 @@ export const biomeTrainerPools: BiomeTrainerPools = { break; } } - if (treeIndex > -1) + if (treeIndex > -1) { break; + } } - if (treeIndex > -1) + if (treeIndex > -1) { (biomeTierPool[treeIndex] as unknown as Species[]).splice(arrayIndex, 0, speciesId); - else + } else { (biomeTierPool as unknown as Species[][]).push([ speciesId ]); + } } } } - for (let b of Object.keys(biomePokemonPools)) { - for (let t of Object.keys(biomePokemonPools[b])) { + for (const b of Object.keys(biomePokemonPools)) { + for (const t of Object.keys(biomePokemonPools[b])) { const tier = parseInt(t) as BiomePoolTier; - for (let tod of Object.keys(biomePokemonPools[b][t])) { + for (const tod of Object.keys(biomePokemonPools[b][t])) { const biomeTierTimePool = biomePokemonPools[b][t][tod]; for (let e = 0; e < biomeTierTimePool.length; e++) { const entry = biomeTierTimePool[e]; - if (entry.length === 1) + if (entry.length === 1) { biomeTierTimePool[e] = entry[0]; - else { + } else { const newEntry = { 1: [ entry[0] ] }; @@ -7763,10 +7769,11 @@ export const biomeTrainerPools: BiomeTrainerPools = { const speciesId = entry[s]; const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId); const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0); - if (!newEntry.hasOwnProperty(level)) + if (!newEntry.hasOwnProperty(level)) { newEntry[level] = [ speciesId ]; - else + } else { newEntry[level].push(speciesId); + } } biomeTierTimePool[e] = newEntry; } @@ -7775,16 +7782,17 @@ export const biomeTrainerPools: BiomeTrainerPools = { } } - for (let tb of trainerBiomes) { + for (const tb of trainerBiomes) { const trainerType = tb[0] as TrainerType; const biomeEntries = tb[1] as BiomePoolTier[][]; - for (let b of biomeEntries) { + for (const b of biomeEntries) { const biome = b[0]; const tier = b[1]; - if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier)) + if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier)) { continue; + } const biomeTierPool = biomeTrainerPools[biome][tier]; biomeTierPool.push(trainerType); @@ -7794,32 +7802,34 @@ export const biomeTrainerPools: BiomeTrainerPools = { //outputPools(); }); + // used in a commented code + // eslint-disable-next-line @typescript-eslint/no-unused-vars function outputPools() { const pokemonOutput = {}; const trainerOutput = {}; - for (let b of Object.keys(biomePokemonPools)) { + for (const b of Object.keys(biomePokemonPools)) { const biome = Biome[b]; pokemonOutput[biome] = {}; trainerOutput[biome] = {}; - for (let t of Object.keys(biomePokemonPools[b])) { + for (const t of Object.keys(biomePokemonPools[b])) { const tier = BiomePoolTier[t]; pokemonOutput[biome][tier] = {}; - for (let tod of Object.keys(biomePokemonPools[b][t])) { + for (const tod of Object.keys(biomePokemonPools[b][t])) { const timeOfDay = TimeOfDay[tod]; pokemonOutput[biome][tier][timeOfDay] = []; - for (let f of biomePokemonPools[b][t][tod]) { - if (typeof f === 'number') + for (const f of biomePokemonPools[b][t][tod]) { + if (typeof f === "number") { pokemonOutput[biome][tier][timeOfDay].push(Species[f]); - else { + } else { const tree = {}; - for (let l of Object.keys(f)) { + for (const l of Object.keys(f)) { tree[l] = f[l].map(s => Species[s]); } @@ -7830,18 +7840,19 @@ export const biomeTrainerPools: BiomeTrainerPools = { } } - for (let t of Object.keys(biomeTrainerPools[b])) { + for (const t of Object.keys(biomeTrainerPools[b])) { const tier = BiomePoolTier[t]; trainerOutput[biome][tier] = []; - for (let f of biomeTrainerPools[b][t]) + for (const f of biomeTrainerPools[b][t]) { trainerOutput[biome][tier].push(TrainerType[f]); + } } } - console.log(beautify(pokemonOutput, null, 2, 180).replace(/( | (?:\{ "\d+": \[ )?| "(?:.*?)": \[ |(?:,|\[) (?:"\w+": \[ |(?:\{ )?"\d+": \[ )?)"(\w+)"(?= |,|\n)/g, '$1Species.$2').replace(/"(\d+)": /g, '$1: ').replace(/((?: )|(?:(?!\n) "(?:.*?)": \{) |\[(?: .*? )?\], )"(\w+)"/g, '$1[TimeOfDay.$2]').replace(/( )"(.*?)"/g, '$1[BiomePoolTier.$2]').replace(/( )"(.*?)"/g, '$1[Biome.$2]')); - console.log(beautify(trainerOutput, null, 2, 120).replace(/( | (?:\{ "\d+": \[ )?| "(?:.*?)": \[ |, (?:(?:\{ )?"\d+": \[ )?)"(.*?)"/g, '$1TrainerType.$2').replace(/"(\d+)": /g, '$1: ').replace(/( )"(.*?)"/g, '$1[BiomePoolTier.$2]').replace(/( )"(.*?)"/g, '$1[Biome.$2]')); + console.log(beautify(pokemonOutput, null, 2, 180).replace(/( | (?:\{ "\d+": \[ )?| "(?:.*?)": \[ |(?:,|\[) (?:"\w+": \[ |(?:\{ )?"\d+": \[ )?)"(\w+)"(?= |,|\n)/g, "$1Species.$2").replace(/"(\d+)": /g, "$1: ").replace(/((?: )|(?:(?!\n) "(?:.*?)": \{) |\[(?: .*? )?\], )"(\w+)"/g, "$1[TimeOfDay.$2]").replace(/( )"(.*?)"/g, "$1[BiomePoolTier.$2]").replace(/( )"(.*?)"/g, "$1[Biome.$2]")); + console.log(beautify(trainerOutput, null, 2, 120).replace(/( | (?:\{ "\d+": \[ )?| "(?:.*?)": \[ |, (?:(?:\{ )?"\d+": \[ )?)"(.*?)"/g, "$1TrainerType.$2").replace(/"(\d+)": /g, "$1: ").replace(/( )"(.*?)"/g, "$1[BiomePoolTier.$2]").replace(/( )"(.*?)"/g, "$1[Biome.$2]")); } /*for (let pokemon of allSpecies) { diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index c1a1206f3d7b..6fd6c6301819 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -14,14 +14,14 @@ export interface DailyRunConfig { export function fetchDailyRunSeed(): Promise { return new Promise((resolve, reject) => { - Utils.apiFetch('daily/seed').then(response => { + Utils.apiFetch("daily/seed").then(response => { if (!response.ok) { resolve(null); return; } return response.text(); }).then(seed => resolve(seed)) - .catch(err => reject(err)); + .catch(err => reject(err)); }); } @@ -72,4 +72,4 @@ function getDailyRunStarter(scene: BattleScene, starterSpeciesForm: PokemonSpeci }; pokemon.destroy(); return starter; -} \ No newline at end of file +} diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 8d1be662f73b..c457aa47d7aa 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -16,317 +16,317 @@ export const trainerTypeDialogue = { [TrainerType.YOUNGSTER]: [ { encounter: [ - `Hey, wanna battle?`, - `Are you a new trainer too?`, - `Hey, I haven't seen you before. Let's battle!`, - `I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!`, - `Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!`, - `All right! Let's go!`, - `All right! Here I come! I'll show you my power!`, - `Haw haw haw... I'll show you how hawesome my Pokémon are!`, - `No need to waste time saying hello. Bring it on whenever you're ready!`, - `Don't let your guard down, or you may be crying when a kid beats you.`, - `I've raised my Pokémon with great care. You're not allowed to hurt them!`, - `Glad you made it! It won't be an easy job from here.`, - `The battles continue forever! Welcome to the world with no end!` + "Hey, wanna battle?", + "Are you a new trainer too?", + "Hey, I haven't seen you before. Let's battle!", + "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!", + "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!", + "All right! Let's go!", + "All right! Here I come! I'll show you my power!", + "Haw haw haw... I'll show you how hawesome my Pokémon are!", + "No need to waste time saying hello. Bring it on whenever you're ready!", + "Don't let your guard down, or you may be crying when a kid beats you.", + "I've raised my Pokémon with great care. You're not allowed to hurt them!", + "Glad you made it! It won't be an easy job from here.", + "The battles continue forever! Welcome to the world with no end!" ], victory: [ - `Wow! You're strong!`, - `I didn't stand a chance, huh?`, - `I'll find you again when I'm older and beat you!`, - `Ugh. I don't have any more Pokémon.`, - `No way… NO WAY! How could I lose again…`, - `No! I lost!`, - `Whoa! You are incredible! I'm amazed and surprised!`, - `Could it be… How… My Pokémon and I are the strongest, though…`, - `I won't lose next time! Let's battle again sometime!`, - `Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!`, - `Your Pokémon are more amazing! Trade with me!`, - `I got a little carried away earlier, but what job was I talking about?`, - `Ahaha! There it is! That's right! You're already right at home in this world!` + "Wow! You're strong!", + "I didn't stand a chance, huh?", + "I'll find you again when I'm older and beat you!", + "Ugh. I don't have any more Pokémon.", + "No way… NO WAY! How could I lose again…", + "No! I lost!", + "Whoa! You are incredible! I'm amazed and surprised!", + "Could it be… How… My Pokémon and I are the strongest, though…", + "I won't lose next time! Let's battle again sometime!", + "Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!", + "Your Pokémon are more amazing! Trade with me!", + "I got a little carried away earlier, but what job was I talking about?", + "Ahaha! There it is! That's right! You're already right at home in this world!" ] }, //LASS { encounter: [ - `Let's have a battle, shall we?`, - `You look like a new trainer. Let's have a battle!`, - `I don't recognize you. How about a battle?`, - `Let's have a fun Pokémon battle!`, - `I'll show you the ropes of how to really use Pokémon!`, - `A serious battle starts from a serious beginning! Are you sure you're ready?`, - `You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.`, - `You'd better go easy on me, OK? Though I'll be seriously fighting!`, - `School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time.` + "Let's have a battle, shall we?", + "You look like a new trainer. Let's have a battle!", + "I don't recognize you. How about a battle?", + "Let's have a fun Pokémon battle!", + "I'll show you the ropes of how to really use Pokémon!", + "A serious battle starts from a serious beginning! Are you sure you're ready?", + "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.", + "You'd better go easy on me, OK? Though I'll be seriously fighting!", + "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time." ], victory: [ - `That was impressive! I've got a lot to learn.`, - `I didn't think you'd beat me that bad…`, - `I hope we get to have a rematch some day.`, - `That was pretty amazingly fun! You've totally exhausted me…`, - `You actually taught me a lesson! You're pretty amazing!`, - `Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.`, - `I don't need memories like this. Deleting memory…`, - `Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.`, - `I'm actually getting tired of battling… There's gotta be something new to do…` + "That was impressive! I've got a lot to learn.", + "I didn't think you'd beat me that bad…", + "I hope we get to have a rematch some day.", + "That was pretty amazingly fun! You've totally exhausted me…", + "You actually taught me a lesson! You're pretty amazing!", + "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.", + "I don't need memories like this. Deleting memory…", + "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.", + "I'm actually getting tired of battling… There's gotta be something new to do…" ] } ], [TrainerType.BREEDER]: [ { encounter: [ - `Obedient Pokémon, selfish Pokémon… Pokémon have unique characteristics.`, - `Even though my upbringing and behavior are poor, I've raised my Pokémon well.`, - `Hmm, do you discipline your Pokémon? Pampering them too much is no good.`, + "Obedient Pokémon, selfish Pokémon… Pokémon have unique characteristics.", + "Even though my upbringing and behavior are poor, I've raised my Pokémon well.", + "Hmm, do you discipline your Pokémon? Pampering them too much is no good.", ], victory: [ - `It is important to nurture and train each Pokémon's characteristics.`, - `Unlike my diabolical self, these are some good Pokémon.`, - `Too much praise can spoil both Pokémon and people.`, + "It is important to nurture and train each Pokémon's characteristics.", + "Unlike my diabolical self, these are some good Pokémon.", + "Too much praise can spoil both Pokémon and people.", ], defeat:[ - `You should not get angry at your Pokémon, even if you lose a battle.`, - `Right? Pretty good Pokémon, huh? I'm suited to raising things.`, - `No matter how much you love your Pokémon, you still have to discipline them when they misbehave.` + "You should not get angry at your Pokémon, even if you lose a battle.", + "Right? Pretty good Pokémon, huh? I'm suited to raising things.", + "No matter how much you love your Pokémon, you still have to discipline them when they misbehave." ] }, { encounter: [ - `Pokémon never betray you. They return all the love you give them.`, - `Shall I give you a tip for training good Pokémon?`, - `I have raised these very special Pokémon using a special method.` + "Pokémon never betray you. They return all the love you give them.", + "Shall I give you a tip for training good Pokémon?", + "I have raised these very special Pokémon using a special method." ], victory: [ - `Ugh… It wasn't supposed to be like this. Did I administer the wrong blend?`, - `How could that happen to my Pokémon… What are you feeding your Pokémon?`, - `If I lose, that tells you I was just killing time. It doesn't damage my ego at all.` + "Ugh… It wasn't supposed to be like this. Did I administer the wrong blend?", + "How could that happen to my Pokémon… What are you feeding your Pokémon?", + "If I lose, that tells you I was just killing time. It doesn't damage my ego at all." ], defeat: [ - `This proves my Pokémon have accepted my love.`, - `The real trick behind training good Pokémon is catching good Pokémon.`, - `Pokémon will be strong or weak depending on how you raise them.` + "This proves my Pokémon have accepted my love.", + "The real trick behind training good Pokémon is catching good Pokémon.", + "Pokémon will be strong or weak depending on how you raise them." ] } ], [TrainerType.FISHERMAN]: [ { encounter: [ - `Aack! You made me lose a bite!\nWhat are you going to do about it?`, - `Go away! You're scaring the Pokémon!`, - `Let's see if you can reel in a victory!`, + "Aack! You made me lose a bite!\nWhat are you going to do about it?", + "Go away! You're scaring the Pokémon!", + "Let's see if you can reel in a victory!", ], victory: [ - `Just forget about it.`, - `Next time, I'll be reelin' in the triumph!`, - `Guess I underestimated the currents this time.`, + "Just forget about it.", + "Next time, I'll be reelin' in the triumph!", + "Guess I underestimated the currents this time.", ] }, { encounter: [ - `Woah! I've hooked a big one!`, - `Line's in, ready to reel in success!`, - `Ready to make waves!` + "Woah! I've hooked a big one!", + "Line's in, ready to reel in success!", + "Ready to make waves!" ], victory: [ - `I'll be back with a stronger hook.`, - `I'll reel in victory next time.`, - `I'm just sharpening my hooks for the comeback!` + "I'll be back with a stronger hook.", + "I'll reel in victory next time.", + "I'm just sharpening my hooks for the comeback!" ] } ], [TrainerType.SWIMMER]: [ { encounter: [ - `Time to dive in!`, - `Let's ride the waves of victory!`, - `Ready to make a splash!`, + "Time to dive in!", + "Let's ride the waves of victory!", + "Ready to make a splash!", ], victory: [ - `Drenched in defeat!`, - `A wave of defeat!`, - `Back to shore, I guess.`, + "Drenched in defeat!", + "A wave of defeat!", + "Back to shore, I guess.", ] } ], [TrainerType.BACKPACKER]: [ { encounter: [ - `Pack up, game on!`, - `Let's see if you can keep pace!`, - `Gear up, challenger!`, - `I've spent 20 years trying to find myself… But where am I?` + "Pack up, game on!", + "Let's see if you can keep pace!", + "Gear up, challenger!", + "I've spent 20 years trying to find myself… But where am I?" ], victory: [ - `Tripped up this time!`, - `Oh, I think I'm lost.`, - `Dead end!`, - `Wait up a second! Hey! Don't you know who I am?` + "Tripped up this time!", + "Oh, I think I'm lost.", + "Dead end!", + "Wait up a second! Hey! Don't you know who I am?" ] } ], [TrainerType.ACE_TRAINER]: [ { encounter: [ - `You seem quite confident.`, - `Your Pokémon… Show them to me…`, - `Because I'm an Ace Trainer, people think I'm strong.`, - `Are you aware of what it takes to be an Ace Trainer?` + "You seem quite confident.", + "Your Pokémon… Show them to me…", + "Because I'm an Ace Trainer, people think I'm strong.", + "Are you aware of what it takes to be an Ace Trainer?" ], victory: [ - `Yes… You have good Pokémon…`, - `What?! But I'm a battling genius!`, - `Of course, you are the main character!`, - `OK! OK! You could be an Ace Trainer!` + "Yes… You have good Pokémon…", + "What?! But I'm a battling genius!", + "Of course, you are the main character!", + "OK! OK! You could be an Ace Trainer!" ], defeat: [ - `I am devoting my body and soul to Pokémon battles!`, - `All within my expectations… Nothing to be surprised about…`, - `I thought I'd grow up to be a frail person who looked like they would break if you squeezed them too hard.`, - `Of course I'm strong and don't lose. It's important that I win gracefully.` + "I am devoting my body and soul to Pokémon battles!", + "All within my expectations… Nothing to be surprised about…", + "I thought I'd grow up to be a frail person who looked like they would break if you squeezed them too hard.", + "Of course I'm strong and don't lose. It's important that I win gracefully." ] } ], [TrainerType.PARASOL_LADY]: [ { encounter: [ - `Time to grace the battlefield with elegance and poise!`, + "Time to grace the battlefield with elegance and poise!", ], victory: [ - `My elegance remains unbroken!`, + "My elegance remains unbroken!", ] } ], [TrainerType.TWINS]: [ { encounter: [ - `Get ready, because when we team up, it's double the trouble!`, - `Two hearts, one strategy – let's see if you can keep up with our twin power!`, - `Hope you're ready for double trouble, because we're about to bring the heat!` + "Get ready, because when we team up, it's double the trouble!", + "Two hearts, one strategy – let's see if you can keep up with our twin power!", + "Hope you're ready for double trouble, because we're about to bring the heat!" ], victory: [ - `We may have lost this round, but our bond remains unbreakable!`, - `Our twin spirit won't be dimmed for long.`, - `We'll come back stronger as a dynamic duo!` + "We may have lost this round, but our bond remains unbreakable!", + "Our twin spirit won't be dimmed for long.", + "We'll come back stronger as a dynamic duo!" ], defeat: [ - `Twin power reigns supreme!`, - `Two hearts, one triumph!`, - `Double the smiles, double the victory dance!` + "Twin power reigns supreme!", + "Two hearts, one triumph!", + "Double the smiles, double the victory dance!" ], } ], [TrainerType.CYCLIST]: [ { encounter: [ - `Get ready to eat my dust!`, - `Gear up, challenger! I'm about to leave you in the dust!`, - `Pedal to the metal, let's see if you can keep pace!` + "Get ready to eat my dust!", + "Gear up, challenger! I'm about to leave you in the dust!", + "Pedal to the metal, let's see if you can keep pace!" ], victory: [ - `Spokes may be still, but determination pedals on.`, - `Outpaced!`, - `The road to victory has many twists and turns yet to explore.` + "Spokes may be still, but determination pedals on.", + "Outpaced!", + "The road to victory has many twists and turns yet to explore." ] } ], [TrainerType.BLACK_BELT]: [ { encounter: [ - `I praise your courage in challenging me! For I am the one with the strongest kick!`, - `Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?` + "I praise your courage in challenging me! For I am the one with the strongest kick!", + "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?" ], victory: [ - `Oh. The Pokémon did the fighting. My strong kick didn't help a bit.`, - `Hmmm… If I was going to lose anyway, I was hoping to get totally messed up in the process.` + "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.", + "Hmmm… If I was going to lose anyway, I was hoping to get totally messed up in the process." ] }, //BATTLE GIRL { encounter: [ - `You don't have to try to impress me. You can lose against me.`, + "You don't have to try to impress me. You can lose against me.", ], victory: [ - `It's hard to say good-bye, but we are running out of time…`, + "It's hard to say good-bye, but we are running out of time…", ] } ], [TrainerType.HIKER]: [ { encounter: [ - `My middle-age spread has given me as much gravitas as the mountains I hike!`, - `I inherited this big-boned body from my parents… I'm like a living mountain range…`, + "My middle-age spread has given me as much gravitas as the mountains I hike!", + "I inherited this big-boned body from my parents… I'm like a living mountain range…", ], victory: [ - `At least I cannot lose when it comes to BMI!`, - `It's not enough… It's never enough. My bad cholesterol isn't high enough…` + "At least I cannot lose when it comes to BMI!", + "It's not enough… It's never enough. My bad cholesterol isn't high enough…" ] } ], [TrainerType.RANGER]: [ { encounter: [ - `When I am surrounded by nature, most other things cease to matter.`, - `When I'm living without nature in my life, sometimes I'll suddenly feel an anxiety attack coming on.` + "When I am surrounded by nature, most other things cease to matter.", + "When I'm living without nature in my life, sometimes I'll suddenly feel an anxiety attack coming on." ], victory: [ - `It doesn't matter to the vastness of nature whether I win or lose…`, - `Something like this is pretty trivial compared to the stifling feelings of city life.` + "It doesn't matter to the vastness of nature whether I win or lose…", + "Something like this is pretty trivial compared to the stifling feelings of city life." ], defeat: [ - `I won the battle. But victory is nothing compared to the vastness of nature…`, - `I'm sure how you feel is not so bad if you compare it to my anxiety attacks…` + "I won the battle. But victory is nothing compared to the vastness of nature…", + "I'm sure how you feel is not so bad if you compare it to my anxiety attacks…" ] } ], [TrainerType.SCIENTIST]: [ { encounter: [ - `My research will lead this world to peace and joy.`, + "My research will lead this world to peace and joy.", ], victory: [ - `I am a genius… I am not supposed to lose against someone like you…`, + "I am a genius… I am not supposed to lose against someone like you…", ] } ], [TrainerType.SCHOOL_KID]: [ { encounter: [ - `…Heehee. I'm confident in my calculations and analysis.`, - `I'm gaining as much experience as I can because I want to be a Gym Leader someday.` + "…Heehee. I'm confident in my calculations and analysis.", + "I'm gaining as much experience as I can because I want to be a Gym Leader someday." ], victory: [ - `Ohhhh… Calculation and analysis are perhaps no match for chance…`, - `Even difficult, trying experiences have their purpose, I suppose.` + "Ohhhh… Calculation and analysis are perhaps no match for chance…", + "Even difficult, trying experiences have their purpose, I suppose." ] } ], [TrainerType.ARTIST]: [ { encounter: [ - `I used to be popular, but now I am all washed up.`, + "I used to be popular, but now I am all washed up.", ], victory: [ - `As times change, values also change. I realized that too late.`, + "As times change, values also change. I realized that too late.", ] } ], [TrainerType.GUITARIST]: [ { encounter: [ - `Get ready to feel the rhythm of defeat as I strum my way to victory!`, + "Get ready to feel the rhythm of defeat as I strum my way to victory!", ], victory: [ - `Silenced for now, but my melody of resilience will play on.`, + "Silenced for now, but my melody of resilience will play on.", ] } ], [TrainerType.WORKER]: [ { encounter: [ - `It bothers me that people always misunderstand me. I'm a lot more pure than everyone thinks.` + "It bothers me that people always misunderstand me. I'm a lot more pure than everyone thinks." ], victory: [ - `I really don't want my skin to burn, so I want to stay in the shade while I work.`, + "I really don't want my skin to burn, so I want to stay in the shade while I work.", ] }, { @@ -335,576 +335,576 @@ export const trainerTypeDialogue = { $I'm a lot more pure than everyone thinks.` ], victory: [ - `I really don't want my skin to burn, so I want to stay in the shade while I work.` + "I really don't want my skin to burn, so I want to stay in the shade while I work." ], defeat: [ - `My body and mind aren't necessarily always in sync.` + "My body and mind aren't necessarily always in sync." ] }, { encounter: [ - `I'll show you we can break you. We've been training in the field!` + "I'll show you we can break you. We've been training in the field!" ], victory: [ - `How strange… How could this be… I shouldn't have been outmuscled.`, + "How strange… How could this be… I shouldn't have been outmuscled.", ] }, ], [TrainerType.HEX_MANIAC]: [ { encounter: [ - `I normally only ever listen to classical music, but if I lose, I think I shall try a bit of new age!`, - `I grow stronger with each tear I cry.` + "I normally only ever listen to classical music, but if I lose, I think I shall try a bit of new age!", + "I grow stronger with each tear I cry." ], victory: [ - `Is this the dawning of the age of Aquarius?`, - `Now I can get even stronger. I grow with every grudge.` + "Is this the dawning of the age of Aquarius?", + "Now I can get even stronger. I grow with every grudge." ], defeat: [ - `New age simply refers to twentieth century classical composers, right?`, - `Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself.` + "New age simply refers to twentieth century classical composers, right?", + "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself." ] } ], [TrainerType.PSYCHIC]: [ { encounter: [ - `Hi! Focus!`, + "Hi! Focus!", ], victory: [ - `Eeeeek!`, + "Eeeeek!", ] } ], [TrainerType.OFFICER]: [ { encounter: [ - `Brace yourself, because justice is about to be served!`, - `Ready to uphold the law and serve justice on the battlefield!` + "Brace yourself, because justice is about to be served!", + "Ready to uphold the law and serve justice on the battlefield!" ], victory: [ - `The weight of justice feels heavier than ever…`, - `The shadows of defeat linger in the precinct.` + "The weight of justice feels heavier than ever…", + "The shadows of defeat linger in the precinct." ] } ], [TrainerType.BEAUTY]: [ { encounter: [ - `My last ever battle… That's the way I'd like us to view this match…` + "My last ever battle… That's the way I'd like us to view this match…" ], victory: [ - `It's been fun… Let's have another last battle again someday…` + "It's been fun… Let's have another last battle again someday…" ] } ], [TrainerType.BAKER]: [ { encounter: [ - `Hope you're ready to taste defeat!` + "Hope you're ready to taste defeat!" ], victory: [ - `I'll bake a comeback.` + "I'll bake a comeback." ] } ], [TrainerType.BIKER]: [ { encounter: [ - `Time to rev up and leave you in the dust!` + "Time to rev up and leave you in the dust!" ], victory: [ - `I'll tune up for the next race.` + "I'll tune up for the next race." ] } ], [TrainerType.BROCK]: { encounter: [ - `My expertise on Rock-type Pokémon will take you down! Come on!`, - `My rock-hard willpower will overwhelm you!`, - `Allow me to show you the true strength of my Pokémon!` + "My expertise on Rock-type Pokémon will take you down! Come on!", + "My rock-hard willpower will overwhelm you!", + "Allow me to show you the true strength of my Pokémon!" ], victory: [ - `Your Pokémon's strength have overcome my rock-hard defenses!`, - `The world is huge! I'm glad to have had a chance to battle you.`, - `Perhaps I should go back to pursuing my dream as a Pokémon Breeder…` + "Your Pokémon's strength have overcome my rock-hard defenses!", + "The world is huge! I'm glad to have had a chance to battle you.", + "Perhaps I should go back to pursuing my dream as a Pokémon Breeder…" ], defeat: [ - `The best offense is a good defense!\nThat's my way of doing things!`, - `Come study rocks with me next time to better learn how to fight them!`, - `Hah, all my traveling around the regions is paying off!` + "The best offense is a good defense!\nThat's my way of doing things!", + "Come study rocks with me next time to better learn how to fight them!", + "Hah, all my traveling around the regions is paying off!" ] }, [TrainerType.MISTY]: { encounter: [ - `My policy is an all out offensive with Water-type Pokémon!`, - `Hiya, I'll show you the strength of my aquatic Pokémon!`, - `My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?` + "My policy is an all out offensive with Water-type Pokémon!", + "Hiya, I'll show you the strength of my aquatic Pokémon!", + "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?" ], victory: [ - `You really are strong… I'll admit that you are skilled…`, - `Grrr… You know you just got lucky, right?!`, - `Wow, you're too much! I can't believe you beat me!` + "You really are strong… I'll admit that you are skilled…", + "Grrr… You know you just got lucky, right?!", + "Wow, you're too much! I can't believe you beat me!" ], defeat: [ - `Was the mighty Misty too much for you?`, - `I hope you saw my Pokémon's elegant swimming techniques!`, - `Your Pokémon were no match for my pride and joys!` + "Was the mighty Misty too much for you?", + "I hope you saw my Pokémon's elegant swimming techniques!", + "Your Pokémon were no match for my pride and joys!" ] }, [TrainerType.LT_SURGE]: { encounter: [ - `My Electric Pokémon saved me during the war! I'll show you how!`, - `Ten-hut! I'll shock you into surrender!`, - `I'll zap you just like I do to all my enemies in battle!` + "My Electric Pokémon saved me during the war! I'll show you how!", + "Ten-hut! I'll shock you into surrender!", + "I'll zap you just like I do to all my enemies in battle!" ], victory: [ - `Whoa! Your team's the real deal, kid!`, - `Aaargh, you're strong! Even my electric tricks lost against you.`, - `That was an absolutely shocking loss!` + "Whoa! Your team's the real deal, kid!", + "Aaargh, you're strong! Even my electric tricks lost against you.", + "That was an absolutely shocking loss!" ], defeat: [ - `Oh yeah! When it comes to Electric-type Pokémon, I'm number one in the world!`, - `Hahaha! That was an electrifying battle, kid!`, - `A Pokémon battle is war, and I have showed you first-hand combat!` + "Oh yeah! When it comes to Electric-type Pokémon, I'm number one in the world!", + "Hahaha! That was an electrifying battle, kid!", + "A Pokémon battle is war, and I have showed you first-hand combat!" ] }, [TrainerType.ERIKA]: { encounter: [ - `Ah, the weather is lovely here…\nOh, a battle? Very well then.`, - `My Pokémon battling skills rival that of my flower arranging skills.`, - `Oh, I hope the pleasant aroma of my Pokémon doesn't put me to sleep again…`, - `Seeing flowers in a garden is so soothing.` + "Ah, the weather is lovely here…\nOh, a battle? Very well then.", + "My Pokémon battling skills rival that of my flower arranging skills.", + "Oh, I hope the pleasant aroma of my Pokémon doesn't put me to sleep again…", + "Seeing flowers in a garden is so soothing." ], victory: [ - `Oh! I concede defeat.`, - `That match was most delightful.`, - `Ah, it appears it is my loss…`, - `Oh, my goodness.` + "Oh! I concede defeat.", + "That match was most delightful.", + "Ah, it appears it is my loss…", + "Oh, my goodness." ], defeat: [ - `I was afraid I would doze off…`, - `Oh my, it seems my Grass Pokémon overwhelmed you.`, - `That battle was such a soothing experience.`, - `Oh… Is that all?` + "I was afraid I would doze off…", + "Oh my, it seems my Grass Pokémon overwhelmed you.", + "That battle was such a soothing experience.", + "Oh… Is that all?" ] }, [TrainerType.JANINE]: { encounter: [ - `I am mastering the art of poisonous attacks.\nI shall spar with you today!`, - `Father trusts that I can hold my own.\nI will prove him right!`, - `My ninja techniques are only second to my Father's!\nCan you keep up?` + "I am mastering the art of poisonous attacks.\nI shall spar with you today!", + "Father trusts that I can hold my own.\nI will prove him right!", + "My ninja techniques are only second to my Father's!\nCan you keep up?" ], victory: [ - `Even now, I still need training… I understand.`, - `Your battle technique has outmatched mine.`, - `I'm going to really apply myself and improve my skills.` + "Even now, I still need training… I understand.", + "Your battle technique has outmatched mine.", + "I'm going to really apply myself and improve my skills." ], defeat: [ - `Fufufu… the poison has sapped all your strength to battle.`, - `Ha! You didn't stand a chance against my superior ninja skills!`, - `Father's faith in me has proven to not be misplaced.` + "Fufufu… the poison has sapped all your strength to battle.", + "Ha! You didn't stand a chance against my superior ninja skills!", + "Father's faith in me has proven to not be misplaced." ] }, [TrainerType.SABRINA]: { encounter: [ - `Through my psychic ability, I had a vision of your arrival!`, - `I dislike fighting, but if you wish, I will show you my powers!`, - `I can sense great ambition in you. I shall see if it not unfounded.` + "Through my psychic ability, I had a vision of your arrival!", + "I dislike fighting, but if you wish, I will show you my powers!", + "I can sense great ambition in you. I shall see if it not unfounded." ], victory: [ - `Your power… It far exceeds what I foresaw…`, - `I failed to accurately predict your power.`, - `Even with my immense psychic powers, I cannot sense another as strong as you.` + "Your power… It far exceeds what I foresaw…", + "I failed to accurately predict your power.", + "Even with my immense psychic powers, I cannot sense another as strong as you." ], defeat: [ - `This victory… It is exactly as I foresaw in my visions!`, - `Perhaps it was another I sensed a great desire in…`, - `Hone your abilities before recklessly charging into battle.\nYou never know what the future may hold if you do…` + "This victory… It is exactly as I foresaw in my visions!", + "Perhaps it was another I sensed a great desire in…", + "Hone your abilities before recklessly charging into battle.\nYou never know what the future may hold if you do…" ] }, [TrainerType.BLAINE]: { encounter: [ - `Hah! Hope you brought a Burn Heal!`, - `My fiery Pokémon will incinerate all challengers!`, - `Get ready to play with fire!` + "Hah! Hope you brought a Burn Heal!", + "My fiery Pokémon will incinerate all challengers!", + "Get ready to play with fire!" ], victory: [ - `I have burned down to nothing! Not even ashes remain!`, - `Didn't I stoke the flames high enough?`, - `I'm all burned out… But this makes my motivation to improve burn even hotter!` + "I have burned down to nothing! Not even ashes remain!", + "Didn't I stoke the flames high enough?", + "I'm all burned out… But this makes my motivation to improve burn even hotter!" ], defeat: [ - `My raging inferno cannot be quelled!`, - `My Pokémon have been powered up with the heat from this victory!`, - `Hah! My passion burns brighter than yours!` + "My raging inferno cannot be quelled!", + "My Pokémon have been powered up with the heat from this victory!", + "Hah! My passion burns brighter than yours!" ] }, [TrainerType.GIOVANNI]: { encounter: [ - `I, the leader of Team Rocket, will make you feel a world of pain!`, - `My training here will be vital before I am to face my old associates again.`, - `I do not think you are prepared for the level of failure you are about to experience!` + "I, the leader of Team Rocket, will make you feel a world of pain!", + "My training here will be vital before I am to face my old associates again.", + "I do not think you are prepared for the level of failure you are about to experience!" ], victory: [ - `WHAT! Me, lose?! There is nothing I wish to say to you!`, - `Hmph… You could never understand what I hope to achieve.`, - `This defeat is merely delaying the inevitable.\nI will rise Team Rocket from the ashes in due time.` + "WHAT! Me, lose?! There is nothing I wish to say to you!", + "Hmph… You could never understand what I hope to achieve.", + "This defeat is merely delaying the inevitable.\nI will rise Team Rocket from the ashes in due time." ], defeat: [ - `Not being able to measure your own strength shows that you are still but a child.`, - `Do not try to interfere with me again.`, - `I hope you understand how foolish challenging me was.` + "Not being able to measure your own strength shows that you are still but a child.", + "Do not try to interfere with me again.", + "I hope you understand how foolish challenging me was." ] }, [TrainerType.ROXANNE]: { encounter: [ - `Would you kindly demonstrate how you battle?`, - `You can learn many things by battling many trainers.`, - `Oh, you caught me strategizing.\nWould you like to battle?` + "Would you kindly demonstrate how you battle?", + "You can learn many things by battling many trainers.", + "Oh, you caught me strategizing.\nWould you like to battle?" ], victory: [ - `Oh, I appear to have lost.\nI understand.`, - `It seems that I still have so much more to learn when it comes to battle.`, - `I'll take what I learned here today to heart.` + "Oh, I appear to have lost.\nI understand.", + "It seems that I still have so much more to learn when it comes to battle.", + "I'll take what I learned here today to heart." ], defeat: [ - `I have learned many things from our battle.\nI hope you have too.`, - `I look forward to battling you again.\nI hope you'll use what you've learned here.`, - `I won due to everything I have learned.` + "I have learned many things from our battle.\nI hope you have too.", + "I look forward to battling you again.\nI hope you'll use what you've learned here.", + "I won due to everything I have learned." ] }, [TrainerType.BRAWLY]: { encounter: [ - `Oh man, a challenger!\nLet's see what you can do!`, - `You seem like a big splash.\nLet's battle!`, - `Time to create a storm!\nLet's go!` + "Oh man, a challenger!\nLet's see what you can do!", + "You seem like a big splash.\nLet's battle!", + "Time to create a storm!\nLet's go!" ], victory: [ - `Oh woah, you've washed me out!`, - `You surfed my wave and crashed me down!`, - `I feel like I'm lost in Granite Cave!` + "Oh woah, you've washed me out!", + "You surfed my wave and crashed me down!", + "I feel like I'm lost in Granite Cave!" ], defeat: [ - `Haha, I surfed the big wave!\nChallenge me again sometime.`, - `Surf with me again some time!`, - `Just like the tides come in and out, I hope you return to challenge me again.` + "Haha, I surfed the big wave!\nChallenge me again sometime.", + "Surf with me again some time!", + "Just like the tides come in and out, I hope you return to challenge me again." ] }, [TrainerType.WATTSON]: { encounter: [ - `Time to get shocked!\nWahahahaha!`, - `I'll make sparks fly!\nWahahahaha!`, - `I hope you brought Paralyz Heal!\nWahahahaha!` + "Time to get shocked!\nWahahahaha!", + "I'll make sparks fly!\nWahahahaha!", + "I hope you brought Paralyz Heal!\nWahahahaha!" ], victory: [ - `Seems like I'm out of charge!\nWahahahaha!`, - `You've completely grounded me!\nWahahahaha!`, - `Thanks for the thrill!\nWahahahaha!` + "Seems like I'm out of charge!\nWahahahaha!", + "You've completely grounded me!\nWahahahaha!", + "Thanks for the thrill!\nWahahahaha!" ], defeat: [ - `Recharge your batteries and challenge me again sometime!\nWahahahaha!`, - `I hope you found our battle electrifying!\nWahahahaha!`, - `Aren't you shocked I won?\nWahahahaha!` + "Recharge your batteries and challenge me again sometime!\nWahahahaha!", + "I hope you found our battle electrifying!\nWahahahaha!", + "Aren't you shocked I won?\nWahahahaha!" ] }, [TrainerType.FLANNERY]: { encounter: [ - `Nice to meet you! Wait, no…\nI will crush you!`, - `I've only been a leader for a little while, but I'll smoke you!`, - `It's time to demonstrate the moves my grandfather has taught me! Let's battle!` + "Nice to meet you! Wait, no…\nI will crush you!", + "I've only been a leader for a little while, but I'll smoke you!", + "It's time to demonstrate the moves my grandfather has taught me! Let's battle!" ], victory: [ - `You remind me of my grandfather…\nNo wonder I lost.`, - `Am I trying too hard?\nI should relax, can't get too heated.`, - `Losing isn't going to smother me out.\nTime to reignite training!` + "You remind me of my grandfather…\nNo wonder I lost.", + "Am I trying too hard?\nI should relax, can't get too heated.", + "Losing isn't going to smother me out.\nTime to reignite training!" ], defeat: [ - `I hope I've made my grandfather proud…\nLet's battle again some time.`, - `I…I can't believe I won!\nDoing things my way worked!`, - `Let's exchange burning hot moves again soon!` + "I hope I've made my grandfather proud…\nLet's battle again some time.", + "I…I can't believe I won!\nDoing things my way worked!", + "Let's exchange burning hot moves again soon!" ] }, [TrainerType.NORMAN]: { encounter: [ - `I'm surprised you managed to get here.\nLet's battle.`, - `I'll do everything in my power as a Gym Leader to win.\nLet's go!`, - `You better give this your all.\nIt's time to battle!` + "I'm surprised you managed to get here.\nLet's battle.", + "I'll do everything in my power as a Gym Leader to win.\nLet's go!", + "You better give this your all.\nIt's time to battle!" ], victory: [ - `I lost to you…?\nRules are rules, though.`, - `Was moving from Olivine a mistake…?`, - `I can't believe it.\nThat was a great match.` + "I lost to you…?\nRules are rules, though.", + "Was moving from Olivine a mistake…?", + "I can't believe it.\nThat was a great match." ], defeat: [ - `We both tried our best.\nI hope we can battle again soon.`, - `You should try challenging my kid instead.\nYou might learn something!`, - `Thank you for the excellent battle.\nBetter luck next time.` + "We both tried our best.\nI hope we can battle again soon.", + "You should try challenging my kid instead.\nYou might learn something!", + "Thank you for the excellent battle.\nBetter luck next time." ] }, [TrainerType.WINONA]: { encounter: [ - `I've been soaring the skies looking for prey…\nAnd you're my target!`, - `No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!`, - `I hope you aren't scared of heights.\nLet's ascend!` + "I've been soaring the skies looking for prey…\nAnd you're my target!", + "No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!", + "I hope you aren't scared of heights.\nLet's ascend!" ], victory: [ - `You're the first Trainer I've seen with more grace than I.\nExcellently played.`, - `Oh, my Flying Pokémon have plummeted!\nVery well.`, - `Though I may have fallen, my Pokémon will continue to fly!` + "You're the first Trainer I've seen with more grace than I.\nExcellently played.", + "Oh, my Flying Pokémon have plummeted!\nVery well.", + "Though I may have fallen, my Pokémon will continue to fly!" ], defeat: [ - `My Flying Pokémon and I will forever dance elegantly!`, - `I hope you enjoyed our show.\nOur graceful dance is finished.`, - `Won't you come see our elegant choreography again?` + "My Flying Pokémon and I will forever dance elegantly!", + "I hope you enjoyed our show.\nOur graceful dance is finished.", + "Won't you come see our elegant choreography again?" ] }, [TrainerType.TATE]: { encounter: [ - `Hehehe…\nWere you surprised to see me without my sister?`, - `I can see what you're thinking…\nYou want to battle!`, - `How can you defeat someone…\nWho knows your every move?` + "Hehehe…\nWere you surprised to see me without my sister?", + "I can see what you're thinking…\nYou want to battle!", + "How can you defeat someone…\nWho knows your every move?" ], victory: [ - `It can't be helped…\nI miss Liza…`, - `Your bond with your Pokémon was stronger than mine.`, - `If I were with Liza, we would have won.\nWe can finish each other's thoughts!` + "It can't be helped…\nI miss Liza…", + "Your bond with your Pokémon was stronger than mine.", + "If I were with Liza, we would have won.\nWe can finish each other's thoughts!" ], defeat: [ - `My Pokémon and I are superior!`, - `If you can't even defeat me, you'll never be able to defeat Liza either.`, - `It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon.` + "My Pokémon and I are superior!", + "If you can't even defeat me, you'll never be able to defeat Liza either.", + "It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon." ] }, [TrainerType.LIZA]: { encounter: [ - `Fufufu…\nWere you surprised to see me without my brother?`, - `I can determine what you desire…\nYou want to battle, don't you?`, - `How can you defeat someone…\nWho's one with their Pokémon?` + "Fufufu…\nWere you surprised to see me without my brother?", + "I can determine what you desire…\nYou want to battle, don't you?", + "How can you defeat someone…\nWho's one with their Pokémon?" ], victory: [ - `It can't be helped…\nI miss Tate…`, - `Your bond with your Pokémon…\nIt's stronger than mine.`, - `If I were with Tate, we would have won.\nWe can finish each other's sentences!` + "It can't be helped…\nI miss Tate…", + "Your bond with your Pokémon…\nIt's stronger than mine.", + "If I were with Tate, we would have won.\nWe can finish each other's sentences!" ], defeat: [ - `My Pokémon and I are victorious.`, - `If you can't even defeat me, you'll never be able to defeat Tate either.`, - `It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon.` + "My Pokémon and I are victorious.", + "If you can't even defeat me, you'll never be able to defeat Tate either.", + "It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon." ] }, [TrainerType.JUAN]: { encounter: [ - `Now's not the time to act coy.\nLet's battle!`, - `Ahahaha, You'll be witness to my artistry with Water Pokémon!`, - `A typhoon approaches!\nWill you be able to test me?`, - `Please, you shall bear witness to our artistry.\nA grand illusion of water sculpted by my Pokémon and myself!` + "Now's not the time to act coy.\nLet's battle!", + "Ahahaha, You'll be witness to my artistry with Water Pokémon!", + "A typhoon approaches!\nWill you be able to test me?", + "Please, you shall bear witness to our artistry.\nA grand illusion of water sculpted by my Pokémon and myself!" ], victory: [ - `You may be a genius who can take on Wallace!`, - `I focused on elegance while you trained.\nIt's only natural that you defeated me.`, - `Ahahaha!\nVery well, You have won this time.`, - `From you, I sense the brilliant shine of skill that will overcome all.` + "You may be a genius who can take on Wallace!", + "I focused on elegance while you trained.\nIt's only natural that you defeated me.", + "Ahahaha!\nVery well, You have won this time.", + "From you, I sense the brilliant shine of skill that will overcome all." ], defeat: [ - `My Pokémon and I have sculpted an illusion of Water and come out victorious.`, - `Ahahaha, I have won, and you have lost.`, - `Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!`, - `I'm the winner! Which is to say, you lost.` + "My Pokémon and I have sculpted an illusion of Water and come out victorious.", + "Ahahaha, I have won, and you have lost.", + "Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!", + "I'm the winner! Which is to say, you lost." ] }, [TrainerType.CRASHER_WAKE]: { encounter: [ - `Crash! Crash! Watch out!\nCrasher Wake…is…heeere!`, - `Crash! Crash! Crasher Wake!`, - `I'm the tidal wave of power to wash you away!` + "Crash! Crash! Watch out!\nCrasher Wake…is…heeere!", + "Crash! Crash! Crasher Wake!", + "I'm the tidal wave of power to wash you away!" ], victory: [ - `That puts a grin on my face!\nGuhahaha! That was a blast!`, - `Hunwah! It's gone and ended!\nHow will I say this…\nI want more! I wanted to battle a lot more!`, - `WHAAAAT!?` + "That puts a grin on my face!\nGuhahaha! That was a blast!", + "Hunwah! It's gone and ended!\nHow will I say this…\nI want more! I wanted to battle a lot more!", + "WHAAAAT!?" ], defeat: [ - `Yeeeeah! That's right!`, - `I won, but I want more! I wanted to battle a lot more!`, - `So long!` + "Yeeeeah! That's right!", + "I won, but I want more! I wanted to battle a lot more!", + "So long!" ] }, [TrainerType.FALKNER]: { encounter: [ - `I'll show you the real power of the magnificent bird Pokémon!`, - `Winds, stay with me!`, - `Dad! I hope you're watching me battle from above!` + "I'll show you the real power of the magnificent bird Pokémon!", + "Winds, stay with me!", + "Dad! I hope you're watching me battle from above!" ], victory: [ - `I understand… I'll bow out gracefully.`, - `A defeat is a defeat. You are strong indeed.`, - `…Shoot! Yeah, I lost.` + "I understand… I'll bow out gracefully.", + "A defeat is a defeat. You are strong indeed.", + "…Shoot! Yeah, I lost." ], defeat: [ - `Dad! I won with your cherished bird Pokémon…`, - `Bird Pokémon are the best after all!`, - `Feels like I'm catching up to my dad!` + "Dad! I won with your cherished bird Pokémon…", + "Bird Pokémon are the best after all!", + "Feels like I'm catching up to my dad!" ] }, [TrainerType.NESSA]: { encounter: [ - `No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.`, - `I'm not here to chat. I'm here to win!`, - `This is a little gift from my Pokémon… I hope you can take it!` + "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.", + "I'm not here to chat. I'm here to win!", + "This is a little gift from my Pokémon… I hope you can take it!" ], victory: [ - `You and your Pokémon are just too much…`, - `How…? How can this be?!`, - `I was totally washed away!` + "You and your Pokémon are just too much…", + "How…? How can this be?!", + "I was totally washed away!" ], defeat: [ - `The raging wave crashes again!`, - `Time to ride the wave of victory!`, - `Ehehe!` + "The raging wave crashes again!", + "Time to ride the wave of victory!", + "Ehehe!" ] }, [TrainerType.MELONY]: { encounter: [ - `I'm not going to hold back!`, - `All righty, I suppose we should get started.`, - `I'll freeze you solid!` + "I'm not going to hold back!", + "All righty, I suppose we should get started.", + "I'll freeze you solid!" ], victory: [ - `You… You're pretty good, huh?`, - `If you find Gordie around, be sure to give him a right trashing, would you?`, - `I think you took breaking the ice a little too literally…` + "You… You're pretty good, huh?", + "If you find Gordie around, be sure to give him a right trashing, would you?", + "I think you took breaking the ice a little too literally…" ], defeat: [ - `Now do you see how severe battles can be?`, - `Hee! Looks like I went and won again!`, - `Are you holding back?` + "Now do you see how severe battles can be?", + "Hee! Looks like I went and won again!", + "Are you holding back?" ] }, [TrainerType.MARLON]: { encounter: [ - `You look strong! Shoots! Let's start!`, - `I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.`, - `Oh ho, so I'm facing you! That's off the wall.` + "You look strong! Shoots! Let's start!", + "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.", + "Oh ho, so I'm facing you! That's off the wall." ], victory: [ - `You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!`, - `You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!`, - `You're strong as a gnarly wave!` + "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!", + "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!", + "You're strong as a gnarly wave!" ], defeat: [ - `You're tough, but it's not enough to sway the sea, 'K!`, - `Hee! Looks like I went and won again!`, - `Sweet, sweet victory!` + "You're tough, but it's not enough to sway the sea, 'K!", + "Hee! Looks like I went and won again!", + "Sweet, sweet victory!" ] }, [TrainerType.SHAUNTAL]: { encounter: [ - `Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.`, - `I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?`, - `Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?` + "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.", + "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?", + "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?" ], victory: [ - `Wow. I'm dumbstruck!`, - `S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!`, - `Even in light of that, I'm still one of the Elite Four!` + "Wow. I'm dumbstruck!", + "S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!", + "Even in light of that, I'm still one of the Elite Four!" ], defeat: [ - `Eheh.`, - `That gave me excellent material for my next novel!`, - `And so, another tale ends…` + "Eheh.", + "That gave me excellent material for my next novel!", + "And so, another tale ends…" ] }, [TrainerType.MARSHAL]: { encounter: [ - `My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!`, - `Victory, decisive victory, is my intention! Challenger, here I come!`, - `In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!` + "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!", + "Victory, decisive victory, is my intention! Challenger, here I come!", + "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!" ], victory: [ - `Whew! Well done!`, - `As your battles continue, aim for even greater heights!`, - `The strength shown by you and your Pokémon has deeply impressed me…` + "Whew! Well done!", + "As your battles continue, aim for even greater heights!", + "The strength shown by you and your Pokémon has deeply impressed me…" ], defeat: [ - `Hmm.`, - `That was good battle.`, - `Haaah! Haaah! Haiyaaaah!` + "Hmm.", + "That was good battle.", + "Haaah! Haaah! Haiyaaaah!" ] }, [TrainerType.CHEREN]: { encounter: [ - `You remind me of an old friend. That makes me excited about this Pokémon battle!`, + "You remind me of an old friend. That makes me excited about this Pokémon battle!", `Pokémon battles have no meaning if you don't think why you battle. $Or better said, it makes battling together with Pokémon meaningless.`, - `My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you.` + "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you." ], victory: [ - `Thank you! I saw what was missing in me.`, - `Thank you! I feel like I saw a little of the way toward my ideals.`, - `Hmm… This is problematic.` + "Thank you! I saw what was missing in me.", + "Thank you! I feel like I saw a little of the way toward my ideals.", + "Hmm… This is problematic." ], defeat: [ - `As a Gym Leader, I aim to be a wall for you to overcome.`, - `All right!`, - `I made it where I am because Pokémon were by my side.\nPerhaps we need to think about why Pokémon help us not in terms of Pokémon and Trainers but as a relationship between living beings.` + "As a Gym Leader, I aim to be a wall for you to overcome.", + "All right!", + "I made it where I am because Pokémon were by my side.\nPerhaps we need to think about why Pokémon help us not in terms of Pokémon and Trainers but as a relationship between living beings." ] }, [TrainerType.CHILI]: { encounter: [ - `Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!`, - `Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!`, - `I'm going to show you what me and my blazing Fire types can do!` + "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!", + "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!", + "I'm going to show you what me and my blazing Fire types can do!" ], victory: [ - `You got me. I am… burned… out…`, - `Whoa ho! You're on fire!`, - `Augh! You got me!` + "You got me. I am… burned… out…", + "Whoa ho! You're on fire!", + "Augh! You got me!" ], defeat: [ - `I'm on fire! Play with me, and you'll get burned!`, - `When you play with fire, you get burned!`, - `I mean, c'mon, your opponent was me! You didn't have a chance!` + "I'm on fire! Play with me, and you'll get burned!", + "When you play with fire, you get burned!", + "I mean, c'mon, your opponent was me! You didn't have a chance!" ] }, [TrainerType.CILAN]: { encounter: [ `Nothing personal... No hard feelings... Me and my Grass-type Pokémon will... $Um... We're gonna battle come what may.`, - `So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.`, - `OK… So, um, I'm Cilan, I like Grass-type Pokémon.` + "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.", + "OK… So, um, I'm Cilan, I like Grass-type Pokémon." ], victory: [ - `Er… Is it over now?`, + "Er… Is it over now?", `…What a surprise. You are very strong, aren't you? $I guess my brothers wouldn't have been able to defeat you either…`, - `…Huh. Looks like my timing was, um, off?` + "…Huh. Looks like my timing was, um, off?" ], defeat: [ - `Huh? Did I win?`, + "Huh? Did I win?", `I guess… $I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.`, - `It…it was quite a thrilling experience…` + "It…it was quite a thrilling experience…" ] }, [TrainerType.ROARK]: { encounter: [ - `I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!`, - `Here goes! These are my rocking Pokémon, my pride and joy!`, - `Rock-type Pokémon are simply the best!`, - `I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!` + "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!", + "Here goes! These are my rocking Pokémon, my pride and joy!", + "Rock-type Pokémon are simply the best!", + "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!" ], victory: [ - `W-what? That can't be! My buffed-up Pokémon!`, - `…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.`, - `With skill like yours, it's natural for you to win.`, - `Wh-what?! It can't be! Even that wasn't enough?`, - `I blew it.` + "W-what? That can't be! My buffed-up Pokémon!", + "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.", + "With skill like yours, it's natural for you to win.", + "Wh-what?! It can't be! Even that wasn't enough?", + "I blew it." ], defeat: [ - `See? I'm proud of my rocking battle style!`, - `Thanks! The battle gave me confidence that I may be able to beat my dad!`, - `I feel like I just smashed through a really stubborn boulder!` + "See? I'm proud of my rocking battle style!", + "Thanks! The battle gave me confidence that I may be able to beat my dad!", + "I feel like I just smashed through a really stubborn boulder!" ] }, [TrainerType.MORTY]: { @@ -915,42 +915,42 @@ export const trainerTypeDialogue = { $I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. $I see a shadow of the person who will make the Pokémon appear. $I believe that person is me! You're going to help me reach that level!`, - `Whether you choose to believe or not, mystic power does exist.`, - `You can bear witness to the fruits of my training.`, - `You must make your soul one with that of Pokémon. Can you do this?`, - `Say, do you want to be part of my training?` + "Whether you choose to believe or not, mystic power does exist.", + "You can bear witness to the fruits of my training.", + "You must make your soul one with that of Pokémon. Can you do this?", + "Say, do you want to be part of my training?" ], victory: [ - `I'm not good enough yet…`, + "I'm not good enough yet…", `I see… Your journey has taken you to far-away places and you have witnessed much more than I. $I envy you for that…`, - `How is this possible…`, + "How is this possible…", `I don't think our potentials are so different. $But you seem to have something more than that… So be it.`, - `Guess I need more training.`, - `That's a shame.` + "Guess I need more training.", + "That's a shame." ], defeat: [ - `I moved… one step ahead again.`, - `Fufufu…`, - `Wh-what?! It can't be! Even that wasn't enough?`, - `I feel like I just smashed through a really stubborn boulder!`, - `Ahahahah!`, - `I knew I would win!` + "I moved… one step ahead again.", + "Fufufu…", + "Wh-what?! It can't be! Even that wasn't enough?", + "I feel like I just smashed through a really stubborn boulder!", + "Ahahahah!", + "I knew I would win!" ] }, [TrainerType.CRISPIN]: { encounter: [ - `I wanna win, so that's exactly what I'll do!`, - `I battle because I wanna battle! And you know what? That's how it should be!` + "I wanna win, so that's exactly what I'll do!", + "I battle because I wanna battle! And you know what? That's how it should be!" ], victory: [ - `I wanted to win…but I lost!`, - `I lost…'cause I couldn't win!` + "I wanted to win…but I lost!", + "I lost…'cause I couldn't win!" ], defeat: [ - `Hey, wait a sec. Did I just win? I think I just won! Talk about satisfying!`, - `Wooo! That was amazing!` + "Hey, wait a sec. Did I just win? I think I just won! Talk about satisfying!", + "Wooo! That was amazing!" ] }, [TrainerType.AMARYS]: { @@ -960,21 +960,21 @@ export const trainerTypeDialogue = { ], victory: [ - `I am… not enough, I see.`, + "I am… not enough, I see.", ], defeat: [ - `Victory belongs to me. Well fought.`, + "Victory belongs to me. Well fought.", ] }, [TrainerType.LACEY]: { encounter: [ - `I'll be facing you with my usual party as a member of the Elite Four.`, + "I'll be facing you with my usual party as a member of the Elite Four.", ], victory: [ - `That was a great battle!`, + "That was a great battle!", ], defeat: [ - `Let's give your Pokémon a nice round of applause for their efforts!`, + "Let's give your Pokémon a nice round of applause for their efforts!", ] }, [TrainerType.DRAYTON]: { @@ -983,10 +983,10 @@ export const trainerTypeDialogue = { $I don't get why everyone doesn't just sit all the time. Standing up's tiring work!`, ], victory: [ - `Guess I should've expected that!`, + "Guess I should've expected that!", ], defeat: [ - `Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?`, + "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?", ] }, [TrainerType.RAMOS]: { @@ -995,10 +995,10 @@ export const trainerTypeDialogue = { $Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?`, ], victory: [ - `Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout.`, + "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout.", ], defeat: [ - `Hohoho… Indeed. Frail little blades o' grass'll break through even concrete.`, + "Hohoho… Indeed. Frail little blades o' grass'll break through even concrete.", ] }, [TrainerType.VIOLA]: { @@ -1006,16 +1006,16 @@ export const trainerTypeDialogue = { `Whether it's the tears of frustration that follow a loss or the blossoming of joy that comes with victory… $They're both great subjects for my camera! Fantastic! This'll be just fantastic! $Now come at me!`, - `My lens is always focused on victory--I won't let anything ruin this shot!` + "My lens is always focused on victory--I won't let anything ruin this shot!" ], victory: [ - `You and your Pokémon have shown me a whole new depth of field! Fantastic! Just fantastic!`, + "You and your Pokémon have shown me a whole new depth of field! Fantastic! Just fantastic!", `The world you see through a lens, and the world you see with a Pokémon by your side… $The same world can look entirely different depending on your view.` ], defeat: [ - `The photo from the moment of my victory will be a really winner, all right!`, - `Yes! I took some great photos!` + "The photo from the moment of my victory will be a really winner, all right!", + "Yes! I took some great photos!" ] }, [TrainerType.CANDICE]: { @@ -1026,66 +1026,66 @@ export const trainerTypeDialogue = { $I'll show you just what I mean. Get ready to lose!` ], victory: [ - `I must say, I'm warmed up to you! I might even admire you a little.`, + "I must say, I'm warmed up to you! I might even admire you a little.", `Wow! You're great! You've earned my respect! $I think your focus and will bowled us over totally. ` ], defeat: [ - `I sensed your will to win, but I don't lose!`, - `See? Candice's focus! My Pokémon's focus is great, too!` + "I sensed your will to win, but I don't lose!", + "See? Candice's focus! My Pokémon's focus is great, too!" ] }, [TrainerType.GARDENIA]: { encounter: [ - `You have a winning aura about you. So, anyway, this will be fun. Let's have our battle!`, + "You have a winning aura about you. So, anyway, this will be fun. Let's have our battle!", ], victory: [ - `Amazing! You're very good, aren't you?`, + "Amazing! You're very good, aren't you?", ], defeat: [ - `Yes! My Pokémon and I are perfectly good!`, + "Yes! My Pokémon and I are perfectly good!", ] }, [TrainerType.AARON]: { encounter: [ - `Ok! Let me take you on!`, + "Ok! Let me take you on!", ], victory: [ - `Battling is a deep and complex affair…`, + "Battling is a deep and complex affair…", ], defeat: [ - `Victory over an Elite Four member doesn't come easily.`, + "Victory over an Elite Four member doesn't come easily.", ] }, [TrainerType.CRESS]: { encounter: [ - `That is correct! It shall be I and my esteemed Water types that you must face in battle!`, + "That is correct! It shall be I and my esteemed Water types that you must face in battle!", ], victory: [ - `Lose? Me? I don't believe this.`, + "Lose? Me? I don't believe this.", ], defeat: [ - `This is the appropriate result when I'm your opponent.`, + "This is the appropriate result when I'm your opponent.", ] }, [TrainerType.ALLISTER]: { encounter: [ - `'M Allister.\nH-here… I go…`, + "'M Allister.\nH-here… I go…", ], victory: [ `I nearly lost my mask from the shock… That was… $Wow. I can see your skill for what it is.`, ], defeat: [ - `Th-that was ace!`, + "Th-that was ace!", ] }, [TrainerType.CLAY]: { encounter: [ - `Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!`, + "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!", ], victory: [ - `Man oh man… It feels good to go all out and still be defeated!`, + "Man oh man… It feels good to go all out and still be defeated!", ], defeat: [ `What's important is how ya react to losin'. @@ -1094,24 +1094,24 @@ export const trainerTypeDialogue = { }, [TrainerType.KOFU]: { encounter: [ - `I'mma serve you a full course o' Water-type Pokémon! Don't try to eat 'em, though!`, + "I'mma serve you a full course o' Water-type Pokémon! Don't try to eat 'em, though!", ], victory: [ - `Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!`, + "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!", ], defeat: [ - `You come back to see me again now, ya hear?`, + "You come back to see me again now, ya hear?", ] }, [TrainerType.TULIP]: { encounter: [ - `Allow me to put my skills to use to make your cute little Pokémon even more beautiful!`, + "Allow me to put my skills to use to make your cute little Pokémon even more beautiful!", ], victory: [ - `Your strength has a magic to it that cannot be washed away.`, + "Your strength has a magic to it that cannot be washed away.", ], defeat: [ - `You know, in my line of work, people who lack talent in one area or the other often fade away quickly—never to be heard of again.`, + "You know, in my line of work, people who lack talent in one area or the other often fade away quickly—never to be heard of again.", ] }, [TrainerType.SIDNEY]: { @@ -1121,10 +1121,10 @@ export const trainerTypeDialogue = { $You and me, let's enjoy a battle that can only be staged here!`, ], victory: [ - `Well, how do you like that? I lost! Eh, it was fun, so it doesn't matter.`, + "Well, how do you like that? I lost! Eh, it was fun, so it doesn't matter.", ], defeat: [ - `No hard feelings, alright?`, + "No hard feelings, alright?", ] }, [TrainerType.PHOEBE]: { @@ -1134,10 +1134,10 @@ export const trainerTypeDialogue = { $So, come on, just try and see if you can even inflict damage on my Pokémon!`, ], victory: [ - `Oh, darn. I've gone and lost.`, + "Oh, darn. I've gone and lost.", ], defeat: [ - `I look forward to battling you again sometime!`, + "I look forward to battling you again sometime!", ] }, [TrainerType.GLACIA]: { @@ -1151,7 +1151,7 @@ export const trainerTypeDialogue = { $It's no surprise that my icy skills failed to harm you.`, ], defeat: [ - `A fiercely passionate battle, indeed.`, + "A fiercely passionate battle, indeed.", ] }, [TrainerType.DRAKE]: { @@ -1160,10 +1160,10 @@ export const trainerTypeDialogue = { $If you don't, then you will never prevail over me!`, ], victory: [ - `Superb, it should be said.`, + "Superb, it should be said.", ], defeat: [ - `I gave my all for that battle!`, + "I gave my all for that battle!", ] }, [TrainerType.WALLACE]: { @@ -1177,7 +1177,7 @@ export const trainerTypeDialogue = { $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, ], defeat: [ - `A grand illusion!`, + "A grand illusion!", ] }, [TrainerType.LORELEI]: { @@ -1186,10 +1186,10 @@ export const trainerTypeDialogue = { $Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?`, ], victory: [ - `How dare you!`, + "How dare you!", ], defeat: [ - `There's nothing you can do once you're frozen.`, + "There's nothing you can do once you're frozen.", ] }, [TrainerType.WILL]: { @@ -1198,10 +1198,10 @@ export const trainerTypeDialogue = { $I can only keep getting better! Losing is not an option!`, ], victory: [ - `I… I can't… believe it…`, + "I… I can't… believe it…", ], defeat: [ - `That was close. I wonder what it is that you lack.`, + "That was close. I wonder what it is that you lack.", ] }, [TrainerType.MALVA]: { @@ -1210,21 +1210,21 @@ export const trainerTypeDialogue = { $I'm burning up with my hatred for you, runt!`, ], victory: [ - `What news… So a new challenger has defeated Malva!`, + "What news… So a new challenger has defeated Malva!", ], defeat: [ - `I am delighted! Yes, delighted that I could squash you beneath my heel.`, + "I am delighted! Yes, delighted that I could squash you beneath my heel.", ] }, [TrainerType.HALA]: { encounter: [ - `Old Hala is here to make you holler!`, + "Old Hala is here to make you holler!", ], victory: [ - `I could feel the power you gained on your journey.`, + "I could feel the power you gained on your journey.", ], defeat: [ - `Haha! What a delightful battle!`, + "Haha! What a delightful battle!", ] }, [TrainerType.MOLAYNE]: { @@ -1233,60 +1233,60 @@ export const trainerTypeDialogue = { $My strength is like that of a supernova!`, ], victory: [ - `I certainly found an interesting Trainer to face!`, + "I certainly found an interesting Trainer to face!", ], defeat: [ - `Ahaha. What an interesting battle.`, + "Ahaha. What an interesting battle.", ] }, [TrainerType.RIKA]: { encounter: [ - `I'd say I'll go easy on you, but… I'd be lying! Think fast!`, + "I'd say I'll go easy on you, but… I'd be lying! Think fast!", ], victory: [ - `Not bad, kiddo.`, + "Not bad, kiddo.", ], defeat: [ - `Nahahaha! You really are something else, kiddo!`, + "Nahahaha! You really are something else, kiddo!", ] }, [TrainerType.BRUNO]: { encounter: [ - `We will grind you down with our superior power! Hoo hah!`, + "We will grind you down with our superior power! Hoo hah!", ], victory: [ - `Why? How could I lose?`, + "Why? How could I lose?", ], defeat: [ - `You can challenge me all you like, but the results will never change!`, + "You can challenge me all you like, but the results will never change!", ] }, [TrainerType.BUGSY]: { encounter: [ - `Let me demonstrate what I've learned from my studies.`, + "Let me demonstrate what I've learned from my studies.", ], victory: [ `Whoa, amazing! You're an expert on Pokémon! $My research isn't complete yet. OK, you win.`, ], defeat: [ - `Thanks! Thanks to our battle, I was also able to make progress in my research!`, + "Thanks! Thanks to our battle, I was also able to make progress in my research!", ] }, [TrainerType.KOGA]: { encounter: [ - `Fwahahahaha! Pokémon are not merely about brute force--you shall see soon enough!`, + "Fwahahahaha! Pokémon are not merely about brute force--you shall see soon enough!", ], victory: [ - `Ah! You've proven your worth!`, + "Ah! You've proven your worth!", ], defeat: [ - `Have you learned to fear the techniques of the ninja?`, + "Have you learned to fear the techniques of the ninja?", ] }, [TrainerType.BERTHA]: { encounter: [ - `Well, would you show this old lady how much you've learned?`, + "Well, would you show this old lady how much you've learned?", ], victory: [ `Well! Dear child, I must say, that was most impressive. @@ -1294,26 +1294,26 @@ export const trainerTypeDialogue = { $Even though I've lost, I find myself with this silly grin!`, ], defeat: [ - `Hahahahah! Looks like this old lady won!`, + "Hahahahah! Looks like this old lady won!", ] }, [TrainerType.LENORA]: { encounter: [ - `Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!`, + "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!", ], victory: [ - `My theory about you was correct. You're more than just talented… You're motivated! I salute you!`, + "My theory about you was correct. You're more than just talented… You're motivated! I salute you!", ], defeat: [ - `Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!`, + "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!", ] }, [TrainerType.SIEBOLD]: { encounter: [ - `As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!`, + "As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!", ], victory: [ - `I shall store my memory of you and your Pokémon forever away within my heart.`, + "I shall store my memory of you and your Pokémon forever away within my heart.", ], defeat: [ `Our Pokémon battle was like food for my soul. It shall keep me going. @@ -1322,32 +1322,32 @@ export const trainerTypeDialogue = { }, [TrainerType.ROXIE]: { encounter: [ - `Get ready! I'm gonna knock some sense outta ya!`, + "Get ready! I'm gonna knock some sense outta ya!", ], victory: [ - `Wild! Your reason's already more toxic than mine!`, + "Wild! Your reason's already more toxic than mine!", ], defeat: [ - `Hey, c'mon! Get serious! You gotta put more out there!`, + "Hey, c'mon! Get serious! You gotta put more out there!", ] }, [TrainerType.OLIVIA]: { encounter: [ - `No introduction needed here. Time to battle me, Olivia!`, + "No introduction needed here. Time to battle me, Olivia!", ], victory: [ - `Really lovely… Both you and your Pokémon…`, + "Really lovely… Both you and your Pokémon…", ], defeat: [ - `Mmm-hmm.`, + "Mmm-hmm.", ] }, [TrainerType.POPPY]: { encounter: [ - `Oooh! Do you wanna have a Pokémon battle with me?`, + "Oooh! Do you wanna have a Pokémon battle with me?", ], victory: [ - `Uagh?! Mmmuuuggghhh…`, + "Uagh?! Mmmuuuggghhh…", ], defeat: [ `Yaaay! I did it! I de-feet-ed you! You can come for… For… An avenge match? @@ -1356,35 +1356,35 @@ export const trainerTypeDialogue = { }, [TrainerType.AGATHA]: { encounter: [ - `Pokémon are for battling! I'll show you how a real Trainer battles!`, + "Pokémon are for battling! I'll show you how a real Trainer battles!", ], victory: [ - `Oh my! You're something special, child!`, + "Oh my! You're something special, child!", ], defeat: [ - `Bahaha. That's how a proper battle's done!`, + "Bahaha. That's how a proper battle's done!", ] }, [TrainerType.FLINT]: { encounter: [ - `Hope you're warmed up, cause here comes the Big Bang!`, + "Hope you're warmed up, cause here comes the Big Bang!", ], victory: [ - `Incredible! Your moves are so hot, they make mine look lukewarm!`, + "Incredible! Your moves are so hot, they make mine look lukewarm!", ], defeat: [ - `Huh? Is that it? I think you need a bit more passion.`, + "Huh? Is that it? I think you need a bit more passion.", ] }, [TrainerType.GRIMSLEY]: { encounter: [ - `The winner takes everything, and there's nothing left for the loser.`, + "The winner takes everything, and there's nothing left for the loser.", ], victory: [ - `When one loses, they lose everything… The next thing I'll look for will be victory, too!`, + "When one loses, they lose everything… The next thing I'll look for will be victory, too!", ], defeat: [ - `If somebody wins, the person who fought against that person will lose.`, + "If somebody wins, the person who fought against that person will lose.", ] }, [TrainerType.CAITLIN]: { @@ -1395,10 +1395,10 @@ export const trainerTypeDialogue = { $Please unleash your power to the fullest!`, ], victory: [ - `My Pokémon and I learned so much! I offer you my thanks.`, + "My Pokémon and I learned so much! I offer you my thanks.", ], defeat: [ - `I aspire to claim victory with elegance and grace.`, + "I aspire to claim victory with elegance and grace.", ] }, [TrainerType.DIANTHA]: { @@ -1407,10 +1407,10 @@ export const trainerTypeDialogue = { $Honestly, it just fills me up with energy I need to keep facing each new day! It does!`, ], victory: [ - `Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…`, + "Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…", ], defeat: [ - `Oh, fantastic! What did you think? My team was pretty cool, right?`, + "Oh, fantastic! What did you think? My team was pretty cool, right?", ] }, [TrainerType.WIKSTROM]: { @@ -1419,7 +1419,7 @@ export const trainerTypeDialogue = { $Let the battle begin! En garde!`, ], victory: [ - `Glorious! The trust that you share with your honorable Pokémon surpasses even mine!`, + "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!", ], defeat: [ `What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! @@ -1428,13 +1428,13 @@ export const trainerTypeDialogue = { }, [TrainerType.ACEROLA]: { encounter: [ - `Battling is just plain fun! Come on, I can take you!`, + "Battling is just plain fun! Come on, I can take you!", ], victory: [ - `I'm… I'm speechless! How did you do it?!`, + "I'm… I'm speechless! How did you do it?!", ], defeat: [ - `Ehaha! What an amazing victory!`, + "Ehaha! What an amazing victory!", ] }, [TrainerType.LARRY_ELITE]: { @@ -1443,41 +1443,41 @@ export const trainerTypeDialogue = { $I serve as a member of the Elite Four too, yes… Unfortunately for me.`, ], victory: [ - `Well, that took the wind from under our wings…`, + "Well, that took the wind from under our wings…", ], defeat: [ - `It's time for a meeting with the boss.`, + "It's time for a meeting with the boss.", ] }, [TrainerType.LANCE]: { encounter: [ - `I've been waiting for you. Allow me to test your skill.`, - `I thought that you would be able to get this far. Let's get this started.` + "I've been waiting for you. Allow me to test your skill.", + "I thought that you would be able to get this far. Let's get this started." ], victory: [ - `You got me. You are magnificent!`, - `I never expected another trainer to beat me… I'm surprised.` + "You got me. You are magnificent!", + "I never expected another trainer to beat me… I'm surprised." ], defeat: [ - `That was close. Want to try again?`, - `It's not that you are weak. Don't let it bother you.` + "That was close. Want to try again?", + "It's not that you are weak. Don't let it bother you." ] }, [TrainerType.KAREN]: { encounter: [ - `I am Karen. Would you care for a showdown with my Dark-type Pokémon?`, - `I am unlike those you've already met.`, - `You've assembled a charming team. Our battle should be a good one.` + "I am Karen. Would you care for a showdown with my Dark-type Pokémon?", + "I am unlike those you've already met.", + "You've assembled a charming team. Our battle should be a good one." ], victory: [ - `No! I can't win. How did you become so strong?`, - `I will not stray from my chosen path.`, - `The Champion is looking forward to meeting you.` + "No! I can't win. How did you become so strong?", + "I will not stray from my chosen path.", + "The Champion is looking forward to meeting you." ], defeat: [ - `That's about what I expected.`, - `Well, that was relatively entertaining.`, - `Come visit me anytime.` + "That's about what I expected.", + "Well, that was relatively entertaining.", + "Come visit me anytime." ] }, [TrainerType.MILO]: { @@ -1487,10 +1487,10 @@ export const trainerTypeDialogue = { $I'll have to Dynamax my Pokémon if I want to win!`, ], victory: [ - `The power of Grass has wilted… What an incredible Challenger!`, + "The power of Grass has wilted… What an incredible Challenger!", ], defeat: [ - `This'll really leave you in shock and awe.`, + "This'll really leave you in shock and awe.", ] }, [TrainerType.LUCIAN]: { @@ -1501,10 +1501,10 @@ export const trainerTypeDialogue = { $Let me see if you'll achieve as much glory as the hero of my book!,` ], victory: [ - `I see… It appears you've put me in checkmate.`, + "I see… It appears you've put me in checkmate.", ], defeat: [ - `I have a reputation to uphold.`, + "I have a reputation to uphold.", ] }, [TrainerType.DRASNA]: { @@ -1513,88 +1513,88 @@ export const trainerTypeDialogue = { $That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!` ], victory: [ - `Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!`, + "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!", ], defeat: [ - `How can this be?`, + "How can this be?", ] }, [TrainerType.KAHILI]: { encounter: [ - `So, here you are… Why don't we see who the winds favor today, you… Or me?` + "So, here you are… Why don't we see who the winds favor today, you… Or me?" ], victory: [ - `It's frustrating to me as a member of the Elite Four, but it seems your strength is the real deal.`, + "It's frustrating to me as a member of the Elite Four, but it seems your strength is the real deal.", ], defeat: [ - `That was an ace!`, + "That was an ace!", ] }, [TrainerType.HASSEL]: { encounter: [ - `Prepare to learn firsthand how the fiery breath of ferocious battle feels!` + "Prepare to learn firsthand how the fiery breath of ferocious battle feels!" ], victory: [ `Fortune smiled on me this time, but… $Judging from how the match went, who knows if I will be so lucky next time.`, ], defeat: [ - `That was an ace!`, + "That was an ace!", ] }, [TrainerType.BLUE]: { encounter: [ - `You must be pretty good to get this far.` + "You must be pretty good to get this far." ], victory: [ - `I've only lost to him and now to you… Him? Hee, hee…`, + "I've only lost to him and now to you… Him? Hee, hee…", ], defeat: [ - `See? My power is what got me here.`, + "See? My power is what got me here.", ] }, [TrainerType.PIERS]: { encounter: [ - `Get ready for a mosh pit with me and my party! Spikemuth, it's time to rock!` + "Get ready for a mosh pit with me and my party! Spikemuth, it's time to rock!" ], victory: [ - `Me an' my team gave it our best. Let's meet up again for a battle some time…`, + "Me an' my team gave it our best. Let's meet up again for a battle some time…", ], defeat: [ - `My throat's ragged from shoutin'… But 'at was an excitin' battle!`, + "My throat's ragged from shoutin'… But 'at was an excitin' battle!", ] }, [TrainerType.RED]: { encounter: [ - `…!` + "…!" ], victory: [ - `…?`, + "…?", ], defeat: [ - `…!`, + "…!", ] }, [TrainerType.JASMINE]: { encounter: [ - `Oh… Your Pokémon are impressive. I think I will enjoy this.` + "Oh… Your Pokémon are impressive. I think I will enjoy this." ], victory: [ - `You are truly strong. I'll have to try much harder, too.`, + "You are truly strong. I'll have to try much harder, too.", ], defeat: [ - `I never expected to win.`, + "I never expected to win.", ] }, [TrainerType.LANCE_CHAMPION]: { encounter: [ - `I am still the Champion. I won't hold anything back.`, + "I am still the Champion. I won't hold anything back.", ], victory: [ - `This is the emergence of a new Champion.`, + "This is the emergence of a new Champion.", ], defeat: [ - `I successfully defended my Championship.`, + "I successfully defended my Championship.", ] }, [TrainerType.STEVEN]: { @@ -1606,21 +1606,21 @@ export const trainerTypeDialogue = { $My Pokémon and I will respond in turn with all that we know!`, ], victory: [ - `So I, the Champion, fall in defeat…`, + "So I, the Champion, fall in defeat…", ], defeat: [ - `That was time well spent! Thank you!`, + "That was time well spent! Thank you!", ] }, [TrainerType.CYNTHIA]: { encounter: [ - `I, Cynthia, accept your challenge! There won't be any letup from me!`, + "I, Cynthia, accept your challenge! There won't be any letup from me!", ], victory: [ - `No matter how fun the battle is, it will always end sometime…`, + "No matter how fun the battle is, it will always end sometime…", ], defeat: [ - `Even if you lose, never lose your love of Pokémon.`, + "Even if you lose, never lose your love of Pokémon.", ] }, [TrainerType.IRIS]: { @@ -1633,10 +1633,10 @@ export const trainerTypeDialogue = { $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, ], victory: [ - `Aghhhh… I did my best, but we lost…`, + "Aghhhh… I did my best, but we lost…", ], defeat: [ - `Yay! We won!`, + "Yay! We won!", ] }, [TrainerType.HAU]: { @@ -1645,10 +1645,10 @@ export const trainerTypeDialogue = { $Let's test it out!`, ], victory: [ - `That was awesome! I think I kinda understand your vibe a little better now!`, + "That was awesome! I think I kinda understand your vibe a little better now!", ], defeat: [ - `Ma-an, that was some kinda battle!`, + "Ma-an, that was some kinda battle!", ] }, [TrainerType.GEETA]: { @@ -1657,26 +1657,26 @@ export const trainerTypeDialogue = { $Come now… Show me the fruits of your training.`, ], victory: [ - `I eagerly await news of all your achievements!`, + "I eagerly await news of all your achievements!", ], defeat: [ - `What's the matter? This isn't all, is it?`, + "What's the matter? This isn't all, is it?", ] }, [TrainerType.NEMONA]: { encounter: [ - `Yesss! I'm so psyched! Time for us to let loose!`, + "Yesss! I'm so psyched! Time for us to let loose!", ], victory: [ - `Well, that stinks, but I still had fun! I'll getcha next time!`, + "Well, that stinks, but I still had fun! I'll getcha next time!", ], defeat: [ - `Well, that was a great battle! Fruitful for sure.`, + "Well, that was a great battle! Fruitful for sure.", ] }, [TrainerType.LEON]: { encounter: [ - `We're gonna have an absolutely champion time!`, + "We're gonna have an absolutely champion time!", ], victory: [ `My time as Champion is over… @@ -1684,62 +1684,62 @@ export const trainerTypeDialogue = { $Thank you for the greatest battle I've ever had!`, ], defeat: [ - `An absolute champion time, that was!`, + "An absolute champion time, that was!", ] }, [TrainerType.WHITNEY]: { encounter: [ - `Hey! Don't you think Pokémon are, like, super cute?`, + "Hey! Don't you think Pokémon are, like, super cute?", ], victory: [ - `Waaah! Waaah! You're so mean!`, + "Waaah! Waaah! You're so mean!", ], defeat: [ - `And that's that!`, + "And that's that!", ] }, [TrainerType.CHUCK]: { encounter: [ - `Hah! You want to challenge me? Are you brave or just ignorant?`, + "Hah! You want to challenge me? Are you brave or just ignorant?", ], victory: [ - `You're strong! Would you please make me your apprentice?`, + "You're strong! Would you please make me your apprentice?", ], defeat: [ - `There. Do you realize how much more powerful I am than you?`, + "There. Do you realize how much more powerful I am than you?", ] }, [TrainerType.KATY]: { encounter: [ - `Don't let your guard down unless you would like to find yourself knocked off your feet!`, + "Don't let your guard down unless you would like to find yourself knocked off your feet!", ], victory: [ - `All of my sweet little Pokémon dropped like flies!`, + "All of my sweet little Pokémon dropped like flies!", ], defeat: [ - `Eat up, my cute little Vivillon!`, + "Eat up, my cute little Vivillon!", ] }, [TrainerType.PRYCE]: { encounter: [ - `Youth alone does not ensure victory! Experience is what counts.`, + "Youth alone does not ensure victory! Experience is what counts.", ], victory: [ - `Outstanding! That was perfect. Try not to forget what you feel now.`, + "Outstanding! That was perfect. Try not to forget what you feel now.", ], defeat: [ - `Just as I envisioned.`, + "Just as I envisioned.", ] }, [TrainerType.CLAIR]: { encounter: [ - `Do you know who I am? And you still dare to challenge me?`, + "Do you know who I am? And you still dare to challenge me?", ], victory: [ - `I wonder how far you can get with your skill level. This should be fascinating.`, + "I wonder how far you can get with your skill level. This should be fascinating.", ], defeat: [ - `That's that.`, + "That's that.", ] }, [TrainerType.MAYLENE]: { @@ -1748,10 +1748,10 @@ export const trainerTypeDialogue = { $Please prepare yourself for battle!`, ], victory: [ - `I admit defeat…`, + "I admit defeat…", ], defeat: [ - `That was awesome.`, + "That was awesome.", ] }, [TrainerType.FANTINA]: { @@ -1760,10 +1760,10 @@ export const trainerTypeDialogue = { $That is what the Gym Leader of Hearthome does, non?`, ], victory: [ - `You are so fantastically strong. I know why I have lost.`, + "You are so fantastically strong. I know why I have lost.", ], defeat: [ - `I am so, so, very happy!`, + "I am so, so, very happy!", ] }, [TrainerType.BYRON]: { @@ -1773,21 +1773,21 @@ export const trainerTypeDialogue = { $So, as a wall for young people, I'll take your challenge!`, ], victory: [ - `Hmm! My sturdy Pokémon--defeated!`, + "Hmm! My sturdy Pokémon--defeated!", ], defeat: [ - `Gwahahaha! How were my sturdy Pokémon?!`, + "Gwahahaha! How were my sturdy Pokémon?!", ] }, [TrainerType.OLYMPIA]: { encounter: [ - `An ancient custom deciding one's destiny. The battle begins!`, + "An ancient custom deciding one's destiny. The battle begins!", ], victory: [ - `Create your own path. Let nothing get in your way. Your fate, your future.`, + "Create your own path. Let nothing get in your way. Your fate, your future.", ], defeat: [ - `Our path is clear now.`, + "Our path is clear now.", ] }, [TrainerType.VOLKNER]: { @@ -1813,11 +1813,11 @@ export const trainerTypeDialogue = { $Well now… Let's get right to it!` ], victory: [ - `Is it over? Has my muse abandoned me?`, - `Hmm… It's over! You're incredible!` + "Is it over? Has my muse abandoned me?", + "Hmm… It's over! You're incredible!" ], defeat: [ - `Wow… It's beautiful somehow, isn't it…`, + "Wow… It's beautiful somehow, isn't it…", `Sometimes I hear people say something was an ugly win. $I think if you're trying your best, any win is beautiful.` ] @@ -1828,10 +1828,10 @@ export const trainerTypeDialogue = { $I want to feel the sensation, so now my beloved Pokémon are going to make your head spin!`, ], victory: [ - `I meant to make your head spin, but you shocked me instead.`, + "I meant to make your head spin, but you shocked me instead.", ], defeat: [ - `That was unsatisfying somehow… Will you give it your all next time?`, + "That was unsatisfying somehow… Will you give it your all next time?", ] }, [TrainerType.SKYLA]: { @@ -1841,10 +1841,10 @@ export const trainerTypeDialogue = { $So, how about you and I have some fun?`, ], victory: [ - `Being your opponent in battle is a new source of strength to me. Thank you!`, + "Being your opponent in battle is a new source of strength to me. Thank you!", ], defeat: [ - `Win or lose, you always gain something from a battle, right?`, + "Win or lose, you always gain something from a battle, right?", ] }, [TrainerType.BRYCEN]: { @@ -1853,10 +1853,10 @@ export const trainerTypeDialogue = { $Receiving their support makes you stronger. I'll show you this power!`, ], victory: [ - `The wonderful combination of you and your Pokémon! What a beautiful friendship!`, + "The wonderful combination of you and your Pokémon! What a beautiful friendship!", ], defeat: [ - `Extreme conditions really test you and train you!`, + "Extreme conditions really test you and train you!", ] }, [TrainerType.DRAYDEN]: { @@ -1865,10 +1865,10 @@ export const trainerTypeDialogue = { $Let's battle with everything we have: your skill, my experience, and the love we've raised our Pokémon with!`, ], victory: [ - `This intense feeling that floods me after a defeat… I don't know how to describe it.`, + "This intense feeling that floods me after a defeat… I don't know how to describe it.", ], defeat: [ - `Harrumph! I know your ability is greater than that!`, + "Harrumph! I know your ability is greater than that!", ] }, [TrainerType.GRANT]: { @@ -1877,7 +1877,7 @@ export const trainerTypeDialogue = { $That by surpassing one another, we find a way to even greater heights.`, ], victory: [ - `You are a wall that I am unable to surmount!`, + "You are a wall that I am unable to surmount!", ], defeat: [ `Do not give up. @@ -1887,24 +1887,24 @@ export const trainerTypeDialogue = { }, [TrainerType.KORRINA]: { encounter: [ - `Time for Lady Korrina's big appearance!`, + "Time for Lady Korrina's big appearance!", ], victory: [ - `It's your very being that allows your Pokémon to evolve!`, + "It's your very being that allows your Pokémon to evolve!", ], defeat: [ - `What an explosive battle!`, + "What an explosive battle!", ] }, [TrainerType.CLEMONT]: { encounter: [ - `Oh! I'm glad that we got to meet!`, + "Oh! I'm glad that we got to meet!", ], victory: [ - `Your passion for battle inspires me!`, + "Your passion for battle inspires me!", ], defeat: [ - `Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!`, + "Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!", ] }, [TrainerType.VALERIE]: { @@ -1914,10 +1914,10 @@ export const trainerTypeDialogue = { $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, ], victory: [ - `I hope that you will find things worth smiling about tomorrow…`, + "I hope that you will find things worth smiling about tomorrow…", ], defeat: [ - `Oh goodness, what a pity…`, + "Oh goodness, what a pity…", ] }, [TrainerType.WULFRIC]: { @@ -1927,10 +1927,10 @@ export const trainerTypeDialogue = { $Who cares about the grandstanding? Let's get to battling!`, ], victory: [ - `Outstanding! I'm tough as an iceberg, but you smashed me through and through!`, + "Outstanding! I'm tough as an iceberg, but you smashed me through and through!", ], defeat: [ - `Tussle with me and this is what happens!`, + "Tussle with me and this is what happens!", ] }, [TrainerType.KABU]: { @@ -1940,10 +1940,10 @@ export const trainerTypeDialogue = { $In the end, the match is decided by which side is able to unleash their true potential.`, ], victory: [ - `I'm glad I could battle you today!`, + "I'm glad I could battle you today!", ], defeat: [ - `That's a great way for me to feel my own growth!`, + "That's a great way for me to feel my own growth!", ] }, [TrainerType.BEA]: { @@ -1952,43 +1952,43 @@ export const trainerTypeDialogue = { $I think I'll just test that out, shall I?`, ], victory: [ - `I felt the fighting spirit of your Pokémon as you led them in battle.`, + "I felt the fighting spirit of your Pokémon as you led them in battle.", ], defeat: [ - `That was the best sort of match anyone could ever hope for.`, + "That was the best sort of match anyone could ever hope for.", ] }, [TrainerType.OPAL]: { encounter: [ - `Let me have a look at how you and your partner Pokémon behave!`, + "Let me have a look at how you and your partner Pokémon behave!", ], victory: [ - `Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.`, + "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.", ], defeat: [ - `Too bad for you, I guess.`, + "Too bad for you, I guess.", ] }, [TrainerType.BEDE]: { encounter: [ - `I suppose I should prove beyond doubt just how pathetic you are and how strong I am.`, + "I suppose I should prove beyond doubt just how pathetic you are and how strong I am.", ], victory: [ - `I see… Well, that's fine. I wasn't really trying all that hard anyway.`, + "I see… Well, that's fine. I wasn't really trying all that hard anyway.", ], defeat: [ - `Not a bad job, I suppose.`, + "Not a bad job, I suppose.", ] }, [TrainerType.GORDIE]: { encounter: [ - `So, let's get this over with.`, + "So, let's get this over with.", ], victory: [ - `I just want to climb into a hole… Well, I guess it'd be more like falling from here.`, + "I just want to climb into a hole… Well, I guess it'd be more like falling from here.", ], defeat: [ - `Battle like you always do, victory will follow!`, + "Battle like you always do, victory will follow!", ] }, [TrainerType.MARNIE]: { @@ -1997,15 +1997,15 @@ export const trainerTypeDialogue = { $So don't take it personal when I kick your butt!`, ], victory: [ - `OK, so I lost… But I got to see a lot of the good points of you and your Pokémon!`, + "OK, so I lost… But I got to see a lot of the good points of you and your Pokémon!", ], defeat: [ - `Hope you enjoyed our battle tactics.`, + "Hope you enjoyed our battle tactics.", ] }, [TrainerType.RAIHAN]: { encounter: [ - `I'm going to defeat the Champion, win the whole tournament, and prove to the world just how strong the great Raihan really is!`, + "I'm going to defeat the Champion, win the whole tournament, and prove to the world just how strong the great Raihan really is!", ], victory: [ `I look this good even when I lose. @@ -2013,18 +2013,18 @@ export const trainerTypeDialogue = { $Guess it's time for another selfie!`, ], defeat: [ - `Let's take a selfie to remember this.`, + "Let's take a selfie to remember this.", ] }, [TrainerType.BRASSIUS]: { encounter: [ - `I assume you are ready? Let our collaborative work of art begin!`, + "I assume you are ready? Let our collaborative work of art begin!", ], victory: [ - `Ahhh…vant-garde!`, + "Ahhh…vant-garde!", ], defeat: [ - `I will begin on a new piece at once!`, + "I will begin on a new piece at once!", ] }, [TrainerType.IONO]: { @@ -2035,43 +2035,43 @@ export const trainerTypeDialogue = { $I 'unno! Let's find out together!`, ], victory: [ - `You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!`, + "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!", ], defeat: [ - `Your eyeballs are MINE!`, + "Your eyeballs are MINE!", ] }, [TrainerType.LARRY]: { encounter: [ - `When all's said and done, simplicity is strongest.`, + "When all's said and done, simplicity is strongest.", ], victory: [ - `A serving of defeat, huh?`, + "A serving of defeat, huh?", ], defeat: [ - `I'll call it a day.`, + "I'll call it a day.", ] }, [TrainerType.RYME]: { encounter: [ - `Come on, baby! Rattle me down to the bone!`, + "Come on, baby! Rattle me down to the bone!", ], victory: [ - `You're cool, my friend—you move my SOUL!`, + "You're cool, my friend—you move my SOUL!", ], defeat: [ - `Later, baby!`, + "Later, baby!", ] }, [TrainerType.GRUSHA]: { encounter: [ - `All I need to do is make sure the power of my Pokémon chills you to the bone!`, + "All I need to do is make sure the power of my Pokémon chills you to the bone!", ], victory: [ - `Your burning passion… I kinda like it, to be honest.`, + "Your burning passion… I kinda like it, to be honest.", ], defeat: [ - `Things didn't heat up for you.`, + "Things didn't heat up for you.", ] }, [TrainerType.RIVAL]: [ @@ -2137,7 +2137,7 @@ export const trainerTypeDialogue = { $@c{smile_wave}Keep at it!` ], defeat: [ - `It's OK to lose sometimes…` + "It's OK to lose sometimes…" ] } ], @@ -2152,7 +2152,7 @@ export const trainerTypeDialogue = { $@c{serious_mopen_fists}If so, prove it to me.` ], victory: [ - `@c{angry_mhalf}This is ridiculous… I've hardly stopped training…\nHow are we still so far apart?` + "@c{angry_mhalf}This is ridiculous… I've hardly stopped training…\nHow are we still so far apart?" ] }, { @@ -2163,10 +2163,10 @@ export const trainerTypeDialogue = { $@c{smile}And when you do, I'll be there for you like always.\n@c{angry_mopen}Now, let me show you how strong I've become!` ], victory: [ - `@c{shock}After all that… it wasn't enough…?\nYou'll never come back at this rate…` + "@c{shock}After all that… it wasn't enough…?\nYou'll never come back at this rate…" ], defeat: [ - `You gave it your best, now let's go home.` + "You gave it your best, now let's go home." ] } ], @@ -2183,7 +2183,7 @@ export const trainerTypeDialogue = { $@c{serious_mopen_fists}Prepare yourself.` ], victory: [ - `@c{neutral}What…@d{64} What are you?` + "@c{neutral}What…@d{64} What are you?" ] }, { @@ -2198,33 +2198,33 @@ export const trainerTypeDialogue = { $@c{angry_mopen}Prepare yourself.` ], victory: [ - `@c{neutral}What…@d{64} What are you?` + "@c{neutral}What…@d{64} What are you?" ], defeat: [ - `$@c{smile}You should be proud of how far you made it.` + "$@c{smile}You should be proud of how far you made it." ] } ], [TrainerType.RIVAL_5]: [ { encounter: [ - `@c{neutral}…` + "@c{neutral}…" ], victory: [ - `@c{neutral}…` + "@c{neutral}…" ] }, { encounter: [ - `@c{neutral}…` + "@c{neutral}…" ], victory: [ - `@c{neutral}…` + "@c{neutral}…" ] }, { defeat: [ - `$@c{smile_ehalf}…` + "$@c{smile_ehalf}…" ] } ], @@ -2288,7 +2288,7 @@ export const battleSpecDialogue = { $We begin.`, firstStageWin: `I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back. $Do not disappoint me.`, - secondStageWin: `…Magnificent.` + secondStageWin: "…Magnificent." } }; @@ -2309,28 +2309,32 @@ export const miscDialogue = { $@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place. $Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?` ] -} +}; export function getCharVariantFromDialogue(message: string): string { const variantMatch = /@c\{(.*?)\}/.exec(message); - if (variantMatch) + if (variantMatch) { return variantMatch[1]; - return 'neutral'; + } + return "neutral"; } export function initTrainerTypeDialogue(): void { const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType); - for (let trainerType of trainerTypes) { + for (const trainerType of trainerTypes) { const messages = trainerTypeDialogue[trainerType]; - const messageTypes = [ 'encounter', 'victory', 'defeat' ]; - for (let messageType of messageTypes) { - if (Array.isArray(messages)) { - if (messages[0][messageType]) - trainerConfigs[trainerType][`${messageType}Messages`] = messages[0][messageType]; - if (messages.length > 1) - trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = messages[1][messageType]; - } else - trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType]; + const messageTypes = [ "encounter", "victory", "defeat" ]; + for (const messageType of messageTypes) { + if (Array.isArray(messages)) { + if (messages[0][messageType]) { + trainerConfigs[trainerType][`${messageType}Messages`] = messages[0][messageType]; + } + if (messages.length > 1) { + trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = messages[1][messageType]; + } + } else { + trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType]; } + } } -} \ No newline at end of file +} diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts index 4a3ffa4ad223..a88dd32a0b7e 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -576,37 +576,39 @@ export const speciesEggMoves = { }; function parseEggMoves(content: string): void { - let output = ''; + let output = ""; const speciesNames = Utils.getEnumKeys(Species); const speciesValues = Utils.getEnumValues(Species); const lines = content.split(/\n/g); lines.forEach((line, l) => { - const cols = line.split(',').slice(0, 5); - const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, '').toLowerCase()); - const enumSpeciesName = cols[0].toUpperCase().replace(/[ -]/g, '_'); + const cols = line.split(",").slice(0, 5); + const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, "").toLowerCase()); + const enumSpeciesName = cols[0].toUpperCase().replace(/[ -]/g, "_"); const species = speciesValues[speciesNames.findIndex(s => s === enumSpeciesName)]; - let eggMoves: Moves[] = []; + const eggMoves: Moves[] = []; for (let m = 0; m < 4; m++) { const moveName = cols[m + 1].trim(); - const moveIndex = moveName !== 'N/A' ? moveNames.findIndex(mn => mn === moveName.toLowerCase()) : -1; + const moveIndex = moveName !== "N/A" ? moveNames.findIndex(mn => mn === moveName.toLowerCase()) : -1; eggMoves.push(moveIndex > -1 ? moveIndex as Moves : Moves.NONE); - if (moveIndex === -1) - console.warn(moveName, 'could not be parsed'); + if (moveIndex === -1) { + console.warn(moveName, "could not be parsed"); + } } - if (eggMoves.find(m => m !== Moves.NONE)) - output += `[Species.${Species[species]}]: [ ${eggMoves.map(m => `Moves.${Moves[m]}`).join(', ')} ],\n`; + if (eggMoves.find(m => m !== Moves.NONE)) { + output += `[Species.${Species[species]}]: [ ${eggMoves.map(m => `Moves.${Moves[m]}`).join(", ")} ],\n`; + } }); console.log(output); } -const eggMovesStr = ``; +const eggMovesStr = ""; if (eggMovesStr) { setTimeout(() => { parseEggMoves(eggMovesStr); diff --git a/src/data/egg.ts b/src/data/egg.ts index 6437dfce2624..743710493630 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,10 +1,8 @@ -import { Type } from "./type"; -import * as Utils from "../utils"; import BattleScene from "../battle-scene"; import { Species } from "./enums/species"; import { getPokemonSpecies, speciesStarters } from "./pokemon-species"; import { EggTier } from "./enums/egg-type"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export const EGG_SEED = 1073741824; @@ -34,57 +32,62 @@ export class Egg { } getKey(): string { - if (this.isManaphyEgg()) - return 'manaphy'; + if (this.isManaphyEgg()) { + return "manaphy"; + } return this.tier.toString(); } } export function getEggTierDefaultHatchWaves(tier: EggTier): integer { switch (tier) { - case EggTier.COMMON: - return 10; - case EggTier.GREAT: - return 25; - case EggTier.ULTRA: - return 50; + case EggTier.COMMON: + return 10; + case EggTier.GREAT: + return 25; + case EggTier.ULTRA: + return 50; } return 100; } export function getEggDescriptor(egg: Egg): string { - if (egg.isManaphyEgg()) - return 'Manaphy'; + if (egg.isManaphyEgg()) { + return "Manaphy"; + } switch (egg.tier) { - case EggTier.GREAT: - return i18next.t('egg:greatTier'); - case EggTier.ULTRA: - return i18next.t('egg:ultraTier'); - case EggTier.MASTER: - return i18next.t('egg:masterTier'); - default: - return i18next.t('egg:defaultTier'); + case EggTier.GREAT: + return i18next.t("egg:greatTier"); + case EggTier.ULTRA: + return i18next.t("egg:ultraTier"); + case EggTier.MASTER: + return i18next.t("egg:masterTier"); + default: + return i18next.t("egg:defaultTier"); } } export function getEggHatchWavesMessage(hatchWaves: integer): string { - if (hatchWaves <= 5) - return i18next.t('egg:hatchWavesMessageSoon'); - if (hatchWaves <= 15) - return i18next.t('egg:hatchWavesMessageClose'); - if (hatchWaves <= 50) - return i18next.t('egg:hatchWavesMessageNotClose'); - return i18next.t('egg:hatchWavesMessageLongTime'); + if (hatchWaves <= 5) { + return i18next.t("egg:hatchWavesMessageSoon"); + } + if (hatchWaves <= 15) { + return i18next.t("egg:hatchWavesMessageClose"); + } + if (hatchWaves <= 50) { + return i18next.t("egg:hatchWavesMessageNotClose"); + } + return i18next.t("egg:hatchWavesMessageLongTime"); } export function getEggGachaTypeDescriptor(scene: BattleScene, egg: Egg): string { switch (egg.gachaType) { - case GachaType.LEGENDARY: - return `${i18next.t('egg:gachaTypeLegendary')} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; - case GachaType.MOVE: - return i18next.t('egg:gachaTypeMove'); - case GachaType.SHINY: - return i18next.t('egg:gachaTypeShiny'); + case GachaType.LEGENDARY: + return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, egg.timestamp)).getName()})`; + case GachaType.MOVE: + return i18next.t("egg:gachaTypeMove"); + case GachaType.SHINY: + return i18next.t("egg:gachaTypeShiny"); } } @@ -98,14 +101,13 @@ export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timesta // 86400000 is the number of miliseconds in one day const timeDate = new Date(timestamp); - const dayDate = new Date(Date.UTC(timeDate.getUTCFullYear(), timeDate.getUTCMonth(), timeDate.getUTCDate())); const dayTimestamp = timeDate.getTime(); // Timestamp of current week const offset = Math.floor(Math.floor(dayTimestamp / 86400000) / legendarySpecies.length); // Cycle number - const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length // Index within cycle + const index = Math.floor(dayTimestamp / 86400000) % legendarySpecies.length; // Index within cycle scene.executeWithSeedOffset(() => { ret = Phaser.Math.RND.shuffle(legendarySpecies)[index]; }, offset, EGG_SEED.toString()); return ret; -} \ No newline at end of file +} diff --git a/src/data/enums/egg-type.ts b/src/data/enums/egg-type.ts index cd845a0d2cf1..d8d0facb0209 100644 --- a/src/data/enums/egg-type.ts +++ b/src/data/enums/egg-type.ts @@ -3,4 +3,4 @@ export enum EggTier { GREAT, ULTRA, MASTER -} \ No newline at end of file +} diff --git a/src/data/enums/moves.ts b/src/data/enums/moves.ts index 07b92b4f0c5e..ee685e85fbeb 100644 --- a/src/data/enums/moves.ts +++ b/src/data/enums/moves.ts @@ -1872,4 +1872,4 @@ export enum Moves { UPPER_HAND, /**{@link https://bulbapedia.bulbagarden.net/wiki/Malignant_Chain_(move) | Source} */ MALIGNANT_CHAIN, -}; \ No newline at end of file +} diff --git a/src/data/enums/species.ts b/src/data/enums/species.ts index dead4fcbd277..0299ee0ce5b2 100644 --- a/src/data/enums/species.ts +++ b/src/data/enums/species.ts @@ -2163,7 +2163,7 @@ export enum Species { PALDEA_WOOPER = 8194, /**{@link https://bulbapedia.bulbagarden.net/wiki/Ursaluna_(Pokémon) | Source} */ BLOODMOON_URSALUNA = 8901, -}; +} export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -2175,4 +2175,4 @@ export const defaultStarterSpecies: Species[] = [ Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY -]; \ No newline at end of file +]; diff --git a/src/data/exp.ts b/src/data/exp.ts index 4a0fd2879c23..3b332eb7cf27 100644 --- a/src/data/exp.ts +++ b/src/data/exp.ts @@ -5,7 +5,7 @@ export enum GrowthRate { MEDIUM_SLOW, SLOW, FLUCTUATING -}; +} const expLevels = [ [ 0, 15, 52, 122, 237, 406, 637, 942, 1326, 1800, 2369, 3041, 3822, 4719, 5737, 6881, 8155, 9564, 11111, 12800, 14632, 16610, 18737, 21012, 23437, 26012, 28737, 31610, 34632, 37800, 41111, 44564, 48155, 51881, 55737, 59719, 63822, 68041, 72369, 76800, 81326, 85942, 90637, 95406, 100237, 105122, 110052, 115015, 120001, 125000, 131324, 137795, 144410, 151165, 158056, 165079, 172229, 179503, 186894, 194400, 202013, 209728, 217540, 225443, 233431, 241496, 249633, 257834, 267406, 276458, 286328, 296358, 305767, 316074, 326531, 336255, 346965, 357812, 367807, 378880, 390077, 400293, 411686, 423190, 433572, 445239, 457001, 467489, 479378, 491346, 501878, 513934, 526049, 536557, 548720, 560922, 571333, 583539, 591882, 600000 ], @@ -19,36 +19,38 @@ const expLevels = [ export function getLevelTotalExp(level: integer, growthRate: GrowthRate): integer { if (level < 100) { const levelExp = expLevels[growthRate][level - 1]; - if (growthRate !== GrowthRate.MEDIUM_FAST) + if (growthRate !== GrowthRate.MEDIUM_FAST) { return Math.floor(levelExp * 0.325 + getLevelTotalExp(level, GrowthRate.MEDIUM_FAST) * 0.675); + } return levelExp; } let ret: integer; switch (growthRate) { - case GrowthRate.ERRATIC: - ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; - break; - case GrowthRate.FAST: - ret = Math.pow(level, 3) * 4 / 5; - break; - case GrowthRate.MEDIUM_FAST: - ret = Math.pow(level, 3); - break; - case GrowthRate.MEDIUM_SLOW: - ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; - break; - case GrowthRate.SLOW: - ret = Math.pow(level, 3) * 5 / 4; - break; - case GrowthRate.FLUCTUATING: - ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); - break; + case GrowthRate.ERRATIC: + ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; + break; + case GrowthRate.FAST: + ret = Math.pow(level, 3) * 4 / 5; + break; + case GrowthRate.MEDIUM_FAST: + ret = Math.pow(level, 3); + break; + case GrowthRate.MEDIUM_SLOW: + ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; + break; + case GrowthRate.SLOW: + ret = Math.pow(level, 3) * 5 / 4; + break; + case GrowthRate.FLUCTUATING: + ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); + break; } - if (growthRate !== GrowthRate.MEDIUM_FAST) + if (growthRate !== GrowthRate.MEDIUM_FAST) { return Math.floor(ret * 0.325 + getLevelTotalExp(level, GrowthRate.MEDIUM_FAST) * 0.675); + } return Math.floor(ret); } @@ -59,17 +61,17 @@ export function getLevelRelExp(level: integer, growthRate: GrowthRate): number { export function getGrowthRateColor(growthRate: GrowthRate, shadow?: boolean) { switch (growthRate) { - case GrowthRate.ERRATIC: - return !shadow ? '#f85888' : '#906060'; - case GrowthRate.FAST: - return !shadow ? '#f8d030' : '#b8a038'; - case GrowthRate.MEDIUM_FAST: - return !shadow ? '#78c850' : '#588040'; - case GrowthRate.MEDIUM_SLOW: - return !shadow ? '#6890f0' : '#807870'; - case GrowthRate.SLOW: - return !shadow ? '#f08030' : '#c03028'; - case GrowthRate.FLUCTUATING: - return !shadow ? '#a040a0' : '#483850'; + case GrowthRate.ERRATIC: + return !shadow ? "#f85888" : "#906060"; + case GrowthRate.FAST: + return !shadow ? "#f8d030" : "#b8a038"; + case GrowthRate.MEDIUM_FAST: + return !shadow ? "#78c850" : "#588040"; + case GrowthRate.MEDIUM_SLOW: + return !shadow ? "#6890f0" : "#807870"; + case GrowthRate.SLOW: + return !shadow ? "#f08030" : "#c03028"; + case GrowthRate.FLUCTUATING: + return !shadow ? "#a040a0" : "#483850"; } -} \ No newline at end of file +} diff --git a/src/data/gender.ts b/src/data/gender.ts index b859a9daa429..0d4b76d8bd1d 100644 --- a/src/data/gender.ts +++ b/src/data/gender.ts @@ -5,21 +5,21 @@ export enum Gender { } export function getGenderSymbol(gender: Gender) { - switch (gender) { - case Gender.MALE: - return '♂'; - case Gender.FEMALE: - return '♀'; - } - return ''; + switch (gender) { + case Gender.MALE: + return "♂"; + case Gender.FEMALE: + return "♀"; + } + return ""; } export function getGenderColor(gender: Gender, shadow?: boolean) { - switch (gender) { - case Gender.MALE: - return shadow ? '#006090' : '#40c8f8'; - case Gender.FEMALE: - return shadow ? '#984038' : '#f89890'; - } - return '#ffffff'; -} \ No newline at end of file + switch (gender) { + case Gender.MALE: + return shadow ? "#006090" : "#40c8f8"; + case Gender.FEMALE: + return shadow ? "#984038" : "#f89890"; + } + return "#ffffff"; +} diff --git a/src/data/move.ts b/src/data/move.ts index 8285bd006c98..d9249f9012a0 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,6 +1,6 @@ import { Moves } from "./enums/moves"; import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; -import { BattleEndPhase, MoveEffectPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; import { EncoreTag } from "./battler-tags"; import { BattlerTagType } from "./enums/battler-tag-type"; @@ -12,9 +12,9 @@ import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagType } from "./enums/arena-tag-type"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, NoTransformAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, PreventBerryUseAbAttr, BlockItemTheftAbAttr } from "./ability"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr } from "./ability"; import { Abilities } from "./enums/abilities"; -import { allAbilities } from './ability'; +import { allAbilities } from "./ability"; import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; import { BattlerIndex } from "../battle"; import { Stat } from "./pokemon-stat"; @@ -24,8 +24,8 @@ import { Species } from "./enums/species"; import { ModifierPoolType } from "#app/modifier/modifier-type"; import { Command } from "../ui/command-ui-handler"; import { Biome } from "./enums/biome"; -import i18next, { Localizable } from '../plugins/i18n'; -import { BerryType, BerryEffectFunc, getBerryEffectFunc } from './berry'; +import i18next, { Localizable } from "../plugins/i18n"; +import { getBerryEffectFunc } from "./berry"; export enum MoveCategory { PHYSICAL, @@ -112,7 +112,7 @@ export default class Move implements Localizable { constructor(id: Moves, type: Type, category: MoveCategory, defaultMoveTarget: MoveTarget, power: integer, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) { this.id = id; - this.nameAppend = ''; + this.nameAppend = ""; this.type = type; this.category = category; this.moveTarget = defaultMoveTarget; @@ -127,19 +127,21 @@ export default class Move implements Localizable { this.conditions = []; this.flags = 0; - if (defaultMoveTarget === MoveTarget.USER) + if (defaultMoveTarget === MoveTarget.USER) { this.setFlag(MoveFlags.IGNORE_PROTECT, true); - if (category === MoveCategory.PHYSICAL) + } + if (category === MoveCategory.PHYSICAL) { this.setFlag(MoveFlags.MAKES_CONTACT, true); + } this.localize(); } localize(): void { - const i18nKey = Moves[this.id].split('_').filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join('') as unknown as string; + const i18nKey = Moves[this.id].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as unknown as string; - this.name = this.id ? `${i18next.t(`move:${i18nKey}.name`).toString()}${this.nameAppend}` : ''; - this.effect = this.id ? `${i18next.t(`move:${i18nKey}.effect`).toString()}${this.nameAppend}` : ''; + this.name = this.id ? `${i18next.t(`move:${i18nKey}.name`).toString()}${this.nameAppend}` : ""; + this.effect = this.id ? `${i18next.t(`move:${i18nKey}.effect`).toString()}${this.nameAppend}` : ""; } getAttrs(attrType: { new(...args: any[]): MoveAttr }): MoveAttr[] { @@ -155,8 +157,9 @@ export default class Move implements Localizable { this.attrs.push(attr); let attrCondition = attr.getCondition(); if (attrCondition) { - if (typeof attrCondition === 'function') + if (typeof attrCondition === "function") { attrCondition = new MoveCondition(attrCondition); + } this.conditions.push(attrCondition); } @@ -167,8 +170,9 @@ export default class Move implements Localizable { this.attrs.push(attr); let attrCondition = attr.getCondition(); if (attrCondition) { - if (typeof attrCondition === 'function') + if (typeof attrCondition === "function") { attrCondition = new MoveCondition(attrCondition); + } this.conditions.push(attrCondition); } @@ -186,53 +190,56 @@ export default class Move implements Localizable { isMultiTarget(): boolean { switch (this.moveTarget) { - case MoveTarget.ALL_OTHERS: - case MoveTarget.ALL_NEAR_OTHERS: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_ENEMIES: - case MoveTarget.USER_AND_ALLIES: - case MoveTarget.ALL: - case MoveTarget.USER_SIDE: - case MoveTarget.ENEMY_SIDE: - case MoveTarget.BOTH_SIDES: - return true; + case MoveTarget.ALL_OTHERS: + case MoveTarget.ALL_NEAR_OTHERS: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_ENEMIES: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.ALL: + case MoveTarget.USER_SIDE: + case MoveTarget.ENEMY_SIDE: + case MoveTarget.BOTH_SIDES: + return true; } return false; } isTypeImmune(type: Type): boolean { switch (type) { - case Type.GRASS: - if (this.hasFlag(MoveFlags.POWDER_MOVE)) - return true; - break; + case Type.GRASS: + if (this.hasFlag(MoveFlags.POWDER_MOVE)) { + return true; + } + break; } return false; } condition(condition: MoveCondition | MoveConditionFunc): this { - if (typeof condition === 'function') + if (typeof condition === "function") { condition = new MoveCondition(condition as MoveConditionFunc); + } this.conditions.push(condition); return this; } partial(): this { - this.nameAppend += ' (P)'; + this.nameAppend += " (P)"; return this; } unimplemented(): this { - this.nameAppend += ' (N)'; + this.nameAppend += " (N)"; return this; } private setFlag(flag: MoveFlags, on: boolean): void { - if (on) + if (on) { this.flags |= flag; - else + } else { this.flags ^= flag; + } } makesContact(makesContact?: boolean): this { @@ -328,36 +335,40 @@ export default class Move implements Localizable { checkFlag(flag: MoveFlags, user: Pokemon, target: Pokemon): boolean { switch (flag) { - case MoveFlags.MAKES_CONTACT: - if (user.hasAbilityWithAttr(IgnoreContactAbAttr)) - return false; - break; - case MoveFlags.IGNORE_ABILITIES: - if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { - const abilityEffectsIgnored = new Utils.BooleanHolder(false); - applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, this); - if (abilityEffectsIgnored.value) - return true; + case MoveFlags.MAKES_CONTACT: + if (user.hasAbilityWithAttr(IgnoreContactAbAttr)) { + return false; + } + break; + case MoveFlags.IGNORE_ABILITIES: + if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { + const abilityEffectsIgnored = new Utils.BooleanHolder(false); + applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, this); + if (abilityEffectsIgnored.value) { + return true; } + } } return !!(this.flags & flag); } applyConditions(user: Pokemon, target: Pokemon, move: Move): boolean { - for (let condition of this.conditions) { - if (!condition.apply(user, target, move)) + for (const condition of this.conditions) { + if (!condition.apply(user, target, move)) { return false; + } } return true; } getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { - for (let attr of this.attrs) { - let failedText = attr.getFailedText(user, target, move, cancelled); - if (failedText !== null) + for (const attr of this.attrs) { + const failedText = attr.getFailedText(user, target, move, cancelled); + if (failedText !== null) { return failedText; + } } return null; } @@ -365,11 +376,13 @@ export default class Move implements Localizable { getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { let score = 0; - for (let attr of this.attrs) + for (const attr of this.attrs) { score += attr.getUserBenefitScore(user, target, move); + } - for (let condition of this.conditions) + for (const condition of this.conditions) { score += condition.getUserBenefitScore(user, target, move); + } return score; } @@ -377,8 +390,9 @@ export default class Move implements Localizable { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { let score = 0; - for (let attr of this.attrs) + for (const attr of this.attrs) { score += attr.getTargetBenefitScore(user, !attr.selfTarget ? target : user, move) * (target !== user && attr.selfTarget ? -1 : 1); + } return score; } @@ -402,20 +416,22 @@ export class AttackMove extends Move { applyMoveAttrs(VariableAtkAttr, user, target, move, atk); if (atk.value > user.getBattleStat(Stat.SPATK, target)) { const statRatio = user.getBattleStat(Stat.SPATK, target) / atk.value; - if (statRatio <= 0.75) + if (statRatio <= 0.75) { attackScore *= 2; - else if (statRatio <= 0.875) + } else if (statRatio <= 0.875) { attackScore *= 1.5; + } } } else { const spAtk = new Utils.IntegerHolder(user.getBattleStat(Stat.SPATK, target)); applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk); if (spAtk.value > user.getBattleStat(Stat.ATK, target)) { const statRatio = user.getBattleStat(Stat.ATK, target) / spAtk.value; - if (statRatio <= 0.75) + if (statRatio <= 0.75) { attackScore *= 2; - else if (statRatio <= 0.875) + } else if (statRatio <= 0.875) { attackScore *= 1.5; + } } } @@ -564,7 +580,7 @@ export class PreMoveMessageAttr extends MoveAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const message = typeof this.message === 'string' + const message = typeof this.message === "string" ? this.message as string : this.message(user, target, move); if (message) { @@ -772,28 +788,33 @@ export class RecoilAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const cancelled = new Utils.BooleanHolder(false); - if (!this.unblockable) + if (!this.unblockable) { applyAbAttrs(BlockRecoilDamageAttr, user, cancelled); + } - if (cancelled.value) + if (cancelled.value) { return false; + } const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.currDamageDealt : user.getMaxHp()) * this.damageRatio), user.turnData.currDamageDealt ? 1 : 0); - if (!recoilDamage) + if (!recoilDamage) { return false; + } applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); - if (cancelled.value) + if (cancelled.value) { return false; + } user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, ' is hit\nwith recoil!')); - user.turnData.damageTaken += recoilDamage; + user.scene.queueMessage(getPokemonMessage(user, " is hit\nwith recoil!")); + user.turnData.damageTaken += recoilDamage; return true; } @@ -830,8 +851,9 @@ export class SacrificialAttr extends MoveEffectAttr { } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (user.isBoss()) + if (user.isBoss()) { return -20; + } return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5)); } } @@ -856,8 +878,9 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { **/ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // If the move fails to hit a target, then the user does not faint and the function returns false - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.damageAndUpdate(user.hp, HitResult.OTHER, false, true, true); user.turnData.damageTaken += user.hp; @@ -866,8 +889,9 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (user.isBoss()) + if (user.isBoss()) { return -20; + } return Math.ceil(((1 - user.getHpRatio()) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5)); } } @@ -892,22 +916,24 @@ export class HalfSacrificialAttr extends MoveEffectAttr { * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const cancelled = new Utils.BooleanHolder(false); // Check to see if the Pokemon has an ability that blocks non-direct damage applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (!cancelled.value){ user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, ' cut its own HP to power up its move!')); // Queue recoil message + user.scene.queueMessage(getPokemonMessage(user, " cut its own HP to power up its move!")); // Queue recoil message } return true; } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (user.isBoss()) + if (user.isBoss()) { return -10; + } return Math.ceil(((1 - user.getHpRatio()/2) * 10 - 10) * (target.getAttackTypeEffectiveness(move.type, user) - 0.5)); } } @@ -950,11 +976,11 @@ export class HealAttr extends MoveEffectAttr { */ addHealPhase(target: Pokemon, healRatio: number) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, ' \nhad its HP restored.'), true, !this.showAnim)); + Math.max(Math.floor(target.getMaxHp() * healRatio), 1), getPokemonMessage(target, " \nhad its HP restored."), true, !this.showAnim)); } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - let score = ((1 - (this.selfTarget ? user : target).getHpRatio()) * 20) - this.healRatio * 10; + const score = ((1 - (this.selfTarget ? user : target).getHpRatio()) * 20) - this.healRatio * 10; return Math.round(score / (1 - this.healRatio / 2)); } } @@ -978,8 +1004,9 @@ export class PartyStatusCureAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } this.addPartyCurePhase(user); } @@ -995,14 +1022,15 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } // We don't know which party member will be chosen, so pick the highest max HP in the party const maxPartyMemberHp = user.scene.getParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0); user.scene.pushPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), - maxPartyMemberHp, getPokemonMessage(user, '\'s Healing Wish\nwas granted!'), true, false, false, true), true); + maxPartyMemberHp, getPokemonMessage(user, "'s Healing Wish\nwas granted!"), true, false, false, true), true); return true; } @@ -1041,8 +1069,9 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const weatherModifier=args[0] as Utils.NumberHolder; //If the type-based attack power modifier due to weather (e.g. Water moves in Sun) is below 1, set it to 1 - if (user.scene.arena.weather?.weatherType === this.weather) + if (user.scene.arena.weather?.weatherType === this.weather) { weatherModifier.value = Math.max(weatherModifier.value, 1); + } return true; } } @@ -1068,17 +1097,17 @@ export abstract class WeatherHealAttr extends HealAttr { export class PlantHealAttr extends WeatherHealAttr { getWeatherHealRatio(weatherType: WeatherType): number { switch (weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - return 2 / 3; - case WeatherType.RAIN: - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - case WeatherType.SNOW: - case WeatherType.HEAVY_RAIN: - return 0.25; - default: - return 0.5; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + return 2 / 3; + case WeatherType.RAIN: + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + case WeatherType.SNOW: + case WeatherType.HEAVY_RAIN: + return 0.25; + default: + return 0.5; } } } @@ -1086,10 +1115,10 @@ export class PlantHealAttr extends WeatherHealAttr { export class SandHealAttr extends WeatherHealAttr { getWeatherHealRatio(weatherType: WeatherType): number { switch (weatherType) { - case WeatherType.SANDSTORM: - return 2 / 3; - default: - return 0.5; + case WeatherType.SANDSTORM: + return 2 / 3; + default: + return 0.5; } } } @@ -1143,9 +1172,11 @@ export class HitHealAttr extends MoveEffectAttr { const reverseDrain = user.hasAbilityWithAttr(ReverseDrainAbAttr); user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), !reverseDrain ? healAmount : healAmount * -1, - !reverseDrain ? getPokemonMessage(target, ` had its\nenergy drained!`) : undefined, + !reverseDrain ? getPokemonMessage(target, " had its\nenergy drained!") : undefined, false, true)); - if (reverseDrain) user.turnData.damageTaken += healAmount; + if (reverseDrain) { + user.turnData.damageTaken += healAmount; + } return true; } @@ -1164,7 +1195,7 @@ export class StrengthSapHealAttr extends MoveEffectAttr { const reverseDrain = user.hasAbilityWithAttr(ReverseDrainAbAttr); user.scene.unshiftPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(), !reverseDrain ? healAmount : healAmount * -1, - !reverseDrain ? getPokemonMessage(user, ` regained\nhealth!`) : undefined, + !reverseDrain ? getPokemonMessage(user, " regained\nhealth!") : undefined, false, true)); return true; } @@ -1198,8 +1229,9 @@ export class IncrementMovePriorityAttr extends MoveAttr { * @returns true if function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!this.moveIncrementFunc(user, target, move)) + if (!this.moveIncrementFunc(user, target, move)) { return false; + } (args[0] as Utils.IntegerHolder).value += this.increaseAmount; return true; @@ -1217,66 +1249,68 @@ export class MultiHitAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { let hitTimes: integer; - const hitType = new Utils.IntegerHolder(this.multiHitType) - applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType) + const hitType = new Utils.IntegerHolder(this.multiHitType); + applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); switch (hitType.value) { - case MultiHitType._2_TO_5: - { - const rand = user.randSeedInt(16); - const hitValue = new Utils.IntegerHolder(rand); - applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); - if (hitValue.value >= 10) - hitTimes = 2; - else if (hitValue.value >= 4) - hitTimes = 3; - else if (hitValue.value >= 2) - hitTimes = 4; - else - hitTimes = 5; + case MultiHitType._2_TO_5: + { + const rand = user.randSeedInt(16); + const hitValue = new Utils.IntegerHolder(rand); + applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); + if (hitValue.value >= 10) { + hitTimes = 2; + } else if (hitValue.value >= 4) { + hitTimes = 3; + } else if (hitValue.value >= 2) { + hitTimes = 4; + } else { + hitTimes = 5; } - break; - case MultiHitType._2: - hitTimes = 2; - break; - case MultiHitType._3: - hitTimes = 3; - break; - case MultiHitType._3_INCR: - hitTimes = 3; - // TODO: Add power increase for every hit - break; - case MultiHitType._1_TO_10: - { - const rand = user.randSeedInt(90); - const hitValue = new Utils.IntegerHolder(rand); - applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); - if (hitValue.value >= 81) - hitTimes = 1; - else if (hitValue.value >= 73) - hitTimes = 2; - else if (hitValue.value >= 66) - hitTimes = 3; - else if (hitValue.value >= 60) - hitTimes = 4; - else if (hitValue.value >= 54) - hitTimes = 5; - else if (hitValue.value >= 49) - hitTimes = 6; - else if (hitValue.value >= 44) - hitTimes = 7; - else if (hitValue.value >= 40) - hitTimes = 8; - else if (hitValue.value >= 36) - hitTimes = 9; - else - hitTimes = 10; + } + break; + case MultiHitType._2: + hitTimes = 2; + break; + case MultiHitType._3: + hitTimes = 3; + break; + case MultiHitType._3_INCR: + hitTimes = 3; + // TODO: Add power increase for every hit + break; + case MultiHitType._1_TO_10: + { + const rand = user.randSeedInt(90); + const hitValue = new Utils.IntegerHolder(rand); + applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); + if (hitValue.value >= 81) { + hitTimes = 1; + } else if (hitValue.value >= 73) { + hitTimes = 2; + } else if (hitValue.value >= 66) { + hitTimes = 3; + } else if (hitValue.value >= 60) { + hitTimes = 4; + } else if (hitValue.value >= 54) { + hitTimes = 5; + } else if (hitValue.value >= 49) { + hitTimes = 6; + } else if (hitValue.value >= 44) { + hitTimes = 7; + } else if (hitValue.value >= 40) { + hitTimes = 8; + } else if (hitValue.value >= 36) { + hitTimes = 9; + } else { + hitTimes = 10; } - break; - case MultiHitType.BEAT_UP: - // No status means the ally pokemon can contribute to Beat Up - hitTimes = user.scene.getParty().reduce((total, pokemon) => { - return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1) - }, 0); + } + break; + case MultiHitType.BEAT_UP: + // No status means the ally pokemon can contribute to Beat Up + hitTimes = user.scene.getParty().reduce((total, pokemon) => { + return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1); + }, 0); } (args[0] as Utils.IntegerHolder).value = hitTimes; return true; @@ -1296,8 +1330,8 @@ export class ChangeMultiHitTypeAttr extends MoveAttr { export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.species.speciesId == Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex == 2) { - (args[0] as Utils.IntegerHolder).value = MultiHitType._3 + if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { + (args[0] as Utils.IntegerHolder).value = MultiHitType._3; return true; } return false; @@ -1322,13 +1356,15 @@ export class StatusEffectAttr extends MoveEffectAttr { if (statusCheck) { const pokemon = this.selfTarget ? user : target; if (pokemon.status) { - if (this.overrideStatus) + if (this.overrideStatus) { pokemon.resetStatus(); - else + } else { return false; + } } - if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) + if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) { return pokemon.trySetStatus(this.effect, true, user, this.cureTurn); + } } return false; } @@ -1369,7 +1405,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { return false; } if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { - var statusAfflictResult = target.trySetStatus(statusToApply, true, user); + const statusAfflictResult = target.trySetStatus(statusToApply, true, user); if (statusAfflictResult) { user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); user.resetStatus(); @@ -1397,8 +1433,9 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) + if (rand >= this.chance) { return resolve(false); + } const heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); if (heldItems.length) { const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; @@ -1406,8 +1443,9 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; user.scene.tryTransferHeldItemModifier(stolenItem, user, false, false).then(success => { - if (success) + if (success) { user.scene.queueMessage(getPokemonMessage(user, ` stole\n${target.name}'s ${stolenItem.type.name}!`)); + } resolve(success); }); return; @@ -1444,8 +1482,9 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const rand = Phaser.Math.RND.realInRange(0, 1); - if (rand >= this.chance) + if (rand >= this.chance) { return resolve(false); + } const heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); if (heldItems.length) { const poolType = target.isPlayer() ? ModifierPoolType.PLAYER : target.hasTrainer() ? ModifierPoolType.TRAINER : ModifierPoolType.WILD; @@ -1453,8 +1492,9 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; user.scene.tryTransferHeldItemModifier(stolenItem, user, false, false).then(success => { - if (success) + if (success) { user.scene.queueMessage(getPokemonMessage(user, ` knocked off\n${target.name}'s ${stolenItem.type.name}!`)); + } resolve(success); }); return; @@ -1489,7 +1529,7 @@ export class EatBerryAttr extends MoveEffectAttr { super(true, MoveEffectTrigger.HIT); this.chosenBerry = undefined; } -/** + /** * Causes the target to eat a berry. * @param user {@linkcode Pokemon} Pokemon that used the move * @param target {@linkcode Pokemon} Pokemon that will eat a berry @@ -1498,13 +1538,15 @@ export class EatBerryAttr extends MoveEffectAttr { * @returns {boolean} true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } if(this.chosenBerry === undefined) { // if no berry has been provided, pick a random berry from their inventory const heldBerries = this.getTargetHeldBerries(target); - if(heldBerries.length <= 0) + if(heldBerries.length <= 0) { return false; + } this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; } @@ -1514,10 +1556,11 @@ export class EatBerryAttr extends MoveEffectAttr { target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); if (!preserve.value){ // remove the eaten berry if not preserved - if (!--this.chosenBerry.stackCount) + if (!--this.chosenBerry.stackCount) { target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); + } target.scene.updateModifiers(target.isPlayer()); -} + } this.chosenBerry = undefined; return true; @@ -1537,7 +1580,7 @@ export class StealEatBerryAttr extends EatBerryAttr { constructor() { super(); } -/** + /** * User steals a random berry from the target and then eats it. * @param {Pokemon} user Pokemon that used the move and will eat the stolen berry * @param {Pokemon} target Pokemon that will have its berry stolen @@ -1549,16 +1592,18 @@ export class StealEatBerryAttr extends EatBerryAttr { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // check for abilities that block item theft - if(cancelled.value == true) + if(cancelled.value === true) { return false; + } const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); if (heldBerries.length) { // if the target has berries, pick a random berry and steal it this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; - if (this.chosenBerry.stackCount == 1) // remove modifier if its the last berry + if (this.chosenBerry.stackCount === 1) { // remove modifier if its the last berry target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); + } target.scene.updateModifiers(target.isPlayer()); user.scene.queueMessage(getPokemonMessage(user, ` stole and ate\n${target.name}'s ${this.chosenBerry.type.name}!`)); @@ -1579,8 +1624,9 @@ export class HealStatusEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { @@ -1663,8 +1709,9 @@ export class ClearWeatherAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.scene.arena.weather?.weatherType === this.weatherType) + if (user.scene.arena.weather?.weatherType === this.weatherType) { return user.scene.arena.trySetWeather(WeatherType.NONE, true); + } return false; } @@ -1705,8 +1752,9 @@ export class ClearTerrainAttr extends MoveEffectAttr { export class OneHitKOAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (target.isBossImmune()) + if (target.isBossImmune()) { return false; + } (args[0] as Utils.BooleanHolder).value = true; @@ -1718,7 +1766,7 @@ export class OneHitKOAttr extends MoveAttr { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockOneHitKOAbAttr, target, cancelled); return !cancelled.value && user.level >= target.level; - } + }; } } @@ -1755,15 +1803,18 @@ export class ChargeAttr extends OverrideMoveEffectAttr { if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && (this.sameTurn || lastMove.turn !== user.scene.currentBattle.turn))) { (args[0] as Utils.BooleanHolder).value = true; new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace('{TARGET}', target.name)}`)); - if (this.tagType) + user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + if (this.tagType) { user.addTag(this.tagType, 1, move.id, user.id); - if (this.chargeEffect) + } + if (this.chargeEffect) { applyMoveAttrs(MoveEffectAttr, user, target, move); + } user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); - if (this.sameTurn) + if (this.sameTurn) { user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], user.moveset.find(m => m.moveId === move.id), true), this.followUpPriority); + } user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); resolve(true); }); @@ -1775,8 +1826,9 @@ export class ChargeAttr extends OverrideMoveEffectAttr { } usedChargeEffect(user: Pokemon, target: Pokemon, move: Move): boolean { - if (!this.chargeEffect) + if (!this.chargeEffect) { return false; + } // Account for move history being populated when this function is called const lastMoves = user.getLastXMoves(2); return lastMoves.length === 2 && lastMoves[1].move === move.id && lastMoves[1].result === MoveResult.OTHER; @@ -1791,10 +1843,11 @@ export class SunlightChargeAttr extends ChargeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const weatherType = user.scene.arena.weather?.weatherType; - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene) && (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN)) + if (!user.scene.arena.weather?.isEffectSuppressed(user.scene) && (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN)) { resolve(false); - else + } else { super.apply(user, target, move, args).then(result => resolve(result)); + } }); } } @@ -1802,7 +1855,7 @@ export class SunlightChargeAttr extends ChargeAttr { export class ElectroShotChargeAttr extends ChargeAttr { private statIncreaseApplied: boolean; constructor() { - super(ChargeAnim.ELECTRO_SHOT_CHARGING, 'absorbed electricity!', null, true); + super(ChargeAnim.ELECTRO_SHOT_CHARGING, "absorbed electricity!", null, true); // Add a flag because ChargeAttr skills use themselves twice instead of once over one-to-two turns this.statIncreaseApplied = false; } @@ -1854,14 +1907,15 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { if (args.length < 2 || !args[1]) { new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { (args[0] as Utils.BooleanHolder).value = true; - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace('{TARGET}', target.name)}`)); + user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.scene.arena.addTag(this.tagType, 3, move.id, user.id, ArenaTagSide.BOTH, target.getBattlerIndex()); resolve(true); }); - } else + } else { user.scene.ui.showText(getPokemonMessage(user.scene.getPokemonById(target.id), ` took\nthe ${move.name} attack!`), null, () => resolve(true)); + } }); } } @@ -1874,7 +1928,7 @@ export class StatChangeAttr extends MoveEffectAttr { constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT) { super(selfTarget, moveEffectTrigger, firstHitOnly); - this.stats = typeof(stats) === 'number' + this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; this.levels = levels; @@ -1883,8 +1937,9 @@ export class StatChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) + if (!super.apply(user, target, move, args) || (this.condition && !this.condition(user, target, move))) { return false; + } if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) { const levels = this.getLevels(user); @@ -1901,34 +1956,40 @@ export class StatChangeAttr extends MoveEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { let ret = 0; - let moveLevels = this.getLevels(user); - for (let stat of this.stats) { + const moveLevels = this.getLevels(user); + for (const stat of this.stats) { let levels = moveLevels; - if (levels > 0) + if (levels > 0) { levels = Math.min(target.summonData.battleStats[stat] + levels, 6) - target.summonData.battleStats[stat]; - else + } else { levels = Math.max(target.summonData.battleStats[stat] + levels, -6) - target.summonData.battleStats[stat]; + } let noEffect = false; switch (stat) { - case BattleStat.ATK: - if (this.selfTarget) - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); - break; - case BattleStat.DEF: - if (!this.selfTarget) - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); - break; - case BattleStat.SPATK: - if (this.selfTarget) - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); - break; - case BattleStat.SPDEF: - if (!this.selfTarget) - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); - break; + case BattleStat.ATK: + if (this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); + } + break; + case BattleStat.DEF: + if (!this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); + } + break; + case BattleStat.SPATK: + if (this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); + } + break; + case BattleStat.SPDEF: + if (!this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); + } + break; } - if (noEffect) + if (noEffect) { continue; + } ret += (levels * 4) + (levels > 0 ? -2 : 2); } return ret; @@ -1943,7 +2004,7 @@ export class PostVictoryStatChangeAttr extends MoveAttr { constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false) { super(); - this.stats = typeof(stats) === 'number' + this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; this.levels = levels; @@ -1951,8 +2012,9 @@ export class PostVictoryStatChangeAttr extends MoveAttr { this.showMessage = showMessage; } applyPostVictory(user: Pokemon, target: Pokemon, move: Move): void { - if(this.condition && !this.condition(user, target, move)) + if(this.condition && !this.condition(user, target, move)) { return false; + } const statChangeAttr = new StatChangeAttr(this.stats, this.levels, this.showMessage); statChangeAttr.apply(user, target, move); } @@ -1967,7 +2029,7 @@ export class AcupressureStatChangeAttr extends MoveEffectAttr { let randStats = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD, BattleStat.ACC, BattleStat.EVA ]; randStats = randStats.filter(s => target.summonData.battleStats[s] < 6); if (randStats.length > 0) { - let boostStat = [randStats[Utils.randInt(randStats.length)]]; + const boostStat = [randStats[Utils.randInt(randStats.length)]]; user.scene.unshiftPhase(new StatChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2)); return true; } @@ -1983,8 +2045,9 @@ export class GrowthStatChangeAttr extends StatChangeAttr { getLevels(user: Pokemon): number { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { const weatherType = user.scene.arena.weather?.weatherType; - if (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN) + if (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN) { return this.levels + 1; + } } return this.levels; } @@ -1998,8 +2061,9 @@ export class HalfHpStatMaxAttr extends StatChangeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - if (damage) + if (damage) { user.scene.damageNumberHandler.add(user, damage); + } user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand maximized its ${getBattleStatName(this.stats[0])}!`)); @@ -2027,8 +2091,9 @@ export class CutHpStatBoostAttr extends StatChangeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - if (damage) + if (damage) { user.scene.damageNumberHandler.add(user, damage); + } user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); resolve(ret); @@ -2043,19 +2108,22 @@ export class CutHpStatBoostAttr extends StatChangeAttr { export class CopyStatsAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - for (let s = 0; s < target.summonData.battleStats.length; s++) + for (let s = 0; s < target.summonData.battleStats.length; s++) { user.summonData.battleStats[s] = target.summonData.battleStats[s]; - if (target.getTag(BattlerTagType.CRIT_BOOST)) + } + if (target.getTag(BattlerTagType.CRIT_BOOST)) { user.addTag(BattlerTagType.CRIT_BOOST, 0, move.id); - else + } else { user.removeTag(BattlerTagType.CRIT_BOOST); + } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(user, ' copied\n') + getPokemonMessage(target, `'s stat changes!`)); + target.scene.queueMessage(getPokemonMessage(user, " copied\n") + getPokemonMessage(target, "'s stat changes!")); return true; } @@ -2063,15 +2131,17 @@ export class CopyStatsAttr extends MoveEffectAttr { export class InvertStatsAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - for (let s = 0; s < target.summonData.battleStats.length; s++) + for (let s = 0; s < target.summonData.battleStats.length; s++) { target.summonData.battleStats[s] *= -1; + } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere all reversed!`)); + target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere all reversed!")); return true; } @@ -2079,15 +2149,17 @@ export class InvertStatsAttr extends MoveEffectAttr { export class ResetStatsAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - for (let s = 0; s < target.summonData.battleStats.length; s++) + for (let s = 0; s < target.summonData.battleStats.length; s++) { target.summonData.battleStats[s] = 0; + } target.updateInfo(); user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(target, `'s stat changes\nwere eliminated!`)); + target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere eliminated!")); return true; } @@ -2096,9 +2168,8 @@ export class ResetStatsAttr extends MoveEffectAttr { /** * Attribute used for moves which swap the user and the target's stat changes. */ -export class SwapStatsAttr extends MoveEffectAttr -{ - /** +export class SwapStatsAttr extends MoveEffectAttr { + /** * Swaps the user and the target's stat changes. * @param user Pokemon that used the move * @param target The target of the move @@ -2106,52 +2177,56 @@ export class SwapStatsAttr extends MoveEffectAttr * @param args N/A * @returns true if the function succeeds */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any []): boolean - { - if (!super.apply(user, target, move, args)) - return false; //Exits if the move can't apply - let priorBoost : integer; //For storing a stat boost - for (let s = 0; s < target.summonData.battleStats.length; s++) - { - priorBoost = user.summonData.battleStats[s]; //Store user stat boost - user.summonData.battleStats[s] = target.summonData.battleStats[s]; //Applies target boost to self - target.summonData.battleStats[s] = priorBoost; //Applies stored boost to target - } - target.updateInfo(); - user.updateInfo(); - target.scene.queueMessage(getPokemonMessage(user, ' switched stat changes with the target!')); - return true; + apply(user: Pokemon, target: Pokemon, move: Move, args: any []): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } //Exits if the move can't apply + let priorBoost : integer; //For storing a stat boost + for (let s = 0; s < target.summonData.battleStats.length; s++) { + priorBoost = user.summonData.battleStats[s]; //Store user stat boost + user.summonData.battleStats[s] = target.summonData.battleStats[s]; //Applies target boost to self + target.summonData.battleStats[s] = priorBoost; //Applies stored boost to target } + target.updateInfo(); + user.updateInfo(); + target.scene.queueMessage(getPokemonMessage(user, " switched stat changes with the target!")); + return true; + } } export class HpSplitAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return resolve(false); + } const infoUpdates = []; const hpValue = Math.floor((target.hp + user.hp) / 2); if (user.hp < hpValue) { const healing = user.heal(hpValue - user.hp); - if (healing) + if (healing) { user.scene.damageNumberHandler.add(user, healing, HitResult.HEAL); + } } else if (user.hp > hpValue) { const damage = user.damage(user.hp - hpValue, true); - if (damage) + if (damage) { user.scene.damageNumberHandler.add(user, damage); + } } infoUpdates.push(user.updateInfo()); if (target.hp < hpValue) { const healing = target.heal(hpValue - target.hp); - if (healing) + if (healing) { user.scene.damageNumberHandler.add(user, healing, HitResult.HEAL); + } } else if (target.hp > hpValue) { const damage = target.damage(target.hp - hpValue, true); - if (damage) + if (damage) { target.scene.damageNumberHandler.add(target, damage); + } } infoUpdates.push(target.updateInfo()); @@ -2178,30 +2253,32 @@ export class LessPPMorePowerAttr extends VariablePowerAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const ppMax = move.pp; - let ppUsed = user.moveset.find((m) => m.moveId === move.id).ppUsed; + const ppUsed = user.moveset.find((m) => m.moveId === move.id).ppUsed; let ppRemains = ppMax - ppUsed; /** Reduce to 0 to avoid negative numbers if user has 1PP before attack and target has Ability.PRESSURE */ - if(ppRemains < 0) ppRemains = 0; + if(ppRemains < 0) { + ppRemains = 0; + } const power = args[0] as Utils.NumberHolder; switch (ppRemains) { - case 0: - power.value = 200; - break; - case 1: - power.value = 80; - break; - case 2: - power.value = 60; - break; - case 3: - power.value = 50; - break; - default: - power.value = 40; - break; + case 0: + power.value = 200; + break; + case 1: + power.value = 80; + break; + case 2: + power.value = 60; + break; + case 3: + power.value = 50; + break; + default: + power.value = 40; + break; } return true; } @@ -2243,7 +2320,7 @@ const beatUpFunc = (user: Pokemon, allyIndex: number): number => { } return (pokemon.species.getBaseStat(Stat.ATK) / 10) + 5; } -} +}; export class BeatUpAttr extends VariablePowerAttr { @@ -2266,9 +2343,10 @@ export class BeatUpAttr extends VariablePowerAttr { const doublePowerChanceMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { let message: string = null; user.scene.executeWithSeedOffset(() => { - let rand = Utils.randSeedInt(100); - if (rand < move.chance) - message = getPokemonMessage(user, ' is going all out for this attack!'); + const rand = Utils.randSeedInt(100); + if (rand < move.chance) { + message = getPokemonMessage(user, " is going all out for this attack!"); + } }, user.scene.currentBattle.turn << 6, user.scene.waveSeed); return message; }; @@ -2296,12 +2374,13 @@ export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultipl let turnMove: TurnMove; while (((turnMove = moveHistory.shift())?.move === move.id || (comboMoves.length && comboMoves.includes(turnMove?.move))) && (!resetOnFail || turnMove.result === MoveResult.SUCCESS)) { - if (count < (limit - 1)) + if (count < (limit - 1)) { count++; - else if (resetOnLimit) + } else if (resetOnLimit) { count = 0; - else + } else { break; + } } return this.getMultiplier(count); @@ -2332,8 +2411,9 @@ export class WeightPowerAttr extends VariablePowerAttr { let w = 0; while (targetWeight >= weightThresholds[w]) { - if (++w === weightThresholds.length) + if (++w === weightThresholds.length) { break; + } } power.value = (w + 1) * 20; @@ -2366,8 +2446,9 @@ export class ElectroBallPowerAttr extends VariablePowerAttr { let w = 0; while (w < statThresholds.length - 1 && statRatio > statThresholds[w]) { - if (++w === statThresholds.length) + if (++w === statThresholds.length) { break; + } } power.value = statThresholdPowers[w]; @@ -2411,24 +2492,24 @@ export class LowHpPowerAttr extends VariablePowerAttr { const hpRatio = user.getHpRatio(); switch (true) { - case (hpRatio < 0.0417): - power.value = 200; - break; - case (hpRatio < 0.1042): - power.value = 150; - break; - case (hpRatio < 0.2083): - power.value = 100; - break; - case (hpRatio < 0.3542): - power.value = 80; - break; - case (hpRatio < 0.6875): - power.value = 40; - break; - default: - power.value = 20; - break; + case (hpRatio < 0.0417): + power.value = 200; + break; + case (hpRatio < 0.1042): + power.value = 150; + break; + case (hpRatio < 0.2083): + power.value = 100; + break; + case (hpRatio < 0.3542): + power.value = 80; + break; + case (hpRatio < 0.6875): + power.value = 40; + break; + default: + power.value = 20; + break; } return true; @@ -2441,27 +2522,28 @@ export class CompareWeightPowerAttr extends VariablePowerAttr { const userWeight = user.getWeight(); const targetWeight = target.getWeight(); - if (!userWeight || userWeight === 0) + if (!userWeight || userWeight === 0) { return false; + } const relativeWeight = (targetWeight / userWeight) * 100; switch (true) { - case (relativeWeight < 20.01): - power.value = 120; - break; - case (relativeWeight < 25.01): - power.value = 100; - break; - case (relativeWeight < 33.35): - power.value = 80; - break; - case (relativeWeight < 50.01): - power.value = 60; - break; - default: - power.value = 40; - break; + case (relativeWeight < 20.01): + power.value = 120; + break; + case (relativeWeight < 25.01): + power.value = 100; + break; + case (relativeWeight < 33.35): + power.value = 80; + break; + case (relativeWeight < 50.01): + power.value = 60; + break; + default: + power.value = 40; + break; } return true; @@ -2517,8 +2599,9 @@ const magnitudeMessageFunc = (user: Pokemon, target: Pokemon, move: Move) => { let m = 0; for (; m < magnitudeThresholds.length; m++) { - if (rand < magnitudeThresholds[m]) + if (rand < magnitudeThresholds[m]) { break; + } } message = `Magnitude ${m + 4}!`; @@ -2539,8 +2622,9 @@ export class MagnitudePowerAttr extends VariablePowerAttr { let m = 0; for (; m < magnitudeThresholds.length; m++) { - if (rand < magnitudeThresholds[m]) + if (rand < magnitudeThresholds[m]) { break; + } } power.value = magnitudePowers[m]; @@ -2555,13 +2639,13 @@ export class AntiSunlightPowerDecreaseAttr extends VariablePowerAttr { const power = args[0] as Utils.NumberHolder; const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { - case WeatherType.RAIN: - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - case WeatherType.SNOW: - case WeatherType.HEAVY_RAIN: - power.value *= 0.5; - return true; + case WeatherType.RAIN: + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + case WeatherType.SNOW: + case WeatherType.HEAVY_RAIN: + power.value *= 0.5; + return true; } } @@ -2614,16 +2698,13 @@ export class PresentPowerAttr extends VariablePowerAttr { const powerSeed = Utils.randSeedInt(100); if (powerSeed <= 40) { (args[0] as Utils.NumberHolder).value = 40; - } - else if (40 < powerSeed && powerSeed <= 70) { + } else if (40 < powerSeed && powerSeed <= 70) { (args[0] as Utils.NumberHolder).value = 80; - } - else if (70 < powerSeed && powerSeed <= 80) { + } else if (70 < powerSeed && powerSeed <= 80) { (args[0] as Utils.NumberHolder).value = 120; - } - else if (80 < powerSeed && powerSeed <= 100) { + } else if (80 < powerSeed && powerSeed <= 100) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, ' regained\nhealth!'), true)); + Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, " regained\nhealth!"), true)); } return true; @@ -2643,8 +2724,8 @@ export class KnockOffPowerAttr extends VariablePowerAttr { export class WaterShurikenPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.species.speciesId == Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex == 2) { - (args[0] as Utils.IntegerHolder).value = 20 + if (user.species.speciesId === Species.GRENINJA && user.hasAbility(Abilities.BATTLE_BOND) && user.formIndex === 2) { + (args[0] as Utils.IntegerHolder).value = 20; return true; } return false; @@ -2718,15 +2799,15 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { const accuracy = args[0] as Utils.NumberHolder; const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { - case WeatherType.SUNNY: - case WeatherType.SANDSTORM: - case WeatherType.HARSH_SUN: - accuracy.value = 50; - return true; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - accuracy.value = -1; - return true; + case WeatherType.SUNNY: + case WeatherType.SANDSTORM: + case WeatherType.HARSH_SUN: + accuracy.value = 50; + return true; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + accuracy.value = -1; + return true; } } @@ -2751,7 +2832,7 @@ export class MinimizeAccuracyAttr extends VariableAccuracyAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (target.getTag(BattlerTagType.MINIMIZED)){ - const accuracy = args[0] as Utils.NumberHolder + const accuracy = args[0] as Utils.NumberHolder; accuracy.value = -1; return true; @@ -2763,11 +2844,11 @@ export class MinimizeAccuracyAttr extends VariableAccuracyAttr { export class ToxicAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (user.isOfType(Type.POISON)) { - const accuracy = args[0] as Utils.NumberHolder; - accuracy.value = -1; - return true; - } + if (user.isOfType(Type.POISON)) { + const accuracy = args[0] as Utils.NumberHolder; + accuracy.value = -1; + return true; + } return false; } @@ -2852,21 +2933,21 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { const type = (args[0] as Utils.IntegerHolder); switch (form) { - case 1: // Shock Drive - type.value = Type.ELECTRIC; - break; - case 2: // Burn Drive - type.value = Type.FIRE; - break; - case 3: // Chill Drive - type.value = Type.ICE; - break; - case 4: // Douse Drive - type.value = Type.WATER; - break; - default: - type.value = Type.NORMAL; - break; + case 1: // Shock Drive + type.value = Type.ELECTRIC; + break; + case 2: // Burn Drive + type.value = Type.FIRE; + break; + case 3: // Chill Drive + type.value = Type.ICE; + break; + case 4: // Douse Drive + type.value = Type.WATER; + break; + default: + type.value = Type.NORMAL; + break; } return true; } @@ -2882,12 +2963,12 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { const type = (args[0] as Utils.IntegerHolder); switch (form) { - case 1: // Hangry Mode - type.value = Type.DARK; - break; - default: // Full Belly Mode - type.value = Type.ELECTRIC; - break; + case 1: // Hangry Mode + type.value = Type.DARK; + break; + default: // Full Belly Mode + type.value = Type.ELECTRIC; + break; } return true; } @@ -2903,15 +2984,15 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { const type = (args[0] as Utils.IntegerHolder); switch (form) { - case 1: // Blaze breed - type.value = Type.FIRE; - break; - case 2: // Aqua breed - type.value = Type.WATER; - break; - default: - type.value = Type.FIGHTING; - break; + case 1: // Blaze breed + type.value = Type.FIRE; + break; + case 2: // Aqua breed + type.value = Type.WATER; + break; + default: + type.value = Type.FIGHTING; + break; } return true; } @@ -2927,30 +3008,30 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { const type = (args[0] as Utils.IntegerHolder); switch (form) { - case 1: // Wellspring Mask - type.value = Type.WATER; - break; - case 2: // Hearthflame Mask - type.value = Type.FIRE; - break; - case 3: // Cornerstone Mask - type.value = Type.ROCK; - break; - case 4: // Teal Mask Tera - type.value = Type.GRASS; - break; - case 5: // Wellspring Mask Tera - type.value = Type.WATER; - break; - case 6: // Hearthflame Mask Tera - type.value = Type.FIRE; - break; - case 7: // Cornerstone Mask Tera - type.value = Type.ROCK; - break; - default: - type.value = Type.GRASS; - break; + case 1: // Wellspring Mask + type.value = Type.WATER; + break; + case 2: // Hearthflame Mask + type.value = Type.FIRE; + break; + case 3: // Cornerstone Mask + type.value = Type.ROCK; + break; + case 4: // Teal Mask Tera + type.value = Type.GRASS; + break; + case 5: // Wellspring Mask Tera + type.value = Type.WATER; + break; + case 6: // Hearthflame Mask Tera + type.value = Type.FIRE; + break; + case 7: // Cornerstone Mask Tera + type.value = Type.ROCK; + break; + default: + type.value = Type.GRASS; + break; } return true; } @@ -2965,23 +3046,23 @@ export class WeatherBallTypeAttr extends VariableMoveTypeAttr { const type = (args[0] as Utils.IntegerHolder); switch (user.scene.arena.weather?.weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - type.value = Type.FIRE; - break; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - type.value = Type.WATER; - break; - case WeatherType.SANDSTORM: - type.value = Type.ROCK; - break; - case WeatherType.HAIL: - case WeatherType.SNOW: - type.value = Type.ICE; - break; - default: - return false; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + type.value = Type.FIRE; + break; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + type.value = Type.WATER; + break; + case WeatherType.SANDSTORM: + type.value = Type.ROCK; + break; + case WeatherType.HAIL: + case WeatherType.SNOW: + type.value = Type.ICE; + break; + default: + return false; } return true; } @@ -3005,27 +3086,28 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if(!user.isGrounded) + if(!user.isGrounded) { return false; + } const currentTerrain = user.scene.arena.getTerrainType(); const type = (args[0] as Utils.IntegerHolder); switch (currentTerrain) { - case TerrainType.MISTY: - type.value = Type.FAIRY; - break; - case TerrainType.ELECTRIC: - type.value = Type.ELECTRIC; - break; - case TerrainType.GRASSY: - type.value = Type.GRASS; - break; - case TerrainType.PSYCHIC: - type.value = Type.PSYCHIC; - break; - default: - return false; + case TerrainType.MISTY: + type.value = Type.FAIRY; + break; + case TerrainType.ELECTRIC: + type.value = Type.ELECTRIC; + break; + case TerrainType.GRASSY: + type.value = Type.GRASS; + break; + case TerrainType.PSYCHIC: + type.value = Type.PSYCHIC; + break; + default: + return false; } return true; } @@ -3062,13 +3144,12 @@ export class MatchUserTypeAttr extends VariableMoveTypeAttr { const nonTeraTypes = user.getTypes(); type.value = nonTeraTypes[0]; return true; - } - else if (userTypes.length > 0) { + } else if (userTypes.length > 0) { type.value = userTypes[0]; return true; - } - else + } else { return false; + } } } @@ -3084,8 +3165,9 @@ export class NeutralDamageAgainstFlyingTypeMultiplierAttr extends VariableMoveTy if (!target.getTag(BattlerTagType.IGNORE_FLYING)) { const multiplier = args[0] as Utils.NumberHolder; //When a flying type is hit, the first hit is always 1x multiplier. Levitating pokemon are instantly affected by typing - if (target.isOfType(Type.FLYING)) + if (target.isOfType(Type.FLYING)) { multiplier.value = 1; + } target.addTag(BattlerTagType.IGNORE_FLYING, 20, move.id, user.id); //TODO: Grounded effect should not have turn limit return true; } @@ -3115,7 +3197,7 @@ export class IceNoEffectTypeAttr extends VariableMoveTypeMultiplierAttr { * @param {any[]} args Sets to false if the target is Ice-Type, so it should do no damage/no effect. * @returns {boolean} Returns true if move is successful, false if Ice-Type. */ - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (target.isOfType(Type.ICE)) { (args[0] as Utils.BooleanHolder).value = false; return false; @@ -3135,10 +3217,11 @@ export class FlyingTypeMultiplierAttr extends VariableMoveTypeMultiplierAttr { export class OneHitKOAccuracyAttr extends VariableAccuracyAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const accuracy = args[0] as Utils.NumberHolder; - if (user.level < target.level) + if (user.level < target.level) { accuracy.value = 0; - else + } else { accuracy.value = Math.min(Math.max(30 + 100 * (1 - target.level / user.level), 0), 100); + } return true; } } @@ -3156,12 +3239,12 @@ export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr { */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const accuracy = args[0] as Utils.NumberHolder; - if (user.level < target.level) { - accuracy.value = 0; - } else { - const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20; - accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100); - } + if (user.level < target.level) { + accuracy.value = 0; + } else { + const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20; + accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100); + } return true; } } @@ -3199,11 +3282,12 @@ export class NoEffectAttr extends MoveAttr { const crashDamageFunc = (user: Pokemon, move: Move) => { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); - if (cancelled.value) + if (cancelled.value) { return false; + } user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - user.scene.queueMessage(getPokemonMessage(user, ' kept going\nand crashed!')); + user.scene.queueMessage(getPokemonMessage(user, " kept going\nand crashed!")); user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2); return true; @@ -3222,19 +3306,22 @@ export class DisableMoveAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const moveQueue = target.getLastXMoves(); let turnMove: TurnMove; while (moveQueue.length) { turnMove = moveQueue.shift(); - if (turnMove.virtual) + if (turnMove.virtual) { continue; + } const moveIndex = target.getMoveset().findIndex(m => m.moveId === turnMove.move); - if (moveIndex === -1) + if (moveIndex === -1) { return false; + } const disabledMove = target.getMoveset()[moveIndex]; target.summonData.disabledMove = disabledMove.moveId; @@ -3250,19 +3337,22 @@ export class DisableMoveAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { - if (target.summonData.disabledMove || target.isMax()) + if (target.summonData.disabledMove || target.isMax()) { return false; + } const moveQueue = target.getLastXMoves(); let turnMove: TurnMove; while (moveQueue.length) { turnMove = moveQueue.shift(); - if (turnMove.virtual) + if (turnMove.virtual) { continue; + } const move = target.getMoveset().find(m => m.moveId === turnMove.move); - if (!move) + if (!move) { continue; + } return true; } @@ -3284,8 +3374,9 @@ export class FrenzyAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } if (!user.getMoveQueue().length) { if (!user.getTag(BattlerTagType.FRENZY)) { @@ -3304,8 +3395,9 @@ export class FrenzyAttr extends MoveEffectAttr { } export const frenzyMissFunc: UserMoveConditionFunc = (user: Pokemon, move: Move) => { - while (user.getMoveQueue().length && user.getMoveQueue()[0].move === move.id) + while (user.getMoveQueue().length && user.getMoveQueue()[0].move === move.id) { user.getMoveQueue().shift(); + } user.lapseTag(BattlerTagType.FRENZY); return true; @@ -3327,12 +3419,14 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const chance = this.getTagChance(user, target, move); - if (chance < 0 || chance === 100 || user.randSeedInt(100) < chance) + if (chance < 0 || chance === 100 || user.randSeedInt(100) < chance) { return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id); + } return false; } @@ -3349,50 +3443,51 @@ export class AddBattlerTagAttr extends MoveEffectAttr { getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { switch (this.tagType) { - case BattlerTagType.RECHARGING: - case BattlerTagType.PERISH_SONG: - return -16; - case BattlerTagType.FLINCHED: - case BattlerTagType.CONFUSED: - case BattlerTagType.INFATUATED: - case BattlerTagType.NIGHTMARE: - case BattlerTagType.DROWSY: - case BattlerTagType.NO_CRIT: - return -5; - case BattlerTagType.SEEDED: - case BattlerTagType.SALT_CURED: - case BattlerTagType.CURSED: - case BattlerTagType.FRENZY: - case BattlerTagType.TRAPPED: - case BattlerTagType.BIND: - case BattlerTagType.WRAP: - case BattlerTagType.FIRE_SPIN: - case BattlerTagType.WHIRLPOOL: - case BattlerTagType.CLAMP: - case BattlerTagType.SAND_TOMB: - case BattlerTagType.MAGMA_STORM: - case BattlerTagType.SNAP_TRAP: - case BattlerTagType.THUNDER_CAGE: - case BattlerTagType.INFESTATION: - return -3; - case BattlerTagType.ENCORE: - return -2; - case BattlerTagType.INGRAIN: - case BattlerTagType.IGNORE_ACCURACY: - case BattlerTagType.AQUA_RING: - return 3; - case BattlerTagType.PROTECTED: - case BattlerTagType.FLYING: - case BattlerTagType.CRIT_BOOST: - case BattlerTagType.ALWAYS_CRIT: - return 5; + case BattlerTagType.RECHARGING: + case BattlerTagType.PERISH_SONG: + return -16; + case BattlerTagType.FLINCHED: + case BattlerTagType.CONFUSED: + case BattlerTagType.INFATUATED: + case BattlerTagType.NIGHTMARE: + case BattlerTagType.DROWSY: + case BattlerTagType.NO_CRIT: + return -5; + case BattlerTagType.SEEDED: + case BattlerTagType.SALT_CURED: + case BattlerTagType.CURSED: + case BattlerTagType.FRENZY: + case BattlerTagType.TRAPPED: + case BattlerTagType.BIND: + case BattlerTagType.WRAP: + case BattlerTagType.FIRE_SPIN: + case BattlerTagType.WHIRLPOOL: + case BattlerTagType.CLAMP: + case BattlerTagType.SAND_TOMB: + case BattlerTagType.MAGMA_STORM: + case BattlerTagType.SNAP_TRAP: + case BattlerTagType.THUNDER_CAGE: + case BattlerTagType.INFESTATION: + return -3; + case BattlerTagType.ENCORE: + return -2; + case BattlerTagType.INGRAIN: + case BattlerTagType.IGNORE_ACCURACY: + case BattlerTagType.AQUA_RING: + return 3; + case BattlerTagType.PROTECTED: + case BattlerTagType.FLYING: + case BattlerTagType.CRIT_BOOST: + case BattlerTagType.ALWAYS_CRIT: + return 5; } } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { let chance = this.getTagChance(user, target, move); - if (chance < 0) + if (chance < 0) { chance = 100; + } return Math.floor(this.getTagTargetBenefitScore(user, target, move) * (chance / 100)); } } @@ -3402,10 +3497,10 @@ export class CurseAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { if (user.getTypes(true).includes(Type.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { - user.scene.queueMessage('But it failed!'); + user.scene.queueMessage("But it failed!"); return false; } - let curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); + const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand laid a curse on the ${target.name}!`)); target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); @@ -3428,11 +3523,13 @@ export class LapseBattlerTagAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - for (let tagType of this.tagTypes) + for (const tagType of this.tagTypes) { (this.selfTarget ? user : target).lapseTag(tagType); + } return true; } @@ -3448,11 +3545,13 @@ export class RemoveBattlerTagAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - for (let tagType of this.tagTypes) + for (const tagType of this.tagTypes) { (this.selfTarget ? user : target).removeTag(tagType); + } return true; } @@ -3495,12 +3594,14 @@ export class ProtectAttr extends AddBattlerTagAttr { while (moveHistory.length) { turnMove = moveHistory.shift(); - if(!allMoves[turnMove.move].getAttrs(ProtectAttr).length || turnMove.result !== MoveResult.SUCCESS) + if(!allMoves[turnMove.move].getAttrs(ProtectAttr).length || turnMove.result !== MoveResult.SUCCESS) { break; + } timesUsed++; } - if (timesUsed) + if (timesUsed) { return !user.randSeedInt(Math.pow(3, timesUsed)); + } return true; }); } @@ -3518,8 +3619,9 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); @@ -3533,8 +3635,9 @@ export class AlwaysCritsAttr extends AddBattlerTagAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); @@ -3548,8 +3651,9 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.scene.queueMessage(getPokemonMessage(target, `\nwill faint in ${this.turnCountMin - 1} turns.`)); @@ -3595,8 +3699,9 @@ export class AddArenaTagAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) { user.scene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); @@ -3617,8 +3722,9 @@ export class AddArenaTrapTagAttr extends AddArenaTagAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (move.category !== MoveCategory.STATUS || !user.scene.arena.getTagOnSide(this.tagType, side)) + if (move.category !== MoveCategory.STATUS || !user.scene.arena.getTagOnSide(this.tagType, side)) { return true; + } const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; return tag.layers < tag.maxLayers; }; @@ -3636,8 +3742,9 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } if(this.targetBothSides){ user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER); @@ -3649,8 +3756,7 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.ENEMY); - } - else { + } else { user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER); @@ -3672,8 +3778,9 @@ export class RemoveScreensAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } if(this.targetBothSides){ user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.PLAYER); @@ -3683,8 +3790,7 @@ export class RemoveScreensAttr extends MoveEffectAttr { user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.ENEMY); - } - else{ + } else{ user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); @@ -3717,40 +3823,41 @@ export class RevivalBlessingAttr extends MoveEffectAttr { // If user is player, checks if the user has fainted pokemon if(user instanceof PlayerPokemon && user.scene.getParty().findIndex(p => p.isFainted())>-1) { - (user as PlayerPokemon).revivalBlessing().then(() => { - resolve(true) - }); + (user as PlayerPokemon).revivalBlessing().then(() => { + resolve(true); + }); // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party } else if(user instanceof EnemyPokemon && user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { - // Selects a random fainted pokemon - const faintedPokemon = user.scene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); - const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; - const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); - pokemon.resetStatus(); - pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); - user.scene.queueMessage(`${pokemon.name} was revived!`,0,true); - - if(user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { - const allyPokemon = user.getAlly(); - if(slotIndex<=1) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, pokemon.getFieldIndex(), slotIndex, false, false, false)); - } else if(allyPokemon.isFainted()){ - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false,false)); - } + // Selects a random fainted pokemon + const faintedPokemon = user.scene.getEnemyParty().filter(p => p.isFainted() && !p.isBoss()); + const pokemon = faintedPokemon[user.randSeedInt(faintedPokemon.length)]; + const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); + pokemon.resetStatus(); + pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); + user.scene.queueMessage(`${pokemon.name} was revived!`,0,true); + + if(user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { + const allyPokemon = user.getAlly(); + if(slotIndex<=1) { + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, pokemon.getFieldIndex(), slotIndex, false, false, false)); + } else if(allyPokemon.isFainted()){ + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false,false)); } - resolve(true); + } + resolve(true); } else { - user.scene.queueMessage(`But it failed!`); + user.scene.queueMessage("But it failed!"); resolve(false); } - }) + }); } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if(user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) + if(user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { return 20; + } return -20; } @@ -3770,11 +3877,11 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return new Promise(resolve => { // Check if the move category is not STATUS or if the switch out condition is not met - if (!this.getSwitchOutCondition()(user, target, move)) { + if (!this.getSwitchOutCondition()(user, target, move)) { //Apply effects before switch out i.e. poison point, flame body, etc - applyPostDefendAbAttrs(PostDefendContactApplyStatusEffectAbAttr, target, user, new PokemonMove(move.id), null); - return resolve(false); - } + applyPostDefendAbAttrs(PostDefendContactApplyStatusEffectAbAttr, target, user, new PokemonMove(move.id), null); + return resolve(false); + } // Move the switch out logic inside the conditional block // This ensures that the switch out only happens when the conditions are met @@ -3783,11 +3890,11 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { if (switchOutTarget.hp) { applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); - } else - resolve(false); + } else { + resolve(false); + } return; - } - else if (user.scene.currentBattle.battleType) { + } else if (user.scene.currentBattle.battleType) { // Switch out logic for the battle type switchOutTarget.resetTurnData(); switchOutTarget.resetSummonData(); @@ -3796,17 +3903,17 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { switchOutTarget.scene.field.remove(switchOutTarget); user.scene.triggerPokemonFormChange(switchOutTarget, SpeciesFormChangeActiveTrigger, true); - if (switchOutTarget.hp) - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false)); - } - else { + if (switchOutTarget.hp) { + user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false)); + } + } else { // Switch out logic for everything else switchOutTarget.setVisible(false); if (switchOutTarget.hp) { switchOutTarget.hideInfo().then(() => switchOutTarget.destroy()); switchOutTarget.scene.field.remove(switchOutTarget); - user.scene.queueMessage(getPokemonMessage(switchOutTarget, ' fled!'), null, true, 500); + user.scene.queueMessage(getPokemonMessage(switchOutTarget, " fled!"), null, true, 500); } if (!switchOutTarget.getAlly()?.isActive(true)) { @@ -3821,16 +3928,16 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { resolve(true); }); - } + } - getCondition(): MoveConditionFunc { + getCondition(): MoveConditionFunc { return (user, target, move) => (move.category !== MoveCategory.STATUS || this.getSwitchOutCondition()(user, target, move)); } getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { const blockedByAbility = new Utils.BooleanHolder(false); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); - return blockedByAbility.value ? getPokemonMessage(target, ` can't be switched out!`) : null; + return blockedByAbility.value ? getPokemonMessage(target, " can't be switched out!") : null; } getSwitchOutCondition(): MoveConditionFunc { @@ -3838,15 +3945,18 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { const switchOutTarget = (this.user ? user : target); const player = switchOutTarget instanceof PlayerPokemon; - if (!this.user && move.category == MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr) || target.isMax())) + if (!this.user && move.category === MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr) || target.isMax())) { return false; + } if (!player && !user.scene.currentBattle.battleType) { - if (this.batonPass) + if (this.batonPass) { return false; + } // Don't allow wild opponents to flee on the boss stage since it can ruin a run early on - if (!(user.scene.currentBattle.waveIndex % 10)) + if (!(user.scene.currentBattle.waveIndex % 10)) { return false; + } } const party = player ? user.scene.getParty() : user.scene.getEnemyParty(); @@ -3855,12 +3965,13 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if (!user.scene.getEnemyParty().find(p => p.isActive() && !p.isOnField())) + if (!user.scene.getEnemyParty().find(p => p.isActive() && !p.isOnField())) { return -20; + } let ret = this.user ? Math.floor((1 - user.getHpRatio()) * 20) : super.getUserBenefitScore(user, target, move); if (this.user && this.batonPass) { const battleStatTotal = user.summonData.battleStats.reduce((bs: integer, total: integer) => total += bs, 0); - ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction('Sine.easeOut')(Math.min(Math.abs(battleStatTotal), 10) / 10) * (battleStatTotal >= 0 ? 10 : -10)); + ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut")(Math.min(Math.abs(battleStatTotal), 10) / 10) * (battleStatTotal >= 0 ? 10 : -10)); } return ret; } @@ -3879,13 +3990,15 @@ export class RemoveTypeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - if(user.isTerastallized && user.getTeraType() == this.removedType) // active tera types cannot be removed + if(user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; + } - const userTypes = user.getTypes(true) + const userTypes = user.getTypes(true); const modifiedTypes = userTypes.filter(type => type !== this.removedType); user.summonData.types = modifiedTypes; user.updateInfo(); @@ -3905,8 +4018,9 @@ export class CopyTypeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.summonData.types = target.getTypes(true); user.updateInfo(); @@ -3927,8 +4041,9 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const biomeType = user.scene.arena.getTypeForBiome(); @@ -3979,7 +4094,7 @@ export class AddTypeAttr extends MoveEffectAttr { target.summonData.types = types; target.updateInfo(); - user.scene.queueMessage(`${Utils.toReadableString(Type[this.type])} was added to\n` + getPokemonMessage(target, '!')); + user.scene.queueMessage(`${Utils.toReadableString(Type[this.type])} was added to\n` + getPokemonMessage(target, "!")); return true; } @@ -3995,10 +4110,11 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } - const firstMoveType = target.getMoveset()[0].getMove().type + const firstMoveType = target.getMoveset()[0].getMove().type; user.summonData.types = [ firstMoveType ]; @@ -4024,23 +4140,24 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { const move = moves[user.randSeedInt(moves.length)]; const moveIndex = moveset.findIndex(m => m.moveId === move.moveId); const moveTargets = getMoveTargets(user, move.moveId); - if (!moveTargets.targets.length) + if (!moveTargets.targets.length) { return false; + } let selectTargets: BattlerIndex[]; switch (true) { - case (moveTargets.multiple || moveTargets.targets.length === 1): { - selectTargets = moveTargets.targets; - break; - } - case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { - selectTargets = [ target.getBattlerIndex() ]; - break; - } - default: { - moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); - selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; - break; - } + case (moveTargets.multiple || moveTargets.targets.length === 1): { + selectTargets = moveTargets.targets; + break; + } + case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { + selectTargets = [ target.getBattlerIndex() ]; + break; + } + default: { + moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); + selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; + break; + } } const targets = selectTargets; user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true }); @@ -4055,7 +4172,7 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { export class RandomMoveAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - const moveIds = Utils.getEnumValues(Moves).filter(m => !allMoves[m].hasFlag(MoveFlags.IGNORE_VIRTUAL) && !allMoves[m].name.endsWith(' (N)')); + const moveIds = Utils.getEnumValues(Moves).filter(m => !allMoves[m].hasFlag(MoveFlags.IGNORE_VIRTUAL) && !allMoves[m].name.endsWith(" (N)")); const moveId = moveIds[user.randSeedInt(moveIds.length)]; const moveTargets = getMoveTargets(user, moveId); @@ -4081,134 +4198,134 @@ export class RandomMoveAttr extends OverrideMoveEffectAttr { export class NaturePowerAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - var moveId; + let moveId; switch (user.scene.arena.getTerrainType()) { - // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (user.scene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; - break; - case Biome.METROPOLIS: - moveId = Moves.TRI_ATTACK; - break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } + // this allows terrains to 'override' the biome move + case TerrainType.NONE: + switch (user.scene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } + break; + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match + moveId = Moves.TRI_ATTACK; + break; } user.getMoveQueue().push({ move: moveId, targets: [target.getBattlerIndex()], ignorePP: true }); @@ -4224,11 +4341,13 @@ export class NaturePowerAttr extends OverrideMoveEffectAttr { const lastMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { const copiableMove = user.scene.currentBattle.lastMove; - if (!copiableMove) + if (!copiableMove) { return false; + } - if (allMoves[copiableMove].getAttrs(ChargeAttr).length) + if (allMoves[copiableMove].getAttrs(ChargeAttr).length) { return false; + } // TODO: Add last turn of Bide @@ -4240,8 +4359,9 @@ export class CopyMoveAttr extends OverrideMoveEffectAttr { const lastMove = user.scene.currentBattle.lastMove; const moveTargets = getMoveTargets(user, lastMove); - if (!moveTargets.targets.length) + if (!moveTargets.targets.length) { return false; + } const targets = moveTargets.multiple || moveTargets.targets.length === 1 ? moveTargets.targets @@ -4291,8 +4411,9 @@ export class ReducePpMoveAttr extends MoveEffectAttr { const maxPp = movesetMove.getMovePp(); const ppLeft = maxPp - movesetMove.ppUsed; const value = -(8 - Math.ceil(Math.min(maxPp, 30) / 5)); - if (ppLeft < 4) + if (ppLeft < 4) { return (value / 4) * ppLeft; + } return value; } } @@ -4304,34 +4425,39 @@ export class ReducePpMoveAttr extends MoveEffectAttr { // TODO: Review this const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) + if (!targetMoves.length) { return false; + } const copiableMove = targetMoves[0]; - if (!copiableMove.move) + if (!copiableMove.move) { return false; + } - if (allMoves[copiableMove.move].getAttrs(ChargeAttr).length && copiableMove.result === MoveResult.OTHER) + if (allMoves[copiableMove.move].getAttrs(ChargeAttr).length && copiableMove.result === MoveResult.OTHER) { return false; + } - // TODO: Add last turn of Bide + // TODO: Add last turn of Bide - return true; + return true; }; export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) + if (!targetMoves.length) { return false; + } const copiedMove = allMoves[targetMoves[0].move]; const thisMoveIndex = user.getMoveset().findIndex(m => m.moveId === move.id); - if (thisMoveIndex === -1) + if (thisMoveIndex === -1) { return false; + } user.summonData.moveset = user.getMoveset().slice(0); user.summonData.moveset[thisMoveIndex] = new PokemonMove(copiedMove.id, 0, 0); @@ -4352,19 +4478,22 @@ export class SketchAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) + if (!targetMoves.length) { return false; + } const sketchedMove = allMoves[targetMoves[0].move]; const sketchIndex = user.getMoveset().findIndex(m => m.moveId === move.id); - if (sketchIndex === -1) + if (sketchIndex === -1) { return false; + } user.setMove(sketchIndex, sketchedMove.id); @@ -4375,17 +4504,20 @@ export class SketchAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { - if (!targetMoveCopiableCondition(user, target, move)) + if (!targetMoveCopiableCondition(user, target, move)) { return false; + } const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) + if (!targetMoves.length) { return false; + } const sketchableMove = targetMoves[0]; - if (user.getMoveset().find(m => m.moveId === sketchableMove.move)) + if (user.getMoveset().find(m => m.moveId === sketchableMove.move)) { return false; + } return true; }; @@ -4402,12 +4534,13 @@ export class AbilityChangeAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } (this.selfTarget ? user : target).summonData.ability = this.ability; - user.scene.queueMessage('The ' + getPokemonMessage((this.selfTarget ? user : target), ` acquired\n${allAbilities[this.ability].name}!`)); + user.scene.queueMessage("The " + getPokemonMessage((this.selfTarget ? user : target), ` acquired\n${allAbilities[this.ability].name}!`)); return true; } @@ -4427,16 +4560,17 @@ export class AbilityCopyAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } user.summonData.ability = target.getAbility().id; - user.scene.queueMessage(getPokemonMessage(user, ` copied the `) + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.scene.queueMessage(getPokemonMessage(user, " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); if (this.copyToPartner && user.scene.currentBattle?.double && user.getAlly().hp) { user.getAlly().summonData.ability = target.getAbility().id; - user.getAlly().scene.queueMessage(getPokemonMessage(user.getAlly(), ` copied the `) + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); + user.getAlly().scene.queueMessage(getPokemonMessage(user.getAlly(), " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); } return true; @@ -4445,10 +4579,11 @@ export class AbilityCopyAttr extends MoveEffectAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { let ret = !target.getAbility().hasAttr(UncopiableAbilityAbAttr) && !user.getAbility().hasAttr(UnsuppressableAbilityAbAttr); - if (this.copyToPartner && user.scene.currentBattle?.double) + if (this.copyToPartner && user.scene.currentBattle?.double) { ret = ret && (!user.getAlly().hp || !user.getAlly().getAbility().hasAttr(UnsuppressableAbilityAbAttr)); - else + } else { ret = ret && user.getAbility().id !== target.getAbility().id; + } return ret; }; } @@ -4462,12 +4597,13 @@ export class AbilityGiveAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } target.summonData.ability = user.getAbility().id; - user.scene.queueMessage('The' + getPokemonMessage(target, `\nacquired ${allAbilities[user.getAbility().id].name}!`)); + user.scene.queueMessage("The" + getPokemonMessage(target, `\nacquired ${allAbilities[user.getAbility().id].name}!`)); return true; } @@ -4479,14 +4615,15 @@ export class AbilityGiveAttr extends MoveEffectAttr { export class SwitchAbilitiesAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } const tempAbilityId = user.getAbility().id; user.summonData.ability = target.getAbility().id; target.summonData.ability = tempAbilityId; - user.scene.queueMessage(getPokemonMessage(user, ` swapped\nabilities with its target!`)); + user.scene.queueMessage(getPokemonMessage(user, " swapped\nabilities with its target!")); return true; } @@ -4498,12 +4635,13 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { export class SuppressAbilitiesAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return false; + } target.summonData.abilitySuppressed = true; - target.scene.queueMessage(getPokemonMessage(target, ` ability\nwas suppressed!`)); + target.scene.queueMessage(getPokemonMessage(target, " ability\nwas suppressed!")); return true; } @@ -4516,8 +4654,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { export class TransformAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - if (!super.apply(user, target, move, args)) + if (!super.apply(user, target, move, args)) { return resolve(false); + } user.summonData.speciesForm = target.getSpeciesForm(); user.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); @@ -4544,8 +4683,9 @@ export class DiscourageFrequentUseAttr extends MoveAttr { const lastMoves = user.getLastXMoves(4); console.log(lastMoves); for (let m = 0; m < lastMoves.length; m++) { - if (lastMoves[m].move === move.id) + if (lastMoves[m].move === move.id) { return (4 - (m + 1)) * -10; + } } return 0; @@ -4559,7 +4699,7 @@ export class MoneyAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move): boolean { user.scene.currentBattle.moneyScattered += user.scene.getWaveMoneyAmount(0.2); - user.scene.queueMessage("Coins were scattered everywhere!") + user.scene.queueMessage("Coins were scattered everywhere!"); return true; } } @@ -4570,8 +4710,9 @@ export class LastResortAttr extends MoveAttr { const uniqueUsedMoveIds = new Set(); const movesetMoveIds = user.getMoveset().map(m => m.moveId); user.getMoveHistory().map(m => { - if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move)) + if (m.move !== move.id && movesetMoveIds.find(mm => mm === m.move)) { uniqueUsedMoveIds.add(m.move); + } }); return uniqueUsedMoveIds.size >= movesetMoveIds.length - 1; }; @@ -4604,10 +4745,11 @@ const failIfDampCondition: MoveConditionFunc = (user, target, move) => { const cancelled = new Utils.BooleanHolder(false); user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); // Queue a message if an ability prevented usage of the move - if (cancelled.value) + if (cancelled.value) { user.scene.queueMessage(getPokemonMessage(user, ` cannot use ${move.name}!`)); + } return !cancelled.value; -} +}; export type MoveAttrFilter = (attr: MoveAttr) => boolean; @@ -4615,10 +4757,11 @@ function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon, targe return new Promise(resolve => { const attrPromises: Promise[] = []; const moveAttrs = move.attrs.filter(a => attrFilter(a)); - for (let attr of moveAttrs) { + for (const attr of moveAttrs) { const result = attr.apply(user, target, move, args); - if (result instanceof Promise) + if (result instanceof Promise) { attrPromises.push(result); + } } Promise.allSettled(attrPromises).then(() => resolve()); }); @@ -4674,7 +4817,7 @@ const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.ge export type MoveTargetSet = { targets: BattlerIndex[]; multiple: boolean; -} +}; export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { const variableTarget = new Utils.NumberHolder(0); @@ -4687,47 +4830,47 @@ export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { let multiple = false; switch (moveTarget) { - case MoveTarget.USER: - case MoveTarget.PARTY: - set = [ user ]; - break; - case MoveTarget.NEAR_OTHER: - case MoveTarget.OTHER: - case MoveTarget.ALL_NEAR_OTHERS: - case MoveTarget.ALL_OTHERS: - set = (opponents.concat([ user.getAlly() ])); - multiple = moveTarget === MoveTarget.ALL_NEAR_OTHERS || moveTarget === MoveTarget.ALL_OTHERS - break; - case MoveTarget.NEAR_ENEMY: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_ENEMIES: - case MoveTarget.ENEMY_SIDE: - set = opponents; - multiple = moveTarget !== MoveTarget.NEAR_ENEMY; - break; - case MoveTarget.RANDOM_NEAR_ENEMY: - set = [ opponents[user.randSeedInt(opponents.length)] ]; - break; - case MoveTarget.ATTACKER: - return { targets: [ -1 as BattlerIndex ], multiple: false }; - case MoveTarget.NEAR_ALLY: - case MoveTarget.ALLY: - set = [ user.getAlly() ]; - break; - case MoveTarget.USER_OR_NEAR_ALLY: - case MoveTarget.USER_AND_ALLIES: - case MoveTarget.USER_SIDE: - set = [ user, user.getAlly() ]; - multiple = moveTarget !== MoveTarget.USER_OR_NEAR_ALLY; - break; - case MoveTarget.ALL: - case MoveTarget.BOTH_SIDES: - set = [ user, user.getAlly() ].concat(opponents); - multiple = true; - break; - case MoveTarget.CURSE: - set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; - break; + case MoveTarget.USER: + case MoveTarget.PARTY: + set = [ user ]; + break; + case MoveTarget.NEAR_OTHER: + case MoveTarget.OTHER: + case MoveTarget.ALL_NEAR_OTHERS: + case MoveTarget.ALL_OTHERS: + set = (opponents.concat([ user.getAlly() ])); + multiple = moveTarget === MoveTarget.ALL_NEAR_OTHERS || moveTarget === MoveTarget.ALL_OTHERS; + break; + case MoveTarget.NEAR_ENEMY: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_ENEMIES: + case MoveTarget.ENEMY_SIDE: + set = opponents; + multiple = moveTarget !== MoveTarget.NEAR_ENEMY; + break; + case MoveTarget.RANDOM_NEAR_ENEMY: + set = [ opponents[user.randSeedInt(opponents.length)] ]; + break; + case MoveTarget.ATTACKER: + return { targets: [ -1 as BattlerIndex ], multiple: false }; + case MoveTarget.NEAR_ALLY: + case MoveTarget.ALLY: + set = [ user.getAlly() ]; + break; + case MoveTarget.USER_OR_NEAR_ALLY: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.USER_SIDE: + set = [ user, user.getAlly() ]; + multiple = moveTarget !== MoveTarget.USER_OR_NEAR_ALLY; + break; + case MoveTarget.ALL: + case MoveTarget.BOTH_SIDES: + set = [ user, user.getAlly() ].concat(opponents); + multiple = true; + break; + case MoveTarget.CURSE: + set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; + break; } return { targets: set.filter(p => p?.isActive(true)).map(p => p.getBattlerIndex()).filter(t => t !== undefined), multiple }; @@ -4767,7 +4910,7 @@ export function initMoves() { .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), new AttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, 'whipped\nup a whirlwind!') + .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, "whipped\nup a whirlwind!") .attr(HighCritAttr) .windMove() .ignoresVirtual() @@ -4787,7 +4930,7 @@ export function initMoves() { .hidesTarget() .windMove(), new AttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, 'flew\nup high!', BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, "flew\nup high!", BattlerTagType.FLYING) .condition(failOnGravityCondition) .ignoresVirtual(), new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, 100, 0, 1) @@ -4934,7 +5077,7 @@ export function initMoves() { .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, 'took\nin sunlight!') + .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, "took\nin sunlight!") .attr(AntiSunlightPowerDecreaseAttr) .ignoresVirtual(), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) @@ -4982,7 +5125,7 @@ export function initMoves() { .attr(HitsTagAttr, BattlerTagType.UNDERGROUND, false) .makesContact(false), new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, 'dug a hole!', BattlerTagType.UNDERGROUND) + .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, "dug a hole!", BattlerTagType.UNDERGROUND) .ignoresVirtual(), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) @@ -5078,7 +5221,7 @@ export function initMoves() { new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, 100, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, 'lowered\nits head!', null, true) + .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, "lowered\nits head!", null, true) .attr(StatChangeAttr, BattleStat.DEF, 1, true) .ignoresVirtual(), new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) @@ -5117,7 +5260,7 @@ export function initMoves() { new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP), new AttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, 'is glowing!') + .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, "is glowing!") .attr(HighCritAttr) .attr(FlinchAttr) .makesContact(false) @@ -5171,7 +5314,7 @@ export function initMoves() { new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1) .attr(FirstMoveTypeAttr), new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1) - .attr(MultiStatusEffectAttr, [StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS]), + .attr(MultiStatusEffectAttr, [StatusEffect.BURN, StatusEffect.FREEZE, StatusEffect.PARALYSIS]), new AttackMove(Moves.SUPER_FANG, Type.NORMAL, MoveCategory.PHYSICAL, -1, 90, 10, -1, 0, 1) .attr(TargetHalfHpDamageAttr), new AttackMove(Moves.SLASH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 1) @@ -5426,7 +5569,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPDEF, -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, 'foresaw\nan attack!'), + .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, "foresaw\nan attack!"), new AttackMove(Moves.ROCK_SMASH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) .attr(StatChangeAttr, BattleStat.DEF, -1), new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, 100, 0, 2) @@ -5514,7 +5657,7 @@ export function initMoves() { new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) .attr(TurnDamagedDoublePowerAttr), new AttackMove(Moves.BRICK_BREAK, Type.FIGHTING, MoveCategory.PHYSICAL, 75, 100, 15, -1, 0, 3) - .attr(RemoveScreensAttr), + .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), @@ -5542,7 +5685,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) - .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, 'hid\nunderwater!', BattlerTagType.UNDERWATER) + .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, "hid\nunderwater!", BattlerTagType.UNDERWATER) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), @@ -5673,7 +5816,7 @@ export function initMoves() { new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1, true), new AttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) - .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, 'sprang up!', BattlerTagType.FLYING) + .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, "sprang up!", BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .condition(failOnGravityCondition) .ignoresVirtual(), @@ -5709,7 +5852,7 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, 'chose\nDoom Desire as its destiny!'), + .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, "chose\nDoom Desire as its destiny!"), new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, 100, 0, 3) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) @@ -5760,7 +5903,7 @@ export function initMoves() { new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 4) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true), new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.BALL ? 2 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.BALL ? 2 : 1), new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) @@ -5776,7 +5919,7 @@ export function initMoves() { || user.status?.effect === StatusEffect.PARALYSIS || user.status?.effect === StatusEffect.SLEEP) && target.canSetStatus(user.status?.effect, false, false, user) - ), + ), new AttackMove(Moves.TRUMP_CARD, Type.NORMAL, MoveCategory.SPECIAL, -1, -1, 5, -1, 0, 4) .makesContact() .attr(LessPPMorePowerAttr), @@ -6022,7 +6165,7 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .windMove(), new AttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) - .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, 'vanished\ninstantly!', BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) @@ -6135,7 +6278,7 @@ export function initMoves() { new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status ? 2 : 1), new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) - .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, 'took {TARGET}\ninto the sky!', BattlerTagType.FLYING) // TODO: Add 2nd turn message + .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, "took {TARGET}\ninto the sky!", BattlerTagType.FLYING) // TODO: Add 2nd turn message .condition(failOnGravityCondition) .ignoresVirtual(), new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) @@ -6255,11 +6398,11 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .danceMove(), new AttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, 'became cloaked\nin a freezing light!') + .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, "became cloaked\nin a freezing light!") .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), new AttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, 'became cloaked\nin freezing air!') + .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, "became cloaked\nin freezing air!") .attr(StatusEffectAttr, StatusEffect.BURN) .ignoresVirtual(), new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) @@ -6295,7 +6438,7 @@ export function initMoves() { new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatChangeAttr, BattleStat.ATK, 3, true ), new AttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, 'vanished\ninstantly!', BattlerTagType.HIDDEN) + .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, "vanished\ninstantly!", BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) @@ -6638,7 +6781,7 @@ export function initMoves() { }) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(RemoveTypeAttr, Type.FIRE, (user) => { - user.scene.queueMessage(getPokemonMessage(user, ` burned itself out!`)); + user.scene.queueMessage(getPokemonMessage(user, " burned itself out!")); }), new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7) .unimplemented(), @@ -6711,7 +6854,7 @@ export function initMoves() { .bitingMove() .attr(RemoveScreensAttr), new AttackMove(Moves.STOMPING_TANTRUM, Type.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result == MoveResult.MISS || user.getLastXMoves(2)[1]?.result == MoveResult.FAIL ? 2 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), new AttackMove(Moves.SHADOW_BONE, Type.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7) .attr(StatChangeAttr, BattleStat.DEF, -1) .makesContact(false), @@ -6999,7 +7142,7 @@ export function initMoves() { .makesContact(false) .partial(), new AttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, 100, 0, 8) - .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, 'is overflowing\nwith space power!', null, true) + .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, "is overflowing\nwith space power!", null, true) .attr(StatChangeAttr, BattleStat.SPATK, 1, true) .ignoresVirtual(), new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) @@ -7270,9 +7413,9 @@ export function initMoves() { .recklessMove(), new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => { - return user.scene.getParty().reduce((acc, pokemonInParty) => acc + (pokemonInParty.status?.effect == StatusEffect.FAINT ? 1 : 0), - 1,) - }) + return user.scene.getParty().reduce((acc, pokemonInParty) => acc + (pokemonInParty.status?.effect === StatusEffect.FAINT ? 1 : 0), + 1,); + }) .makesContact(false), new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatChangeAttr, BattleStat.SPDEF, -2), @@ -7388,13 +7531,13 @@ export function initMoves() { .slicingMove() .triageMove(), new AttackMove(Moves.DOUBLE_SHOCK, Type.ELECTRIC, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 9) - .condition((user) => { - const userTypes = user.getTypes(true); - return userTypes.includes(Type.ELECTRIC); - }) - .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { - user.scene.queueMessage(getPokemonMessage(user, ` used up all its electricity!`)); - }), + .condition((user) => { + const userTypes = user.getTypes(true); + return userTypes.includes(Type.ELECTRIC); + }) + .attr(RemoveTypeAttr, Type.ELECTRIC, (user) => { + user.scene.queueMessage(getPokemonMessage(user, " used up all its electricity!")); + }), new AttackMove(Moves.GIGATON_HAMMER, Type.STEEL, MoveCategory.PHYSICAL, 160, 100, 5, -1, 0, 9) .makesContact(false) .condition((user, target, move) => { @@ -7472,7 +7615,7 @@ export function initMoves() { .soundBased() .partial(), new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result == MoveResult.MISS || user.getLastXMoves(2)[1]?.result == MoveResult.FAIL ? 2 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1), new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9) .attr(MissEffectAttr, crashDamageFunc) .attr(NoEffectAttr, crashDamageFunc) diff --git a/src/data/nature.ts b/src/data/nature.ts index a8b361674e25..4e1a22c36b05 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -2,7 +2,7 @@ import { Stat, getStatName } from "./pokemon-stat"; import * as Utils from "../utils"; import { TextStyle, getBBCodeFrag } from "../ui/text"; import { UiTheme } from "#app/enums/ui-theme"; -import i18next from 'i18next'; +import i18next from "i18next"; export enum Nature { HARDY, @@ -35,103 +35,105 @@ export enum Nature { export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string { let ret = Utils.toReadableString(Nature[nature]); //Translating nature - if(i18next.exists('nature:' + ret)){ - ret = i18next.t('nature:' + ret as any) + if(i18next.exists("nature:" + ret)){ + ret = i18next.t("nature:" + ret as any); } if (includeStatEffects) { const stats = Utils.getEnumValues(Stat).slice(1); let increasedStat: Stat = null; let decreasedStat: Stat = null; - for (let stat of stats) { + for (const stat of stats) { const multiplier = getNatureStatMultiplier(nature, stat); - if (multiplier > 1) + if (multiplier > 1) { increasedStat = stat; - else if (multiplier < 1) + } else if (multiplier < 1) { decreasedStat = stat; + } } const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW; const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text; - if (increasedStat && decreasedStat) - ret = `${getTextFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag('/', textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(')', textStyle)}`; - else - ret = getTextFrag(`${ret}${!forStarterSelect ? '\n' : ' '}(-)`, textStyle); + if (increasedStat && decreasedStat) { + ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`; + } else { + ret = getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(-)`, textStyle); + } } return ret; } export function getNatureStatMultiplier(nature: Nature, stat: Stat): number { switch (stat) { - case Stat.ATK: - switch (nature) { - case Nature.LONELY: - case Nature.BRAVE: - case Nature.ADAMANT: - case Nature.NAUGHTY: - return 1.1; - case Nature.BOLD: - case Nature.TIMID: - case Nature.MODEST: - case Nature.CALM: - return 0.9; - } - break; - case Stat.DEF: - switch (nature) { - case Nature.BOLD: - case Nature.RELAXED: - case Nature.IMPISH: - case Nature.LAX: - return 1.1; - case Nature.LONELY: - case Nature.HASTY: - case Nature.MILD: - case Nature.GENTLE: - return 0.9; - } - break; - case Stat.SPATK: - switch (nature) { - case Nature.MODEST: - case Nature.MILD: - case Nature.QUIET: - case Nature.RASH: - return 1.1; - case Nature.ADAMANT: - case Nature.IMPISH: - case Nature.JOLLY: - case Nature.CAREFUL: - return 0.9; - } - break; - case Stat.SPDEF: - switch (nature) { - case Nature.CALM: - case Nature.GENTLE: - case Nature.SASSY: - case Nature.CAREFUL: - return 1.1; - case Nature.NAUGHTY: - case Nature.LAX: - case Nature.NAIVE: - case Nature.RASH: - return 0.9; - } - break; - case Stat.SPD: - switch (nature) { - case Nature.TIMID: - case Nature.HASTY: - case Nature.JOLLY: - case Nature.NAIVE: - return 1.1; - case Nature.BRAVE: - case Nature.RELAXED: - case Nature.QUIET: - case Nature.SASSY: - return 0.9; - } - break; + case Stat.ATK: + switch (nature) { + case Nature.LONELY: + case Nature.BRAVE: + case Nature.ADAMANT: + case Nature.NAUGHTY: + return 1.1; + case Nature.BOLD: + case Nature.TIMID: + case Nature.MODEST: + case Nature.CALM: + return 0.9; + } + break; + case Stat.DEF: + switch (nature) { + case Nature.BOLD: + case Nature.RELAXED: + case Nature.IMPISH: + case Nature.LAX: + return 1.1; + case Nature.LONELY: + case Nature.HASTY: + case Nature.MILD: + case Nature.GENTLE: + return 0.9; + } + break; + case Stat.SPATK: + switch (nature) { + case Nature.MODEST: + case Nature.MILD: + case Nature.QUIET: + case Nature.RASH: + return 1.1; + case Nature.ADAMANT: + case Nature.IMPISH: + case Nature.JOLLY: + case Nature.CAREFUL: + return 0.9; + } + break; + case Stat.SPDEF: + switch (nature) { + case Nature.CALM: + case Nature.GENTLE: + case Nature.SASSY: + case Nature.CAREFUL: + return 1.1; + case Nature.NAUGHTY: + case Nature.LAX: + case Nature.NAIVE: + case Nature.RASH: + return 0.9; + } + break; + case Stat.SPD: + switch (nature) { + case Nature.TIMID: + case Nature.HASTY: + case Nature.JOLLY: + case Nature.NAIVE: + return 1.1; + case Nature.BRAVE: + case Nature.RELAXED: + case Nature.QUIET: + case Nature.SASSY: + return 0.9; + } + break; } return 1; -} \ No newline at end of file +} diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index f5e39ba38abe..de8d5456f457 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -1,5 +1,5 @@ import BattleScene from "../battle-scene"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export enum PokeballType { POKEBALL, @@ -8,81 +8,81 @@ export enum PokeballType { ROGUE_BALL, MASTER_BALL, LUXURY_BALL -}; +} export function getPokeballAtlasKey(type: PokeballType): string { switch (type) { - case PokeballType.POKEBALL: - return 'pb'; - case PokeballType.GREAT_BALL: - return 'gb'; - case PokeballType.ULTRA_BALL: - return 'ub'; - case PokeballType.ROGUE_BALL: - return 'rb'; - case PokeballType.MASTER_BALL: - return 'mb'; - case PokeballType.LUXURY_BALL: - return 'lb'; + case PokeballType.POKEBALL: + return "pb"; + case PokeballType.GREAT_BALL: + return "gb"; + case PokeballType.ULTRA_BALL: + return "ub"; + case PokeballType.ROGUE_BALL: + return "rb"; + case PokeballType.MASTER_BALL: + return "mb"; + case PokeballType.LUXURY_BALL: + return "lb"; } } export function getPokeballName(type: PokeballType): string { let ret: string; switch (type) { - case PokeballType.POKEBALL: - ret = i18next.t('pokeball:pokeBall'); - break; - case PokeballType.GREAT_BALL: - ret = i18next.t('pokeball:greatBall'); - break; - case PokeballType.ULTRA_BALL: - ret = i18next.t('pokeball:ultraBall'); - break; - case PokeballType.ROGUE_BALL: - ret = i18next.t('pokeball:rogueBall'); - break; - case PokeballType.MASTER_BALL: - ret = i18next.t('pokeball:masterBall'); - break; - case PokeballType.LUXURY_BALL: - ret = i18next.t('pokeball:luxuryBall'); - break; + case PokeballType.POKEBALL: + ret = i18next.t("pokeball:pokeBall"); + break; + case PokeballType.GREAT_BALL: + ret = i18next.t("pokeball:greatBall"); + break; + case PokeballType.ULTRA_BALL: + ret = i18next.t("pokeball:ultraBall"); + break; + case PokeballType.ROGUE_BALL: + ret = i18next.t("pokeball:rogueBall"); + break; + case PokeballType.MASTER_BALL: + ret = i18next.t("pokeball:masterBall"); + break; + case PokeballType.LUXURY_BALL: + ret = i18next.t("pokeball:luxuryBall"); + break; } return ret; } export function getPokeballCatchMultiplier(type: PokeballType): number { switch (type) { - case PokeballType.POKEBALL: - return 1; - case PokeballType.GREAT_BALL: - return 1.5; - case PokeballType.ULTRA_BALL: - return 2; - case PokeballType.ROGUE_BALL: - return 3; - case PokeballType.MASTER_BALL: - return -1; - case PokeballType.LUXURY_BALL: - return 1; + case PokeballType.POKEBALL: + return 1; + case PokeballType.GREAT_BALL: + return 1.5; + case PokeballType.ULTRA_BALL: + return 2; + case PokeballType.ROGUE_BALL: + return 3; + case PokeballType.MASTER_BALL: + return -1; + case PokeballType.LUXURY_BALL: + return 1; } } export function getPokeballTintColor(type: PokeballType): number { switch (type) { - case PokeballType.POKEBALL: - return 0xd52929; - case PokeballType.GREAT_BALL: - return 0x94b4de; - case PokeballType.ULTRA_BALL: - return 0xe6cd31; - case PokeballType.ROGUE_BALL: - return 0xd52929; - case PokeballType.MASTER_BALL: - return 0xa441bd; - case PokeballType.LUXURY_BALL: - return 0xffde6a; + case PokeballType.POKEBALL: + return 0xd52929; + case PokeballType.GREAT_BALL: + return 0x94b4de; + case PokeballType.ULTRA_BALL: + return 0xe6cd31; + case PokeballType.ROGUE_BALL: + return 0xd52929; + case PokeballType.MASTER_BALL: + return 0xa441bd; + case PokeballType.LUXURY_BALL: + return 0xffde6a; } } @@ -90,16 +90,16 @@ export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameOb let bouncePower = 1; let bounceYOffset = y1; let bounceY = y2; - let yd = y2 - y1; + const yd = y2 - y1; const doBounce = () => { scene.tweens.add({ targets: pokeball, y: y2, duration: bouncePower * baseBounceDuration, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { - scene.playSound('pb_bounce_1', { volume: bouncePower }); + scene.playSound("pb_bounce_1", { volume: bouncePower }); bouncePower = bouncePower > 0.01 ? bouncePower * 0.5 : 0; @@ -111,14 +111,15 @@ export function doPokeballBounceAnim(scene: BattleScene, pokeball: Phaser.GameOb targets: pokeball, y: bounceY, duration: bouncePower * baseBounceDuration, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", onComplete: () => doBounce() }); - } else if (callback) + } else if (callback) { callback(); + } } }); }; doBounce(); -} \ No newline at end of file +} diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index f87fe8d7d0af..3465b5bb1520 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1,5 +1,5 @@ import { Gender } from "./gender"; -import { AttackTypeBoosterModifier, FlinchChanceModifier } from "../modifier/modifier"; +import { FlinchChanceModifier } from "../modifier/modifier"; import { Moves } from "./enums/moves"; import { PokeballType } from "./pokeball"; import Pokemon from "../field/pokemon"; @@ -185,7 +185,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DUGTRIO, 26, null, null) ], [Species.MEOWTH]: [ - new SpeciesFormEvolution(Species.PERSIAN, '', '', 28, null, null) + new SpeciesFormEvolution(Species.PERSIAN, "", "", 28, null, null) ], [Species.PSYDUCK]: [ new SpeciesEvolution(Species.GOLDUCK, 33, null, null) @@ -858,8 +858,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.PANGORO, 32, null, new SpeciesEvolutionCondition(p => !!p.scene.getParty().find(p => p.getTypes(false, false, true).indexOf(Type.DARK) > -1)), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.ESPURR]: [ - new SpeciesFormEvolution(Species.MEOWSTIC, '', 'female', 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), - new SpeciesFormEvolution(Species.MEOWSTIC, '', '', 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) + new SpeciesFormEvolution(Species.MEOWSTIC, "", "female", 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), + new SpeciesFormEvolution(Species.MEOWSTIC, "", "", 25, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) ], [Species.HONEDGE]: [ new SpeciesEvolution(Species.DOUBLADE, 35, null, null) @@ -1049,9 +1049,9 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BARRASKEWDA, 26, null, null) ], [Species.TOXEL]: [ - new SpeciesFormEvolution(Species.TOXTRICITY, '', 'lowkey', 30, null, + new SpeciesFormEvolution(Species.TOXTRICITY, "", "lowkey", 30, null, new SpeciesEvolutionCondition(p => [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ].indexOf(p.getNature()) > -1)), - new SpeciesFormEvolution(Species.TOXTRICITY, '', 'amped', 30, null, null) + new SpeciesFormEvolution(Species.TOXTRICITY, "", "amped", 30, null, null) ], [Species.SIZZLIPEDE]: [ new SpeciesEvolution(Species.CENTISKORCH, 28, null, null) @@ -1130,8 +1130,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.QUAQUAVAL, 36, null, null) ], [Species.LECHONK]: [ - new SpeciesFormEvolution(Species.OINKOLOGNE, '', 'female', 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), - new SpeciesFormEvolution(Species.OINKOLOGNE, '', '', 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) + new SpeciesFormEvolution(Species.OINKOLOGNE, "", "female", 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE)), + new SpeciesFormEvolution(Species.OINKOLOGNE, "", "", 18, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE)) ], [Species.TAROUNTULA]: [ new SpeciesEvolution(Species.SPIDOPS, 15, null, null) @@ -1215,8 +1215,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLODSIRE, 20, null, null) ], [Species.PIKACHU]: [ - new SpeciesFormEvolution(Species.ALOLA_RAICHU, '', '', 1, EvolutionItem.THUNDER_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.RAICHU, '', '', 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.ALOLA_RAICHU, "", "", 1, EvolutionItem.THUNDER_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.RAICHU, "", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.NIDORINA]: [ new SpeciesEvolution(Species.NIDOQUEEN, 1, EvolutionItem.MOON_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1254,7 +1254,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLOYSTER, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EXEGGCUTE]: [ - new SpeciesEvolution(Species.ALOLA_EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType == Biome.BEACH), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.ALOLA_EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ @@ -1267,14 +1267,14 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EEVEE]: [ - new SpeciesFormEvolution(Species.SYLVEON, '', '', 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ESPEON, '', '', 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.UMBREON, '', '', 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.VAPOREON, '', '', 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.JOLTEON, '', '', 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.FLAREON, '', '', 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.LEAFEON, '', '', 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.GLACEON, '', '', 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.VAPOREON, "", "", 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.JOLTEON, "", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.FLAREON, "", "", 1, EvolutionItem.FIRE_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.LEAFEON, "", "", 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.GLACEON, "", "", 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG), ], [Species.TOGETIC]: [ new SpeciesEvolution(Species.TOGEKISS, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1298,10 +1298,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.FARIGIRAF, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.TWIN_BEAM).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.DUNSPARCE]: [ - new SpeciesFormEvolution(Species.DUDUNSPARCE, '', 'three-segment', 32, null, new SpeciesEvolutionCondition(p => { + new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new SpeciesEvolutionCondition(p => { let ret = false; - if (p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0) + if (p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0) { p.scene.executeWithSeedOffset(() => ret = !Utils.randSeedInt(4), p.id); + } return ret; }), SpeciesWildEvolutionDelay.LONG), new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.HYPER_DRILL).length > 0), SpeciesWildEvolutionDelay.LONG) @@ -1363,8 +1364,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.LILLIGANT, 1, EvolutionItem.SUN_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG) ], [Species.BASCULIN]: [ - new SpeciesFormEvolution(Species.BASCULEGION, 'white-striped', 'female', 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesFormEvolution(Species.BASCULEGION, 'white-striped', 'male', 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "female", 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "male", 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MINCCINO]: [ new SpeciesEvolution(Species.CINCCINO, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1391,9 +1392,9 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CRABOMINABLE, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.ROCKRUFF]: [ - new SpeciesFormEvolution(Species.LYCANROC, '', 'midday', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null), - new SpeciesFormEvolution(Species.LYCANROC, '', 'dusk', 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null), - new SpeciesFormEvolution(Species.LYCANROC, '', 'midnight', 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null) + new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0)), null), + new SpeciesFormEvolution(Species.LYCANROC, "", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1), null), + new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0)), null) ], [Species.STEENEE]: [ new SpeciesEvolution(Species.TSAREENA, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.STOMP).length > 0), SpeciesWildEvolutionDelay.LONG) @@ -1416,26 +1417,26 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.TAUNT).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.SINISTEA]: [ - new SpeciesFormEvolution(Species.POLTEAGEIST, 'phony', 'phony', 1, EvolutionItem.CRACKED_POT, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.POLTEAGEIST, 'antique', 'antique', 1, EvolutionItem.CHIPPED_POT, null, SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.POLTEAGEIST, "phony", "phony", 1, EvolutionItem.CRACKED_POT, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.POLTEAGEIST, "antique", "antique", 1, EvolutionItem.CHIPPED_POT, null, SpeciesWildEvolutionDelay.LONG) ], [Species.MILCERY]: [ - new SpeciesFormEvolution(Species.ALCREMIE, '', 'vanilla-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TOWN || p.scene.arena.biomeType === Biome.PLAINS || p.scene.arena.biomeType === Biome.GRASS || p.scene.arena.biomeType === Biome.TALL_GRASS || p.scene.arena.biomeType === Biome.METROPOLIS), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'ruby-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.BADLANDS || p.scene.arena.biomeType === Biome.VOLCANO || p.scene.arena.biomeType === Biome.GRAVEYARD || p.scene.arena.biomeType === Biome.FACTORY || p.scene.arena.biomeType === Biome.SLUM), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'matcha-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.FOREST || p.scene.arena.biomeType === Biome.SWAMP || p.scene.arena.biomeType === Biome.MEADOW || p.scene.arena.biomeType === Biome.JUNGLE), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'mint-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.SEA || p.scene.arena.biomeType === Biome.BEACH || p.scene.arena.biomeType === Biome.LAKE || p.scene.arena.biomeType === Biome.SEABED), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'lemon-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.DESERT || p.scene.arena.biomeType === Biome.POWER_PLANT || p.scene.arena.biomeType === Biome.DOJO || p.scene.arena.biomeType === Biome.RUINS || p.scene.arena.biomeType === Biome.CONSTRUCTION_SITE), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'salted-cream', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.MOUNTAIN || p.scene.arena.biomeType === Biome.CAVE || p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.FAIRY_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'ruby-swirl', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.WASTELAND || p.scene.arena.biomeType === Biome.LABORATORY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'caramel-swirl', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TEMPLE || p.scene.arena.biomeType === Biome.ISLAND), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALCREMIE, '', 'rainbow-swirl', 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ABYSS || p.scene.arena.biomeType === Biome.SPACE || p.scene.arena.biomeType === Biome.END), SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.ALCREMIE, "", "vanilla-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TOWN || p.scene.arena.biomeType === Biome.PLAINS || p.scene.arena.biomeType === Biome.GRASS || p.scene.arena.biomeType === Biome.TALL_GRASS || p.scene.arena.biomeType === Biome.METROPOLIS), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.BADLANDS || p.scene.arena.biomeType === Biome.VOLCANO || p.scene.arena.biomeType === Biome.GRAVEYARD || p.scene.arena.biomeType === Biome.FACTORY || p.scene.arena.biomeType === Biome.SLUM), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "matcha-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.FOREST || p.scene.arena.biomeType === Biome.SWAMP || p.scene.arena.biomeType === Biome.MEADOW || p.scene.arena.biomeType === Biome.JUNGLE), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "mint-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.SEA || p.scene.arena.biomeType === Biome.BEACH || p.scene.arena.biomeType === Biome.LAKE || p.scene.arena.biomeType === Biome.SEABED), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "lemon-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.DESERT || p.scene.arena.biomeType === Biome.POWER_PLANT || p.scene.arena.biomeType === Biome.DOJO || p.scene.arena.biomeType === Biome.RUINS || p.scene.arena.biomeType === Biome.CONSTRUCTION_SITE), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "salted-cream", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.MOUNTAIN || p.scene.arena.biomeType === Biome.CAVE || p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.FAIRY_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "ruby-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.WASTELAND || p.scene.arena.biomeType === Biome.LABORATORY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "caramel-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.TEMPLE || p.scene.arena.biomeType === Biome.ISLAND), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALCREMIE, "", "rainbow-swirl", 1, EvolutionItem.STRAWBERRY_SWEET, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ABYSS || p.scene.arena.biomeType === Biome.SPACE || p.scene.arena.biomeType === Biome.END), SpeciesWildEvolutionDelay.LONG) ], [Species.DURALUDON]: [ - new SpeciesFormEvolution(Species.ARCHALUDON, '', '', 1, EvolutionItem.METAL_ALLOY, null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.ARCHALUDON, "", "", 1, EvolutionItem.METAL_ALLOY, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.KUBFU]: [ - new SpeciesFormEvolution(Species.URSHIFU, '', 'single-strike', 1, EvolutionItem.SCROLL_OF_DARKNESS, null, SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesFormEvolution(Species.URSHIFU, '', 'rapid-strike', 1, EvolutionItem.SCROLL_OF_WATERS, null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.URSHIFU, "", "single-strike", 1, EvolutionItem.SCROLL_OF_DARKNESS, null, SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.URSHIFU, "", "rapid-strike", 1, EvolutionItem.SCROLL_OF_WATERS, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GALAR_DARUMAKA]: [ new SpeciesEvolution(Species.GALAR_DARMANITAN, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1466,8 +1467,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CETITAN, 1, EvolutionItem.ICE_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.POLTCHAGEIST]: [ - new SpeciesFormEvolution(Species.SINISTCHA, 'counterfeit', 'unremarkable', 1, EvolutionItem.UNREMARKABLE_TEACUP, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.SINISTCHA, 'artisan', 'masterpiece', 1, EvolutionItem.MASTERPIECE_TEACUP, null, SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.SINISTCHA, "counterfeit", "unremarkable", 1, EvolutionItem.UNREMARKABLE_TEACUP, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SINISTCHA, "artisan", "masterpiece", 1, EvolutionItem.MASTERPIECE_TEACUP, null, SpeciesWildEvolutionDelay.LONG) ], [Species.DIPPLIN]: [ new SpeciesEvolution(Species.HYDRAPPLE, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.DRAGON_CHEER).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) @@ -1486,8 +1487,8 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.ONIX]: [ new SpeciesEvolution(Species.STEELIX, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( - p => p.moveset.filter(m => m.getMove().type === Type.STEEL).length > 0), - SpeciesWildEvolutionDelay.VERY_LONG) + p => p.moveset.filter(m => m.getMove().type === Type.STEEL).length > 0), + SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Protector */), SpeciesWildEvolutionDelay.VERY_LONG) @@ -1498,7 +1499,7 @@ export const pokemonEvolutions: PokemonEvolutions = { [Species.SCYTHER]: [ new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( p => p.moveset.filter(m => m.getMove().type === Type.STEEL).length > 0), - SpeciesWildEvolutionDelay.VERY_LONG), + SpeciesWildEvolutionDelay.VERY_LONG), new SpeciesEvolution(Species.KLEAVOR, 1, EvolutionItem.BLACK_AUGURITE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ @@ -1619,14 +1620,15 @@ interface PokemonPrevolutions { export const pokemonPrevolutions: PokemonPrevolutions = {}; { - const megaFormKeys = [ SpeciesFormKey.MEGA, '', SpeciesFormKey.MEGA_X, '', SpeciesFormKey.MEGA_Y ].map(sfk => sfk as string); + const megaFormKeys = [ SpeciesFormKey.MEGA, "", SpeciesFormKey.MEGA_X, "", SpeciesFormKey.MEGA_Y ].map(sfk => sfk as string); const prevolutionKeys = Object.keys(pokemonEvolutions); prevolutionKeys.forEach(pk => { const evolutions = pokemonEvolutions[pk]; - for (let ev of evolutions) { - if (ev.evoFormKey && megaFormKeys.indexOf(ev.evoFormKey) > -1) + for (const ev of evolutions) { + if (ev.evoFormKey && megaFormKeys.indexOf(ev.evoFormKey) > -1) { continue; + } pokemonPrevolutions[ev.speciesId] = parseInt(pk) as Species; } }); -} \ No newline at end of file +} diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index a8bc07e92df7..63bd5c088107 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -110,38 +110,46 @@ export class SpeciesFormChange { } canChange(pokemon: Pokemon): boolean { - if (pokemon.species.speciesId !== this.speciesId) + if (pokemon.species.speciesId !== this.speciesId) { return false; + } - if (!pokemon.species.forms.length) + if (!pokemon.species.forms.length) { return false; + } const formKeys = pokemon.species.forms.map(f => f.formKey); - if (formKeys[pokemon.formIndex] !== this.preFormKey) + if (formKeys[pokemon.formIndex] !== this.preFormKey) { return false; + } - if (formKeys[pokemon.formIndex] === this.formKey) + if (formKeys[pokemon.formIndex] === this.formKey) { return false; + } - for (let condition of this.conditions) { - if (!condition.predicate(pokemon)) + for (const condition of this.conditions) { + if (!condition.predicate(pokemon)) { return false; + } } - if (!this.trigger.canChange(pokemon)) + if (!this.trigger.canChange(pokemon)) { return false; + } return true; } findTrigger(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): SpeciesFormChangeTrigger { - if (!this.trigger.hasTriggerType(triggerType)) + if (!this.trigger.hasTriggerType(triggerType)) { return null; + } - let trigger = this.trigger; + const trigger = this.trigger; - if (trigger instanceof SpeciesFormChangeCompoundTrigger) + if (trigger instanceof SpeciesFormChangeCompoundTrigger) { return trigger.triggers.find(t => t.hasTriggerType(triggerType)); + } return trigger; } @@ -181,9 +189,10 @@ export class SpeciesFormChangeCompoundTrigger { } canChange(pokemon: Pokemon): boolean { - for (let trigger of this.triggers) { - if (!trigger.canChange(pokemon)) + for (const trigger of this.triggers) { + if (!trigger.canChange(pokemon)) { return false; + } } return true; @@ -241,8 +250,9 @@ export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigg constructor(statusEffects: StatusEffect | StatusEffect[], invert: boolean = false) { super(); - if (!Array.isArray(statusEffects)) + if (!Array.isArray(statusEffects)) { statusEffects = [ statusEffects ]; + } this.statusEffects = statusEffects; this.invert = invert; } @@ -273,7 +283,7 @@ export abstract class SpeciesFormChangeMoveTrigger extends SpeciesFormChangeTrig constructor(move: Moves | ((m: Moves) => boolean), used: boolean = true) { super(); - this.movePredicate = typeof move === 'function' ? move : (m: Moves) => m === move; + this.movePredicate = typeof move === "function" ? move : (m: Moves) => m === move; this.used = used; } } @@ -307,17 +317,21 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger { export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string { const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; const isGmax = formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1; - const isEmax = formChange.formKey.indexOf('eternamax') > -1; + const isEmax = formChange.formKey.indexOf("eternamax") > -1; const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; - const prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? 'Foe ' : 'Wild ' : 'Your '; - if (isMega) + const prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? "Foe " : "Wild " : "Your "; + if (isMega) { return `${prefix}${preName} mega-evolved\ninto ${pokemon.name}!`; - if (isGmax) + } + if (isGmax) { return `${prefix}${preName} Gigantamaxed\ninto ${pokemon.name}!`; - if (isEmax) + } + if (isEmax) { return `${prefix}${preName} Eternamaxed\ninto ${pokemon.name}!`; - if (isRevert) + } + if (isRevert) { return `${prefix}${pokemon.name} reverted\nto its original form!`; + } return `${prefix}${preName} changed form!`; } @@ -327,202 +341,202 @@ interface PokemonFormChanges { export const pokemonFormChanges: PokemonFormChanges = { [Species.VENUSAUR]: [ - new SpeciesFormChange(Species.VENUSAUR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.VENUSAURITE)), - new SpeciesFormChange(Species.VENUSAUR, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.VENUSAUR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.VENUSAURITE)), + new SpeciesFormChange(Species.VENUSAUR, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.BLASTOISE]: [ - new SpeciesFormChange(Species.BLASTOISE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLASTOISINITE)), - new SpeciesFormChange(Species.BLASTOISE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.BLASTOISE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLASTOISINITE)), + new SpeciesFormChange(Species.BLASTOISE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CHARIZARD]: [ - new SpeciesFormChange(Species.CHARIZARD, '', SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_X)), - new SpeciesFormChange(Species.CHARIZARD, '', SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_Y)), - new SpeciesFormChange(Species.CHARIZARD, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.CHARIZARD, "", SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_X)), + new SpeciesFormChange(Species.CHARIZARD, "", SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_Y)), + new SpeciesFormChange(Species.CHARIZARD, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.BUTTERFREE]: [ - new SpeciesFormChange(Species.BUTTERFREE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.BUTTERFREE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.BEEDRILL]: [ - new SpeciesFormChange(Species.BEEDRILL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BEEDRILLITE)) + new SpeciesFormChange(Species.BEEDRILL, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BEEDRILLITE)) ], [Species.PIDGEOT]: [ - new SpeciesFormChange(Species.PIDGEOT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PIDGEOTITE)) + new SpeciesFormChange(Species.PIDGEOT, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PIDGEOTITE)) ], [Species.PIKACHU]: [ - new SpeciesFormChange(Species.PIKACHU, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.PIKACHU, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.MEOWTH]: [ - new SpeciesFormChange(Species.MEOWTH, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.MEOWTH, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.ALAKAZAM]: [ - new SpeciesFormChange(Species.ALAKAZAM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALAKAZITE)) + new SpeciesFormChange(Species.ALAKAZAM, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALAKAZITE)) ], [Species.MACHAMP]: [ - new SpeciesFormChange(Species.MACHAMP, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.MACHAMP, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.SLOWBRO]: [ - new SpeciesFormChange(Species.SLOWBRO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SLOWBRONITE)) + new SpeciesFormChange(Species.SLOWBRO, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SLOWBRONITE)) ], [Species.GENGAR]: [ - new SpeciesFormChange(Species.GENGAR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GENGARITE)), - new SpeciesFormChange(Species.GENGAR, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.GENGAR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GENGARITE)), + new SpeciesFormChange(Species.GENGAR, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.KINGLER]: [ - new SpeciesFormChange(Species.KINGLER, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.KINGLER, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.KANGASKHAN]: [ - new SpeciesFormChange(Species.KANGASKHAN, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.KANGASKHANITE)) + new SpeciesFormChange(Species.KANGASKHAN, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.KANGASKHANITE)) ], [Species.PINSIR]: [ - new SpeciesFormChange(Species.PINSIR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PINSIRITE)) + new SpeciesFormChange(Species.PINSIR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PINSIRITE)) ], [Species.GYARADOS]: [ - new SpeciesFormChange(Species.GYARADOS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GYARADOSITE)) + new SpeciesFormChange(Species.GYARADOS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GYARADOSITE)) ], [Species.LAPRAS]: [ - new SpeciesFormChange(Species.LAPRAS, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.LAPRAS, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.EEVEE]: [ - new SpeciesFormChange(Species.EEVEE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.EEVEE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.SNORLAX]: [ - new SpeciesFormChange(Species.SNORLAX, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.SNORLAX, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.AERODACTYL]: [ - new SpeciesFormChange(Species.AERODACTYL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AERODACTYLITE)) + new SpeciesFormChange(Species.AERODACTYL, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AERODACTYLITE)) ], [Species.MEWTWO]: [ - new SpeciesFormChange(Species.MEWTWO, '', SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_X)), - new SpeciesFormChange(Species.MEWTWO, '', SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_Y)) + new SpeciesFormChange(Species.MEWTWO, "", SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_X)), + new SpeciesFormChange(Species.MEWTWO, "", SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_Y)) ], [Species.AMPHAROS]: [ - new SpeciesFormChange(Species.AMPHAROS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AMPHAROSITE)) + new SpeciesFormChange(Species.AMPHAROS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AMPHAROSITE)) ], [Species.STEELIX]: [ - new SpeciesFormChange(Species.STEELIX, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.STEELIXITE)) + new SpeciesFormChange(Species.STEELIX, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.STEELIXITE)) ], [Species.SCIZOR]: [ - new SpeciesFormChange(Species.SCIZOR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCIZORITE)) + new SpeciesFormChange(Species.SCIZOR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCIZORITE)) ], [Species.HERACROSS]: [ - new SpeciesFormChange(Species.HERACROSS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HERACRONITE)) + new SpeciesFormChange(Species.HERACROSS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HERACRONITE)) ], [Species.HOUNDOOM]: [ - new SpeciesFormChange(Species.HOUNDOOM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HOUNDOOMINITE)) + new SpeciesFormChange(Species.HOUNDOOM, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HOUNDOOMINITE)) ], [Species.TYRANITAR]: [ - new SpeciesFormChange(Species.TYRANITAR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.TYRANITARITE)) + new SpeciesFormChange(Species.TYRANITAR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.TYRANITARITE)) ], [Species.SCEPTILE]: [ - new SpeciesFormChange(Species.SCEPTILE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCEPTILITE)) + new SpeciesFormChange(Species.SCEPTILE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCEPTILITE)) ], [Species.BLAZIKEN]: [ - new SpeciesFormChange(Species.BLAZIKEN, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLAZIKENITE)) + new SpeciesFormChange(Species.BLAZIKEN, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLAZIKENITE)) ], [Species.SWAMPERT]: [ - new SpeciesFormChange(Species.SWAMPERT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SWAMPERTITE)) + new SpeciesFormChange(Species.SWAMPERT, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SWAMPERTITE)) ], [Species.GARDEVOIR]: [ - new SpeciesFormChange(Species.GARDEVOIR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARDEVOIRITE)) + new SpeciesFormChange(Species.GARDEVOIR, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARDEVOIRITE)) ], [Species.SABLEYE]: [ - new SpeciesFormChange(Species.SABLEYE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SABLENITE)) + new SpeciesFormChange(Species.SABLEYE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SABLENITE)) ], [Species.MAWILE]: [ - new SpeciesFormChange(Species.MAWILE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MAWILITE)) + new SpeciesFormChange(Species.MAWILE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MAWILITE)) ], [Species.AGGRON]: [ - new SpeciesFormChange(Species.AGGRON, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AGGRONITE)) + new SpeciesFormChange(Species.AGGRON, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AGGRONITE)) ], [Species.MEDICHAM]: [ - new SpeciesFormChange(Species.MEDICHAM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MEDICHAMITE)) + new SpeciesFormChange(Species.MEDICHAM, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MEDICHAMITE)) ], [Species.MANECTRIC]: [ - new SpeciesFormChange(Species.MANECTRIC, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MANECTITE)) + new SpeciesFormChange(Species.MANECTRIC, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MANECTITE)) ], [Species.SHARPEDO]: [ - new SpeciesFormChange(Species.SHARPEDO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SHARPEDONITE)) + new SpeciesFormChange(Species.SHARPEDO, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SHARPEDONITE)) ], [Species.CAMERUPT]: [ - new SpeciesFormChange(Species.CAMERUPT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.CAMERUPTITE)) + new SpeciesFormChange(Species.CAMERUPT, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.CAMERUPTITE)) ], [Species.ALTARIA]: [ - new SpeciesFormChange(Species.ALTARIA, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE)) + new SpeciesFormChange(Species.ALTARIA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE)) ], [Species.BANETTE]: [ - new SpeciesFormChange(Species.BANETTE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE)) + new SpeciesFormChange(Species.BANETTE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE)) ], [Species.ABSOL]: [ - new SpeciesFormChange(Species.ABSOL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABSOLITE)) + new SpeciesFormChange(Species.ABSOL, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABSOLITE)) ], [Species.GLALIE]: [ - new SpeciesFormChange(Species.GLALIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GLALITITE)) + new SpeciesFormChange(Species.GLALIE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GLALITITE)) ], [Species.SALAMENCE]: [ - new SpeciesFormChange(Species.SALAMENCE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SALAMENCITE)) + new SpeciesFormChange(Species.SALAMENCE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SALAMENCITE)) ], [Species.METAGROSS]: [ - new SpeciesFormChange(Species.METAGROSS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.METAGROSSITE)) + new SpeciesFormChange(Species.METAGROSS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.METAGROSSITE)) ], [Species.LATIAS]: [ - new SpeciesFormChange(Species.LATIAS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIASITE)) + new SpeciesFormChange(Species.LATIAS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIASITE)) ], [Species.LATIOS]: [ - new SpeciesFormChange(Species.LATIOS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIOSITE)) + new SpeciesFormChange(Species.LATIOS, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIOSITE)) ], [Species.KYOGRE]: [ - new SpeciesFormChange(Species.KYOGRE, '', SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.BLUE_ORB)) + new SpeciesFormChange(Species.KYOGRE, "", SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.BLUE_ORB)) ], [Species.GROUDON]: [ - new SpeciesFormChange(Species.GROUDON, '', SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.RED_ORB)) + new SpeciesFormChange(Species.GROUDON, "", SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.RED_ORB)) ], [Species.RAYQUAZA]: [ - new SpeciesFormChange(Species.RAYQUAZA, '', SpeciesFormKey.MEGA, new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE), new SpeciesFormChangeMoveLearnedTrigger(Moves.DRAGON_ASCENT))) + new SpeciesFormChange(Species.RAYQUAZA, "", SpeciesFormKey.MEGA, new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE), new SpeciesFormChangeMoveLearnedTrigger(Moves.DRAGON_ASCENT))) ], [Species.DEOXYS]: [ - new SpeciesFormChange(Species.DEOXYS, 'normal', 'attack', new SpeciesFormChangeItemTrigger(FormChangeItem.SHARP_METEORITE)), - new SpeciesFormChange(Species.DEOXYS, 'normal', 'defense', new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)), - new SpeciesFormChange(Species.DEOXYS, 'normal', 'speed', new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_METEORITE)) + new SpeciesFormChange(Species.DEOXYS, "normal", "attack", new SpeciesFormChangeItemTrigger(FormChangeItem.SHARP_METEORITE)), + new SpeciesFormChange(Species.DEOXYS, "normal", "defense", new SpeciesFormChangeItemTrigger(FormChangeItem.HARD_METEORITE)), + new SpeciesFormChange(Species.DEOXYS, "normal", "speed", new SpeciesFormChangeItemTrigger(FormChangeItem.SMOOTH_METEORITE)) ], [Species.LOPUNNY]: [ - new SpeciesFormChange(Species.LOPUNNY, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE)) + new SpeciesFormChange(Species.LOPUNNY, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE)) ], [Species.GARCHOMP]: [ - new SpeciesFormChange(Species.GARCHOMP, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARCHOMPITE)) + new SpeciesFormChange(Species.GARCHOMP, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARCHOMPITE)) ], [Species.LUCARIO]: [ - new SpeciesFormChange(Species.LUCARIO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LUCARIONITE)) + new SpeciesFormChange(Species.LUCARIO, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LUCARIONITE)) ], [Species.ABOMASNOW]: [ - new SpeciesFormChange(Species.ABOMASNOW, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABOMASITE)) + new SpeciesFormChange(Species.ABOMASNOW, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABOMASITE)) ], [Species.GALLADE]: [ - new SpeciesFormChange(Species.GALLADE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GALLADITE)) + new SpeciesFormChange(Species.GALLADE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GALLADITE)) ], [Species.AUDINO]: [ - new SpeciesFormChange(Species.AUDINO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AUDINITE)) + new SpeciesFormChange(Species.AUDINO, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AUDINITE)) ], [Species.DIALGA]: [ - new SpeciesFormChange(Species.DIALGA, '', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.ADAMANT_CRYSTAL)) + new SpeciesFormChange(Species.DIALGA, "", SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.ADAMANT_CRYSTAL)) ], [Species.PALKIA]: [ - new SpeciesFormChange(Species.PALKIA, '', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.LUSTROUS_ORB)) + new SpeciesFormChange(Species.PALKIA, "", SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.LUSTROUS_ORB)) ], [Species.GIRATINA]: [ - new SpeciesFormChange(Species.GIRATINA, 'altered', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.GRISEOUS_CORE)) + new SpeciesFormChange(Species.GIRATINA, "altered", SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.GRISEOUS_CORE)) ], [Species.SHAYMIN]: [ - new SpeciesFormChange(Species.SHAYMIN, 'land', 'sky', new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAY, TimeOfDay.DUSK), + new SpeciesFormChange(Species.SHAYMIN, "land", "sky", new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAY, TimeOfDay.DUSK), new SpeciesFormChangeItemTrigger(FormChangeItem.GRACIDEA), new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE, true))), - new SpeciesFormChange(Species.SHAYMIN, 'sky', 'land', new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAWN, TimeOfDay.NIGHT)), - new SpeciesFormChange(Species.SHAYMIN, 'sky', 'land', new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE)) + new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAWN, TimeOfDay.NIGHT)), + new SpeciesFormChange(Species.SHAYMIN, "sky", "land", new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE)) ], [Species.DARMANITAN]: [ - new SpeciesFormChange(Species.DARMANITAN, '', 'zen', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.DARMANITAN, 'zen', '', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true) ], [Species.GARBODOR]: [ - new SpeciesFormChange(Species.GARBODOR, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.GARBODOR, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.TORNADUS]: [ new SpeciesFormChange(Species.TORNADUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) @@ -534,184 +548,184 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.LANDORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) ], [Species.KYUREM]: [ - new SpeciesFormChange(Species.KYUREM, '', 'black', new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE)), - new SpeciesFormChange(Species.KYUREM, '', 'white', new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE)) + new SpeciesFormChange(Species.KYUREM, "", "black", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE)), + new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE)) ], [Species.KELDEO]: [ - new SpeciesFormChange(Species.KELDEO, 'ordinary', 'resolute', new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD)), - new SpeciesFormChange(Species.KELDEO, 'resolute', 'ordinary', new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false)) + new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD)), + new SpeciesFormChange(Species.KELDEO, "resolute", "ordinary", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false)) ], [Species.MELOETTA]: [ - new SpeciesFormChange(Species.MELOETTA, 'aria', 'pirouette', new SpeciesFormChangePostMoveTrigger(Moves.RELIC_SONG), true), - new SpeciesFormChange(Species.MELOETTA, 'pirouette', 'aria', new SpeciesFormChangePostMoveTrigger(Moves.RELIC_SONG), true), - new SpeciesFormChange(Species.MELOETTA, 'pirouette', 'aria', new SpeciesFormChangeActiveTrigger(false), true) + new SpeciesFormChange(Species.MELOETTA, "aria", "pirouette", new SpeciesFormChangePostMoveTrigger(Moves.RELIC_SONG), true), + new SpeciesFormChange(Species.MELOETTA, "pirouette", "aria", new SpeciesFormChangePostMoveTrigger(Moves.RELIC_SONG), true), + new SpeciesFormChange(Species.MELOETTA, "pirouette", "aria", new SpeciesFormChangeActiveTrigger(false), true) ], [Species.GENESECT]: [ - new SpeciesFormChange(Species.GENESECT, '', 'shock', new SpeciesFormChangeItemTrigger(FormChangeItem.SHOCK_DRIVE)), - new SpeciesFormChange(Species.GENESECT, '', 'burn', new SpeciesFormChangeItemTrigger(FormChangeItem.BURN_DRIVE)), - new SpeciesFormChange(Species.GENESECT, '', 'chill', new SpeciesFormChangeItemTrigger(FormChangeItem.CHILL_DRIVE)), - new SpeciesFormChange(Species.GENESECT, '', 'douse', new SpeciesFormChangeItemTrigger(FormChangeItem.DOUSE_DRIVE)) + new SpeciesFormChange(Species.GENESECT, "", "shock", new SpeciesFormChangeItemTrigger(FormChangeItem.SHOCK_DRIVE)), + new SpeciesFormChange(Species.GENESECT, "", "burn", new SpeciesFormChangeItemTrigger(FormChangeItem.BURN_DRIVE)), + new SpeciesFormChange(Species.GENESECT, "", "chill", new SpeciesFormChangeItemTrigger(FormChangeItem.CHILL_DRIVE)), + new SpeciesFormChange(Species.GENESECT, "", "douse", new SpeciesFormChangeItemTrigger(FormChangeItem.DOUSE_DRIVE)) ], [Species.GRENINJA]: [ - new SpeciesFormChange(Species.GRENINJA, 'battle-bond', 'ash', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.GRENINJA, 'ash', 'battle-bond', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.GRENINJA, "battle-bond", "ash", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.GRENINJA, "ash", "battle-bond", new SpeciesFormChangeManualTrigger(), true) ], [Species.AEGISLASH]: [ - new SpeciesFormChange(Species.AEGISLASH, 'blade', 'shield', new SpeciesFormChangePreMoveTrigger(Moves.KINGS_SHIELD), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), - new SpeciesFormChange(Species.AEGISLASH, 'shield', 'blade', new SpeciesFormChangePreMoveTrigger(m => allMoves[m].category !== MoveCategory.STATUS), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), - new SpeciesFormChange(Species.AEGISLASH, 'blade', 'shield', new SpeciesFormChangeActiveTrigger(false), true) + new SpeciesFormChange(Species.AEGISLASH, "blade", "shield", new SpeciesFormChangePreMoveTrigger(Moves.KINGS_SHIELD), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), + new SpeciesFormChange(Species.AEGISLASH, "shield", "blade", new SpeciesFormChangePreMoveTrigger(m => allMoves[m].category !== MoveCategory.STATUS), true, new SpeciesFormChangeCondition(p => p.hasAbility(Abilities.STANCE_CHANGE))), + new SpeciesFormChange(Species.AEGISLASH, "blade", "shield", new SpeciesFormChangeActiveTrigger(false), true) ], [Species.ZYGARDE]: [ - new SpeciesFormChange(Species.ZYGARDE, '50-pc', 'complete', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, 'complete', '50-pc', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, '10-pc', 'complete', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.ZYGARDE, 'complete', '10-pc', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.ZYGARDE, "50-pc", "complete", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "complete", "50-pc", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "10-pc", "complete", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.ZYGARDE, "complete", "10-pc", new SpeciesFormChangeManualTrigger(), true) ], [Species.DIANCIE]: [ - new SpeciesFormChange(Species.DIANCIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE)) + new SpeciesFormChange(Species.DIANCIE, "", SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE)) ], [Species.HOOPA]: [ - new SpeciesFormChange(Species.HOOPA, '', 'unbound', new SpeciesFormChangeItemTrigger(FormChangeItem.PRISON_BOTTLE)) + new SpeciesFormChange(Species.HOOPA, "", "unbound", new SpeciesFormChangeItemTrigger(FormChangeItem.PRISON_BOTTLE)) ], [Species.WISHIWASHI]: [ - new SpeciesFormChange(Species.WISHIWASHI, '', 'school', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.WISHIWASHI, 'school', '', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.WISHIWASHI, "", "school", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.WISHIWASHI, "school", "", new SpeciesFormChangeManualTrigger(), true) ], [Species.MINIOR]: [ - new SpeciesFormChange(Species.MINIOR, 'red-meteor', 'red', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'red', 'red-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'orange-meteor', 'orange', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'orange', 'orange-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'yellow-meteor', 'yellow', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'yellow', 'yellow-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'green-meteor', 'green', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'green', 'green-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'blue-meteor', 'blue', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'blue', 'blue-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'indigo-meteor', 'indigo', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'indigo', 'indigo-meteor', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'violet-meteor', 'violet', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MINIOR, 'violet', 'violet-meteor', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MINIOR, "red-meteor", "red", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "red", "red-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "orange-meteor", "orange", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "orange", "orange-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "yellow-meteor", "yellow", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "yellow", "yellow-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "green-meteor", "green", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "green", "green-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "blue-meteor", "blue", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "blue", "blue-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "indigo-meteor", "indigo", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "indigo", "indigo-meteor", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "violet-meteor", "violet", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MINIOR, "violet", "violet-meteor", new SpeciesFormChangeManualTrigger(), true) ], [Species.MIMIKYU]: [ - new SpeciesFormChange(Species.MIMIKYU, 'disguised', 'busted', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MIMIKYU, 'busted', 'disguised', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MIMIKYU, "disguised", "busted", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeManualTrigger(), true) ], [Species.NECROZMA]: [ - new SpeciesFormChange(Species.NECROZMA, '', 'dawn-wings', new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER)), - new SpeciesFormChange(Species.NECROZMA, '', 'dusk-mane', new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER)) + new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER)), + new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER)) ], [Species.MELMETAL]: [ - new SpeciesFormChange(Species.MELMETAL, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.RILLABOOM]: [ - new SpeciesFormChange(Species.RILLABOOM, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.RILLABOOM, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CINDERACE]: [ - new SpeciesFormChange(Species.CINDERACE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.CINDERACE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.INTELEON]: [ - new SpeciesFormChange(Species.INTELEON, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.INTELEON, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CORVIKNIGHT]: [ - new SpeciesFormChange(Species.CORVIKNIGHT, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.CORVIKNIGHT, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.ORBEETLE]: [ - new SpeciesFormChange(Species.ORBEETLE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.ORBEETLE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.DREDNAW]: [ - new SpeciesFormChange(Species.DREDNAW, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.DREDNAW, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.COALOSSAL]: [ - new SpeciesFormChange(Species.COALOSSAL, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.COALOSSAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.FLAPPLE]: [ - new SpeciesFormChange(Species.FLAPPLE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.FLAPPLE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.APPLETUN]: [ - new SpeciesFormChange(Species.APPLETUN, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.APPLETUN, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.SANDACONDA]: [ - new SpeciesFormChange(Species.SANDACONDA, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.SANDACONDA, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.TOXTRICITY]: [ - new SpeciesFormChange(Species.TOXTRICITY, 'amped', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.TOXTRICITY, 'lowkey', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.TOXTRICITY, SpeciesFormKey.GIGANTAMAX, 'amped', new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS, false), new SpeciesDefaultFormMatchTrigger('amped'))), - new SpeciesFormChange(Species.TOXTRICITY, SpeciesFormKey.GIGANTAMAX, 'lowkey', new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS, false), new SpeciesDefaultFormMatchTrigger('lowkey'))) + new SpeciesFormChange(Species.TOXTRICITY, "amped", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.TOXTRICITY, "lowkey", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.TOXTRICITY, SpeciesFormKey.GIGANTAMAX, "amped", new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS, false), new SpeciesDefaultFormMatchTrigger("amped"))), + new SpeciesFormChange(Species.TOXTRICITY, SpeciesFormKey.GIGANTAMAX, "lowkey", new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS, false), new SpeciesDefaultFormMatchTrigger("lowkey"))) ], [Species.CENTISKORCH]: [ - new SpeciesFormChange(Species.CENTISKORCH, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.CENTISKORCH, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.HATTERENE]: [ - new SpeciesFormChange(Species.HATTERENE, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.HATTERENE, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.GRIMMSNARL]: [ - new SpeciesFormChange(Species.GRIMMSNARL, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.GRIMMSNARL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.ALCREMIE]: [ - new SpeciesFormChange(Species.ALCREMIE, 'vanilla-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'ruby-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'matcha-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'mint-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'lemon-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'salted-cream', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'ruby-swirl', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'caramel-swirl', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.ALCREMIE, 'rainbow-swirl', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.ALCREMIE, "vanilla-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "ruby-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "matcha-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "mint-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "lemon-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "salted-cream", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "ruby-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "caramel-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.ALCREMIE, "rainbow-swirl", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.MORPEKO]: [ - new SpeciesFormChange(Species.MORPEKO, 'full-belly', 'hangry', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.MORPEKO, 'hangry', 'full-belly', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.MORPEKO, "full-belly", "hangry", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.MORPEKO, "hangry", "full-belly", new SpeciesFormChangeManualTrigger(), true) ], [Species.COPPERAJAH]: [ - new SpeciesFormChange(Species.COPPERAJAH, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.COPPERAJAH, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.DURALUDON]: [ - new SpeciesFormChange(Species.DURALUDON, '', SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.DURALUDON, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.ZACIAN]: [ - new SpeciesFormChange(Species.ZACIAN, 'hero', 'crowned', new SpeciesFormChangeItemTrigger(FormChangeItem.RUSTED_SWORD)) + new SpeciesFormChange(Species.ZACIAN, "hero", "crowned", new SpeciesFormChangeItemTrigger(FormChangeItem.RUSTED_SWORD)) ], [Species.ZAMAZENTA]: [ - new SpeciesFormChange(Species.ZAMAZENTA, 'hero', 'crowned', new SpeciesFormChangeItemTrigger(FormChangeItem.RUSTED_SHIELD)) + new SpeciesFormChange(Species.ZAMAZENTA, "hero", "crowned", new SpeciesFormChangeItemTrigger(FormChangeItem.RUSTED_SHIELD)) ], [Species.ETERNATUS]: [ - new SpeciesFormChange(Species.ETERNATUS, '', SpeciesFormKey.ETERNAMAX, new SpeciesFormChangeManualTrigger()), - new SpeciesFormChange(Species.ETERNATUS, '', SpeciesFormKey.ETERNAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.ETERNATUS, "", SpeciesFormKey.ETERNAMAX, new SpeciesFormChangeManualTrigger()), + new SpeciesFormChange(Species.ETERNATUS, "", SpeciesFormKey.ETERNAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.URSHIFU]: [ - new SpeciesFormChange(Species.URSHIFU, 'single-strike', SpeciesFormKey.GIGANTAMAX_SINGLE, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), - new SpeciesFormChange(Species.URSHIFU, 'rapid-strike', SpeciesFormKey.GIGANTAMAX_RAPID, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) + new SpeciesFormChange(Species.URSHIFU, "single-strike", SpeciesFormKey.GIGANTAMAX_SINGLE, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)), + new SpeciesFormChange(Species.URSHIFU, "rapid-strike", SpeciesFormKey.GIGANTAMAX_RAPID, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CALYREX]: [ - new SpeciesFormChange(Species.CALYREX, '', 'ice', new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY)), - new SpeciesFormChange(Species.CALYREX, '', 'shadow', new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY)) + new SpeciesFormChange(Species.CALYREX, "", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY)), + new SpeciesFormChange(Species.CALYREX, "", "shadow", new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY)) ], [Species.ENAMORUS]: [ new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) ], [Species.OGERPON]: [ - new SpeciesFormChange(Species.OGERPON, 'teal-mask', 'wellspring-mask', new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)), - new SpeciesFormChange(Species.OGERPON, 'teal-mask', 'hearthflame-mask', new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)), - new SpeciesFormChange(Species.OGERPON, 'teal-mask', 'cornerstone-mask', new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)), - new SpeciesFormChange(Species.OGERPON, 'teal-mask', 'teal-mask-tera', new SpeciesFormChangeManualTrigger(), true), //When holding a Grass Tera Shard - new SpeciesFormChange(Species.OGERPON, 'teal-mask-tera', 'teal-mask', new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard - new SpeciesFormChange(Species.OGERPON, 'wellspring-mask', 'wellspring-mask-tera', new SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard - new SpeciesFormChange(Species.OGERPON, 'wellspring-mask-tera', 'wellspring-mask', new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard - new SpeciesFormChange(Species.OGERPON, 'hearthflame-mask', 'hearthflame-mask-tera', new SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard - new SpeciesFormChange(Species.OGERPON, 'hearthflame-mask-tera', 'hearthflame-mask', new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard - new SpeciesFormChange(Species.OGERPON, 'cornerstone-mask', 'cornerstone-mask-tera', new SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard - new SpeciesFormChange(Species.OGERPON, 'cornerstone-mask-tera', 'cornerstone-mask', new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard + new SpeciesFormChange(Species.OGERPON, "teal-mask", "wellspring-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.WELLSPRING_MASK)), + new SpeciesFormChange(Species.OGERPON, "teal-mask", "hearthflame-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.HEARTHFLAME_MASK)), + new SpeciesFormChange(Species.OGERPON, "teal-mask", "cornerstone-mask", new SpeciesFormChangeItemTrigger(FormChangeItem.CORNERSTONE_MASK)), + new SpeciesFormChange(Species.OGERPON, "teal-mask", "teal-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Grass Tera Shard + new SpeciesFormChange(Species.OGERPON, "teal-mask-tera", "teal-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Grass Tera Shard + new SpeciesFormChange(Species.OGERPON, "wellspring-mask", "wellspring-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Water Tera Shard + new SpeciesFormChange(Species.OGERPON, "wellspring-mask-tera", "wellspring-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Water Tera Shard + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask", "hearthflame-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Fire Tera Shard + new SpeciesFormChange(Species.OGERPON, "hearthflame-mask-tera", "hearthflame-mask", new SpeciesFormChangeManualTrigger(), true), //When no longer holding a Fire Tera Shard + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask", "cornerstone-mask-tera", new SpeciesFormChangeManualTrigger(), true), //When holding a Rock Tera Shard + new SpeciesFormChange(Species.OGERPON, "cornerstone-mask-tera", "cornerstone-mask", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Rock Tera Shard ], [Species.TERAPAGOS]: [ - new SpeciesFormChange(Species.TERAPAGOS, '', 'terastal', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.TERAPAGOS, 'terastal', 'stellar', new SpeciesFormChangeManualTrigger(), true), //When holding a Stellar Tera Shard - new SpeciesFormChange(Species.TERAPAGOS, 'stellar', 'terastal', new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard + new SpeciesFormChange(Species.TERAPAGOS, "", "terastal", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.TERAPAGOS, "terastal", "stellar", new SpeciesFormChangeManualTrigger(), true), //When holding a Stellar Tera Shard + new SpeciesFormChange(Species.TERAPAGOS, "stellar", "terastal", new SpeciesFormChangeManualTrigger(), true) //When no longer holding a Stellar Tera Shard ], [Species.GALAR_DARMANITAN]: [ - new SpeciesFormChange(Species.GALAR_DARMANITAN, '', 'zen', new SpeciesFormChangeManualTrigger(), true), - new SpeciesFormChange(Species.GALAR_DARMANITAN, 'zen', '', new SpeciesFormChangeManualTrigger(), true) + new SpeciesFormChange(Species.GALAR_DARMANITAN, "", "zen", new SpeciesFormChangeManualTrigger(), true), + new SpeciesFormChange(Species.GALAR_DARMANITAN, "zen", "", new SpeciesFormChangeManualTrigger(), true) ] }; @@ -719,12 +733,13 @@ export const pokemonFormChanges: PokemonFormChanges = { const formChangeKeys = Object.keys(pokemonFormChanges); formChangeKeys.forEach(pk => { const formChanges = pokemonFormChanges[pk]; - let newFormChanges: SpeciesFormChange[] = []; - for (let fc of formChanges) { + const newFormChanges: SpeciesFormChange[] = []; + for (const fc of formChanges) { const itemTrigger = fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger; - if (itemTrigger && !formChanges.find(c => fc.formKey === c.preFormKey && fc.preFormKey === c.formKey)) + if (itemTrigger && !formChanges.find(c => fc.formKey === c.preFormKey && fc.preFormKey === c.formKey)) { newFormChanges.push(new SpeciesFormChange(fc.speciesId, fc.formKey, fc.preFormKey, new SpeciesFormChangeItemTrigger(itemTrigger.item, false))); + } } formChanges.push(...newFormChanges); }); -} \ No newline at end of file +} diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index deb3fdbc00e0..9ba716a99688 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -1,21 +1,21 @@ import { Abilities } from "./enums/abilities"; -import BattleScene, { AnySound } from '../battle-scene'; -import { Variant, variantColorCache } from './variant'; -import { variantData } from './variant'; -import { GrowthRate } from './exp'; -import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from './pokemon-evolutions'; -import { Species } from './enums/species'; -import { Type } from './type'; -import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from './pokemon-level-moves'; -import { uncatchableSpecies } from './biomes'; -import * as Utils from '../utils'; -import { StarterMoveset } from '../system/game-data'; -import { speciesEggMoves } from './egg-moves'; +import BattleScene, { AnySound } from "../battle-scene"; +import { Variant, variantColorCache } from "./variant"; +import { variantData } from "./variant"; +import { GrowthRate } from "./exp"; +import { SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; +import { Species } from "./enums/species"; +import { Type } from "./type"; +import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves"; +import { uncatchableSpecies } from "./biomes"; +import * as Utils from "../utils"; +import { StarterMoveset } from "../system/game-data"; +import { speciesEggMoves } from "./egg-moves"; import { PartyMemberStrength } from "./enums/party-member-strength"; -import { GameMode } from '../game-mode'; +import { GameMode } from "../game-mode"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; -import { VariantSet } from './variant'; -import i18next, { Localizable } from '../plugins/i18n'; +import { VariantSet } from "./variant"; +import i18next, { Localizable } from "../plugins/i18n"; import { Stat } from "./pokemon-stat"; export enum Region { @@ -27,17 +27,19 @@ export enum Region { } export function getPokemonSpecies(species: Species): PokemonSpecies { - if (species >= 2000) + if (species >= 2000) { return allSpecies.find(s => s.speciesId === species); + } return allSpecies[species - 1]; } export function getPokemonSpeciesForm(species: Species, formIndex: integer): PokemonSpeciesForm { - let retSpecies: PokemonSpecies = species >= 2000 + const retSpecies: PokemonSpecies = species >= 2000 ? allSpecies.find(s => s.speciesId === species) : allSpecies[species - 1]; - if (formIndex < retSpecies.forms?.length) + if (formIndex < retSpecies.forms?.length) { return retSpecies.forms[formIndex]; + } return retSpecies; } @@ -46,26 +48,30 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-\'])(.*?)$/i; const [ speciesAPrefixMatch, speciesBPrefixMatch ] = [ speciesAName, speciesBName ].map(n => /^(?:[^ ]+) /.exec(n)); - const [ speciesAPrefix, speciesBPrefix ] = [ speciesAPrefixMatch, speciesBPrefixMatch ].map(m => m ? m[0] : ''); + const [ speciesAPrefix, speciesBPrefix ] = [ speciesAPrefixMatch, speciesBPrefixMatch ].map(m => m ? m[0] : ""); - if (speciesAPrefix) + if (speciesAPrefix) { speciesAName = speciesAName.slice(speciesAPrefix.length); - if (speciesBPrefix) + } + if (speciesBPrefix) { speciesBName = speciesBName.slice(speciesBPrefix.length); + } const [ speciesASuffixMatch, speciesBSuffixMatch ] = [ speciesAName, speciesBName ].map(n => / (?:[^ ]+)$/.exec(n)); - const [ speciesASuffix, speciesBSuffix ] = [ speciesASuffixMatch, speciesBSuffixMatch ].map(m => m ? m[0] : ''); + const [ speciesASuffix, speciesBSuffix ] = [ speciesASuffixMatch, speciesBSuffixMatch ].map(m => m ? m[0] : ""); - if (speciesASuffix) + if (speciesASuffix) { speciesAName = speciesAName.slice(0, -speciesASuffix.length); - if (speciesBSuffix) + } + if (speciesBSuffix) { speciesBName = speciesBName.slice(0, -speciesBSuffix.length); + } const splitNameA = speciesAName.split(/ /g); const splitNameB = speciesBName.split(/ /g); - let fragAMatch = fragAPattern.exec(speciesAName); - let fragBMatch = fragBPattern.exec(speciesBName); + const fragAMatch = fragAPattern.exec(speciesAName); + const fragBMatch = fragBPattern.exec(speciesBName); let fragA: string; let fragB: string; @@ -78,23 +84,27 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): if (fragBMatch) { const lastCharA = fragA.slice(fragA.length - 1); const prevCharB = fragBMatch[1].slice(fragBMatch.length - 1); - fragB = (/[\-']/.test(prevCharB) ? prevCharB : '') + fragBMatch[2] || prevCharB; + fragB = (/[\-']/.test(prevCharB) ? prevCharB : "") + fragBMatch[2] || prevCharB; if (lastCharA === fragB[0]) { - if (/[aiu]/.test(lastCharA)) + if (/[aiu]/.test(lastCharA)) { fragB = fragB.slice(1); - else { + } else { const newCharMatch = new RegExp(`[^${lastCharA}]`).exec(fragB); - if (newCharMatch?.index > 0) + if (newCharMatch?.index > 0) { fragB = fragB.slice(newCharMatch.index); + } } } - } else + } else { fragB = speciesBName; - } else + } + } else { fragB = splitNameB[splitNameB.length - 1]; + } - if (splitNameA.length > 1) - fragA = `${splitNameA.slice(0, splitNameA.length - 1).join(' ')} ${fragA}`; + if (splitNameA.length > 1) { + fragA = `${splitNameA.slice(0, splitNameA.length - 1).join(" ")} ${fragA}`; + } fragB = `${fragB.slice(0, 1).toLowerCase()}${fragB.slice(1)}`; @@ -124,25 +134,26 @@ export abstract class PokemonSpeciesForm { constructor(type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean) { - this.type1 = type1; - this.type2 = type2; - this.height = height; - this.weight = weight; - this.ability1 = ability1; - this.ability2 = ability2; - this.abilityHidden = abilityHidden; - this.baseTotal = baseTotal; - this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; - this.catchRate = catchRate; - this.baseFriendship = baseFriendship; - this.baseExp = baseExp; - this.genderDiffs = genderDiffs; + this.type1 = type1; + this.type2 = type2; + this.height = height; + this.weight = weight; + this.ability1 = ability1; + this.ability2 = ability2; + this.abilityHidden = abilityHidden; + this.baseTotal = baseTotal; + this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; + this.catchRate = catchRate; + this.baseFriendship = baseFriendship; + this.baseExp = baseExp; + this.genderDiffs = genderDiffs; } getRootSpeciesId(forStarter: boolean = false): Species { let ret = this.speciesId; - while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret))) + while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret))) { ret = pokemonPrevolutions[ret]; + } return ret; } @@ -159,8 +170,9 @@ export abstract class PokemonSpeciesForm { } getLevelMoves(): LevelMoves { - if (pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) + if (pokemonSpeciesFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonSpeciesFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { return pokemonSpeciesFormLevelMoves[this.speciesId][this.formIndex].slice(0); + } return pokemonSpeciesLevelMoves[this.speciesId].slice(0); } @@ -186,8 +198,8 @@ export abstract class PokemonSpeciesForm { isRareRegional(): boolean { switch (this.getRegion()) { - case Region.HISUI: - return true; + case Region.HISUI: + return true; } return false; @@ -199,44 +211,44 @@ export abstract class PokemonSpeciesForm { * @returns The species' base stat amount. */ getBaseStat(stat: Stat): integer { - return this.baseStats[stat] + return this.baseStats[stat]; } getBaseExp(): integer { let ret = this.baseExp; switch (this.getFormSpriteKey()) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.MEGA_X: - case SpeciesFormKey.MEGA_Y: - case SpeciesFormKey.PRIMAL: - case SpeciesFormKey.GIGANTAMAX: - case SpeciesFormKey.ETERNAMAX: - ret *= 1.5; - break; + case SpeciesFormKey.MEGA: + case SpeciesFormKey.MEGA_X: + case SpeciesFormKey.MEGA_Y: + case SpeciesFormKey.PRIMAL: + case SpeciesFormKey.GIGANTAMAX: + case SpeciesFormKey.ETERNAMAX: + ret *= 1.5; + break; } return ret; } getSpriteAtlasPath(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { - const spriteId = this.getSpriteId(female, formIndex, shiny, variant).replace(/\_{2}/g, '/'); - return `${/_[1-3]$/.test(spriteId) ? 'variant/' : ''}${spriteId}`; + const spriteId = this.getSpriteId(female, formIndex, shiny, variant).replace(/\_{2}/g, "/"); + return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getSpriteId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer, back?: boolean): string { - if (formIndex === undefined || this instanceof PokemonForm) + if (formIndex === undefined || this instanceof PokemonForm) { formIndex = this.formIndex; + } const formSpriteKey = this.getFormSpriteKey(formIndex); const showGenderDiffs = this.genderDiffs && female && ![ SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX ].find(k => formSpriteKey === k); - const baseSpriteKey = `${showGenderDiffs ? 'female__' : ''}${this.speciesId}${formSpriteKey ? `-${formSpriteKey}` : ''}`; + const baseSpriteKey = `${showGenderDiffs ? "female__" : ""}${this.speciesId}${formSpriteKey ? `-${formSpriteKey}` : ""}`; - let variantSet: VariantSet; let config = variantData; - `${back ? 'back__' : ''}${baseSpriteKey}`.split('__').map(p => config ? config = config[p] : null); - variantSet = config as VariantSet; + `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => config ? config = config[p] : null); + const variantSet = config as VariantSet; - return `${back ? 'back__' : ''}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? 'shiny__' : ''}${baseSpriteKey}${shiny && variantSet && variantSet[variant || 0] === 2 ? `_${variant + 1}` : ''}`; + return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant || 0] === 2 ? `_${variant + 1}` : ""}`; } getSpriteKey(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { @@ -247,47 +259,51 @@ export abstract class PokemonSpeciesForm { getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { const isVariant = shiny && variantData[this.speciesId] && variantData[this.speciesId][variant]; - return `pokemon_icons_${this.generation}${isVariant ? 'v' : ''}`; + return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } getIconId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { - if (formIndex === undefined) + if (formIndex === undefined) { formIndex = this.formIndex; + } let ret = this.speciesId.toString(); const isVariant = shiny && variantData[this.speciesId] && variantData[this.speciesId][variant]; - if (shiny && !isVariant) - ret += 's'; + if (shiny && !isVariant) { + ret += "s"; + } switch (this.speciesId) { - case Species.HIPPOPOTAS: - case Species.HIPPOWDON: - case Species.UNFEZANT: - case Species.FRILLISH: - case Species.JELLICENT: - ret += female ? '-f' : ''; - break; + case Species.HIPPOPOTAS: + case Species.HIPPOWDON: + case Species.UNFEZANT: + case Species.FRILLISH: + case Species.JELLICENT: + ret += female ? "-f" : ""; + break; } let formSpriteKey = this.getFormSpriteKey(formIndex); if (formSpriteKey) { switch (this.speciesId) { - case Species.DUDUNSPARCE: - break; - case Species.ZACIAN: - case Species.ZAMAZENTA: - if (formSpriteKey.startsWith('behemoth')) - formSpriteKey = 'crowned'; - default: - ret += `-${formSpriteKey}`; - break; + case Species.DUDUNSPARCE: + break; + case Species.ZACIAN: + case Species.ZAMAZENTA: + if (formSpriteKey.startsWith("behemoth")) { + formSpriteKey = "crowned"; + } + default: + ret += `-${formSpriteKey}`; + break; } } - if (isVariant) + if (isVariant) { ret += `_${variant + 1}`; + } return ret; } @@ -296,15 +312,15 @@ export abstract class PokemonSpeciesForm { let speciesId = this.speciesId; if (this.speciesId > 2000) { switch (this.speciesId) { - case Species.GALAR_SLOWPOKE: - break; - case Species.ETERNAL_FLOETTE: - break; - case Species.BLOODMOON_URSALUNA: - break; - default: - speciesId = speciesId % 2000; - break; + case Species.GALAR_SLOWPOKE: + break; + case Species.ETERNAL_FLOETTE: + break; + case Species.BLOODMOON_URSALUNA: + break; + default: + speciesId = speciesId % 2000; + break; } } let ret = speciesId.toString(); @@ -316,41 +332,41 @@ export abstract class PokemonSpeciesForm { } const formKey = forms[formIndex || 0].formKey; switch (formKey) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.MEGA_X: - case SpeciesFormKey.MEGA_Y: - case SpeciesFormKey.GIGANTAMAX: - case SpeciesFormKey.GIGANTAMAX_SINGLE: - case SpeciesFormKey.GIGANTAMAX_RAPID: - case 'white': - case 'black': - case 'therian': - case 'sky': - case 'gorging': - case 'gulping': - case 'no-ice': - case 'hangry': - case 'crowned': - case 'eternamax': - case 'four': - case 'droopy': - case 'stretchy': - case 'roaming': - case 'complete': - case '10': - case 'super': - case 'unbound': - case 'pau': - case 'pompom': - case 'sensu': - case 'dusk': - case 'midnight': - case 'school': - case 'dawn-wings': - case 'dusk-mane': - case 'ultra': - ret += `-${formKey}`; - break; + case SpeciesFormKey.MEGA: + case SpeciesFormKey.MEGA_X: + case SpeciesFormKey.MEGA_Y: + case SpeciesFormKey.GIGANTAMAX: + case SpeciesFormKey.GIGANTAMAX_SINGLE: + case SpeciesFormKey.GIGANTAMAX_RAPID: + case "white": + case "black": + case "therian": + case "sky": + case "gorging": + case "gulping": + case "no-ice": + case "hangry": + case "crowned": + case "eternamax": + case "four": + case "droopy": + case "stretchy": + case "roaming": + case "complete": + case "10": + case "super": + case "unbound": + case "pau": + case "pompom": + case "sensu": + case "dusk": + case "midnight": + case "school": + case "dawn-wings": + case "dusk-mane": + case "ultra": + ret += `-${formKey}`; + break; } } return ret; @@ -358,17 +374,20 @@ export abstract class PokemonSpeciesForm { validateStarterMoveset(moveset: StarterMoveset, eggMoves: integer): boolean { const rootSpeciesId = this.getRootSpeciesId(); - for (let moveId of moveset) { + for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { const eggMoveIndex = speciesEggMoves[rootSpeciesId].findIndex(m => m === moveId); - if (eggMoveIndex > -1 && eggMoves & Math.pow(2, eggMoveIndex)) + if (eggMoveIndex > -1 && eggMoves & Math.pow(2, eggMoveIndex)) { continue; + } } if (pokemonFormLevelMoves.hasOwnProperty(this.speciesId) && pokemonFormLevelMoves[this.speciesId].hasOwnProperty(this.formIndex)) { - if (!pokemonFormLevelMoves[this.speciesId][this.formIndex].find(lm => lm[0] <= 5 && lm[1] === moveId)) + if (!pokemonFormLevelMoves[this.speciesId][this.formIndex].find(lm => lm[0] <= 5 && lm[1] === moveId)) { return false; - } else if (!pokemonSpeciesLevelMoves[this.speciesId].find(lm => lm[0] <= 5 && lm[1] === moveId)) + } + } else if (!pokemonSpeciesLevelMoves[this.speciesId].find(lm => lm[0] <= 5 && lm[1] === moveId)) { return false; + } } return true; @@ -391,19 +410,20 @@ export abstract class PokemonSpeciesForm { frameRate: 12, repeat: -1 }); - let spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace('variant/', '').replace(/_[1-3]$/, ''); + let spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace("variant/", "").replace(/_[1-3]$/, ""); const useExpSprite = scene.experimentalSprites && scene.hasExpSprite(spriteKey); - if (useExpSprite) + if (useExpSprite) { spritePath = `exp/${spritePath}`; - let variantSet: VariantSet; + } let config = variantData; - spritePath.split('/').map(p => config ? config = config[p] : null); - variantSet = config as VariantSet; + spritePath.split("/").map(p => config ? config = config[p] : null); + const variantSet = config as VariantSet; if (variantSet && variantSet[variant] === 1) { const populateVariantColors = (key: string): Promise => { return new Promise(resolve => { - if (variantColorCache.hasOwnProperty(key)) + if (variantColorCache.hasOwnProperty(key)) { return resolve(); + } scene.cachedFetch(`./images/pokemon/variant/${spritePath}.json`).then(res => res.json()).then(c => { variantColorCache[key] = c; resolve(); @@ -416,21 +436,25 @@ export abstract class PokemonSpeciesForm { resolve(); }); if (startLoad) { - if (!scene.load.isLoading()) + if (!scene.load.isLoading()) { scene.load.start(); - } else + } + } else { resolve(); + } }); } cry(scene: BattleScene, soundConfig?: Phaser.Types.Sound.SoundConfig, ignorePlay?: boolean): AnySound { const cryKey = this.getCryKey(this.formIndex); let cry = scene.sound.get(cryKey) as AnySound; - if (cry?.pendingRemove) + if (cry?.pendingRemove) { cry = null; + } cry = scene.playSound(cry || cryKey, soundConfig); - if (ignorePlay) + if (ignorePlay) { cry.stop(); + } return cry; } @@ -440,11 +464,11 @@ export abstract class PokemonSpeciesForm { const sourceFrame = sourceTexture.frames[sourceTexture.firstFrame]; const sourceImage = sourceTexture.getSourceImage() as HTMLImageElement; - const canvas = document.createElement('canvas'); + const canvas = document.createElement("canvas"); const spriteColors: integer[][] = []; - const context = canvas.getContext('2d'); + const context = canvas.getContext("2d"); const frame = sourceFrame; canvas.width = frame.width; canvas.height = frame.height; @@ -456,16 +480,18 @@ export abstract class PokemonSpeciesForm { if (pixelData[i + 3]) { const pixel = pixelData.slice(i, i + 4); const [ r, g, b, a ] = pixel; - if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) + if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { spriteColors.push([ r, g, b, a ]); + } } } const pixelColors = []; for (let i = 0; i < pixelData.length; i += 4) { const total = pixelData.slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); - if (!total) + if (!total) { continue; + } pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); } @@ -476,7 +502,7 @@ export abstract class PokemonSpeciesForm { scene.executeWithSeedOffset(() => { paletteColors = QuantizerCelebi.quantize(pixelColors, 2); - }, 0, 'This result should not vary'); + }, 0, "This result should not vary"); Math.random = originalRandom; @@ -529,17 +555,18 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (formIndex !== undefined && this.forms.length) { const form = this.forms[formIndex]; switch (form.formKey) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.PRIMAL: - case SpeciesFormKey.ETERNAMAX: - return `${form.formName} ${this.name}`; - case SpeciesFormKey.MEGA_X: - return `Mega ${this.name} X`; - case SpeciesFormKey.MEGA_Y: - return `Mega ${this.name} Y`; - default: - if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) - return `G-Max ${this.name}`; + case SpeciesFormKey.MEGA: + case SpeciesFormKey.PRIMAL: + case SpeciesFormKey.ETERNAMAX: + return `${form.formName} ${this.name}`; + case SpeciesFormKey.MEGA_X: + return `Mega ${this.name} X`; + case SpeciesFormKey.MEGA_Y: + return `Mega ${this.name} Y`; + default: + if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) { + return `G-Max ${this.name}`; + } } } return this.name; @@ -559,18 +586,18 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali private getStrengthLevelDiff(strength: PartyMemberStrength): integer { switch (Math.min(strength, PartyMemberStrength.STRONGER)) { - case PartyMemberStrength.WEAKEST: - return 60; - case PartyMemberStrength.WEAKER: - return 40; - case PartyMemberStrength.WEAK: - return 20; - case PartyMemberStrength.AVERAGE: - return 10; - case PartyMemberStrength.STRONG: - return 5; - default: - return 0; + case PartyMemberStrength.WEAKEST: + return 60; + case PartyMemberStrength.WEAKER: + return 40; + case PartyMemberStrength.WEAK: + return 20; + case PartyMemberStrength.AVERAGE: + return 10; + case PartyMemberStrength.STRONG: + return 5; + default: + return 0; } } @@ -580,52 +607,56 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (prevolutionLevels.length) { for (let pl = prevolutionLevels.length - 1; pl >= 0; pl--) { const prevolutionLevel = prevolutionLevels[pl]; - if (level < prevolutionLevel[1]) + if (level < prevolutionLevel[1]) { return prevolutionLevel[0]; + } } } - if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) + if (!allowEvolving || !pokemonEvolutions.hasOwnProperty(this.speciesId)) { return this.speciesId; + } const evolutions = pokemonEvolutions[this.speciesId]; - const easeInFunc = Phaser.Tweens.Builders.GetEaseFunction('Sine.easeIn'); - const easeOutFunc = Phaser.Tweens.Builders.GetEaseFunction('Sine.easeOut'); + const easeInFunc = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn"); + const easeOutFunc = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut"); const evolutionPool: Map = new Map(); let totalWeight = 0; let noEvolutionChance = 1; - for (let ev of evolutions) { - if (ev.level > level) + for (const ev of evolutions) { + if (ev.level > level) { continue; + } let evolutionChance: number; const evolutionSpecies = getPokemonSpecies(ev.speciesId); const isRegionalEvolution = !this.isRegional() && evolutionSpecies.isRegional(); - if (!forTrainer && isRegionalEvolution) + if (!forTrainer && isRegionalEvolution) { evolutionChance = 0; - else { + } else { if (ev.wildDelay === SpeciesWildEvolutionDelay.NONE) { - if (strength === PartyMemberStrength.STRONGER) + if (strength === PartyMemberStrength.STRONGER) { evolutionChance = 1; - else { + } else { const maxLevelDiff = this.getStrengthLevelDiff(strength); const minChance: number = 0.875 - 0.125 * strength; evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1); } } else { - let preferredMinLevel = Math.max((ev.level - 1) + ev.wildDelay * this.getStrengthLevelDiff(strength), 1); + const preferredMinLevel = Math.max((ev.level - 1) + ev.wildDelay * this.getStrengthLevelDiff(strength), 1); let evolutionLevel = Math.max(ev.level > 1 ? ev.level : Math.floor(preferredMinLevel / 2), 1); if (ev.level <= 1 && pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevel = pokemonEvolutions[pokemonPrevolutions[this.speciesId]].find(ev => ev.speciesId === this.speciesId).level; - if (prevolutionLevel > 1) + if (prevolutionLevel > 1) { evolutionLevel = prevolutionLevel; + } } evolutionChance = Math.min(0.65 * easeInFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel) / preferredMinLevel) + 0.35 * easeOutFunc(Math.min(Math.max(level - evolutionLevel, 0), preferredMinLevel * 2.5) / (preferredMinLevel * 2.5)), 1); @@ -633,26 +664,30 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } if (evolutionChance > 0) { - if (isRegionalEvolution) + if (isRegionalEvolution) { evolutionChance /= (evolutionSpecies.isRareRegional() ? 16 : 4); + } totalWeight += evolutionChance; evolutionPool.set(totalWeight, ev.speciesId); - if ((1 - evolutionChance) < noEvolutionChance) + if ((1 - evolutionChance) < noEvolutionChance) { noEvolutionChance = 1 - evolutionChance; + } } } - if (noEvolutionChance === 1 || Phaser.Math.RND.realInRange(0, 1) < noEvolutionChance) + if (noEvolutionChance === 1 || Phaser.Math.RND.realInRange(0, 1) < noEvolutionChance) { return this.speciesId; + } const randValue = evolutionPool.size === 1 ? 0 : Utils.randSeedInt(totalWeight); - for (let weight of evolutionPool.keys()) { - if (randValue < weight) + for (const weight of evolutionPool.keys()) { + if (randValue < weight) { return getPokemonSpecies(evolutionPool.get(weight)).getSpeciesForLevel(level, true, forTrainer, strength); + } } return this.speciesId; @@ -664,14 +699,15 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali //console.log(Species[this.speciesId], pokemonEvolutions[this.speciesId]) if (pokemonEvolutions.hasOwnProperty(this.speciesId)) { - for (let e of pokemonEvolutions[this.speciesId]) { + for (const e of pokemonEvolutions[this.speciesId]) { const speciesId = e.speciesId; const level = e.level; evolutionLevels.push([ speciesId, level ]); //console.log(Species[speciesId], getPokemonSpecies(speciesId), getPokemonSpecies(speciesId).getEvolutionLevels()); const nextEvolutionLevels = getPokemonSpecies(speciesId).getEvolutionLevels(); - for (let npl of nextEvolutionLevels) + for (const npl of nextEvolutionLevels) { evolutionLevels.push(npl); + } } } @@ -682,15 +718,16 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali const prevolutionLevels = []; const allEvolvingPokemon = Object.keys(pokemonEvolutions); - for (let p of allEvolvingPokemon) { - for (let e of pokemonEvolutions[p]) { + for (const p of allEvolvingPokemon) { + for (const e of pokemonEvolutions[p]) { if (e.speciesId === this.speciesId && (!this.forms.length || !e.evoFormKey || e.evoFormKey === this.forms[this.formIndex].formKey)) { const speciesId = parseInt(p) as Species; - let level = e.level; + const level = e.level; prevolutionLevels.push([ speciesId, level ]); const subPrevolutionLevels = getPokemonSpecies(speciesId).getPrevolutionLevels(); - for (let spl of subPrevolutionLevels) + for (const spl of subPrevolutionLevels) { prevolutionLevels.push(spl); + } } } } @@ -747,7 +784,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } return this.forms?.length ? this.forms[formIndex || 0].getFormSpriteKey() - : ''; + : ""; } } @@ -788,7 +825,7 @@ export enum SpeciesFormKey { export const allSpecies: PokemonSpecies[] = []; export function initSpecies() { - allSpecies.push( + allSpecies.push( new PokemonSpecies(Species.BULBASAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 0.7, 6.9, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.IVYSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 1, 13, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, @@ -3168,25 +3205,25 @@ export const noStarterFormKeys: string[] = [ export function getStarterValueFriendshipCap(value: integer): integer { switch (value) { - case 1: - return 20; - case 2: - return 40; - case 3: - return 60; - case 4: - return 100; - case 5: - return 140; - case 6: - return 200; - case 7: - return 280; - case 8: - case 9: - return 450; - default: - return 600; + case 1: + return 20; + case 2: + return 40; + case 3: + return 60; + case 4: + return 100; + case 5: + return 140; + case 6: + return 200; + case 7: + return 280; + case 8: + case 9: + return 450; + default: + return 600; } } @@ -3765,7 +3802,7 @@ export const starterPassiveAbilities = { // TODO: Remove { //setTimeout(() => { - /*for (let tc of Object.keys(trainerConfigs)) { + /*for (let tc of Object.keys(trainerConfigs)) { console.log(TrainerType[tc], !trainerConfigs[tc].speciesFilter ? 'all' : [...new Set(allSpecies.filter(s => s.generation <= 9).filter(trainerConfigs[tc].speciesFilter).map(s => { while (pokemonPrevolutions.hasOwnProperty(s.speciesId)) s = getPokemonSpecies(pokemonPrevolutions[s.speciesId]); diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts index 94e710c981bc..c1faee0e177c 100644 --- a/src/data/pokemon-stat.ts +++ b/src/data/pokemon-stat.ts @@ -1,4 +1,4 @@ -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export enum Stat { HP = 0, @@ -7,29 +7,29 @@ export enum Stat { SPATK, SPDEF, SPD -}; +} export function getStatName(stat: Stat, shorten: boolean = false) { let ret: string; switch (stat) { - case Stat.HP: - ret = !shorten ? i18next.t('pokemonInfo:Stat.HP') : i18next.t('pokemonInfo:Stat.HPshortened'); - break; - case Stat.ATK: - ret = !shorten ? i18next.t('pokemonInfo:Stat.ATK') : i18next.t('pokemonInfo:Stat.ATKshortened'); - break; - case Stat.DEF: - ret = !shorten ? i18next.t('pokemonInfo:Stat.DEF') : i18next.t('pokemonInfo:Stat.DEFshortened'); - break; - case Stat.SPATK: - ret = !shorten ? i18next.t('pokemonInfo:Stat.SPATK') : i18next.t('pokemonInfo:Stat.SPATKshortened'); - break; - case Stat.SPDEF: - ret = !shorten ? i18next.t('pokemonInfo:Stat.SPDEF') : i18next.t('pokemonInfo:Stat.SPDEFshortened'); - break; - case Stat.SPD: - ret = !shorten ? i18next.t('pokemonInfo:Stat.SPD') : i18next.t('pokemonInfo:Stat.SPDshortened'); - break; + case Stat.HP: + ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened"); + break; + case Stat.ATK: + ret = !shorten ? i18next.t("pokemonInfo:Stat.ATK") : i18next.t("pokemonInfo:Stat.ATKshortened"); + break; + case Stat.DEF: + ret = !shorten ? i18next.t("pokemonInfo:Stat.DEF") : i18next.t("pokemonInfo:Stat.DEFshortened"); + break; + case Stat.SPATK: + ret = !shorten ? i18next.t("pokemonInfo:Stat.SPATK") : i18next.t("pokemonInfo:Stat.SPATKshortened"); + break; + case Stat.SPDEF: + ret = !shorten ? i18next.t("pokemonInfo:Stat.SPDEF") : i18next.t("pokemonInfo:Stat.SPDEFshortened"); + break; + case Stat.SPD: + ret = !shorten ? i18next.t("pokemonInfo:Stat.SPD") : i18next.t("pokemonInfo:Stat.SPDshortened"); + break; } return ret; -} \ No newline at end of file +} diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index c650b038287d..1732d215ef5c 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -1,45 +1,45 @@ import i18next from "../plugins/i18n"; export function getBattleCountSplashMessage(): string { - return `{COUNT} ${i18next.t('splashMessages:battlesWon')}`; + return `{COUNT} ${i18next.t("splashMessages:battlesWon")}`; } export function getSplashMessages(): string[] { const splashMessages = Array(10).fill(getBattleCountSplashMessage()); splashMessages.push(...[ - i18next.t('splashMessages:joinTheDiscord'), - i18next.t('splashMessages:infiniteLevels'), - i18next.t('splashMessages:everythingStacks'), - i18next.t('splashMessages:optionalSaveScumming'), - i18next.t('splashMessages:biomes'), - i18next.t('splashMessages:openSource'), - i18next.t('splashMessages:playWithSpeed'), - i18next.t('splashMessages:liveBugTesting'), - i18next.t('splashMessages:heavyInfluence'), - i18next.t('splashMessages:pokemonRiskAndPokemonRain'), - i18next.t('splashMessages:nowWithMoreSalt'), - i18next.t('splashMessages:infiniteFusionAtHome'), - i18next.t('splashMessages:brokenEggMoves'), - i18next.t('splashMessages:magnificent'), - i18next.t('splashMessages:mubstitute'), - i18next.t('splashMessages:thatsCrazy'), - i18next.t('splashMessages:oranceJuice'), - i18next.t('splashMessages:questionableBalancing'), - i18next.t('splashMessages:coolShaders'), - i18next.t('splashMessages:aiFree'), - i18next.t('splashMessages:suddenDifficultySpikes'), - i18next.t('splashMessages:basedOnAnUnfinishedFlashGame'), - i18next.t('splashMessages:moreAddictiveThanIntended'), - i18next.t('splashMessages:mostlyConsistentSeeds'), - i18next.t('splashMessages:achievementPointsDontDoAnything'), - i18next.t('splashMessages:youDoNotStartAtLevel'), - i18next.t('splashMessages:dontTalkAboutTheManaphyEggIncident'), - i18next.t('splashMessages:alsoTryPokengine'), - i18next.t('splashMessages:alsoTryEmeraldRogue'), - i18next.t('splashMessages:alsoTryRadicalRed'), - i18next.t('splashMessages:eeveeExpo'), - i18next.t('splashMessages:ynoproject'), + i18next.t("splashMessages:joinTheDiscord"), + i18next.t("splashMessages:infiniteLevels"), + i18next.t("splashMessages:everythingStacks"), + i18next.t("splashMessages:optionalSaveScumming"), + i18next.t("splashMessages:biomes"), + i18next.t("splashMessages:openSource"), + i18next.t("splashMessages:playWithSpeed"), + i18next.t("splashMessages:liveBugTesting"), + i18next.t("splashMessages:heavyInfluence"), + i18next.t("splashMessages:pokemonRiskAndPokemonRain"), + i18next.t("splashMessages:nowWithMoreSalt"), + i18next.t("splashMessages:infiniteFusionAtHome"), + i18next.t("splashMessages:brokenEggMoves"), + i18next.t("splashMessages:magnificent"), + i18next.t("splashMessages:mubstitute"), + i18next.t("splashMessages:thatsCrazy"), + i18next.t("splashMessages:oranceJuice"), + i18next.t("splashMessages:questionableBalancing"), + i18next.t("splashMessages:coolShaders"), + i18next.t("splashMessages:aiFree"), + i18next.t("splashMessages:suddenDifficultySpikes"), + i18next.t("splashMessages:basedOnAnUnfinishedFlashGame"), + i18next.t("splashMessages:moreAddictiveThanIntended"), + i18next.t("splashMessages:mostlyConsistentSeeds"), + i18next.t("splashMessages:achievementPointsDontDoAnything"), + i18next.t("splashMessages:youDoNotStartAtLevel"), + i18next.t("splashMessages:dontTalkAboutTheManaphyEggIncident"), + i18next.t("splashMessages:alsoTryPokengine"), + i18next.t("splashMessages:alsoTryEmeraldRogue"), + i18next.t("splashMessages:alsoTryRadicalRed"), + i18next.t("splashMessages:eeveeExpo"), + i18next.t("splashMessages:ynoproject"), ]); - return splashMessages -} \ No newline at end of file + return splashMessages; +} diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index c14d49a32506..03c5f46e8ee2 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -32,105 +32,105 @@ export class Status { } export function getStatusEffectObtainText(statusEffect: StatusEffect, sourceText?: string): string { - const sourceClause = sourceText ? ` ${statusEffect !== StatusEffect.SLEEP ? 'by' : 'from'} ${sourceText}` : ''; + const sourceClause = sourceText ? ` ${statusEffect !== StatusEffect.SLEEP ? "by" : "from"} ${sourceText}` : ""; switch (statusEffect) { - case StatusEffect.POISON: - return `\nwas poisoned${sourceClause}!`; - case StatusEffect.TOXIC: - return `\nwas badly poisoned${sourceClause}!`; - case StatusEffect.PARALYSIS: - return ` was paralyzed${sourceClause}!\nIt may be unable to move!`; - case StatusEffect.SLEEP: - return `\nfell asleep${sourceClause}!`; - case StatusEffect.FREEZE: - return `\nwas frozen solid${sourceClause}!`; - case StatusEffect.BURN: - return `\nwas burned${sourceClause}!`; + case StatusEffect.POISON: + return `\nwas poisoned${sourceClause}!`; + case StatusEffect.TOXIC: + return `\nwas badly poisoned${sourceClause}!`; + case StatusEffect.PARALYSIS: + return ` was paralyzed${sourceClause}!\nIt may be unable to move!`; + case StatusEffect.SLEEP: + return `\nfell asleep${sourceClause}!`; + case StatusEffect.FREEZE: + return `\nwas frozen solid${sourceClause}!`; + case StatusEffect.BURN: + return `\nwas burned${sourceClause}!`; } - return ''; + return ""; } export function getStatusEffectActivationText(statusEffect: StatusEffect): string { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return ' is hurt\nby poison!'; - case StatusEffect.PARALYSIS: - return ' is paralyzed!\nIt can\'t move!'; - case StatusEffect.SLEEP: - return ' is fast asleep.'; - case StatusEffect.FREEZE: - return ' is\nfrozen solid!'; - case StatusEffect.BURN: - return ' is hurt\nby its burn!'; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + return " is hurt\nby poison!"; + case StatusEffect.PARALYSIS: + return " is paralyzed!\nIt can't move!"; + case StatusEffect.SLEEP: + return " is fast asleep."; + case StatusEffect.FREEZE: + return " is\nfrozen solid!"; + case StatusEffect.BURN: + return " is hurt\nby its burn!"; } - return ''; + return ""; } export function getStatusEffectOverlapText(statusEffect: StatusEffect): string { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return ' is\nalready poisoned!'; - case StatusEffect.PARALYSIS: - return ' is\nalready paralyzed!'; - case StatusEffect.SLEEP: - return ' is\nalready asleep!'; - case StatusEffect.FREEZE: - return ' is\nalready frozen!'; - case StatusEffect.BURN: - return ' is\nalready burned!'; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + return " is\nalready poisoned!"; + case StatusEffect.PARALYSIS: + return " is\nalready paralyzed!"; + case StatusEffect.SLEEP: + return " is\nalready asleep!"; + case StatusEffect.FREEZE: + return " is\nalready frozen!"; + case StatusEffect.BURN: + return " is\nalready burned!"; } - return ''; + return ""; } export function getStatusEffectHealText(statusEffect: StatusEffect): string { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return ' was\ncured of its poison!'; - case StatusEffect.PARALYSIS: - return ' was\nhealed of paralysis!'; - case StatusEffect.SLEEP: - return ' woke up!'; - case StatusEffect.FREEZE: - return ' was\ndefrosted!'; - case StatusEffect.BURN: - return ' was\nhealed of its burn!'; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + return " was\ncured of its poison!"; + case StatusEffect.PARALYSIS: + return " was\nhealed of paralysis!"; + case StatusEffect.SLEEP: + return " woke up!"; + case StatusEffect.FREEZE: + return " was\ndefrosted!"; + case StatusEffect.BURN: + return " was\nhealed of its burn!"; } - return ''; + return ""; } export function getStatusEffectDescriptor(statusEffect: StatusEffect): string { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - return 'poisoning'; - case StatusEffect.PARALYSIS: - return 'paralysis'; - case StatusEffect.SLEEP: - return 'sleep'; - case StatusEffect.FREEZE: - return 'freezing'; - case StatusEffect.BURN: - return 'burn'; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + return "poisoning"; + case StatusEffect.PARALYSIS: + return "paralysis"; + case StatusEffect.SLEEP: + return "sleep"; + case StatusEffect.FREEZE: + return "freezing"; + case StatusEffect.BURN: + return "burn"; } } export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - case StatusEffect.PARALYSIS: - case StatusEffect.BURN: - return 1.5; - case StatusEffect.SLEEP: - case StatusEffect.FREEZE: - return 2.5; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + case StatusEffect.PARALYSIS: + case StatusEffect.BURN: + return 1.5; + case StatusEffect.SLEEP: + case StatusEffect.FREEZE: + return 2.5; } return 1; @@ -174,4 +174,4 @@ export function getRandomStatus(statusA: Status, statusB: Status): Status { return Utils.randIntRange(0, 2) ? statusA : statusB; -} \ No newline at end of file +} diff --git a/src/data/temp-battle-stat.ts b/src/data/temp-battle-stat.ts index 72dff92fe52b..35653bfd75ad 100644 --- a/src/data/temp-battle-stat.ts +++ b/src/data/temp-battle-stat.ts @@ -11,26 +11,27 @@ export enum TempBattleStat { } export function getTempBattleStatName(tempBattleStat: TempBattleStat) { - if (tempBattleStat === TempBattleStat.CRIT) - return 'critical-hit ratio'; + if (tempBattleStat === TempBattleStat.CRIT) { + return "critical-hit ratio"; + } return getBattleStatName(tempBattleStat as integer as BattleStat); } export function getTempBattleStatBoosterItemName(tempBattleStat: TempBattleStat) { switch (tempBattleStat) { - case TempBattleStat.ATK: - return 'X Attack'; - case TempBattleStat.DEF: - return 'X Defense'; - case TempBattleStat.SPATK: - return 'X Sp. Atk'; - case TempBattleStat.SPDEF: - return 'X Sp. Def'; - case TempBattleStat.SPD: - return 'X Speed'; - case TempBattleStat.ACC: - return 'X Accuracy'; - case TempBattleStat.CRIT: - return 'Dire Hit'; + case TempBattleStat.ATK: + return "X Attack"; + case TempBattleStat.DEF: + return "X Defense"; + case TempBattleStat.SPATK: + return "X Sp. Atk"; + case TempBattleStat.SPDEF: + return "X Sp. Def"; + case TempBattleStat.SPD: + return "X Speed"; + case TempBattleStat.ACC: + return "X Accuracy"; + case TempBattleStat.CRIT: + return "Dire Hit"; } -} \ No newline at end of file +} diff --git a/src/data/terrain.ts b/src/data/terrain.ts index c0328d98d6c5..6a77f8762395 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -24,26 +24,30 @@ export class Terrain { } lapse(): boolean { - if (this.turnsLeft) + if (this.turnsLeft) { return !!--this.turnsLeft; + } return true; } getAttackTypeMultiplier(attackType: Type): number { switch (this.terrainType) { - case TerrainType.ELECTRIC: - if (attackType === Type.ELECTRIC) - return 1.3; - break; - case TerrainType.GRASSY: - if (attackType === Type.GRASS) - return 1.3; - break; - case TerrainType.PSYCHIC: - if (attackType === Type.PSYCHIC) - return 1.3; - break; + case TerrainType.ELECTRIC: + if (attackType === Type.ELECTRIC) { + return 1.3; + } + break; + case TerrainType.GRASSY: + if (attackType === Type.GRASS) { + return 1.3; + } + break; + case TerrainType.PSYCHIC: + if (attackType === Type.PSYCHIC) { + return 1.3; + } + break; } return 1; @@ -51,12 +55,12 @@ export class Terrain { isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move): boolean { switch (this.terrainType) { - case TerrainType.PSYCHIC: - if (!move.getAttrs(ProtectAttr).length) { - const priority = new Utils.IntegerHolder(move.priority); - applyAbAttrs(IncrementMovePriorityAbAttr, user, null, move, priority); - return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex())).length > 0; - } + case TerrainType.PSYCHIC: + if (!move.getAttrs(ProtectAttr).length) { + const priority = new Utils.IntegerHolder(move.priority); + applyAbAttrs(IncrementMovePriorityAbAttr, user, null, move, priority); + return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex())).length > 0; + } } return false; @@ -65,15 +69,15 @@ export class Terrain { export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] { switch (terrainType) { - case TerrainType.MISTY: - return [ 232, 136, 200 ]; - case TerrainType.ELECTRIC: - return [ 248, 248, 120 ]; - case TerrainType.GRASSY: - return [ 120, 200, 80 ]; - case TerrainType.PSYCHIC: - return [ 160, 64, 160 ]; + case TerrainType.MISTY: + return [ 232, 136, 200 ]; + case TerrainType.ELECTRIC: + return [ 248, 248, 120 ]; + case TerrainType.GRASSY: + return [ 120, 200, 80 ]; + case TerrainType.PSYCHIC: + return [ 160, 64, 160 ]; } return [ 0, 0, 0 ]; -} \ No newline at end of file +} diff --git a/src/data/tms.ts b/src/data/tms.ts index c6f692aeebd3..6e55ea496ba8 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -240,16 +240,16 @@ export const tmSpecies: TmSpecies = { Species.ZARUDE, [ Species.DEOXYS, - 'attack', - 'defense', - 'speed', + "attack", + "defense", + "speed", ], Species.ALOLA_RAICHU, Species.ALOLA_GOLEM, Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_SLOWBRO, Species.GALAR_MR_MIME, @@ -402,8 +402,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'speed', + "", + "speed", ], Species.CHIMCHAR, Species.MONFERNO, @@ -488,7 +488,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_SLOWKING, Species.GALAR_DARUMAKA, @@ -605,8 +605,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'speed', + "", + "speed", ], Species.BUIZEL, Species.FLOATZEL, @@ -809,8 +809,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'speed', + "", + "speed", ], Species.CHIMCHAR, Species.MONFERNO, @@ -914,7 +914,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_SLOWKING, Species.HISUI_TYPHLOSION, @@ -1105,9 +1105,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -1214,7 +1214,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_FARFETCHD, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_QWILFISH, Species.HISUI_SNEASEL, @@ -1827,15 +1827,15 @@ export const tmSpecies: TmSpecies = { Species.FLAMIGO, [ Species.DEOXYS, - 'attack', - 'defense', - 'speed', + "attack", + "defense", + "speed", ], Species.ALOLA_RAICHU, Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_SLOWBRO, Species.GALAR_MR_MIME, @@ -2267,8 +2267,8 @@ export const tmSpecies: TmSpecies = { Species.ROCKRUFF, [ Species.LYCANROC, - 'midday', - 'midnight', + "midday", + "midnight", ], Species.TOXAPEX, Species.MUDBRAY, @@ -2427,8 +2427,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -2857,9 +2857,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -3550,8 +3550,8 @@ export const tmSpecies: TmSpecies = { Species.SPECTRIER, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.WYRDEER, Species.KLEAVOR, @@ -4147,7 +4147,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_GOODRA, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.HYDRO_PUMP]: [ @@ -4336,7 +4336,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_GOODRA, [ Species.PALDEA_TAUROS, - 'aqua', + "aqua", ], Species.PALDEA_WOOPER, ], @@ -4584,8 +4584,8 @@ export const tmSpecies: TmSpecies = { Species.HISUI_GOODRA, [ Species.PALDEA_TAUROS, - 'combat', - 'aqua', + "combat", + "aqua", ], Species.PALDEA_WOOPER, ], @@ -4883,7 +4883,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -5165,7 +5165,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -6730,11 +6730,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -6934,7 +6934,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_TYPHLOSION, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.THUNDERBOLT]: [ @@ -8040,8 +8040,8 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.WORMADAM, - 'sandy', - 'trash', + "sandy", + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -8354,9 +8354,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -9148,11 +9148,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -9508,11 +9508,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.ESPURR, @@ -9872,7 +9872,7 @@ export const tmSpecies: TmSpecies = { Species.IRON_BOULDER, [ Species.DEOXYS, - 'speed', + "speed", ], Species.ALOLA_RAICHU, Species.ALOLA_SANDSLASH, @@ -9995,7 +9995,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_TYPHLOSION, Species.HISUI_ZORUA, @@ -10885,11 +10885,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -11210,7 +11210,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_TYPHLOSION, Species.HISUI_ZORUA, @@ -11542,7 +11542,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.INDEEDEE, - 'female', + "female", ], ], [Moves.HAZE]: [ @@ -11655,7 +11655,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_QWILFISH, Species.HISUI_DECIDUEYE, @@ -11978,7 +11978,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.INDEEDEE, - 'female', + "female", ], Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -12147,7 +12147,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'dusk', + "dusk", ], Species.GALAR_FARFETCHD, Species.GALAR_ZAPDOS, @@ -12602,7 +12602,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_GOODRA, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.WATERFALL]: [ @@ -12757,7 +12757,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -12985,8 +12985,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'speed', + "", + "speed", ], Species.CHIMCHAR, Species.MONFERNO, @@ -13116,9 +13116,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.FLETCHLING, Species.FLETCHINDER, @@ -13432,7 +13432,7 @@ export const tmSpecies: TmSpecies = { Species.SCREAM_TAIL, [ Species.DEOXYS, - 'defense', + "defense", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -14784,11 +14784,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -16388,11 +16388,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -17937,11 +17937,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -18584,8 +18584,8 @@ export const tmSpecies: TmSpecies = { Species.SPECTRIER, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.WYRDEER, Species.KLEAVOR, @@ -18826,8 +18826,8 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_DUGTRIO, [ Species.LYCANROC, - 'midnight', - 'dusk', + "midnight", + "dusk", ], Species.GALAR_ZAPDOS, Species.GALAR_DARMANITAN, @@ -19688,11 +19688,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -21021,9 +21021,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -21049,8 +21049,8 @@ export const tmSpecies: TmSpecies = { Species.ROCKRUFF, [ Species.LYCANROC, - 'midday', - 'midnight', + "midday", + "midnight", ], Species.MUDBRAY, Species.MUDSDALE, @@ -21104,7 +21104,7 @@ export const tmSpecies: TmSpecies = { Species.MUNKIDORI, [ Species.WORMADAM, - 'sandy', + "sandy", ], Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -21199,7 +21199,7 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, [ Species.DEOXYS, - 'defense', + "defense", ], Species.ALOLA_SANDSLASH, Species.HISUI_QWILFISH, @@ -21372,8 +21372,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'speed', + "", + "speed", ], Species.PIPLUP, Species.PRINPLUP, @@ -21523,7 +21523,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_LINOONE, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -21694,12 +21694,12 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', - 'dusk', + "midnight", + "dusk", ], [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -21951,8 +21951,8 @@ export const tmSpecies: TmSpecies = { Species.IRON_BOULDER, [ Species.WORMADAM, - 'sandy', - 'trash', + "sandy", + "trash", ], Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -22129,11 +22129,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -22840,9 +22840,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -23483,7 +23483,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_MR_MIME, [ Species.INDEEDEE, - 'female', + "female", ], Species.HISUI_LILLIGANT, Species.HISUI_SLIGGOO, @@ -23572,9 +23572,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.PANCHAM, Species.PANGORO, @@ -24280,11 +24280,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -25150,11 +25150,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -26023,11 +26023,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -27086,11 +27086,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -27898,11 +27898,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -28247,11 +28247,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.ESPURR, @@ -28342,7 +28342,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.INDEEDEE, - 'female', + "female", ], ], [Moves.PAIN_SPLIT]: [ @@ -28539,7 +28539,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_RAPIDASH, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_SAMUROTT, ], @@ -28723,7 +28723,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_MR_MIME, [ Species.INDEEDEE, - 'female', + "female", ], Species.HISUI_DECIDUEYE, ], @@ -30007,11 +30007,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -30672,11 +30672,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -30888,7 +30888,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -31382,11 +31382,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -31444,8 +31444,8 @@ export const tmSpecies: TmSpecies = { Species.RIBOMBEE, [ Species.LYCANROC, - 'midday', - 'midnight', + "midday", + "midnight", ], Species.MUDBRAY, Species.MUDSDALE, @@ -31626,8 +31626,8 @@ export const tmSpecies: TmSpecies = { Species.HISUI_DECIDUEYE, [ Species.PALDEA_TAUROS, - 'combat', - 'blaze', + "combat", + "blaze", ], Species.BLOODMOON_URSALUNA, ], @@ -31864,8 +31864,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -32470,7 +32470,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_TYPHLOSION, Species.HISUI_QWILFISH, @@ -32571,7 +32571,7 @@ export const tmSpecies: TmSpecies = { Species.IRON_CROWN, [ Species.MEOWSTIC, - 'female', + "female", ], Species.ALOLA_RAICHU, Species.GALAR_PONYTA, @@ -33212,7 +33212,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_LINOONE, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], ], [Moves.BEAT_UP]: [ @@ -33593,7 +33593,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_WEEZING, @@ -33603,8 +33603,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.BLOODMOON_URSALUNA, ], @@ -33951,7 +33951,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.CALYREX, - 'ice', + "ice", ], ], [Moves.TORMENT]: [ @@ -34148,7 +34148,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_ZORUA, Species.HISUI_ZOROARK, @@ -34293,7 +34293,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -34302,7 +34302,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZOROARK, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.FACADE]: [ @@ -34957,11 +34957,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -35585,7 +35585,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_DARUMAKA, Species.HISUI_TYPHLOSION, @@ -35696,11 +35696,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -36189,8 +36189,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -36567,20 +36567,20 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.LITLEO, Species.PYROAR, Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -37126,7 +37126,7 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, [ Species.DEOXYS, - 'attack', + "attack", ], Species.ALOLA_GEODUDE, Species.ALOLA_GRAVELER, @@ -37138,7 +37138,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_BRAVIARY, ], @@ -37255,7 +37255,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_RATTATA, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_FARFETCHD, Species.GALAR_ZAPDOS, @@ -37493,9 +37493,9 @@ export const tmSpecies: TmSpecies = { Species.CHESNAUGHT, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -37731,9 +37731,9 @@ export const tmSpecies: TmSpecies = { Species.METAGROSS, [ Species.DEOXYS, - '', - 'defense', - 'speed', + "", + "defense", + "speed", ], Species.CHIMCHAR, Species.MONFERNO, @@ -37928,7 +37928,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_FARFETCHD, @@ -38723,7 +38723,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], ], [Moves.FEATHER_DANCE]: [ @@ -39557,7 +39557,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_TYPHLOSION, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.ROCK_TOMB]: [ @@ -39939,8 +39939,8 @@ export const tmSpecies: TmSpecies = { Species.IRON_BOULDER, [ Species.WORMADAM, - 'sandy', - 'trash', + "sandy", + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -39992,7 +39992,7 @@ export const tmSpecies: TmSpecies = { Species.BASTIODON, [ Species.WORMADAM, - 'trash', + "trash", ], Species.BRONZOR, Species.BRONZONG, @@ -40070,8 +40070,8 @@ export const tmSpecies: TmSpecies = { Species.JIRACHI, [ Species.DEOXYS, - '', - 'attack', + "", + "attack", ], Species.BUNEARY, Species.LOPUNNY, @@ -41037,7 +41037,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_AVALUGG, ], @@ -41278,11 +41278,11 @@ export const tmSpecies: TmSpecies = { Species.IRON_CROWN, [ Species.DEOXYS, - 'defense', + "defense", ], [ Species.WORMADAM, - 'trash', + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -41302,7 +41302,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_AVALUGG, ], @@ -41804,9 +41804,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -42039,11 +42039,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -42099,7 +42099,7 @@ export const tmSpecies: TmSpecies = { Species.HYDRAPPLE, [ Species.MEOWSTIC, - 'female', + "female", ], Species.ALOLA_EXEGGUTOR, Species.ETERNAL_FLOETTE, @@ -42256,11 +42256,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.ESPURR, @@ -42570,7 +42570,7 @@ export const tmSpecies: TmSpecies = { Species.IRON_THORNS, [ Species.WORMADAM, - 'sandy', + "sandy", ], Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -42872,7 +42872,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_GOODRA, [ Species.PALDEA_TAUROS, - 'aqua', + "aqua", ], Species.PALDEA_WOOPER, ], @@ -43238,7 +43238,7 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.WORMADAM, - 'trash', + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -43369,7 +43369,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_QWILFISH, ], @@ -43872,7 +43872,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_ZAPDOS, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -44179,7 +44179,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_WEEZING, @@ -44193,8 +44193,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], ], [Moves.ASSURANCE]: [ @@ -44394,12 +44394,12 @@ export const tmSpecies: TmSpecies = { Species.GALAR_LINOONE, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], [ Species.PALDEA_TAUROS, - 'combat', + "combat", ], ], [Moves.EMBARGO]: [ @@ -44893,7 +44893,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_SLOWBRO, @@ -45048,7 +45048,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_ARTICUNO, [ Species.INDEEDEE, - 'female', + "female", ], ], [Moves.TOXIC_SPIKES]: [ @@ -45108,9 +45108,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.SKRELP, Species.DRAGALGE, @@ -45235,7 +45235,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_TYPHLOSION, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.AURA_SPHERE]: [ @@ -45784,7 +45784,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -45916,11 +45916,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -47143,11 +47143,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -47508,7 +47508,7 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.WORMADAM, - 'sandy', + "sandy", ], Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -48305,7 +48305,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_SNEASEL, Species.HISUI_ZORUA, @@ -48417,7 +48417,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_SAMUROTT, Species.HISUI_AVALUGG, @@ -48628,7 +48628,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_PERSIAN, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_LINOONE, @@ -49017,7 +49017,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_ARTICUNO, [ Species.CALYREX, - 'shadow', + "shadow", ], ], [Moves.ZEN_HEADBUTT]: [ @@ -49485,7 +49485,7 @@ export const tmSpecies: TmSpecies = { Species.IRON_CROWN, [ Species.WORMADAM, - 'trash', + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -50319,7 +50319,7 @@ export const tmSpecies: TmSpecies = { Species.PECHARUNT, [ Species.WORMADAM, - 'trash', + "trash", ], Species.ALOLA_MEOWTH, Species.ALOLA_PERSIAN, @@ -50549,7 +50549,7 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.WORMADAM, - 'trash', + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -51015,8 +51015,8 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.WORMADAM, - 'sandy', - 'trash', + "sandy", + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -51271,11 +51271,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -52687,7 +52687,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_GOLEM, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_SLIGGOO, Species.HISUI_GOODRA, @@ -52872,7 +52872,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_TYPHLOSION, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.LOW_SWEEP]: [ @@ -52964,9 +52964,9 @@ export const tmSpecies: TmSpecies = { Species.CHESNAUGHT, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.PANCHAM, Species.PANGORO, @@ -53020,7 +53020,7 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_ZAPDOS, Species.GALAR_SLOWKING, @@ -53267,7 +53267,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_SLOWPOKE, @@ -53278,7 +53278,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -53937,11 +53937,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -54379,11 +54379,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.PANCHAM, @@ -54579,7 +54579,7 @@ export const tmSpecies: TmSpecies = { Species.TERAPAGOS, [ Species.MEOWSTIC, - 'female', + "female", ], Species.ALOLA_RAICHU, Species.ALOLA_VULPIX, @@ -54712,11 +54712,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.ESPURR, @@ -54935,7 +54935,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], ], [Moves.HEX]: [ @@ -55064,7 +55064,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_YAMASK, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_TYPHLOSION, Species.HISUI_QWILFISH, @@ -56150,8 +56150,8 @@ export const tmSpecies: TmSpecies = { Species.IRON_CROWN, [ Species.WORMADAM, - 'sandy', - 'trash', + "sandy", + "trash", ], Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, @@ -56170,8 +56170,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_ARCANINE, Species.HISUI_TYPHLOSION, @@ -56628,7 +56628,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_PERSIAN, [ Species.LYCANROC, - 'dusk', + "dusk", ], Species.GALAR_MEOWTH, Species.GALAR_FARFETCHD, @@ -56903,8 +56903,8 @@ export const tmSpecies: TmSpecies = { Species.ESCAVALIER, [ Species.LYCANROC, - 'midday', - 'dusk', + "midday", + "dusk", ], Species.GOLISOPOD, Species.PHEROMOSA, @@ -57020,8 +57020,8 @@ export const tmSpecies: TmSpecies = { Species.MEOWSTIC, [ Species.LYCANROC, - 'midday', - 'dusk', + "midday", + "dusk", ], Species.SKWOVET, Species.GREEDENT, @@ -57322,7 +57322,7 @@ export const tmSpecies: TmSpecies = { Species.PECHARUNT, [ Species.CALYREX, - 'shadow', + "shadow", ], Species.HISUI_ZORUA, Species.HISUI_ZOROARK, @@ -57602,11 +57602,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -57685,11 +57685,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.MEOWSTIC, @@ -58554,11 +58554,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -58882,7 +58882,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, [ Species.TOXTRICITY, - 'low-key', + "low-key", ], ], [Moves.ELECTRIC_TERRAIN]: [ @@ -59058,11 +59058,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SPRITZEE, @@ -59392,7 +59392,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_RAPIDASH, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_AVALUGG, Species.PALDEA_TAUROS, @@ -59574,7 +59574,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MAROWAK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_RAPIDASH, @@ -59584,7 +59584,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_LINOONE, [ Species.CALYREX, - 'ice', + "ice", ], ], [Moves.POLLEN_PUFF]: [ @@ -59863,7 +59863,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_RAPIDASH, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_GROWLITHE, Species.HISUI_ARCANINE, @@ -60357,8 +60357,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_TYPHLOSION, Species.HISUI_GOODRA, @@ -60450,9 +60450,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.INKAY, Species.MALAMAR, @@ -60512,13 +60512,13 @@ export const tmSpecies: TmSpecies = { Species.GALAR_CORSOLA, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, [ Species.PALDEA_TAUROS, - 'aqua', + "aqua", ], Species.PALDEA_WOOPER, ], @@ -60641,8 +60641,8 @@ export const tmSpecies: TmSpecies = { Species.GLASTRIER, [ Species.CALYREX, - '', - 'ice', + "", + "ice", ], Species.URSALUNA, Species.OINKOLOGNE, @@ -61596,7 +61596,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.GALAR_MEOWTH, Species.GALAR_MOLTRES, @@ -61606,8 +61606,8 @@ export const tmSpecies: TmSpecies = { Species.GALAR_STUNFISK, [ Species.CALYREX, - 'ice', - 'shadow', + "ice", + "shadow", ], Species.HISUI_QWILFISH, Species.HISUI_SNEASEL, @@ -62674,9 +62674,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.BUNNELBY, Species.DIGGERSBY, @@ -62691,11 +62691,11 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, [ Species.FLOETTE, - 'red', - 'yellow', - 'orange', - 'blue', - 'white', + "red", + "yellow", + "orange", + "blue", + "white", ], Species.FLORGES, Species.SKIDDO, @@ -63113,7 +63113,7 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_SANDSLASH, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_LILLIGANT, Species.HISUI_SLIGGOO, @@ -63175,9 +63175,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.SKRELP, Species.DRAGALGE, @@ -63209,7 +63209,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_ARTICUNO, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_SAMUROTT, Species.HISUI_ZORUA, @@ -63436,9 +63436,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.LITLEO, Species.PYROAR, @@ -63540,7 +63540,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_ZAPDOS, [ Species.CALYREX, - 'ice', + "ice", ], Species.HISUI_SNEASEL, Species.HISUI_LILLIGANT, @@ -63650,9 +63650,9 @@ export const tmSpecies: TmSpecies = { Species.FROGADIER, [ Species.GRENINJA, - '', - 'battle-bond', - 'ash', + "", + "battle-bond", + "ash", ], Species.FLABEBE, Species.FLOETTE, @@ -63726,7 +63726,7 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, [ Species.URSHIFU, - 'rapid-strike', + "rapid-strike", ], Species.HISUI_QWILFISH, Species.HISUI_SAMUROTT, @@ -63735,7 +63735,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_AVALUGG, [ Species.PALDEA_TAUROS, - 'aqua', + "aqua", ], Species.PALDEA_WOOPER, ], @@ -63988,7 +63988,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_TYPHLOSION, [ Species.PALDEA_TAUROS, - 'blaze', + "blaze", ], ], [Moves.SUPERCELL_SLAM]:[ @@ -64158,7 +64158,7 @@ export const tmSpecies: TmSpecies = { Species.CRABOMINABLE, [ Species.LYCANROC, - 'midnight', + "midnight", ], Species.PASSIMIAN, Species.HAKAMO_O, @@ -64183,309 +64183,309 @@ interface TmPoolTiers { } export const tmPoolTiers: TmPoolTiers = { - [Moves.MEGA_PUNCH]: ModifierTier.GREAT, - [Moves.PAY_DAY]: ModifierTier.ULTRA, - [Moves.FIRE_PUNCH]: ModifierTier.GREAT, - [Moves.ICE_PUNCH]: ModifierTier.GREAT, - [Moves.THUNDER_PUNCH]: ModifierTier.GREAT, - [Moves.SWORDS_DANCE]: ModifierTier.COMMON, - [Moves.CUT]: ModifierTier.COMMON, - [Moves.FLY]: ModifierTier.COMMON, - [Moves.MEGA_KICK]: ModifierTier.GREAT, - [Moves.BODY_SLAM]: ModifierTier.GREAT, - [Moves.TAKE_DOWN]: ModifierTier.GREAT, - [Moves.DOUBLE_EDGE]: ModifierTier.ULTRA, - [Moves.PIN_MISSILE]: ModifierTier.COMMON, - [Moves.ROAR]: ModifierTier.COMMON, - [Moves.FLAMETHROWER]: ModifierTier.ULTRA, - [Moves.HYDRO_PUMP]: ModifierTier.ULTRA, - [Moves.SURF]: ModifierTier.ULTRA, - [Moves.ICE_BEAM]: ModifierTier.ULTRA, - [Moves.BLIZZARD]: ModifierTier.ULTRA, - [Moves.PSYBEAM]: ModifierTier.GREAT, - [Moves.HYPER_BEAM]: ModifierTier.ULTRA, - [Moves.LOW_KICK]: ModifierTier.COMMON, - [Moves.STRENGTH]: ModifierTier.GREAT, - [Moves.SOLAR_BEAM]: ModifierTier.ULTRA, - [Moves.FIRE_SPIN]: ModifierTier.COMMON, - [Moves.THUNDERBOLT]: ModifierTier.ULTRA, - [Moves.THUNDER_WAVE]: ModifierTier.COMMON, - [Moves.THUNDER]: ModifierTier.ULTRA, - [Moves.EARTHQUAKE]: ModifierTier.ULTRA, - [Moves.DIG]: ModifierTier.GREAT, - [Moves.TOXIC]: ModifierTier.GREAT, - [Moves.PSYCHIC]: ModifierTier.ULTRA, - [Moves.AGILITY]: ModifierTier.COMMON, - [Moves.NIGHT_SHADE]: ModifierTier.COMMON, - [Moves.SCREECH]: ModifierTier.COMMON, - [Moves.DOUBLE_TEAM]: ModifierTier.COMMON, - [Moves.CONFUSE_RAY]: ModifierTier.COMMON, - [Moves.LIGHT_SCREEN]: ModifierTier.COMMON, - [Moves.HAZE]: ModifierTier.COMMON, - [Moves.REFLECT]: ModifierTier.COMMON, - [Moves.FOCUS_ENERGY]: ModifierTier.COMMON, - [Moves.METRONOME]: ModifierTier.COMMON, - [Moves.SELF_DESTRUCT]: ModifierTier.GREAT, - [Moves.FIRE_BLAST]: ModifierTier.ULTRA, - [Moves.WATERFALL]: ModifierTier.GREAT, - [Moves.SWIFT]: ModifierTier.COMMON, - [Moves.AMNESIA]: ModifierTier.COMMON, - [Moves.DREAM_EATER]: ModifierTier.GREAT, - [Moves.LEECH_LIFE]: ModifierTier.ULTRA, - [Moves.FLASH]: ModifierTier.COMMON, - [Moves.EXPLOSION]: ModifierTier.GREAT, - [Moves.REST]: ModifierTier.COMMON, - [Moves.ROCK_SLIDE]: ModifierTier.GREAT, - [Moves.TRI_ATTACK]: ModifierTier.ULTRA, - [Moves.SUPER_FANG]: ModifierTier.COMMON, - [Moves.SUBSTITUTE]: ModifierTier.COMMON, - [Moves.THIEF]: ModifierTier.GREAT, - [Moves.SNORE]: ModifierTier.COMMON, - [Moves.CURSE]: ModifierTier.COMMON, - [Moves.REVERSAL]: ModifierTier.COMMON, - [Moves.SPITE]: ModifierTier.COMMON, - [Moves.PROTECT]: ModifierTier.COMMON, - [Moves.SCARY_FACE]: ModifierTier.COMMON, - [Moves.SLUDGE_BOMB]: ModifierTier.GREAT, - [Moves.MUD_SLAP]: ModifierTier.COMMON, - [Moves.SPIKES]: ModifierTier.COMMON, - [Moves.ICY_WIND]: ModifierTier.GREAT, - [Moves.OUTRAGE]: ModifierTier.ULTRA, - [Moves.SANDSTORM]: ModifierTier.COMMON, - [Moves.GIGA_DRAIN]: ModifierTier.ULTRA, - [Moves.ENDURE]: ModifierTier.COMMON, - [Moves.CHARM]: ModifierTier.COMMON, - [Moves.FALSE_SWIPE]: ModifierTier.COMMON, - [Moves.SWAGGER]: ModifierTier.COMMON, - [Moves.STEEL_WING]: ModifierTier.GREAT, - [Moves.ATTRACT]: ModifierTier.COMMON, - [Moves.SLEEP_TALK]: ModifierTier.COMMON, - [Moves.RETURN]: ModifierTier.ULTRA, - [Moves.FRUSTRATION]: ModifierTier.COMMON, - [Moves.SAFEGUARD]: ModifierTier.COMMON, - [Moves.PAIN_SPLIT]: ModifierTier.COMMON, - [Moves.MEGAHORN]: ModifierTier.ULTRA, - [Moves.BATON_PASS]: ModifierTier.COMMON, - [Moves.ENCORE]: ModifierTier.COMMON, - [Moves.IRON_TAIL]: ModifierTier.GREAT, - [Moves.METAL_CLAW]: ModifierTier.COMMON, - [Moves.HIDDEN_POWER]: ModifierTier.GREAT, - [Moves.RAIN_DANCE]: ModifierTier.COMMON, - [Moves.SUNNY_DAY]: ModifierTier.COMMON, - [Moves.CRUNCH]: ModifierTier.GREAT, - [Moves.PSYCH_UP]: ModifierTier.COMMON, - [Moves.SHADOW_BALL]: ModifierTier.ULTRA, - [Moves.FUTURE_SIGHT]: ModifierTier.GREAT, - [Moves.ROCK_SMASH]: ModifierTier.COMMON, - [Moves.WHIRLPOOL]: ModifierTier.COMMON, - [Moves.BEAT_UP]: ModifierTier.COMMON, - [Moves.UPROAR]: ModifierTier.GREAT, - [Moves.HEAT_WAVE]: ModifierTier.ULTRA, - [Moves.HAIL]: ModifierTier.COMMON, - [Moves.TORMENT]: ModifierTier.COMMON, - [Moves.WILL_O_WISP]: ModifierTier.COMMON, - [Moves.FACADE]: ModifierTier.GREAT, - [Moves.FOCUS_PUNCH]: ModifierTier.COMMON, - [Moves.NATURE_POWER]: ModifierTier.COMMON, - [Moves.CHARGE]: ModifierTier.COMMON, - [Moves.TAUNT]: ModifierTier.COMMON, - [Moves.HELPING_HAND]: ModifierTier.COMMON, - [Moves.TRICK]: ModifierTier.COMMON, - [Moves.SUPERPOWER]: ModifierTier.ULTRA, - [Moves.REVENGE]: ModifierTier.GREAT, - [Moves.BRICK_BREAK]: ModifierTier.GREAT, - [Moves.KNOCK_OFF]: ModifierTier.GREAT, - [Moves.ENDEAVOR]: ModifierTier.COMMON, - [Moves.SKILL_SWAP]: ModifierTier.COMMON, - [Moves.IMPRISON]: ModifierTier.COMMON, - [Moves.DIVE]: ModifierTier.GREAT, - [Moves.FEATHER_DANCE]: ModifierTier.COMMON, - [Moves.BLAZE_KICK]: ModifierTier.GREAT, - [Moves.HYPER_VOICE]: ModifierTier.ULTRA, - [Moves.BLAST_BURN]: ModifierTier.ULTRA, - [Moves.HYDRO_CANNON]: ModifierTier.ULTRA, - [Moves.WEATHER_BALL]: ModifierTier.COMMON, - [Moves.FAKE_TEARS]: ModifierTier.COMMON, - [Moves.AIR_CUTTER]: ModifierTier.GREAT, - [Moves.OVERHEAT]: ModifierTier.ULTRA, - [Moves.ROCK_TOMB]: ModifierTier.GREAT, - [Moves.METAL_SOUND]: ModifierTier.COMMON, - [Moves.COSMIC_POWER]: ModifierTier.COMMON, - [Moves.SIGNAL_BEAM]: ModifierTier.GREAT, - [Moves.SAND_TOMB]: ModifierTier.COMMON, - [Moves.MUDDY_WATER]: ModifierTier.GREAT, - [Moves.BULLET_SEED]: ModifierTier.GREAT, - [Moves.AERIAL_ACE]: ModifierTier.GREAT, - [Moves.ICICLE_SPEAR]: ModifierTier.GREAT, - [Moves.IRON_DEFENSE]: ModifierTier.GREAT, - [Moves.DRAGON_CLAW]: ModifierTier.ULTRA, - [Moves.FRENZY_PLANT]: ModifierTier.ULTRA, - [Moves.BULK_UP]: ModifierTier.COMMON, - [Moves.BOUNCE]: ModifierTier.GREAT, - [Moves.MUD_SHOT]: ModifierTier.GREAT, - [Moves.POISON_TAIL]: ModifierTier.GREAT, - [Moves.MAGICAL_LEAF]: ModifierTier.GREAT, - [Moves.CALM_MIND]: ModifierTier.GREAT, - [Moves.LEAF_BLADE]: ModifierTier.ULTRA, - [Moves.DRAGON_DANCE]: ModifierTier.GREAT, - [Moves.ROCK_BLAST]: ModifierTier.GREAT, - [Moves.WATER_PULSE]: ModifierTier.GREAT, - [Moves.ROOST]: ModifierTier.GREAT, - [Moves.GRAVITY]: ModifierTier.COMMON, - [Moves.GYRO_BALL]: ModifierTier.COMMON, - [Moves.BRINE]: ModifierTier.GREAT, - [Moves.TAILWIND]: ModifierTier.GREAT, - [Moves.U_TURN]: ModifierTier.GREAT, - [Moves.CLOSE_COMBAT]: ModifierTier.ULTRA, - [Moves.PAYBACK]: ModifierTier.COMMON, - [Moves.ASSURANCE]: ModifierTier.COMMON, - [Moves.EMBARGO]: ModifierTier.COMMON, - [Moves.FLING]: ModifierTier.COMMON, - [Moves.POWER_SWAP]: ModifierTier.COMMON, - [Moves.GUARD_SWAP]: ModifierTier.COMMON, - [Moves.TOXIC_SPIKES]: ModifierTier.GREAT, - [Moves.FLARE_BLITZ]: ModifierTier.ULTRA, - [Moves.AURA_SPHERE]: ModifierTier.GREAT, - [Moves.ROCK_POLISH]: ModifierTier.COMMON, - [Moves.POISON_JAB]: ModifierTier.GREAT, - [Moves.DARK_PULSE]: ModifierTier.GREAT, - [Moves.SEED_BOMB]: ModifierTier.GREAT, - [Moves.AIR_SLASH]: ModifierTier.GREAT, - [Moves.X_SCISSOR]: ModifierTier.GREAT, - [Moves.BUG_BUZZ]: ModifierTier.GREAT, - [Moves.DRAGON_PULSE]: ModifierTier.GREAT, - [Moves.POWER_GEM]: ModifierTier.GREAT, - [Moves.DRAIN_PUNCH]: ModifierTier.GREAT, - [Moves.VACUUM_WAVE]: ModifierTier.COMMON, - [Moves.FOCUS_BLAST]: ModifierTier.GREAT, - [Moves.ENERGY_BALL]: ModifierTier.GREAT, - [Moves.BRAVE_BIRD]: ModifierTier.ULTRA, - [Moves.EARTH_POWER]: ModifierTier.ULTRA, - [Moves.GIGA_IMPACT]: ModifierTier.GREAT, - [Moves.NASTY_PLOT]: ModifierTier.COMMON, - [Moves.AVALANCHE]: ModifierTier.GREAT, - [Moves.SHADOW_CLAW]: ModifierTier.GREAT, - [Moves.THUNDER_FANG]: ModifierTier.GREAT, - [Moves.ICE_FANG]: ModifierTier.GREAT, - [Moves.FIRE_FANG]: ModifierTier.GREAT, - [Moves.PSYCHO_CUT]: ModifierTier.GREAT, - [Moves.ZEN_HEADBUTT]: ModifierTier.GREAT, - [Moves.FLASH_CANNON]: ModifierTier.GREAT, - [Moves.ROCK_CLIMB]: ModifierTier.GREAT, - [Moves.DEFOG]: ModifierTier.COMMON, - [Moves.TRICK_ROOM]: ModifierTier.COMMON, - [Moves.DRACO_METEOR]: ModifierTier.ULTRA, - [Moves.LEAF_STORM]: ModifierTier.ULTRA, - [Moves.POWER_WHIP]: ModifierTier.ULTRA, - [Moves.CROSS_POISON]: ModifierTier.GREAT, - [Moves.GUNK_SHOT]: ModifierTier.ULTRA, - [Moves.IRON_HEAD]: ModifierTier.GREAT, - [Moves.STONE_EDGE]: ModifierTier.ULTRA, - [Moves.STEALTH_ROCK]: ModifierTier.COMMON, - [Moves.GRASS_KNOT]: ModifierTier.ULTRA, - [Moves.BUG_BITE]: ModifierTier.GREAT, - [Moves.CHARGE_BEAM]: ModifierTier.GREAT, - [Moves.HONE_CLAWS]: ModifierTier.COMMON, - [Moves.WONDER_ROOM]: ModifierTier.COMMON, - [Moves.PSYSHOCK]: ModifierTier.GREAT, - [Moves.VENOSHOCK]: ModifierTier.GREAT, - [Moves.MAGIC_ROOM]: ModifierTier.COMMON, - [Moves.SMACK_DOWN]: ModifierTier.COMMON, - [Moves.SLUDGE_WAVE]: ModifierTier.GREAT, - [Moves.HEAVY_SLAM]: ModifierTier.GREAT, - [Moves.ELECTRO_BALL]: ModifierTier.GREAT, - [Moves.FLAME_CHARGE]: ModifierTier.GREAT, - [Moves.LOW_SWEEP]: ModifierTier.GREAT, - [Moves.ACID_SPRAY]: ModifierTier.COMMON, - [Moves.FOUL_PLAY]: ModifierTier.ULTRA, - [Moves.ROUND]: ModifierTier.COMMON, - [Moves.ECHOED_VOICE]: ModifierTier.COMMON, - [Moves.STORED_POWER]: ModifierTier.COMMON, - [Moves.ALLY_SWITCH]: ModifierTier.COMMON, - [Moves.SCALD]: ModifierTier.GREAT, - [Moves.HEX]: ModifierTier.GREAT, - [Moves.SKY_DROP]: ModifierTier.GREAT, - [Moves.QUASH]: ModifierTier.COMMON, - [Moves.ACROBATICS]: ModifierTier.GREAT, - [Moves.RETALIATE]: ModifierTier.GREAT, - [Moves.WATER_PLEDGE]: ModifierTier.GREAT, - [Moves.FIRE_PLEDGE]: ModifierTier.GREAT, - [Moves.GRASS_PLEDGE]: ModifierTier.GREAT, - [Moves.VOLT_SWITCH]: ModifierTier.GREAT, - [Moves.STRUGGLE_BUG]: ModifierTier.COMMON, - [Moves.BULLDOZE]: ModifierTier.GREAT, - [Moves.FROST_BREATH]: ModifierTier.GREAT, - [Moves.DRAGON_TAIL]: ModifierTier.GREAT, - [Moves.WORK_UP]: ModifierTier.COMMON, - [Moves.ELECTROWEB]: ModifierTier.GREAT, - [Moves.WILD_CHARGE]: ModifierTier.GREAT, - [Moves.DRILL_RUN]: ModifierTier.GREAT, - [Moves.SACRED_SWORD]: ModifierTier.ULTRA, - [Moves.RAZOR_SHELL]: ModifierTier.GREAT, - [Moves.HEAT_CRASH]: ModifierTier.GREAT, - [Moves.TAIL_SLAP]: ModifierTier.GREAT, - [Moves.HURRICANE]: ModifierTier.ULTRA, - [Moves.SNARL]: ModifierTier.COMMON, - [Moves.PHANTOM_FORCE]: ModifierTier.ULTRA, - [Moves.PETAL_BLIZZARD]: ModifierTier.GREAT, - [Moves.DISARMING_VOICE]: ModifierTier.GREAT, - [Moves.DRAINING_KISS]: ModifierTier.GREAT, - [Moves.GRASSY_TERRAIN]: ModifierTier.COMMON, - [Moves.MISTY_TERRAIN]: ModifierTier.COMMON, - [Moves.PLAY_ROUGH]: ModifierTier.GREAT, - [Moves.CONFIDE]: ModifierTier.COMMON, - [Moves.MYSTICAL_FIRE]: ModifierTier.GREAT, - [Moves.EERIE_IMPULSE]: ModifierTier.COMMON, - [Moves.VENOM_DRENCH]: ModifierTier.COMMON, - [Moves.ELECTRIC_TERRAIN]: ModifierTier.COMMON, - [Moves.DAZZLING_GLEAM]: ModifierTier.ULTRA, - [Moves.INFESTATION]: ModifierTier.COMMON, - [Moves.DRAGON_ASCENT]: ModifierTier.ULTRA, - [Moves.DARKEST_LARIAT]: ModifierTier.GREAT, - [Moves.HIGH_HORSEPOWER]: ModifierTier.ULTRA, - [Moves.SOLAR_BLADE]: ModifierTier.GREAT, - [Moves.THROAT_CHOP]: ModifierTier.GREAT, - [Moves.POLLEN_PUFF]: ModifierTier.GREAT, - [Moves.PSYCHIC_TERRAIN]: ModifierTier.COMMON, - [Moves.LUNGE]: ModifierTier.GREAT, - [Moves.SPEED_SWAP]: ModifierTier.COMMON, - [Moves.SMART_STRIKE]: ModifierTier.GREAT, - [Moves.BRUTAL_SWING]: ModifierTier.GREAT, - [Moves.PSYCHIC_FANGS]: ModifierTier.GREAT, - [Moves.STOMPING_TANTRUM]: ModifierTier.GREAT, - [Moves.LIQUIDATION]: ModifierTier.ULTRA, - [Moves.BODY_PRESS]: ModifierTier.ULTRA, - [Moves.BREAKING_SWIPE]: ModifierTier.GREAT, - [Moves.STEEL_BEAM]: ModifierTier.ULTRA, - [Moves.EXPANDING_FORCE]: ModifierTier.GREAT, - [Moves.STEEL_ROLLER]: ModifierTier.COMMON, - [Moves.SCALE_SHOT]: ModifierTier.ULTRA, - [Moves.METEOR_BEAM]: ModifierTier.GREAT, - [Moves.MISTY_EXPLOSION]: ModifierTier.COMMON, - [Moves.GRASSY_GLIDE]: ModifierTier.COMMON, - [Moves.RISING_VOLTAGE]: ModifierTier.COMMON, - [Moves.TERRAIN_PULSE]: ModifierTier.COMMON, - [Moves.SKITTER_SMACK]: ModifierTier.GREAT, - [Moves.BURNING_JEALOUSY]: ModifierTier.GREAT, - [Moves.LASH_OUT]: ModifierTier.GREAT, - [Moves.POLTERGEIST]: ModifierTier.ULTRA, - [Moves.CORROSIVE_GAS]: ModifierTier.COMMON, - [Moves.COACHING]: ModifierTier.COMMON, - [Moves.FLIP_TURN]: ModifierTier.COMMON, - [Moves.TRIPLE_AXEL]: ModifierTier.COMMON, - [Moves.DUAL_WINGBEAT]: ModifierTier.COMMON, - [Moves.SCORCHING_SANDS]: ModifierTier.GREAT, - [Moves.TERA_BLAST]: ModifierTier.GREAT, - [Moves.ICE_SPINNER]: ModifierTier.GREAT, - [Moves.SNOWSCAPE]: ModifierTier.COMMON, - [Moves.POUNCE]: ModifierTier.COMMON, - [Moves.TRAILBLAZE]: ModifierTier.COMMON, - [Moves.CHILLING_WATER]: ModifierTier.COMMON, - [Moves.HARD_PRESS]: ModifierTier.GREAT, - [Moves.DRAGON_CHEER]: ModifierTier.COMMON, - [Moves.ALLURING_VOICE]: ModifierTier.GREAT, - [Moves.TEMPER_FLARE]: ModifierTier.GREAT, - [Moves.SUPERCELL_SLAM]: ModifierTier.GREAT, - [Moves.PSYCHIC_NOISE]: ModifierTier.GREAT, - [Moves.UPPER_HAND]: ModifierTier.COMMON, -}; \ No newline at end of file + [Moves.MEGA_PUNCH]: ModifierTier.GREAT, + [Moves.PAY_DAY]: ModifierTier.ULTRA, + [Moves.FIRE_PUNCH]: ModifierTier.GREAT, + [Moves.ICE_PUNCH]: ModifierTier.GREAT, + [Moves.THUNDER_PUNCH]: ModifierTier.GREAT, + [Moves.SWORDS_DANCE]: ModifierTier.COMMON, + [Moves.CUT]: ModifierTier.COMMON, + [Moves.FLY]: ModifierTier.COMMON, + [Moves.MEGA_KICK]: ModifierTier.GREAT, + [Moves.BODY_SLAM]: ModifierTier.GREAT, + [Moves.TAKE_DOWN]: ModifierTier.GREAT, + [Moves.DOUBLE_EDGE]: ModifierTier.ULTRA, + [Moves.PIN_MISSILE]: ModifierTier.COMMON, + [Moves.ROAR]: ModifierTier.COMMON, + [Moves.FLAMETHROWER]: ModifierTier.ULTRA, + [Moves.HYDRO_PUMP]: ModifierTier.ULTRA, + [Moves.SURF]: ModifierTier.ULTRA, + [Moves.ICE_BEAM]: ModifierTier.ULTRA, + [Moves.BLIZZARD]: ModifierTier.ULTRA, + [Moves.PSYBEAM]: ModifierTier.GREAT, + [Moves.HYPER_BEAM]: ModifierTier.ULTRA, + [Moves.LOW_KICK]: ModifierTier.COMMON, + [Moves.STRENGTH]: ModifierTier.GREAT, + [Moves.SOLAR_BEAM]: ModifierTier.ULTRA, + [Moves.FIRE_SPIN]: ModifierTier.COMMON, + [Moves.THUNDERBOLT]: ModifierTier.ULTRA, + [Moves.THUNDER_WAVE]: ModifierTier.COMMON, + [Moves.THUNDER]: ModifierTier.ULTRA, + [Moves.EARTHQUAKE]: ModifierTier.ULTRA, + [Moves.DIG]: ModifierTier.GREAT, + [Moves.TOXIC]: ModifierTier.GREAT, + [Moves.PSYCHIC]: ModifierTier.ULTRA, + [Moves.AGILITY]: ModifierTier.COMMON, + [Moves.NIGHT_SHADE]: ModifierTier.COMMON, + [Moves.SCREECH]: ModifierTier.COMMON, + [Moves.DOUBLE_TEAM]: ModifierTier.COMMON, + [Moves.CONFUSE_RAY]: ModifierTier.COMMON, + [Moves.LIGHT_SCREEN]: ModifierTier.COMMON, + [Moves.HAZE]: ModifierTier.COMMON, + [Moves.REFLECT]: ModifierTier.COMMON, + [Moves.FOCUS_ENERGY]: ModifierTier.COMMON, + [Moves.METRONOME]: ModifierTier.COMMON, + [Moves.SELF_DESTRUCT]: ModifierTier.GREAT, + [Moves.FIRE_BLAST]: ModifierTier.ULTRA, + [Moves.WATERFALL]: ModifierTier.GREAT, + [Moves.SWIFT]: ModifierTier.COMMON, + [Moves.AMNESIA]: ModifierTier.COMMON, + [Moves.DREAM_EATER]: ModifierTier.GREAT, + [Moves.LEECH_LIFE]: ModifierTier.ULTRA, + [Moves.FLASH]: ModifierTier.COMMON, + [Moves.EXPLOSION]: ModifierTier.GREAT, + [Moves.REST]: ModifierTier.COMMON, + [Moves.ROCK_SLIDE]: ModifierTier.GREAT, + [Moves.TRI_ATTACK]: ModifierTier.ULTRA, + [Moves.SUPER_FANG]: ModifierTier.COMMON, + [Moves.SUBSTITUTE]: ModifierTier.COMMON, + [Moves.THIEF]: ModifierTier.GREAT, + [Moves.SNORE]: ModifierTier.COMMON, + [Moves.CURSE]: ModifierTier.COMMON, + [Moves.REVERSAL]: ModifierTier.COMMON, + [Moves.SPITE]: ModifierTier.COMMON, + [Moves.PROTECT]: ModifierTier.COMMON, + [Moves.SCARY_FACE]: ModifierTier.COMMON, + [Moves.SLUDGE_BOMB]: ModifierTier.GREAT, + [Moves.MUD_SLAP]: ModifierTier.COMMON, + [Moves.SPIKES]: ModifierTier.COMMON, + [Moves.ICY_WIND]: ModifierTier.GREAT, + [Moves.OUTRAGE]: ModifierTier.ULTRA, + [Moves.SANDSTORM]: ModifierTier.COMMON, + [Moves.GIGA_DRAIN]: ModifierTier.ULTRA, + [Moves.ENDURE]: ModifierTier.COMMON, + [Moves.CHARM]: ModifierTier.COMMON, + [Moves.FALSE_SWIPE]: ModifierTier.COMMON, + [Moves.SWAGGER]: ModifierTier.COMMON, + [Moves.STEEL_WING]: ModifierTier.GREAT, + [Moves.ATTRACT]: ModifierTier.COMMON, + [Moves.SLEEP_TALK]: ModifierTier.COMMON, + [Moves.RETURN]: ModifierTier.ULTRA, + [Moves.FRUSTRATION]: ModifierTier.COMMON, + [Moves.SAFEGUARD]: ModifierTier.COMMON, + [Moves.PAIN_SPLIT]: ModifierTier.COMMON, + [Moves.MEGAHORN]: ModifierTier.ULTRA, + [Moves.BATON_PASS]: ModifierTier.COMMON, + [Moves.ENCORE]: ModifierTier.COMMON, + [Moves.IRON_TAIL]: ModifierTier.GREAT, + [Moves.METAL_CLAW]: ModifierTier.COMMON, + [Moves.HIDDEN_POWER]: ModifierTier.GREAT, + [Moves.RAIN_DANCE]: ModifierTier.COMMON, + [Moves.SUNNY_DAY]: ModifierTier.COMMON, + [Moves.CRUNCH]: ModifierTier.GREAT, + [Moves.PSYCH_UP]: ModifierTier.COMMON, + [Moves.SHADOW_BALL]: ModifierTier.ULTRA, + [Moves.FUTURE_SIGHT]: ModifierTier.GREAT, + [Moves.ROCK_SMASH]: ModifierTier.COMMON, + [Moves.WHIRLPOOL]: ModifierTier.COMMON, + [Moves.BEAT_UP]: ModifierTier.COMMON, + [Moves.UPROAR]: ModifierTier.GREAT, + [Moves.HEAT_WAVE]: ModifierTier.ULTRA, + [Moves.HAIL]: ModifierTier.COMMON, + [Moves.TORMENT]: ModifierTier.COMMON, + [Moves.WILL_O_WISP]: ModifierTier.COMMON, + [Moves.FACADE]: ModifierTier.GREAT, + [Moves.FOCUS_PUNCH]: ModifierTier.COMMON, + [Moves.NATURE_POWER]: ModifierTier.COMMON, + [Moves.CHARGE]: ModifierTier.COMMON, + [Moves.TAUNT]: ModifierTier.COMMON, + [Moves.HELPING_HAND]: ModifierTier.COMMON, + [Moves.TRICK]: ModifierTier.COMMON, + [Moves.SUPERPOWER]: ModifierTier.ULTRA, + [Moves.REVENGE]: ModifierTier.GREAT, + [Moves.BRICK_BREAK]: ModifierTier.GREAT, + [Moves.KNOCK_OFF]: ModifierTier.GREAT, + [Moves.ENDEAVOR]: ModifierTier.COMMON, + [Moves.SKILL_SWAP]: ModifierTier.COMMON, + [Moves.IMPRISON]: ModifierTier.COMMON, + [Moves.DIVE]: ModifierTier.GREAT, + [Moves.FEATHER_DANCE]: ModifierTier.COMMON, + [Moves.BLAZE_KICK]: ModifierTier.GREAT, + [Moves.HYPER_VOICE]: ModifierTier.ULTRA, + [Moves.BLAST_BURN]: ModifierTier.ULTRA, + [Moves.HYDRO_CANNON]: ModifierTier.ULTRA, + [Moves.WEATHER_BALL]: ModifierTier.COMMON, + [Moves.FAKE_TEARS]: ModifierTier.COMMON, + [Moves.AIR_CUTTER]: ModifierTier.GREAT, + [Moves.OVERHEAT]: ModifierTier.ULTRA, + [Moves.ROCK_TOMB]: ModifierTier.GREAT, + [Moves.METAL_SOUND]: ModifierTier.COMMON, + [Moves.COSMIC_POWER]: ModifierTier.COMMON, + [Moves.SIGNAL_BEAM]: ModifierTier.GREAT, + [Moves.SAND_TOMB]: ModifierTier.COMMON, + [Moves.MUDDY_WATER]: ModifierTier.GREAT, + [Moves.BULLET_SEED]: ModifierTier.GREAT, + [Moves.AERIAL_ACE]: ModifierTier.GREAT, + [Moves.ICICLE_SPEAR]: ModifierTier.GREAT, + [Moves.IRON_DEFENSE]: ModifierTier.GREAT, + [Moves.DRAGON_CLAW]: ModifierTier.ULTRA, + [Moves.FRENZY_PLANT]: ModifierTier.ULTRA, + [Moves.BULK_UP]: ModifierTier.COMMON, + [Moves.BOUNCE]: ModifierTier.GREAT, + [Moves.MUD_SHOT]: ModifierTier.GREAT, + [Moves.POISON_TAIL]: ModifierTier.GREAT, + [Moves.MAGICAL_LEAF]: ModifierTier.GREAT, + [Moves.CALM_MIND]: ModifierTier.GREAT, + [Moves.LEAF_BLADE]: ModifierTier.ULTRA, + [Moves.DRAGON_DANCE]: ModifierTier.GREAT, + [Moves.ROCK_BLAST]: ModifierTier.GREAT, + [Moves.WATER_PULSE]: ModifierTier.GREAT, + [Moves.ROOST]: ModifierTier.GREAT, + [Moves.GRAVITY]: ModifierTier.COMMON, + [Moves.GYRO_BALL]: ModifierTier.COMMON, + [Moves.BRINE]: ModifierTier.GREAT, + [Moves.TAILWIND]: ModifierTier.GREAT, + [Moves.U_TURN]: ModifierTier.GREAT, + [Moves.CLOSE_COMBAT]: ModifierTier.ULTRA, + [Moves.PAYBACK]: ModifierTier.COMMON, + [Moves.ASSURANCE]: ModifierTier.COMMON, + [Moves.EMBARGO]: ModifierTier.COMMON, + [Moves.FLING]: ModifierTier.COMMON, + [Moves.POWER_SWAP]: ModifierTier.COMMON, + [Moves.GUARD_SWAP]: ModifierTier.COMMON, + [Moves.TOXIC_SPIKES]: ModifierTier.GREAT, + [Moves.FLARE_BLITZ]: ModifierTier.ULTRA, + [Moves.AURA_SPHERE]: ModifierTier.GREAT, + [Moves.ROCK_POLISH]: ModifierTier.COMMON, + [Moves.POISON_JAB]: ModifierTier.GREAT, + [Moves.DARK_PULSE]: ModifierTier.GREAT, + [Moves.SEED_BOMB]: ModifierTier.GREAT, + [Moves.AIR_SLASH]: ModifierTier.GREAT, + [Moves.X_SCISSOR]: ModifierTier.GREAT, + [Moves.BUG_BUZZ]: ModifierTier.GREAT, + [Moves.DRAGON_PULSE]: ModifierTier.GREAT, + [Moves.POWER_GEM]: ModifierTier.GREAT, + [Moves.DRAIN_PUNCH]: ModifierTier.GREAT, + [Moves.VACUUM_WAVE]: ModifierTier.COMMON, + [Moves.FOCUS_BLAST]: ModifierTier.GREAT, + [Moves.ENERGY_BALL]: ModifierTier.GREAT, + [Moves.BRAVE_BIRD]: ModifierTier.ULTRA, + [Moves.EARTH_POWER]: ModifierTier.ULTRA, + [Moves.GIGA_IMPACT]: ModifierTier.GREAT, + [Moves.NASTY_PLOT]: ModifierTier.COMMON, + [Moves.AVALANCHE]: ModifierTier.GREAT, + [Moves.SHADOW_CLAW]: ModifierTier.GREAT, + [Moves.THUNDER_FANG]: ModifierTier.GREAT, + [Moves.ICE_FANG]: ModifierTier.GREAT, + [Moves.FIRE_FANG]: ModifierTier.GREAT, + [Moves.PSYCHO_CUT]: ModifierTier.GREAT, + [Moves.ZEN_HEADBUTT]: ModifierTier.GREAT, + [Moves.FLASH_CANNON]: ModifierTier.GREAT, + [Moves.ROCK_CLIMB]: ModifierTier.GREAT, + [Moves.DEFOG]: ModifierTier.COMMON, + [Moves.TRICK_ROOM]: ModifierTier.COMMON, + [Moves.DRACO_METEOR]: ModifierTier.ULTRA, + [Moves.LEAF_STORM]: ModifierTier.ULTRA, + [Moves.POWER_WHIP]: ModifierTier.ULTRA, + [Moves.CROSS_POISON]: ModifierTier.GREAT, + [Moves.GUNK_SHOT]: ModifierTier.ULTRA, + [Moves.IRON_HEAD]: ModifierTier.GREAT, + [Moves.STONE_EDGE]: ModifierTier.ULTRA, + [Moves.STEALTH_ROCK]: ModifierTier.COMMON, + [Moves.GRASS_KNOT]: ModifierTier.ULTRA, + [Moves.BUG_BITE]: ModifierTier.GREAT, + [Moves.CHARGE_BEAM]: ModifierTier.GREAT, + [Moves.HONE_CLAWS]: ModifierTier.COMMON, + [Moves.WONDER_ROOM]: ModifierTier.COMMON, + [Moves.PSYSHOCK]: ModifierTier.GREAT, + [Moves.VENOSHOCK]: ModifierTier.GREAT, + [Moves.MAGIC_ROOM]: ModifierTier.COMMON, + [Moves.SMACK_DOWN]: ModifierTier.COMMON, + [Moves.SLUDGE_WAVE]: ModifierTier.GREAT, + [Moves.HEAVY_SLAM]: ModifierTier.GREAT, + [Moves.ELECTRO_BALL]: ModifierTier.GREAT, + [Moves.FLAME_CHARGE]: ModifierTier.GREAT, + [Moves.LOW_SWEEP]: ModifierTier.GREAT, + [Moves.ACID_SPRAY]: ModifierTier.COMMON, + [Moves.FOUL_PLAY]: ModifierTier.ULTRA, + [Moves.ROUND]: ModifierTier.COMMON, + [Moves.ECHOED_VOICE]: ModifierTier.COMMON, + [Moves.STORED_POWER]: ModifierTier.COMMON, + [Moves.ALLY_SWITCH]: ModifierTier.COMMON, + [Moves.SCALD]: ModifierTier.GREAT, + [Moves.HEX]: ModifierTier.GREAT, + [Moves.SKY_DROP]: ModifierTier.GREAT, + [Moves.QUASH]: ModifierTier.COMMON, + [Moves.ACROBATICS]: ModifierTier.GREAT, + [Moves.RETALIATE]: ModifierTier.GREAT, + [Moves.WATER_PLEDGE]: ModifierTier.GREAT, + [Moves.FIRE_PLEDGE]: ModifierTier.GREAT, + [Moves.GRASS_PLEDGE]: ModifierTier.GREAT, + [Moves.VOLT_SWITCH]: ModifierTier.GREAT, + [Moves.STRUGGLE_BUG]: ModifierTier.COMMON, + [Moves.BULLDOZE]: ModifierTier.GREAT, + [Moves.FROST_BREATH]: ModifierTier.GREAT, + [Moves.DRAGON_TAIL]: ModifierTier.GREAT, + [Moves.WORK_UP]: ModifierTier.COMMON, + [Moves.ELECTROWEB]: ModifierTier.GREAT, + [Moves.WILD_CHARGE]: ModifierTier.GREAT, + [Moves.DRILL_RUN]: ModifierTier.GREAT, + [Moves.SACRED_SWORD]: ModifierTier.ULTRA, + [Moves.RAZOR_SHELL]: ModifierTier.GREAT, + [Moves.HEAT_CRASH]: ModifierTier.GREAT, + [Moves.TAIL_SLAP]: ModifierTier.GREAT, + [Moves.HURRICANE]: ModifierTier.ULTRA, + [Moves.SNARL]: ModifierTier.COMMON, + [Moves.PHANTOM_FORCE]: ModifierTier.ULTRA, + [Moves.PETAL_BLIZZARD]: ModifierTier.GREAT, + [Moves.DISARMING_VOICE]: ModifierTier.GREAT, + [Moves.DRAINING_KISS]: ModifierTier.GREAT, + [Moves.GRASSY_TERRAIN]: ModifierTier.COMMON, + [Moves.MISTY_TERRAIN]: ModifierTier.COMMON, + [Moves.PLAY_ROUGH]: ModifierTier.GREAT, + [Moves.CONFIDE]: ModifierTier.COMMON, + [Moves.MYSTICAL_FIRE]: ModifierTier.GREAT, + [Moves.EERIE_IMPULSE]: ModifierTier.COMMON, + [Moves.VENOM_DRENCH]: ModifierTier.COMMON, + [Moves.ELECTRIC_TERRAIN]: ModifierTier.COMMON, + [Moves.DAZZLING_GLEAM]: ModifierTier.ULTRA, + [Moves.INFESTATION]: ModifierTier.COMMON, + [Moves.DRAGON_ASCENT]: ModifierTier.ULTRA, + [Moves.DARKEST_LARIAT]: ModifierTier.GREAT, + [Moves.HIGH_HORSEPOWER]: ModifierTier.ULTRA, + [Moves.SOLAR_BLADE]: ModifierTier.GREAT, + [Moves.THROAT_CHOP]: ModifierTier.GREAT, + [Moves.POLLEN_PUFF]: ModifierTier.GREAT, + [Moves.PSYCHIC_TERRAIN]: ModifierTier.COMMON, + [Moves.LUNGE]: ModifierTier.GREAT, + [Moves.SPEED_SWAP]: ModifierTier.COMMON, + [Moves.SMART_STRIKE]: ModifierTier.GREAT, + [Moves.BRUTAL_SWING]: ModifierTier.GREAT, + [Moves.PSYCHIC_FANGS]: ModifierTier.GREAT, + [Moves.STOMPING_TANTRUM]: ModifierTier.GREAT, + [Moves.LIQUIDATION]: ModifierTier.ULTRA, + [Moves.BODY_PRESS]: ModifierTier.ULTRA, + [Moves.BREAKING_SWIPE]: ModifierTier.GREAT, + [Moves.STEEL_BEAM]: ModifierTier.ULTRA, + [Moves.EXPANDING_FORCE]: ModifierTier.GREAT, + [Moves.STEEL_ROLLER]: ModifierTier.COMMON, + [Moves.SCALE_SHOT]: ModifierTier.ULTRA, + [Moves.METEOR_BEAM]: ModifierTier.GREAT, + [Moves.MISTY_EXPLOSION]: ModifierTier.COMMON, + [Moves.GRASSY_GLIDE]: ModifierTier.COMMON, + [Moves.RISING_VOLTAGE]: ModifierTier.COMMON, + [Moves.TERRAIN_PULSE]: ModifierTier.COMMON, + [Moves.SKITTER_SMACK]: ModifierTier.GREAT, + [Moves.BURNING_JEALOUSY]: ModifierTier.GREAT, + [Moves.LASH_OUT]: ModifierTier.GREAT, + [Moves.POLTERGEIST]: ModifierTier.ULTRA, + [Moves.CORROSIVE_GAS]: ModifierTier.COMMON, + [Moves.COACHING]: ModifierTier.COMMON, + [Moves.FLIP_TURN]: ModifierTier.COMMON, + [Moves.TRIPLE_AXEL]: ModifierTier.COMMON, + [Moves.DUAL_WINGBEAT]: ModifierTier.COMMON, + [Moves.SCORCHING_SANDS]: ModifierTier.GREAT, + [Moves.TERA_BLAST]: ModifierTier.GREAT, + [Moves.ICE_SPINNER]: ModifierTier.GREAT, + [Moves.SNOWSCAPE]: ModifierTier.COMMON, + [Moves.POUNCE]: ModifierTier.COMMON, + [Moves.TRAILBLAZE]: ModifierTier.COMMON, + [Moves.CHILLING_WATER]: ModifierTier.COMMON, + [Moves.HARD_PRESS]: ModifierTier.GREAT, + [Moves.DRAGON_CHEER]: ModifierTier.COMMON, + [Moves.ALLURING_VOICE]: ModifierTier.GREAT, + [Moves.TEMPER_FLARE]: ModifierTier.GREAT, + [Moves.SUPERCELL_SLAM]: ModifierTier.GREAT, + [Moves.PSYCHIC_NOISE]: ModifierTier.GREAT, + [Moves.UPPER_HAND]: ModifierTier.COMMON, +}; diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 0abd153ff250..cbe40e50cca5 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -36,128 +36,131 @@ export enum TrainerSlot { } export class TrainerPartyTemplate { - public size: integer; - public strength: PartyMemberStrength; - public sameSpecies: boolean; - public balanced: boolean; - - constructor(size: integer, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { - this.size = size; - this.strength = strength; - this.sameSpecies = !!sameSpecies; - this.balanced = !!balanced; - } - - getStrength(index: integer): PartyMemberStrength { - return this.strength; - } - - isSameSpecies(index: integer): boolean { - return this.sameSpecies; - } - - isBalanced(index: integer): boolean { - return this.balanced; - } + public size: integer; + public strength: PartyMemberStrength; + public sameSpecies: boolean; + public balanced: boolean; + + constructor(size: integer, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) { + this.size = size; + this.strength = strength; + this.sameSpecies = !!sameSpecies; + this.balanced = !!balanced; + } + + getStrength(index: integer): PartyMemberStrength { + return this.strength; + } + + isSameSpecies(index: integer): boolean { + return this.sameSpecies; + } + + isBalanced(index: integer): boolean { + return this.balanced; + } } export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate { - public templates: TrainerPartyTemplate[]; - - constructor(...templates: TrainerPartyTemplate[]) { - super(templates.reduce((total: integer, template: TrainerPartyTemplate) => { - total += template.size; - return total; - }, 0), PartyMemberStrength.AVERAGE); - this.templates = templates; + public templates: TrainerPartyTemplate[]; + + constructor(...templates: TrainerPartyTemplate[]) { + super(templates.reduce((total: integer, template: TrainerPartyTemplate) => { + total += template.size; + return total; + }, 0), PartyMemberStrength.AVERAGE); + this.templates = templates; + } + + getStrength(index: integer): PartyMemberStrength { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.getStrength(index - t); + } + t += template.size; } - getStrength(index: integer): PartyMemberStrength { - let t = 0; - for (let template of this.templates) { - if (t + template.size > index) - return template.getStrength(index - t); - t += template.size; - } + return super.getStrength(index); + } - return super.getStrength(index); + isSameSpecies(index: integer): boolean { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.isSameSpecies(index - t); + } + t += template.size; } - isSameSpecies(index: integer): boolean { - let t = 0; - for (let template of this.templates) { - if (t + template.size > index) - return template.isSameSpecies(index - t); - t += template.size; - } + return super.isSameSpecies(index); + } - return super.isSameSpecies(index); + isBalanced(index: integer): boolean { + let t = 0; + for (const template of this.templates) { + if (t + template.size > index) { + return template.isBalanced(index - t); + } + t += template.size; } - isBalanced(index: integer): boolean { - let t = 0; - for (let template of this.templates) { - if (t + template.size > index) - return template.isBalanced(index - t); - t += template.size; - } - - return super.isBalanced(index); - } + return super.isBalanced(index); + } } export const trainerPartyTemplates = { - ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), - ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), - TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), - TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)), - TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), - TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)), - TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), - THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), - THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), - THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), - THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true), - THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true), - FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER), - FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true), - FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK), - FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true), - FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true), - FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER), - FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK), - FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), - SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), - SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), - SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), - - GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - - ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), - - CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), new TrainerPartyTemplate(5, PartyMemberStrength.STRONG, false, true)), - - RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), - RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), - RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), - RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), + ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER), + TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), + TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), + TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), + TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)), + TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), + TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)), + TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), + THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK), + THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true), + THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), + THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true), + THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true), + FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER), + FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true), + FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK), + FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true), + FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true), + FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER), + FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK), + FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), + SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), + SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), + + GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + + ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)), + + CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), new TrainerPartyTemplate(5, PartyMemberStrength.STRONG, false, true)), + + RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)), + RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), + RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), + RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)), + RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)), + RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) }; type PartyTemplateFunc = (scene: BattleScene) => TrainerPartyTemplate; @@ -169,477 +172,486 @@ export interface PartyMemberFuncs { } export class TrainerConfig { - public trainerType: TrainerType; - public name: string; - public nameFemale: string; - public nameDouble: string; - public title: string; - public hasGenders: boolean = false; - public hasDouble: boolean = false; - public hasCharSprite: boolean = false; - public doubleOnly: boolean = false; - public moneyMultiplier: number = 1; - public isBoss: boolean = false; - public hasStaticParty: boolean = false; - public useSameSeedForAllMembers: boolean = false; - public battleBgm: string; - public encounterBgm: string; - public femaleEncounterBgm: string; - public doubleEncounterBgm: string; - public victoryBgm: string; - public genModifiersFunc: GenModifiersFunc; - public modifierRewardFuncs: ModifierTypeFunc[] = []; - public partyTemplates: TrainerPartyTemplate[]; - public partyTemplateFunc: PartyTemplateFunc; - public partyMemberFuncs: PartyMemberFuncs = {}; - public speciesPools: TrainerTierPools; - public speciesFilter: PokemonSpeciesFilter; - public specialtyTypes: Type[] = []; - - public encounterMessages: string[] = []; - public victoryMessages: string[] = []; - public defeatMessages: string[] = []; - - public femaleEncounterMessages: string[]; - public femaleVictoryMessages: string[]; - public femaleDefeatMessages: string[]; - - public doubleEncounterMessages: string[]; - public doubleVictoryMessages: string[]; - public doubleDefeatMessages: string[]; - - constructor(trainerType: TrainerType, allowLegendaries?: boolean) { - this.trainerType = trainerType; - this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]); - this.battleBgm = 'battle_trainer'; - this.victoryBgm = 'victory_trainer'; - this.partyTemplates = [trainerPartyTemplates.TWO_AVG]; - this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden(); - } - - getKey(): string { - return TrainerType[this.getDerivedType()].toString().toLowerCase(); + public trainerType: TrainerType; + public name: string; + public nameFemale: string; + public nameDouble: string; + public title: string; + public hasGenders: boolean = false; + public hasDouble: boolean = false; + public hasCharSprite: boolean = false; + public doubleOnly: boolean = false; + public moneyMultiplier: number = 1; + public isBoss: boolean = false; + public hasStaticParty: boolean = false; + public useSameSeedForAllMembers: boolean = false; + public battleBgm: string; + public encounterBgm: string; + public femaleEncounterBgm: string; + public doubleEncounterBgm: string; + public victoryBgm: string; + public genModifiersFunc: GenModifiersFunc; + public modifierRewardFuncs: ModifierTypeFunc[] = []; + public partyTemplates: TrainerPartyTemplate[]; + public partyTemplateFunc: PartyTemplateFunc; + public partyMemberFuncs: PartyMemberFuncs = {}; + public speciesPools: TrainerTierPools; + public speciesFilter: PokemonSpeciesFilter; + public specialtyTypes: Type[] = []; + + public encounterMessages: string[] = []; + public victoryMessages: string[] = []; + public defeatMessages: string[] = []; + + public femaleEncounterMessages: string[]; + public femaleVictoryMessages: string[]; + public femaleDefeatMessages: string[]; + + public doubleEncounterMessages: string[]; + public doubleVictoryMessages: string[]; + public doubleDefeatMessages: string[]; + + constructor(trainerType: TrainerType, allowLegendaries?: boolean) { + this.trainerType = trainerType; + this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]); + this.battleBgm = "battle_trainer"; + this.victoryBgm = "victory_trainer"; + this.partyTemplates = [trainerPartyTemplates.TWO_AVG]; + this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden(); + } + + getKey(): string { + return TrainerType[this.getDerivedType()].toString().toLowerCase(); + } + + getSpriteKey(female?: boolean): string { + let ret = this.getKey(); + if (this.hasGenders) { + ret += `_${female ? "f" : "m"}`; } - - getSpriteKey(female?: boolean): string { - let ret = this.getKey(); - if (this.hasGenders) - ret += `_${female ? 'f' : 'm'}`; - return ret; + return ret; + } + + setName(name: string): TrainerConfig { + if (name === "Finn") { + // Give the rival a localized name + // First check if i18n is initialized + if (!getIsInitialized()) { + initI18n(); + } + // This is only the male name, because the female name is handled in a different function (setHasGenders) + if (name === "Finn") { + name = i18next.t("trainerNames:rival"); + } } - - setName(name: string): TrainerConfig { - if (name === 'Finn') { - // Give the rival a localized name - // First check if i18n is initialized - if (!getIsInitialized()) { - initI18n(); - } - // This is only the male name, because the female name is handled in a different function (setHasGenders) - if (name === 'Finn') { - name = i18next.t('trainerNames:rival'); - } - } - this.name = name; - return this; + this.name = name; + return this; + } + + setTitle(title: string): TrainerConfig { + // First check if i18n is initialized + if (!getIsInitialized()) { + initI18n(); } - setTitle(title: string): TrainerConfig { - // First check if i18n is initialized - if (!getIsInitialized()) { - initI18n(); - } - - // Make the title lowercase and replace spaces with underscores - title = title.toLowerCase().replace(/\s/g, '_'); - - // Get the title from the i18n file - this.title = i18next.t(`titles:${title}`); - - - return this; + // Make the title lowercase and replace spaces with underscores + title = title.toLowerCase().replace(/\s/g, "_"); + + // Get the title from the i18n file + this.title = i18next.t(`titles:${title}`); + + + return this; + } + + getDerivedType(): TrainerType { + let trainerType = this.trainerType; + switch (trainerType) { + case TrainerType.RIVAL_2: + case TrainerType.RIVAL_3: + case TrainerType.RIVAL_4: + case TrainerType.RIVAL_5: + case TrainerType.RIVAL_6: + trainerType = TrainerType.RIVAL; + break; + case TrainerType.LANCE_CHAMPION: + trainerType = TrainerType.LANCE; + break; + case TrainerType.LARRY_ELITE: + trainerType = TrainerType.LARRY; + break; } - getDerivedType(): TrainerType { - let trainerType = this.trainerType; - switch (trainerType) { - case TrainerType.RIVAL_2: - case TrainerType.RIVAL_3: - case TrainerType.RIVAL_4: - case TrainerType.RIVAL_5: - case TrainerType.RIVAL_6: - trainerType = TrainerType.RIVAL; - break; - case TrainerType.LANCE_CHAMPION: - trainerType = TrainerType.LANCE; - break; - case TrainerType.LARRY_ELITE: - trainerType = TrainerType.LARRY; - break; - } - - return trainerType; - } + return trainerType; + } - /** + /** * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). * @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned. * @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string. * @returns {TrainerConfig} - The updated TrainerConfig instance. **/ - setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { - // If the female name is 'Ivy' (the rival), assign a localized name. - if (nameFemale === 'Ivy') { - // Check if the internationalization (i18n) system is initialized. - if (!getIsInitialized()) { - // Initialize the i18n system if it is not already initialized. - initI18n(); - } - // Set the localized name for the female rival. - this.nameFemale = i18next.t('trainerNames:rival_female'); - } else { - // Otherwise, assign the provided female name. - this.nameFemale = nameFemale; - } - - // Indicate that this trainer configuration includes genders. - this.hasGenders = true; - - // If a female encounter BGM is provided. - if (femaleEncounterBgm) { - // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase. - // Otherwise, assign the provided string as the BGM. - this.femaleEncounterBgm = typeof femaleEncounterBgm === 'number' - ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, ' ').toLowerCase() - : femaleEncounterBgm; - } - - // Return the updated TrainerConfig instance. - return this; - } - - setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig { - this.hasDouble = true; - this.nameDouble = nameDouble; - if (doubleEncounterBgm) - this.doubleEncounterBgm = typeof doubleEncounterBgm === 'number' ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, ' ').toLowerCase() : doubleEncounterBgm; - return this; - } - - setHasCharSprite(): TrainerConfig { - this.hasCharSprite = true; - return this; - } - - setDoubleOnly(): TrainerConfig { - this.doubleOnly = true; - return this; - } - - setMoneyMultiplier(moneyMultiplier: number): TrainerConfig { - this.moneyMultiplier = moneyMultiplier; - return this; - } - - setBoss(): TrainerConfig { - this.isBoss = true; - return this; - } - - setStaticParty(): TrainerConfig { - this.hasStaticParty = true; - return this; - } - - setUseSameSeedForAllMembers(): TrainerConfig { - this.useSameSeedForAllMembers = true; - return this; - } - - setBattleBgm(battleBgm: string): TrainerConfig { - this.battleBgm = battleBgm; - return this; - } - - setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig { - this.encounterBgm = typeof encounterBgm === 'number' ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; - return this; - } - - setVictoryBgm(victoryBgm: string): TrainerConfig { - this.victoryBgm = victoryBgm; - return this; + setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { + // If the female name is 'Ivy' (the rival), assign a localized name. + if (nameFemale === "Ivy") { + // Check if the internationalization (i18n) system is initialized. + if (!getIsInitialized()) { + // Initialize the i18n system if it is not already initialized. + initI18n(); + } + // Set the localized name for the female rival. + this.nameFemale = i18next.t("trainerNames:rival_female"); + } else { + // Otherwise, assign the provided female name. + this.nameFemale = nameFemale; } - setPartyTemplates(...partyTemplates: TrainerPartyTemplate[]): TrainerConfig { - this.partyTemplates = partyTemplates; - return this; - } - - setPartyTemplateFunc(partyTemplateFunc: PartyTemplateFunc): TrainerConfig { - this.partyTemplateFunc = partyTemplateFunc; - return this; - } + // Indicate that this trainer configuration includes genders. + this.hasGenders = true; - setPartyMemberFunc(slotIndex: integer, partyMemberFunc: PartyMemberFunc): TrainerConfig { - this.partyMemberFuncs[slotIndex] = partyMemberFunc; - return this; + // If a female encounter BGM is provided. + if (femaleEncounterBgm) { + // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase. + // Otherwise, assign the provided string as the BGM. + this.femaleEncounterBgm = typeof femaleEncounterBgm === "number" + ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase() + : femaleEncounterBgm; } - setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig { - this.speciesPools = (Array.isArray(speciesPools) ? {[TrainerPoolTier.COMMON]: speciesPools} : speciesPools) as unknown as TrainerTierPools; - return this; - } + // Return the updated TrainerConfig instance. + return this; + } - setSpeciesFilter(speciesFilter: PokemonSpeciesFilter, allowLegendaries?: boolean): TrainerConfig { - const baseFilter = this.speciesFilter; - this.speciesFilter = allowLegendaries ? speciesFilter : species => speciesFilter(species) && baseFilter(species); - return this; + setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig { + this.hasDouble = true; + this.nameDouble = nameDouble; + if (doubleEncounterBgm) { + this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() : doubleEncounterBgm; } - - setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig { - this.specialtyTypes = specialtyTypes; - return this; - } - - setGenModifiersFunc(genModifiersFunc: GenModifiersFunc): TrainerConfig { - this.genModifiersFunc = genModifiersFunc; - return this; - } - - setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { - this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { - const modifierTypeFunc = func(); - const modifierType = modifierTypeFunc(); - modifierType.withIdFromFunc(modifierTypeFunc); - return modifierType; - }); - return this; - } - - /** + return this; + } + + setHasCharSprite(): TrainerConfig { + this.hasCharSprite = true; + return this; + } + + setDoubleOnly(): TrainerConfig { + this.doubleOnly = true; + return this; + } + + setMoneyMultiplier(moneyMultiplier: number): TrainerConfig { + this.moneyMultiplier = moneyMultiplier; + return this; + } + + setBoss(): TrainerConfig { + this.isBoss = true; + return this; + } + + setStaticParty(): TrainerConfig { + this.hasStaticParty = true; + return this; + } + + setUseSameSeedForAllMembers(): TrainerConfig { + this.useSameSeedForAllMembers = true; + return this; + } + + setBattleBgm(battleBgm: string): TrainerConfig { + this.battleBgm = battleBgm; + return this; + } + + setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig { + this.encounterBgm = typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm; + return this; + } + + setVictoryBgm(victoryBgm: string): TrainerConfig { + this.victoryBgm = victoryBgm; + return this; + } + + setPartyTemplates(...partyTemplates: TrainerPartyTemplate[]): TrainerConfig { + this.partyTemplates = partyTemplates; + return this; + } + + setPartyTemplateFunc(partyTemplateFunc: PartyTemplateFunc): TrainerConfig { + this.partyTemplateFunc = partyTemplateFunc; + return this; + } + + setPartyMemberFunc(slotIndex: integer, partyMemberFunc: PartyMemberFunc): TrainerConfig { + this.partyMemberFuncs[slotIndex] = partyMemberFunc; + return this; + } + + setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig { + this.speciesPools = (Array.isArray(speciesPools) ? {[TrainerPoolTier.COMMON]: speciesPools} : speciesPools) as unknown as TrainerTierPools; + return this; + } + + setSpeciesFilter(speciesFilter: PokemonSpeciesFilter, allowLegendaries?: boolean): TrainerConfig { + const baseFilter = this.speciesFilter; + this.speciesFilter = allowLegendaries ? speciesFilter : species => speciesFilter(species) && baseFilter(species); + return this; + } + + setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig { + this.specialtyTypes = specialtyTypes; + return this; + } + + setGenModifiersFunc(genModifiersFunc: GenModifiersFunc): TrainerConfig { + this.genModifiersFunc = genModifiersFunc; + return this; + } + + setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { + this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { + const modifierTypeFunc = func(); + const modifierType = modifierTypeFunc(); + modifierType.withIdFromFunc(modifierTypeFunc); + return modifierType; + }); + return this; + } + + /** * Initializes the trainer configuration for a Gym Leader. * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader. * @param {Type[]} specialtyTypes - The specialty types for the Gym Leader. * @returns {TrainerConfig} - The updated TrainerConfig instance. * **/ - initForGymLeader(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { - // Check if the internationalization (i18n) system is initialized. - if (!getIsInitialized()) { - initI18n(); - } + initForGymLeader(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + // Check if the internationalization (i18n) system is initialized. + if (!getIsInitialized()) { + initI18n(); + } - // Set the function to generate the Gym Leader's party template. - this.setPartyTemplateFunc(getGymLeaderPartyTemplate); + // Set the function to generate the Gym Leader's party template. + this.setPartyTemplateFunc(getGymLeaderPartyTemplate); + + // Set up party members with their corresponding species. + signatureSpecies.forEach((speciesPool, s) => { + // Ensure speciesPool is an array. + if (!Array.isArray(speciesPool)) { + speciesPool = [speciesPool]; + } + // Set a function to get a random party member from the species pool. + this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); + }); + + // If specialty types are provided, set species filter and specialty types. + if (specialtyTypes.length) { + this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); + this.setSpecialtyTypes(...specialtyTypes); + } - // Set up party members with their corresponding species. - signatureSpecies.forEach((speciesPool, s) => { - // Ensure speciesPool is an array. - if (!Array.isArray(speciesPool)) - speciesPool = [speciesPool]; - // Set a function to get a random party member from the species pool. - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); + // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. + const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + this.name = i18next.t(`trainerNames:${nameForCall}`); - // If specialty types are provided, set species filter and specialty types. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); - this.setSpecialtyTypes(...specialtyTypes); - } + // Set the title to "gym_leader". (this is the key in the i18n file) + this.setTitle("gym_leader"); - // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. - const nameForCall = this.name.toLowerCase().replace(/\s/g, '_'); - this.name = i18next.t(`trainerNames:${nameForCall}`); - - // Set the title to "gym_leader". (this is the key in the i18n file) - this.setTitle('gym_leader'); - - // Configure various properties for the Gym Leader. - this.setMoneyMultiplier(2.5); - this.setBoss(); - this.setStaticParty(); - this.setBattleBgm('battle_unova_gym'); - this.setVictoryBgm('victory_gym'); - this.setGenModifiersFunc(party => { - const waveIndex = party[0].scene.currentBattle.waveIndex; - return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : null); - }); + // Configure various properties for the Gym Leader. + this.setMoneyMultiplier(2.5); + this.setBoss(); + this.setStaticParty(); + this.setBattleBgm("battle_unova_gym"); + this.setVictoryBgm("victory_gym"); + this.setGenModifiersFunc(party => { + const waveIndex = party[0].scene.currentBattle.waveIndex; + return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : null); + }); - return this; - } + return this; + } - /** + /** * Initializes the trainer configuration for an Elite Four member. * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member. * @param {Type[]} specialtyTypes - The specialty types for the Elite Four member. * @returns {TrainerConfig} - The updated TrainerConfig instance. **/ - initForEliteFour(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { - // Check if the internationalization (i18n) system is initialized. - if (!getIsInitialized()) { - initI18n(); - } - - // Set the party templates for the Elite Four. - this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); - - // Set up party members with their corresponding species. - signatureSpecies.forEach((speciesPool, s) => { - // Ensure speciesPool is an array. - if (!Array.isArray(speciesPool)) - speciesPool = [speciesPool]; - // Set a function to get a random party member from the species pool. - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); + initForEliteFour(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + // Check if the internationalization (i18n) system is initialized. + if (!getIsInitialized()) { + initI18n(); + } - // Set species filter and specialty types if provided, otherwise filter by base total. - if (specialtyTypes.length) { - this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) && p.baseTotal >= 450); - this.setSpecialtyTypes(...specialtyTypes); - } else { - this.setSpeciesFilter(p => p.baseTotal >= 450); - } + // Set the party templates for the Elite Four. + this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); + + // Set up party members with their corresponding species. + signatureSpecies.forEach((speciesPool, s) => { + // Ensure speciesPool is an array. + if (!Array.isArray(speciesPool)) { + speciesPool = [speciesPool]; + } + // Set a function to get a random party member from the species pool. + this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); + }); + + // Set species filter and specialty types if provided, otherwise filter by base total. + if (specialtyTypes.length) { + this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) && p.baseTotal >= 450); + this.setSpecialtyTypes(...specialtyTypes); + } else { + this.setSpeciesFilter(p => p.baseTotal >= 450); + } - // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. - const nameForCall = this.name.toLowerCase().replace(/\s/g, '_'); - this.name = i18next.t(`trainerNames:${nameForCall}`); + // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. + const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + this.name = i18next.t(`trainerNames:${nameForCall}`); - // Set the title to "elite_four". (this is the key in the i18n file) - this.setTitle('elite_four'); + // Set the title to "elite_four". (this is the key in the i18n file) + this.setTitle("elite_four"); - // Configure various properties for the Elite Four member. - this.setMoneyMultiplier(3.25); - this.setBoss(); - this.setStaticParty(); - this.setBattleBgm('battle_elite'); - this.setVictoryBgm('victory_gym'); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : null)); + // Configure various properties for the Elite Four member. + this.setMoneyMultiplier(3.25); + this.setBoss(); + this.setStaticParty(); + this.setBattleBgm("battle_elite"); + this.setVictoryBgm("victory_gym"); + this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : null)); - return this; - } + return this; + } - /** + /** * Initializes the trainer configuration for a Champion. * @param {Species | Species[]} signatureSpecies - The signature species for the Champion. * @returns {TrainerConfig} - The updated TrainerConfig instance. **/ - initForChampion(signatureSpecies: (Species | Species[])[]): TrainerConfig { - // Check if the internationalization (i18n) system is initialized. - if (!getIsInitialized()) { - initI18n(); - } - - // Set the party templates for the Champion. - this.setPartyTemplates(trainerPartyTemplates.CHAMPION); - - // Set up party members with their corresponding species. - signatureSpecies.forEach((speciesPool, s) => { - // Ensure speciesPool is an array. - if (!Array.isArray(speciesPool)) - speciesPool = [speciesPool]; - // Set a function to get a random party member from the species pool. - this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); - }); - - // Set species filter to only include species with a base total of 470 or higher. - this.setSpeciesFilter(p => p.baseTotal >= 470); - - // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. - const nameForCall = this.name.toLowerCase().replace(/\s/g, '_'); - this.name = i18next.t(`trainerNames:${nameForCall}`); - - // Set the title to "champion". (this is the key in the i18n file) - this.setTitle('champion'); - - // Configure various properties for the Champion. - this.setMoneyMultiplier(10); - this.setBoss(); - this.setStaticParty(); - this.setBattleBgm('battle_champion_alder'); - this.setVictoryBgm('victory_champion'); - this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3)); - - return this; + initForChampion(signatureSpecies: (Species | Species[])[]): TrainerConfig { + // Check if the internationalization (i18n) system is initialized. + if (!getIsInitialized()) { + initI18n(); } - /** + // Set the party templates for the Champion. + this.setPartyTemplates(trainerPartyTemplates.CHAMPION); + + // Set up party members with their corresponding species. + signatureSpecies.forEach((speciesPool, s) => { + // Ensure speciesPool is an array. + if (!Array.isArray(speciesPool)) { + speciesPool = [speciesPool]; + } + // Set a function to get a random party member from the species pool. + this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); + }); + + // Set species filter to only include species with a base total of 470 or higher. + this.setSpeciesFilter(p => p.baseTotal >= 470); + + // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. + const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + this.name = i18next.t(`trainerNames:${nameForCall}`); + + // Set the title to "champion". (this is the key in the i18n file) + this.setTitle("champion"); + + // Configure various properties for the Champion. + this.setMoneyMultiplier(10); + this.setBoss(); + this.setStaticParty(); + this.setBattleBgm("battle_champion_alder"); + this.setVictoryBgm("victory_champion"); + this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3)); + + return this; + } + + /** * Retrieves the title for the trainer based on the provided trainer slot and variant. * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. * @returns {string} - The title of the trainer. **/ - getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { - let ret = this.name; - - // Check if the variant is double and the name for double exists - if (!trainerSlot && variant === TrainerVariant.DOUBLE && this.nameDouble) - return this.nameDouble; - - // Female variant - if (this.hasGenders) { - // If the name is already set - if (this.nameFemale) { - // Check if the variant is either female or this is for the partner in a double battle - if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) - return this.nameFemale; - } else - // Check if !variant is true, if so return the name, else return the name with _female appended - if (variant) { - if (!getIsInitialized()) { - initI18n(); - } - // Check if the female version exists in the i18n file - if (i18next.exists(`trainerClasses:${this.name.toLowerCase().replace()}`)) { - // If it does, return - return ret + "_female"; - } else { - // If it doesn't, we do not do anything and go to the normal return - // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization - } - } - } + getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { + const ret = this.name; - return ret; + // Check if the variant is double and the name for double exists + if (!trainerSlot && variant === TrainerVariant.DOUBLE && this.nameDouble) { + return this.nameDouble; } - loadAssets(scene: BattleScene, variant: TrainerVariant): Promise { - return new Promise(resolve => { - const isDouble = variant === TrainerVariant.DOUBLE; - const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE); - const partnerTrainerKey = this.getSpriteKey(true); - scene.loadAtlas(trainerKey, 'trainer'); - if (isDouble) - scene.loadAtlas(partnerTrainerKey, 'trainer'); - scene.load.once(Phaser.Loader.Events.COMPLETE, () => { - const originalWarn = console.warn; - // Ignore warnings for missing frames, because there will be a lot - console.warn = () => { - }; - const frameNames = scene.anims.generateFrameNames(trainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}); - const partnerFrameNames = isDouble - ? scene.anims.generateFrameNames(partnerTrainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}) - : null; - console.warn = originalWarn; - scene.anims.create({ - key: trainerKey, - frames: frameNames, - frameRate: 24, - repeat: -1 - }); - if (isDouble) { - scene.anims.create({ - key: partnerTrainerKey, - frames: partnerFrameNames, - frameRate: 24, - repeat: -1 - }); - } - resolve(); - }); - if (!scene.load.isLoading()) - scene.load.start(); - }); + // Female variant + if (this.hasGenders) { + // If the name is already set + if (this.nameFemale) { + // Check if the variant is either female or this is for the partner in a double battle + if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) { + return this.nameFemale; + } + } else + // Check if !variant is true, if so return the name, else return the name with _female appended + if (variant) { + if (!getIsInitialized()) { + initI18n(); + } + // Check if the female version exists in the i18n file + if (i18next.exists(`trainerClasses:${this.name.toLowerCase().replace()}`)) { + // If it does, return + return ret + "_female"; + } else { + // If it doesn't, we do not do anything and go to the normal return + // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization + } + } } + + return ret; + } + + loadAssets(scene: BattleScene, variant: TrainerVariant): Promise { + return new Promise(resolve => { + const isDouble = variant === TrainerVariant.DOUBLE; + const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE); + const partnerTrainerKey = this.getSpriteKey(true); + scene.loadAtlas(trainerKey, "trainer"); + if (isDouble) { + scene.loadAtlas(partnerTrainerKey, "trainer"); + } + scene.load.once(Phaser.Loader.Events.COMPLETE, () => { + const originalWarn = console.warn; + // Ignore warnings for missing frames, because there will be a lot + console.warn = () => { + }; + const frameNames = scene.anims.generateFrameNames(trainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}); + const partnerFrameNames = isDouble + ? scene.anims.generateFrameNames(partnerTrainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}) + : null; + console.warn = originalWarn; + scene.anims.create({ + key: trainerKey, + frames: frameNames, + frameRate: 24, + repeat: -1 + }); + if (isDouble) { + scene.anims.create({ + key: partnerTrainerKey, + frames: partnerFrameNames, + frameRate: 24, + repeat: -1 + }); + } + resolve(); + }); + if (!scene.load.isLoading()) { + scene.load.start(); + } + }); + } } let t = 0; @@ -649,50 +661,51 @@ interface TrainerConfigs { } function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) { - return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)]; + return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)]; } function getGymLeaderPartyTemplate(scene: BattleScene) { - return getWavePartyTemplate(scene, trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5); + return getWavePartyTemplate(scene, trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5); } function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc { - return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - let species = Utils.randSeedItem(speciesPool); - if (!ignoreEvolution) - species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); - return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); - }; + return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { + let species = Utils.randSeedItem(speciesPool); + if (!ignoreEvolution) { + species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); + } + return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); + }; } function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, postProcess?: (EnemyPokemon: EnemyPokemon) => void): PartyMemberFunc { - const originalSpeciesFilter = speciesFilter; - speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); - return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); - return ret; - }; + const originalSpeciesFilter = speciesFilter; + speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); + return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { + const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength)), level, trainerSlot, undefined, undefined, postProcess); + return ret; + }; } function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] { - const ret: PersistentModifier[] = []; - const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); - for (let t = 0; t < Math.min(count, party.length); t++) { - const randomIndex = Utils.randSeedItem(partyMemberIndexes); - partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); - ret.push(modifierTypes.TERA_SHARD().generateType(null, [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); - } - return ret; + const ret: PersistentModifier[] = []; + const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i); + for (let t = 0; t < Math.min(count, party.length); t++) { + const randomIndex = Utils.randSeedItem(partyMemberIndexes); + partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1); + ret.push(modifierTypes.TERA_SHARD().generateType(null, [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); + } + return ret; } export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), - [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders('Ace Trainer Female').setHasDouble('Ace Duo').setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) + [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)), [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) .setSpeciesPools([ Species.SMEARGLE ]), [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble('Backpackers').setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) + [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ], @@ -703,7 +716,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)), - [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders('Battle Girl', TrainerType.PSYCHIC).setHasDouble('Crush Kin').setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) + [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], @@ -712,17 +725,17 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [ Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O ], [TrainerPoolTier.ULTRA_RARE]: [ Species.KUBFU ] }), - [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble('Breeders') + [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders") .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER)) .setSpeciesFilter(s => s.baseTotal < 450), - [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble('Colleagues').setEncounterBgm(TrainerType.CLERK) + [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO ], [TrainerPoolTier.UNCOMMON]: [ Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO ], [TrainerPoolTier.RARE]: [ Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE ] }), - [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble('Cyclists').setEncounterBgm(TrainerType.CYCLIST) + [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND ], @@ -739,7 +752,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.SUPER_RARE]: [ Species.POPPLIO ] }), [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK), - [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders('Nurse', 'lass').setHasDouble('Medical Team').setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) + [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)), [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) @@ -769,7 +782,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC) .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG) .setSpeciesFilter(s => s.isOfType(Type.GHOST)), - [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm('lass'), + [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK) .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG) .setSpeciesPools({ @@ -781,9 +794,9 @@ export const trainerConfigs: TrainerConfigs = { }), [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), - [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName('PokéFan').setHasGenders("PokéFan Female").setHasDouble('PokéFan Family').setEncounterBgm(TrainerType.POKEFAN) + [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN) .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME), - [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", 'lass').setHasDouble('Preschoolers') + [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers") .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV ], @@ -791,7 +804,7 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS ], [TrainerPoolTier.SUPER_RARE]: [ Species.DARUMAKA, Species.TINKATINK ], }), - [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble('Psychics').setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC) + [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA ], @@ -799,17 +812,17 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.RARE]: [ Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC ], [TrainerPoolTier.SUPER_RARE]: [ Species.BELDUM, Species.ESPEON, Species.STANTLER ], }), - [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName('Pokémon Ranger').setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble('Pokémon Rangers') + [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers") .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER ], [TrainerPoolTier.UNCOMMON]: [ Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL ], [TrainerPoolTier.RARE]: [ Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO ], [TrainerPoolTier.SUPER_RARE]: [ Species.LARVESTA ], }), - [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName('Gentleman').setHasGenders('Madame').setHasDouble('Rich Couple'), - [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName('Rich Boy').setHasGenders('Lady').setHasDouble('Rich Kids').setEncounterBgm(TrainerType.RICH), + [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"), + [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH), [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)), - [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble('Scientists').setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) + [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ], [TrainerPoolTier.UNCOMMON]: [ Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE ], @@ -818,66 +831,66 @@ export const trainerConfigs: TrainerConfigs = { [TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ] }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName('Worker').setHasGenders("Worker Female").setHasDouble('Workers').setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), + [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), - [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", 'lass').setHasDouble('School Kids') + [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ], [TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ], [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] }), - [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble('Swimmers').setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), + [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER)) .setEncounterBgm(TrainerType.TWINS), - [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble('Veteran Duo').setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)), - [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders('Waitress').setHasDouble('Restaurant Staff').setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) + [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)), + [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) .setSpeciesPools({ [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ], [TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ], [TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ] }), - [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble('Workers').setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)), - [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders('Lass', 'lass').setHasDouble('Beginners').setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) + [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)), + [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) .setSpeciesPools( [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] ), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK).setBattleBgm('battle_kanto_gym'), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER).setBattleBgm('battle_kanto_gym'), - [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC).setBattleBgm('battle_kanto_gym'), - [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader([ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], Type.GRASS).setBattleBgm('battle_kanto_gym'), - [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader([ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], Type.POISON).setBattleBgm('battle_kanto_gym'), - [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader([ Species.ABRA, Species.MR_MIME, Species.ESPEON ], Type.PSYCHIC).setBattleBgm('battle_kanto_gym'), - [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader([ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], Type.FIRE).setBattleBgm('battle_kanto_gym'), - [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader([ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], Type.DARK).setBattleBgm('battle_kanto_gym'), - [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader([ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], Type.FLYING).setBattleBgm('battle_johto_gym'), - [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader([ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], Type.BUG).setBattleBgm('battle_johto_gym'), - [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.MILTANK ], Type.NORMAL).setBattleBgm('battle_johto_gym'), - [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader([ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], Type.GHOST).setBattleBgm('battle_johto_gym'), - [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader([ Species.POLIWRATH, Species.MANKEY ], Type.FIGHTING).setBattleBgm('battle_johto_gym'), - [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL).setBattleBgm('battle_johto_gym'), - [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE).setBattleBgm('battle_johto_gym'), - [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON).setBattleBgm('battle_johto_gym'), - [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK).setBattleBgm('battle_hoenn_gym'), - [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING).setBattleBgm('battle_hoenn_gym'), - [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC).setBattleBgm('battle_hoenn_gym'), - [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE).setBattleBgm('battle_hoenn_gym'), - [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL).setBattleBgm('battle_hoenn_gym'), - [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING).setBattleBgm('battle_hoenn_gym'), - [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC).setBattleBgm('battle_hoenn_gym'), - [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC).setBattleBgm('battle_hoenn_gym'), - [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER).setBattleBgm('battle_hoenn_gym'), - [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader([ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ], Type.WATER).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader([ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], Type.GHOST).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader([ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], Type.STEEL).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader([ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], Type.ICE).setBattleBgm('battle_sinnoh_gym'), - [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader([ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], Type.ELECTRIC).setBattleBgm('battle_sinnoh_gym'), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK).setBattleBgm("battle_kanto_gym"), + [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER).setBattleBgm("battle_kanto_gym"), + [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC).setBattleBgm("battle_kanto_gym"), + [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader([ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], Type.GRASS).setBattleBgm("battle_kanto_gym"), + [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader([ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], Type.POISON).setBattleBgm("battle_kanto_gym"), + [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader([ Species.ABRA, Species.MR_MIME, Species.ESPEON ], Type.PSYCHIC).setBattleBgm("battle_kanto_gym"), + [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader([ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], Type.FIRE).setBattleBgm("battle_kanto_gym"), + [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader([ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], Type.DARK).setBattleBgm("battle_kanto_gym"), + [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader([ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], Type.FLYING).setBattleBgm("battle_johto_gym"), + [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader([ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], Type.BUG).setBattleBgm("battle_johto_gym"), + [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.MILTANK ], Type.NORMAL).setBattleBgm("battle_johto_gym"), + [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader([ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], Type.GHOST).setBattleBgm("battle_johto_gym"), + [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader([ Species.POLIWRATH, Species.MANKEY ], Type.FIGHTING).setBattleBgm("battle_johto_gym"), + [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL).setBattleBgm("battle_johto_gym"), + [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE).setBattleBgm("battle_johto_gym"), + [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON).setBattleBgm("battle_johto_gym"), + [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK).setBattleBgm("battle_hoenn_gym"), + [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING).setBattleBgm("battle_hoenn_gym"), + [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC).setBattleBgm("battle_hoenn_gym"), + [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE).setBattleBgm("battle_hoenn_gym"), + [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL).setBattleBgm("battle_hoenn_gym"), + [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING).setBattleBgm("battle_hoenn_gym"), + [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"), + [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"), + [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER).setBattleBgm("battle_hoenn_gym"), + [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader([ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ], Type.WATER).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader([ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], Type.GHOST).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader([ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], Type.STEEL).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader([ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], Type.ICE).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader([ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym"), [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader([ Species.PANSAGE, Species.COTTONEE, Species.PETILIL ], Type.GRASS), [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader([ Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR ], Type.FIRE), [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader([ Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE ], Type.WATER), @@ -957,14 +970,14 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour([ Species.EXCADRILL, Species.PRIMARINA, Species.ALCREMIE, Species.GALAR_SLOWBRO ], Type.FAIRY), [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour([ Species.DRAGONITE, Species.ARCHALUDON, Species.FLYGON, Species.SCEPTILE ], Type.DRAGON), - [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion([ Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT ]).setBattleBgm('battle_kanto_champion'), - [TrainerType.RED]: new TrainerConfig(++t).initForChampion([ Species.CHARIZARD, [ Species.LUGIA, Species.HO_OH ], Species.SNORLAX, Species.RAICHU, Species.ESPEON ]).setBattleBgm('battle_johto_champion'), - [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion([ Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR ]).setBattleBgm('battle_johto_champion'), - [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion([ Species.METAGROSS, [ Species.DIALGA, Species.PALKIA ], Species.SKARMORY, Species.AGGRON, Species.CARBINK ]).setBattleBgm('battle_hoenn_champion'), - [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion([ Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO ]).setBattleBgm('battle_hoenn_champion'), - [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion([ Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS ]).setBattleBgm('battle_sinnoh_champion'), + [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion([ Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT ]).setBattleBgm("battle_kanto_champion"), + [TrainerType.RED]: new TrainerConfig(++t).initForChampion([ Species.CHARIZARD, [ Species.LUGIA, Species.HO_OH ], Species.SNORLAX, Species.RAICHU, Species.ESPEON ]).setBattleBgm("battle_johto_champion"), + [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion([ Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR ]).setBattleBgm("battle_johto_champion"), + [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion([ Species.METAGROSS, [ Species.DIALGA, Species.PALKIA ], Species.SKARMORY, Species.AGGRON, Species.CARBINK ]).setBattleBgm("battle_hoenn_champion"), + [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion([ Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO ]).setBattleBgm("battle_hoenn_champion"), + [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion([ Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS ]).setBattleBgm("battle_sinnoh_champion"), [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion([ Species.VOLCARONA, Species.GROUDON, Species.BOUFFALANT, Species.ACCELGOR, Species.CONKELDURR ]), - [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion([ Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.ARON, Species.LAPRAS ]).setBattleBgm('battle_champion_iris'), + [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion([ Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.ARON, Species.LAPRAS ]).setBattleBgm("battle_champion_iris"), [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion([ Species.HAWLUCHA, Species.XERNEAS, Species.GOURGEIST, Species.GOODRA, Species.GARDEVOIR ]), [TrainerType.HAU]: new TrainerConfig(++t).initForChampion([ Species.ALOLA_RAICHU, [ Species.SOLGALEO, Species.LUNALA ], Species.NOIVERN, [ Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA ], Species.CRABOMINABLE ]), [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion([ Species.GLIMMORA, Species.MIRAIDON, Species.ESPATHRA, Species.VELUZA, Species.KINGAMBIT ]), @@ -972,21 +985,21 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion([ Species.POLITOED, [ Species.OGERPON, Species.TERAPAGOS ], Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL ]), [TrainerType.LEON]: new TrainerConfig(++t).initForChampion([ Species.DRAGAPULT, [ Species.ZACIAN, Species.ZAMAZENTA ], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD ]), - [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL) + [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)), - [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_2) + [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), - [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival').setPartyTemplates(trainerPartyTemplates.RIVAL_3) + [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540), - [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_2').setPartyTemplates(trainerPartyTemplates.RIVAL_4) + [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) @@ -995,7 +1008,7 @@ export const trainerConfigs: TrainerConfigs = { const starter = party[0]; return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; }), - [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_5) + [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => p.setBoss(true, 2))) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) @@ -1011,7 +1024,7 @@ export const trainerConfigs: TrainerConfigs = { const starter = party[0]; return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; }), - [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName('Finn').setHasGenders('Ivy').setHasCharSprite().setTitle('Rival').setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm('final').setBattleBgm('battle_rival_3').setPartyTemplates(trainerPartyTemplates.RIVAL_6) + [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); @@ -1039,5 +1052,5 @@ export const trainerConfigs: TrainerConfigs = { }; (function () { - initTrainerTypeDialogue(); + initTrainerTypeDialogue(); })(); diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index 2b95a91314e9..7583d1605c60 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -6,7 +6,7 @@ class TrainerNameConfig { public femaleUrls: string[]; constructor(type: TrainerType, ...urls: string[]) { - this.urls = urls.length ? urls : [ Utils.toReadableString(TrainerType[type]).replace(/ /g, '_') ]; + this.urls = urls.length ? urls : [ Utils.toReadableString(TrainerType[type]).replace(/ /g, "_") ]; } hasGenderVariant(...femaleUrls: string[]): TrainerNameConfig { @@ -19,6 +19,8 @@ interface TrainerNameConfigs { [key: integer]: TrainerNameConfig } +// used in a commented code +// eslint-disable-next-line @typescript-eslint/no-unused-vars const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.ACE_TRAINER]: new TrainerNameConfig(TrainerType.ACE_TRAINER), [TrainerType.ARTIST]: new TrainerNameConfig(TrainerType.ARTIST), @@ -27,13 +29,13 @@ const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.BAKER]: new TrainerNameConfig(TrainerType.BAKER), [TrainerType.BEAUTY]: new TrainerNameConfig(TrainerType.BEAUTY), [TrainerType.BIKER]: new TrainerNameConfig(TrainerType.BIKER), - [TrainerType.BLACK_BELT]: new TrainerNameConfig(TrainerType.BLACK_BELT).hasGenderVariant('Battle_Girl'), - [TrainerType.BREEDER]: new TrainerNameConfig(TrainerType.BREEDER, 'Pokémon_Breeder'), + [TrainerType.BLACK_BELT]: new TrainerNameConfig(TrainerType.BLACK_BELT).hasGenderVariant("Battle_Girl"), + [TrainerType.BREEDER]: new TrainerNameConfig(TrainerType.BREEDER, "Pokémon_Breeder"), [TrainerType.CLERK]: new TrainerNameConfig(TrainerType.CLERK), [TrainerType.CYCLIST]: new TrainerNameConfig(TrainerType.CYCLIST), [TrainerType.DANCER]: new TrainerNameConfig(TrainerType.DANCER), [TrainerType.DEPOT_AGENT]: new TrainerNameConfig(TrainerType.DEPOT_AGENT), - [TrainerType.DOCTOR]: new TrainerNameConfig(TrainerType.DOCTOR).hasGenderVariant('Nurse'), + [TrainerType.DOCTOR]: new TrainerNameConfig(TrainerType.DOCTOR).hasGenderVariant("Nurse"), [TrainerType.FISHERMAN]: new TrainerNameConfig(TrainerType.FISHERMAN), [TrainerType.GUITARIST]: new TrainerNameConfig(TrainerType.GUITARIST), [TrainerType.HARLEQUIN]: new TrainerNameConfig(TrainerType.HARLEQUIN), @@ -50,113 +52,118 @@ const trainerNameConfigs: TrainerNameConfigs = { [TrainerType.OFFICER]: new TrainerNameConfig(TrainerType.OFFICER), [TrainerType.PARASOL_LADY]: new TrainerNameConfig(TrainerType.PARASOL_LADY), [TrainerType.PILOT]: new TrainerNameConfig(TrainerType.PILOT), - [TrainerType.POKEFAN]: new TrainerNameConfig(TrainerType.POKEFAN, 'Poké_Fan'), + [TrainerType.POKEFAN]: new TrainerNameConfig(TrainerType.POKEFAN, "Poké_Fan"), [TrainerType.PRESCHOOLER]: new TrainerNameConfig(TrainerType.PRESCHOOLER), [TrainerType.PSYCHIC]: new TrainerNameConfig(TrainerType.PSYCHIC), [TrainerType.RANGER]: new TrainerNameConfig(TrainerType.RANGER), - [TrainerType.RICH]: new TrainerNameConfig(TrainerType.RICH, 'Gentleman').hasGenderVariant('Madame'), - [TrainerType.RICH_KID]: new TrainerNameConfig(TrainerType.RICH_KID, 'Rich_Boy').hasGenderVariant('Lady'), + [TrainerType.RICH]: new TrainerNameConfig(TrainerType.RICH, "Gentleman").hasGenderVariant("Madame"), + [TrainerType.RICH_KID]: new TrainerNameConfig(TrainerType.RICH_KID, "Rich_Boy").hasGenderVariant("Lady"), [TrainerType.ROUGHNECK]: new TrainerNameConfig(TrainerType.ROUGHNECK), [TrainerType.SCIENTIST]: new TrainerNameConfig(TrainerType.SCIENTIST), [TrainerType.SMASHER]: new TrainerNameConfig(TrainerType.SMASHER), - [TrainerType.SNOW_WORKER]: new TrainerNameConfig(TrainerType.SNOW_WORKER, 'Worker'), + [TrainerType.SNOW_WORKER]: new TrainerNameConfig(TrainerType.SNOW_WORKER, "Worker"), [TrainerType.STRIKER]: new TrainerNameConfig(TrainerType.STRIKER), - [TrainerType.SCHOOL_KID]: new TrainerNameConfig(TrainerType.SCHOOL_KID, 'School_Kid'), + [TrainerType.SCHOOL_KID]: new TrainerNameConfig(TrainerType.SCHOOL_KID, "School_Kid"), [TrainerType.SWIMMER]: new TrainerNameConfig(TrainerType.SWIMMER), [TrainerType.TWINS]: new TrainerNameConfig(TrainerType.TWINS), [TrainerType.VETERAN]: new TrainerNameConfig(TrainerType.VETERAN), - [TrainerType.WAITER]: new TrainerNameConfig(TrainerType.WAITER).hasGenderVariant('Waitress'), + [TrainerType.WAITER]: new TrainerNameConfig(TrainerType.WAITER).hasGenderVariant("Waitress"), [TrainerType.WORKER]: new TrainerNameConfig(TrainerType.WORKER), - [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant('Lass') + [TrainerType.YOUNGSTER]: new TrainerNameConfig(TrainerType.YOUNGSTER).hasGenderVariant("Lass") }; export const trainerNamePools = { - [TrainerType.ACE_TRAINER]: [["Aaron","Allen","Blake","Brian","Gaven","Jake","Kevin","Mike","Nick","Paul","Ryan","Sean","Darin","Albert","Berke","Clyde","Edgar","George","Leroy","Owen","Parker","Randall","Ruben","Samuel","Vincent","Warren","Wilton","Zane","Alfred","Braxton","Felix","Gerald","Jonathan","Leonel","Marcel","Mitchell","Quincy","Roderick","Colby","Rolando","Yuji","Abel","Anton","Arthur","Cesar","Dalton","Dennis","Ernest","Garrett","Graham","Henry","Isaiah","Jonah","Jose","Keenan","Micah","Omar","Quinn","Rodolfo","Saul","Sergio","Skylar","Stefan","Zachery","Alton","Arabella","Bonita","Cal","Cody","French","Kobe","Paulo","Shaye","Austin","Beckett","Charlie","Corky","David","Dwayne","Elmer","Jesse","Jared","Johan","Jordan","Kipp","Lou","Terry","Tom","Webster","Billy","Doyle","Enzio","Geoff","Grant","Kelsey","Miguel","Pierce","Ray","Santino","Shel","Adelbert","Bence","Emil","Evan","Mathis","Maxim","Neil","Rico","Robbie","Theo","Viktor","Benedict","Cornelius","Hisato","Leopold","Neville","Vito","Chase","Cole","Hiroshi","Jackson","Jim","Kekoa","Makana","Yuki","Elwood","Seth","Alvin","Arjun","Arnold","Cameron","Carl","Carlton","Christopher","Dave","Dax","Dominic","Edmund","Finn","Fred","Garret","Grayson","Jace","Jaxson","Jay","Jirard","Johnson","Kayden","Kite","Louis","Mac","Marty","Percy","Raymond","Ronnie","Satch","Tim","Zach","Conner","Vince","Bedro","Boda","Botan","Daras","Dury","Herton","Rewn","Stum","Tock","Trilo","Berki","Cruik","Dazon","Desid","Dillot","Farfin","Forgon","Hebel","Morfon","Moril","Shadd","Vanhub","Bardo","Carben","Degin","Gorps","Klept","Lask","Malex","Mopar","Niled","Noxon","Teslor","Tetil"],["Beth","Carol","Cybil","Emma","Fran","Gwen","Irene","Jenn","Joyce","Kate","Kelly","Lois","Lola","Megan","Quinn","Reena","Cara","Alexa","Brooke","Caroline","Elaine","Hope","Jennifer","Jody","Julie","Lori","Mary","Michelle","Shannon","Wendy","Alexia","Alicia","Athena","Carolina","Cristin","Darcy","Dianne","Halle","Jazmyn","Katelynn","Keira","Marley","Allyson","Kathleen","Naomi","Alyssa","Ariana","Brandi","Breanna","Brenda","Brenna","Catherine","Clarice","Dana","Deanna","Destiny","Jamie","Jasmin","Kassandra","Laura","Maria","Mariah","Maya","Meagan","Mikayla","Monique","Natasha","Olivia","Sandra","Savannah","Sydney","Moira","Piper","Salma","Allison","Beverly","Cathy","Cheyenne","Clara","Dara","Eileen","Glinda","Junko","Lena","Lucille","Mariana","Olwen","Shanta","Stella","Angi","Belle","Chandra","Cora","Eve","Jacqueline","Jeanne","Juliet","Kathrine","Layla","Lucca","Melina","Miki","Nina","Sable","Shelly","Summer","Trish","Vicki","Alanza","Cordelia","Hilde","Imelda","Michele","Mireille","Claudia","Constance","Harriet","Honor","Melba","Portia","Alexis","Angela","Karla","Lindsey","Tori","Sheri","Jada","Kailee","Amanda","Annie","Kindra","Kyla","Sofia","Yvette","Becky","Flora","Gloria","Buna","Ferda","Lehan","Liqui","Lomen","Neira","Atilo","Detta","Gilly","Gosney","Levens","Moden","Rask","Rateis","Rosno","Tynan","Veron","Zoel","Cida","Dibsin","Dodin","Ebson","Equin","Flostin","Gabsen","Halsion","Hileon","Quelor","Rapeel","Roze","Tensin"]], - [TrainerType.ARTIST]: [["Ismael","William","Horton","Pierre","Zach","Gough","Salvador","Vincent","Duncan"],["Georgia"]], - [TrainerType.BACKERS]: [["Alf & Fred","Hawk & Dar","Joe & Ross","Les & Web","Masa & Yas","Stu & Art"],["Ai & Ciel","Ami & Eira","Cam & Abby","Fey & Sue","Kat & Phae","Kay & Ali","Ava & Aya","Cleo & Rio","May & Mal"]], - [TrainerType.BACKPACKER]: [["Alexander","Carlos","Herman","Jerome","Keane","Kelsey","Kiyo","Michael","Nate","Peter","Sam","Stephen","Talon","Terrance","Toru","Waylon","Boone","Clifford","Ivan","Kendall","Lowell","Randall","Reece","Roland","Shane","Walt","Farid","Heike","Joren","Lane","Roderick","Darnell","Deon","Emory","Graeme","Grayson","Ashley","Mikiko","Kiana","Perdy","Maria","Yuho","Peren","Barbara","Diane","Ruth","Aitor","Alex","Arturo","Asier","Jaime","Jonathan","Julio","Kevin","Kosuke","Lander","Markel","Mateo","Nil","Pau","Samuel"],["Anna","Corin","Elaine","Emi","Jill","Kumiko","Liz","Lois","Lora","Molly","Patty","Ruth","Vicki","Annie","Blossom","Clara","Eileen","Mae","Myra","Rachel","Tami"]], - [TrainerType.BAKER]: ["Chris","Jenn","Lilly"], - [TrainerType.BEAUTY]: ["Cassie","Julia","Olivia","Samantha","Valerie","Victoria","Bridget","Connie","Jessica","Johanna","Melissa","Sheila","Shirley","Tiffany","Namiko","Thalia","Grace","Lola","Lori","Maura","Tamia","Cyndy","Devon","Gabriella","Harley","Lindsay","Nicola","Callie","Charlotte","Kassandra","December","Fleming","Nikola","Aimee","Anais","Brigitte","Cassandra","Andrea","Brittney","Carolyn","Krystal","Alexis","Alice","Aina","Anya","Arianna","Aubrey","Beverly","Camille","Beauty","Evette","Hansol","Haruka","Jill","Jo","Lana","Lois","Lucy","Mai","Nickie","Nicole","Prita","Rose","Shelly","Suzy","Tessa","Anita","Alissa","Rita","Cudsy","Eloff","Miru","Minot","Nevah","Niven","Ogoin"], - [TrainerType.BIKER]: ["Charles","Dwayne","Glenn","Harris","Joel","Riley","Zeke","Alex","Billy","Ernest","Gerald","Hideo","Isaac","Jared","Jaren","Jaxon","Jordy","Lao","Lukas","Malik","Nikolas","Ricardo","Ruben","Virgil","William","Aiden","Dale","Dan","Jacob","Markey","Reese","Teddy","Theron","Jeremy","Morgann","Phillip","Philip","Stanley","Dillon"], - [TrainerType.BLACK_BELT]: [["Kenji","Lao","Lung","Nob","Wai","Yoshi","Atsushi","Daisuke","Hideki","Hitoshi","Kiyo","Koichi","Koji","Yuji","Cristian","Rhett","Takao","Theodore","Zander","Aaron","Hugh","Mike","Nicolas","Shea","Takashi","Adam","Carl","Colby","Darren","David","Davon","Derek","Eddie","Gregory","Griffin","Jarrett","Jeffery","Kendal","Kyle","Luke","Miles","Nathaniel","Philip","Rafael","Ray","Ricky","Sean","Willie","Ander","Manford","Benjamin","Corey","Edward","Grant","Jay","Kendrew","Kentaro","Ryder","Teppei","Thomas","Tyrone","Andrey","Donny","Drago","Gordon","Grigor","Jeriel","Kenneth","Martell","Mathis","Rich","Rocky","Rodrigo","Wesley","Zachery","Alonzo","Cadoc","Gunnar","Igor","Killian","Markus","Ricardo","Yanis","Banting","Clayton","Duane","Earl","Greg","Roy","Terry","Tracy","Walter","Alvaro","Curtis","Francis","Ross","Brice","Cheng","Dudley","Eric","Kano","Masahiro","Randy","Ryuji","Steve","Tadashi","Wong","Yuen","Brian","Carter","Reece","Nick","Yang"],["Cora","Cyndy","Jill","Laura","Sadie","Tessa","Vivian","Aisha","Callie","Danielle","Helene","Jocelyn","Lilith","Paula","Reyna","Helen","Kelsey","Tyler","Amy","Chandra","Hillary","Janie","Lee","Maggie","Mikiko","Miriam","Sharon","Susie","Xiao","Alize","Azra","Brenda","Chalina","Chan","Glinda","Maki","Tia","Tiffany","Wendy","Andrea","Gabrielle","Gerardine","Hailey","Hedvig","Justine","Kinsey","Sigrid","Veronique","Tess"]], - [TrainerType.BREEDER]: [["Isaac","Myles","Salvadore","Albert","Kahlil","Eustace","Galen","Owen","Addison","Marcus","Foster","Cory","Glenn","Jay","Wesley","William","Adrian","Bradley","Jaime"],["Allison","Alize","Bethany","Lily","Lydia","Gabrielle","Jayden","Pat","Veronica","Amber","Jennifer","Kaylee","Adelaide","Brooke","Ethel","April","Irene","Magnolia","Amala","Mercy","Amanda","Ikue","Savannah","Yuka","Chloe","Debra","Denise","Elena"]], - [TrainerType.CLERK]: [["Chaz","Clemens","Doug","Fredric","Ivan","Isaac","Nelson","Wade","Warren","Augustin","Gilligan","Cody","Jeremy","Shane","Dugal","Royce","Ronald"],["Alberta","Ingrid","Katie","Piper","Trisha","Wren","Britney","Lana","Jessica","Kristen","Michelle","Gabrielle"]], - [TrainerType.CYCLIST]: [["Axel","James","John","Ryan","Hector","Jeremiah"],["Kayla","Megan","Nicole","Rachel","Krissa","Adelaide"]], - [TrainerType.DANCER]: ["Brian","Davey","Dirk","Edmond","Mickey","Raymond","Cara","Julia","Maika","Mireille","Ronda","Zoe"], - [TrainerType.DEPOT_AGENT]: ["Josh","Hank","Vincent"], - [TrainerType.DOCTOR]: [["Hank","Jerry","Jules","Logan","Wayne","Braid","Derek","Heath","Julius","Kit","Graham"],["Kirsten","Sachiko","Shery","Carol","Dixie","Mariah"]], - [TrainerType.FISHERMAN]: ["Andre","Arnold","Barney","Chris","Edgar","Henry","Jonah","Justin","Kyle","Martin","Marvin","Ralph","Raymond","Scott","Stephen","Wilton","Tully","Andrew","Barny","Carter","Claude","Dale","Elliot","Eugene","Ivan","Ned","Nolan","Roger","Ronald","Wade","Wayne","Darian","Kai","Chip","Hank","Kaden","Tommy","Tylor","Alec","Brett","Cameron","Cody","Cole","Cory","Erick","George","Joseph","Juan","Kenneth","Luc","Miguel","Travis","Walter","Zachary","Josh","Gideon","Kyler","Liam","Murphy","Bruce","Damon","Devon","Hubert","Jones","Lydon","Mick","Pete","Sean","Sid","Vince","Bucky","Dean","Eustace","Kenzo","Leroy","Mack","Ryder","Ewan","Finn","Murray","Seward","Shad","Wharton","Finley","Fisher","Fisk","River","Sheaffer","Timin","Carl","Ernest","Hal","Herbert","Hisato","Mike","Vernon","Harriet","Marina","Chase"], - [TrainerType.GUITARIST]: ["Anna","Beverly","January","Tina","Alicia","Claudia","Julia","Lidia","Mireia","Noelia","Sara","Sheila","Tatiana"], - [TrainerType.HARLEQUIN]: ["Charley","Ian","Jack","Kerry","Louis","Pat","Paul","Rick","Anders","Clarence","Gary"], - [TrainerType.HIKER]: ["Anthony","Bailey","Benjamin","Daniel","Erik","Jim","Kenny","Leonard","Michael","Parry","Phillip","Russell","Sidney","Tim","Timothy","Alan","Brice","Clark","Eric","Lenny","Lucas","Mike","Trent","Devan","Eli","Marc","Sawyer","Allen","Daryl","Dudley","Earl","Franklin","Jeremy","Marcos","Nob","Oliver","Wayne","Alexander","Damon","Jonathan","Justin","Kevin","Lorenzo","Louis","Maurice","Nicholas","Reginald","Robert","Theodore","Bruce","Clarke","Devin","Dwight","Edwin","Eoin","Noland","Russel","Andy","Bret","Darrell","Gene","Hardy","Hugh","Jebediah","Jeremiah","Kit","Neil","Terrell","Don","Doug","Hunter","Jared","Jerome","Keith","Manuel","Markus","Otto","Shelby","Stephen","Teppei","Tobias","Wade","Zaiem","Aaron","Alain","Bergin","Bernard","Brent","Corwin","Craig","Delmon","Dunstan","Orestes","Ross","Davian","Calhoun","David","Gabriel","Ryan","Thomas","Travis","Zachary","Anuhea","Barnaby","Claus","Collin","Colson","Dexter","Dillan","Eugine","Farkas","Hisato","Julius","Kenji","Irwin","Lionel","Paul","Richter","Valentino","Donald","Douglas","Kevyn","Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira","Chester"], - [TrainerType.HOOLIGANS]: ["Jim & Cas","Rob & Sal"], - [TrainerType.HOOPSTER]: ["Bobby","John","Lamarcus","Derrick","Nicolas"], - [TrainerType.INFIELDER]: ["Alex","Connor","Todd"], - [TrainerType.JANITOR]: ["Caleb","Geoff","Brady","Felix","Orville","Melvin","Shawn"], - [TrainerType.LINEBACKER]: ["Bob","Dan","Jonah"], - [TrainerType.MAID]: ["Belinda","Sophie","Emily","Elena","Clare","Alica","Tanya","Tammy"], - [TrainerType.MUSICIAN]: ["Boris","Preston","Charles","Clyde","Vincent","Dalton","Kirk","Shawn","Fabian","Fernando","Joseph","Marcos","Arturo","Jerry","Lonnie","Tony"], - [TrainerType.NURSERY_AIDE]: ["Autumn","Briana","Leah","Miho","Ethel","Hollie","Ilse","June","Kimya","Rosalyn"], - [TrainerType.OFFICER]: ["Dirk","Keith","Alex","Bobby","Caleb","Danny","Dylan","Thomas","Daniel","Jeff","Braven","Dell","Neagle","Haruki","Mitchell","Raymond"], - [TrainerType.PARASOL_LADY]: ["Angelica","Clarissa","Madeline","Akari","Annabell","Kayley","Rachel","Alexa","Sabrina","April","Gwyneth","Laura","Lumi","Mariah","Melita","Nicole","Tihana","Ingrid","Tyra"], - [TrainerType.PILOT]: ["Chase","Leonard","Ted","Elron","Ewing","Flynn","Winslow"], - [TrainerType.POKEFAN]: [["Alex","Allan","Brandon","Carter","Colin","Derek","Jeremy","Joshua","Rex","Robert","Trevor","William","Colton","Miguel","Francisco","Kaleb","Leonard","Boone","Elliot","Jude","Norbert","Corey","Gabe","Baxter"],["Beverly","Georgia","Jaime","Ruth","Isabel","Marissa","Vanessa","Annika","Bethany","Kimberly","Meredith","Rebekah","Eleanor","Darcy","Lydia","Sachiko","Abigail","Agnes","Lydie","Roisin","Tara","Carmen","Janet"]], - [TrainerType.PRESCHOOLER]: [["Billy","Doyle","Evan","Homer","Tully","Albert","Buster","Greg","Ike","Jojo","Tyrone","Adrian","Oliver","Hayden","Hunter","Kaleb","Liam","Dylan"],["Juliet","Mia","Sarah","Wendy","Winter","Chrissy","Eva","Lin","Samantha","Ella","Lily","Natalie","Ailey","Hannah","Malia","Kindra","Nancy"]], - [TrainerType.PSYCHIC]: [["Fidel","Franklin","Gilbert","Greg","Herman","Jared","Mark","Nathan","Norman","Phil","Richard","Rodney","Cameron","Edward","Fritz","Joshua","Preston","Virgil","William","Alvaro","Blake","Cedric","Keenan","Nicholas","Dario","Johan","Lorenzo","Tyron","Bryce","Corbin","Deandre","Elijah","Kody","Landon","Maxwell","Mitchell","Sterling","Eli","Nelson","Vernon","Gaven","Gerard","Low","Micki","Perry","Rudolf","Tommy","Al","Nandor","Tully","Arthur","Emanuel","Franz","Harry","Paschal","Robert","Sayid","Angelo","Anton","Arin","Avery","Danny","Frasier","Harrison","Jaime","Ross","Rui","Vlad","Mason"],["Alexis","Hannah","Jacki","Jaclyn","Kayla","Maura","Samantha","Alix","Brandi","Edie","Macey","Mariella","Marlene","Laura","Rodette","Abigail","Brittney","Chelsey","Daisy","Desiree","Kendra","Lindsey","Rachael","Valencia","Belle","Cybil","Doreen","Dua","Future","Lin","Madhu","Alia","Ena","Joyce","Lynette","Olesia","Sarah"]], - [TrainerType.RANGER]: [["Carlos","Jackson","Sebastian","Gav","Lorenzo","Logan","Nicolas","Trenton","Deshawn","Dwayne","Jeffery","Kyler","Taylor","Alain","Claude","Crofton","Forrest","Harry","Jaden","Keith","Lewis","Miguel","Pedro","Ralph","Richard","Bret","Daryl","Eddie","Johan","Leaf","Louis","Maxwell","Parker","Rick","Steve","Bjorn","Chaise","Dean","Lee","Maurice","Nash","Ralf","Reed","Shinobu","Silas"],["Catherine","Jenna","Sophia","Merdith","Nora","Beth","Chelsea","Katelyn","Madeline","Allison","Ashlee","Felicia","Krista","Annie","Audra","Brenda","Chloris","Eliza","Heidi","Irene","Mary","Mylene","Shanti","Shelly","Thalia","Anja","Briana","Dianna","Elaine","Elle","Hillary","Katie","Lena","Lois","Malory","Melita","Mikiko","Naoko","Serenity","Ambre","Brooke","Clementine","Melina","Petra","Twiggy"]], - [TrainerType.RICH]: [["Alfred","Edward","Gregory","Preston","Thomas","Tucker","Walter","Clifford","Everett","Micah","Nate","Pierre","Terrance","Arthur","Brooks","Emanuel","Lamar","Jeremy","Leonardo","Milton","Frederic","Renaud","Robert","Yan","Daniel","Sheldon","Stonewall","Gerald","Ronald","Smith","Stanley","Reginald","Orson","Wilco","Caden","Glenn"],["Rebecca","Reina","Cassandra","Emilia","Grace","Marian","Elizabeth","Kathleen","Sayuri","Caroline","Judy"]], - [TrainerType.RICH_KID]: [["Garret","Winston","Dawson","Enrique","Jason","Roman","Trey","Liam","Anthony","Brad","Cody","Manuel","Martin","Pierce","Rolan","Keenan","Filbert","Antoin","Cyus","Diek","Dugo","Flitz","Jurek","Lond","Perd","Quint","Basto","Benit","Brot","Denc","Guyit","Marcon","Perc","Puros","Roex","Sainz","Symin","Tark","Venak"],["Anette","Brianna","Cindy","Colleen","Daphne","Elizabeth","Naomi","Sarah","Charlotte","Gillian","Jacki","Lady","Melissa","Celeste","Colette","Elizandra","Isabel","Lynette","Magnolia","Sophie","Lina","Dulcie","Auro","Brin","Caril","Eloos","Gwin","Illa","Kowly","Rima","Ristin","Vesey","Brena","Deasy","Denslon","Kylet","Nemi","Rene","Sanol","Stouner","Sturk","Talmen","Zoila"]], - [TrainerType.ROUGHNECK]: ["Camron","Corey","Gabriel","Isaiah","Jamal","Koji","Luke","Paxton","Raul","Zeek","Kirby","Chance","Dave","Fletcher","Johnny","Reese","Joey","Ricky","Silvester","Martin"], - [TrainerType.SCIENTIST]: [["Jed","Marc","Mitch","Rich","Ross","Beau","Braydon","Connor","Ed","Ivan","Jerry","Jose","Joshua","Parker","Rodney","Taylor","Ted","Travis","Zackery","Darrius","Emilio","Fredrick","Shaun","Stefano","Travon","Daniel","Garett","Gregg","Linden","Lowell","Trenton","Dudley","Luke","Markus","Nathan","Orville","Randall","Ron","Ronald","Simon","Steve","William","Franklin","Clarke","Jacques","Terrance","Ernst","Justus","Ikaika","Jayson","Kyle","Reid","Tyrone","Adam","Albert","Alphonse","Cory","Donnie","Elton","Francis","Gordon","Herbert","Humphrey","Jordan","Julian","Keaton","Levi","Melvin","Murray","West","Craig","Coren","Dubik","Kotan","Lethco","Mante","Mort","Myron","Odlow","Ribek","Roeck","Vogi","Vonder","Zogo","Doimo","Doton","Durel","Hildon","Kukla","Messa","Nanot","Platen","Raburn","Reman","Acrod","Coffy","Elrok","Foss","Hardig","Hombol","Hospel","Kaller","Klots","Krilok","Limar","Loket","Mesak","Morbit","Newin","Orill","Tabor","Tekot"],["Blythe","Chan","Kathrine","Marie","Maria","Naoko","Samantha","Satomi","Shannon","Athena","Caroline","Lumi","Lumina","Marissa","Sonia"]], - [TrainerType.SMASHER]: ["Aspen","Elena","Mari","Amy","Lizzy"], - [TrainerType.SNOW_WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], - [TrainerType.STRIKER]: ["Marco","Roberto","Tony"], - [TrainerType.SCHOOL_KID]: [["Alan","Billy","Chad","Danny","Dudley","Jack","Joe","Johnny","Kipp","Nate","Ricky","Tommy","Jerry","Paul","Ted","Chance","Esteban","Forrest","Harrison","Connor","Sherman","Torin","Travis","Al","Carter","Edgar","Jem","Sammy","Shane","Shayne","Alvin","Keston","Neil","Seymour","William","Carson","Clark","Nolan"],["Georgia","Karen","Meiko","Christine","Mackenzie","Tiera","Ann","Gina","Lydia","Marsha","Millie","Sally","Serena","Silvia","Alberta","Cassie","Mara","Rita","Georgie","Meena","Nitzel"]], - [TrainerType.SWIMMER]: [["Berke","Cameron","Charlie","George","Harold","Jerome","Kirk","Mathew","Parker","Randall","Seth","Simon","Tucker","Austin","Barry","Chad","Cody","Darrin","David","Dean","Douglas","Franklin","Gilbert","Herman","Jack","Luis","Matthew","Reed","Richard","Rodney","Roland","Spencer","Stan","Tony","Clarence","Declan","Dominik","Harrison","Kevin","Leonardo","Nolen","Pete","Santiago","Axle","Braden","Finn","Garrett","Mymo","Reece","Samir","Toby","Adrian","Colton","Dillon","Erik","Evan","Francisco","Glenn","Kurt","Oscar","Ricardo","Sam","Sheltin","Troy","Vincent","Wade","Wesley","Duane","Elmo","Esteban","Frankie","Ronald","Tyson","Bart","Matt","Tim","Wright","Jeffery","Kyle","Alessandro","Estaban","Kieran","Ramses","Casey","Dakota","Jared","Kalani","Keoni","Lawrence","Logan","Robert","Roddy","Yasu","Derek","Jacob","Bruce","Clayton"],["Briana","Dawn","Denise","Diana","Elaine","Kara","Kaylee","Lori","Nicole","Nikki","Paula","Susie","Wendy","Alice","Beth","Beverly","Brenda","Dana","Debra","Grace","Jenny","Katie","Laurel","Linda","Missy","Sharon","Tanya","Tara","Tisha","Carlee","Imani","Isabelle","Kyla","Sienna","Abigail","Amara","Anya","Connie","Maria","Melissa","Nora","Shirley","Shania","Tiffany","Aubree","Cassandra","Claire","Crystal","Erica","Gabrielle","Haley","Jessica","Joanna","Lydia","Mallory","Mary","Miranda","Paige","Sophia","Vanessa","Chelan","Debbie","Joy","Kendra","Leona","Mina","Caroline","Joyce","Larissa","Rebecca","Tyra","Dara","Desiree","Kaoru","Ruth","Coral","Genevieve","Isla","Marissa","Romy","Sheryl","Alexandria","Alicia","Chelsea","Jade","Kelsie","Laura","Portia","Shelby","Sara","Tiare","Kyra","Natasha","Layla","Scarlett","Cora"]], - [TrainerType.TWINS]: ["Amy & May","Jo & Zoe","Meg & Peg","Ann & Anne","Lea & Pia","Amy & Liv","Gina & Mia","Miu & Yuki","Tori & Tia","Eli & Anne","Jen & Kira","Joy & Meg","Kiri & Jan","Miu & Mia","Emma & Lil","Liv & Liz","Teri & Tia","Amy & Mimi","Clea & Gil","Day & Dani","Kay & Tia","Tori & Til","Saya & Aya","Emy & Lin","Kumi & Amy","Mayo & May","Ally & Amy","Lia & Lily","Rae & Ula","Sola & Ana","Tara & Val","Faith & Joy","Nana & Nina"], - [TrainerType.VETERAN]: [["Armando","Brenden","Brian","Clayton","Edgar","Emanuel","Grant","Harlan","Terrell","Arlen","Chester","Hugo","Martell","Ray","Shaun","Abraham","Carter","Claude","Jerry","Lucius","Murphy","Rayne","Ron","Sinan","Sterling","Vincent","Zach","Gerard","Gilles","Louis","Timeo","Akira","Don","Eric","Harry","Leon","Roger","Angus","Aristo","Brone","Johnny"],["Julia","Karla","Kim","Sayuri","Tiffany","Cathy","Cecile","Chloris","Denae","Gina","Maya","Oriana","Portia","Rhona","Rosaline","Catrina","Inga","Trisha","Heather","Lynn","Sheri","Alonsa","Ella","Leticia","Kiara"]], - [TrainerType.WAITER]: [["Bert","Clint","Maxwell","Lou"],["Kati","Aurora","Bonita","Flo","Tia","Jan","Olwen","Paget","Paula","Talia"]], - [TrainerType.WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], - [TrainerType.YOUNGSTER]: [["Albert","Gordon","Ian","Jason","Jimmy","Mikey","Owen","Samuel","Warren","Allen","Ben","Billy","Calvin","Dillion","Eddie","Joey","Josh","Neal","Timmy","Tommy","Breyden","Deandre","Demetrius","Dillon","Jaylen","Johnson","Shigenobu","Chad","Cole","Cordell","Dan","Dave","Destin","Nash","Tyler","Yasu","Austin","Dallas","Darius","Donny","Jonathon","Logan","Michael","Oliver","Sebastian","Tristan","Wayne","Norman","Roland","Regis","Abe","Astor","Keita","Kenneth","Kevin","Kyle","Lester","Masao","Nicholas","Parker","Wes","Zachary","Cody","Henley","Jaye","Karl","Kenny","Masahiro","Pedro","Petey","Sinclair","Terrell","Waylon","Aidan","Anthony","David","Jacob","Jayden","Cutler","Ham","Caleb","Kai","Honus","Kenway","Bret","Chris","Cid","Dennis","Easton","Ken","Robby","Ronny","Shawn","Benjamin","Jake","Travis","Adan","Aday","Beltran","Elian","Hernan","Julen","Luka","Roi","Bernie","Dustin","Jonathan","Wyatt"],["Alice","Bridget","Carrie","Connie","Dana","Ellen","Krise","Laura","Linda","Michelle","Shannon","Andrea","Crissy","Janice","Robin","Sally","Tiana","Haley","Ali","Ann","Dalia","Dawn","Iris","Joana","Julia","Kay","Lisa","Megan","Mikaela","Miriam","Paige","Reli","Blythe","Briana","Caroline","Cassidy","Kaitlin","Madeline","Molly","Natalie","Samantha","Sarah","Cathy","Dye","Eri","Eva","Fey","Kara","Lurleen","Maki","Mali","Maya","Miki","Sibyl","Daya","Diana","Flo","Helia","Henrietta","Isabel","Mai","Persephone","Serena","Anna","Charlotte","Elin","Elsa","Lise","Sara","Suzette","Audrey","Emmy","Isabella","Madison","Rika","Rylee","Salla","Ellie","Alexandra","Amy","Lass","Brittany","Chel","Cindy","Dianne","Emily","Emma","Evelyn","Hana","Harleen","Hazel","Jocelyn","Katrina","Kimberly","Lina","Marge","Mila","Mizuki","Rena","Sal","Satoko","Summer","Tomoe","Vicky","Yue","Yumi","Lauren","Rei","Riley","Lois","Nancy","Tammy","Terry"]], - [TrainerType.HEX_MANIAC]: ["Kindra","Patricia","Tammy","Tasha","Valerie","Alaina","Kathleen","Leah","Makie","Sylvia","Anina","Arachna","Carrie","Desdemona","Josette","Luna","Melanie","Osanna","Raziah"], + [TrainerType.ACE_TRAINER]: [["Aaron","Allen","Blake","Brian","Gaven","Jake","Kevin","Mike","Nick","Paul","Ryan","Sean","Darin","Albert","Berke","Clyde","Edgar","George","Leroy","Owen","Parker","Randall","Ruben","Samuel","Vincent","Warren","Wilton","Zane","Alfred","Braxton","Felix","Gerald","Jonathan","Leonel","Marcel","Mitchell","Quincy","Roderick","Colby","Rolando","Yuji","Abel","Anton","Arthur","Cesar","Dalton","Dennis","Ernest","Garrett","Graham","Henry","Isaiah","Jonah","Jose","Keenan","Micah","Omar","Quinn","Rodolfo","Saul","Sergio","Skylar","Stefan","Zachery","Alton","Arabella","Bonita","Cal","Cody","French","Kobe","Paulo","Shaye","Austin","Beckett","Charlie","Corky","David","Dwayne","Elmer","Jesse","Jared","Johan","Jordan","Kipp","Lou","Terry","Tom","Webster","Billy","Doyle","Enzio","Geoff","Grant","Kelsey","Miguel","Pierce","Ray","Santino","Shel","Adelbert","Bence","Emil","Evan","Mathis","Maxim","Neil","Rico","Robbie","Theo","Viktor","Benedict","Cornelius","Hisato","Leopold","Neville","Vito","Chase","Cole","Hiroshi","Jackson","Jim","Kekoa","Makana","Yuki","Elwood","Seth","Alvin","Arjun","Arnold","Cameron","Carl","Carlton","Christopher","Dave","Dax","Dominic","Edmund","Finn","Fred","Garret","Grayson","Jace","Jaxson","Jay","Jirard","Johnson","Kayden","Kite","Louis","Mac","Marty","Percy","Raymond","Ronnie","Satch","Tim","Zach","Conner","Vince","Bedro","Boda","Botan","Daras","Dury","Herton","Rewn","Stum","Tock","Trilo","Berki","Cruik","Dazon","Desid","Dillot","Farfin","Forgon","Hebel","Morfon","Moril","Shadd","Vanhub","Bardo","Carben","Degin","Gorps","Klept","Lask","Malex","Mopar","Niled","Noxon","Teslor","Tetil"],["Beth","Carol","Cybil","Emma","Fran","Gwen","Irene","Jenn","Joyce","Kate","Kelly","Lois","Lola","Megan","Quinn","Reena","Cara","Alexa","Brooke","Caroline","Elaine","Hope","Jennifer","Jody","Julie","Lori","Mary","Michelle","Shannon","Wendy","Alexia","Alicia","Athena","Carolina","Cristin","Darcy","Dianne","Halle","Jazmyn","Katelynn","Keira","Marley","Allyson","Kathleen","Naomi","Alyssa","Ariana","Brandi","Breanna","Brenda","Brenna","Catherine","Clarice","Dana","Deanna","Destiny","Jamie","Jasmin","Kassandra","Laura","Maria","Mariah","Maya","Meagan","Mikayla","Monique","Natasha","Olivia","Sandra","Savannah","Sydney","Moira","Piper","Salma","Allison","Beverly","Cathy","Cheyenne","Clara","Dara","Eileen","Glinda","Junko","Lena","Lucille","Mariana","Olwen","Shanta","Stella","Angi","Belle","Chandra","Cora","Eve","Jacqueline","Jeanne","Juliet","Kathrine","Layla","Lucca","Melina","Miki","Nina","Sable","Shelly","Summer","Trish","Vicki","Alanza","Cordelia","Hilde","Imelda","Michele","Mireille","Claudia","Constance","Harriet","Honor","Melba","Portia","Alexis","Angela","Karla","Lindsey","Tori","Sheri","Jada","Kailee","Amanda","Annie","Kindra","Kyla","Sofia","Yvette","Becky","Flora","Gloria","Buna","Ferda","Lehan","Liqui","Lomen","Neira","Atilo","Detta","Gilly","Gosney","Levens","Moden","Rask","Rateis","Rosno","Tynan","Veron","Zoel","Cida","Dibsin","Dodin","Ebson","Equin","Flostin","Gabsen","Halsion","Hileon","Quelor","Rapeel","Roze","Tensin"]], + [TrainerType.ARTIST]: [["Ismael","William","Horton","Pierre","Zach","Gough","Salvador","Vincent","Duncan"],["Georgia"]], + [TrainerType.BACKERS]: [["Alf & Fred","Hawk & Dar","Joe & Ross","Les & Web","Masa & Yas","Stu & Art"],["Ai & Ciel","Ami & Eira","Cam & Abby","Fey & Sue","Kat & Phae","Kay & Ali","Ava & Aya","Cleo & Rio","May & Mal"]], + [TrainerType.BACKPACKER]: [["Alexander","Carlos","Herman","Jerome","Keane","Kelsey","Kiyo","Michael","Nate","Peter","Sam","Stephen","Talon","Terrance","Toru","Waylon","Boone","Clifford","Ivan","Kendall","Lowell","Randall","Reece","Roland","Shane","Walt","Farid","Heike","Joren","Lane","Roderick","Darnell","Deon","Emory","Graeme","Grayson","Ashley","Mikiko","Kiana","Perdy","Maria","Yuho","Peren","Barbara","Diane","Ruth","Aitor","Alex","Arturo","Asier","Jaime","Jonathan","Julio","Kevin","Kosuke","Lander","Markel","Mateo","Nil","Pau","Samuel"],["Anna","Corin","Elaine","Emi","Jill","Kumiko","Liz","Lois","Lora","Molly","Patty","Ruth","Vicki","Annie","Blossom","Clara","Eileen","Mae","Myra","Rachel","Tami"]], + [TrainerType.BAKER]: ["Chris","Jenn","Lilly"], + [TrainerType.BEAUTY]: ["Cassie","Julia","Olivia","Samantha","Valerie","Victoria","Bridget","Connie","Jessica","Johanna","Melissa","Sheila","Shirley","Tiffany","Namiko","Thalia","Grace","Lola","Lori","Maura","Tamia","Cyndy","Devon","Gabriella","Harley","Lindsay","Nicola","Callie","Charlotte","Kassandra","December","Fleming","Nikola","Aimee","Anais","Brigitte","Cassandra","Andrea","Brittney","Carolyn","Krystal","Alexis","Alice","Aina","Anya","Arianna","Aubrey","Beverly","Camille","Beauty","Evette","Hansol","Haruka","Jill","Jo","Lana","Lois","Lucy","Mai","Nickie","Nicole","Prita","Rose","Shelly","Suzy","Tessa","Anita","Alissa","Rita","Cudsy","Eloff","Miru","Minot","Nevah","Niven","Ogoin"], + [TrainerType.BIKER]: ["Charles","Dwayne","Glenn","Harris","Joel","Riley","Zeke","Alex","Billy","Ernest","Gerald","Hideo","Isaac","Jared","Jaren","Jaxon","Jordy","Lao","Lukas","Malik","Nikolas","Ricardo","Ruben","Virgil","William","Aiden","Dale","Dan","Jacob","Markey","Reese","Teddy","Theron","Jeremy","Morgann","Phillip","Philip","Stanley","Dillon"], + [TrainerType.BLACK_BELT]: [["Kenji","Lao","Lung","Nob","Wai","Yoshi","Atsushi","Daisuke","Hideki","Hitoshi","Kiyo","Koichi","Koji","Yuji","Cristian","Rhett","Takao","Theodore","Zander","Aaron","Hugh","Mike","Nicolas","Shea","Takashi","Adam","Carl","Colby","Darren","David","Davon","Derek","Eddie","Gregory","Griffin","Jarrett","Jeffery","Kendal","Kyle","Luke","Miles","Nathaniel","Philip","Rafael","Ray","Ricky","Sean","Willie","Ander","Manford","Benjamin","Corey","Edward","Grant","Jay","Kendrew","Kentaro","Ryder","Teppei","Thomas","Tyrone","Andrey","Donny","Drago","Gordon","Grigor","Jeriel","Kenneth","Martell","Mathis","Rich","Rocky","Rodrigo","Wesley","Zachery","Alonzo","Cadoc","Gunnar","Igor","Killian","Markus","Ricardo","Yanis","Banting","Clayton","Duane","Earl","Greg","Roy","Terry","Tracy","Walter","Alvaro","Curtis","Francis","Ross","Brice","Cheng","Dudley","Eric","Kano","Masahiro","Randy","Ryuji","Steve","Tadashi","Wong","Yuen","Brian","Carter","Reece","Nick","Yang"],["Cora","Cyndy","Jill","Laura","Sadie","Tessa","Vivian","Aisha","Callie","Danielle","Helene","Jocelyn","Lilith","Paula","Reyna","Helen","Kelsey","Tyler","Amy","Chandra","Hillary","Janie","Lee","Maggie","Mikiko","Miriam","Sharon","Susie","Xiao","Alize","Azra","Brenda","Chalina","Chan","Glinda","Maki","Tia","Tiffany","Wendy","Andrea","Gabrielle","Gerardine","Hailey","Hedvig","Justine","Kinsey","Sigrid","Veronique","Tess"]], + [TrainerType.BREEDER]: [["Isaac","Myles","Salvadore","Albert","Kahlil","Eustace","Galen","Owen","Addison","Marcus","Foster","Cory","Glenn","Jay","Wesley","William","Adrian","Bradley","Jaime"],["Allison","Alize","Bethany","Lily","Lydia","Gabrielle","Jayden","Pat","Veronica","Amber","Jennifer","Kaylee","Adelaide","Brooke","Ethel","April","Irene","Magnolia","Amala","Mercy","Amanda","Ikue","Savannah","Yuka","Chloe","Debra","Denise","Elena"]], + [TrainerType.CLERK]: [["Chaz","Clemens","Doug","Fredric","Ivan","Isaac","Nelson","Wade","Warren","Augustin","Gilligan","Cody","Jeremy","Shane","Dugal","Royce","Ronald"],["Alberta","Ingrid","Katie","Piper","Trisha","Wren","Britney","Lana","Jessica","Kristen","Michelle","Gabrielle"]], + [TrainerType.CYCLIST]: [["Axel","James","John","Ryan","Hector","Jeremiah"],["Kayla","Megan","Nicole","Rachel","Krissa","Adelaide"]], + [TrainerType.DANCER]: ["Brian","Davey","Dirk","Edmond","Mickey","Raymond","Cara","Julia","Maika","Mireille","Ronda","Zoe"], + [TrainerType.DEPOT_AGENT]: ["Josh","Hank","Vincent"], + [TrainerType.DOCTOR]: [["Hank","Jerry","Jules","Logan","Wayne","Braid","Derek","Heath","Julius","Kit","Graham"],["Kirsten","Sachiko","Shery","Carol","Dixie","Mariah"]], + [TrainerType.FISHERMAN]: ["Andre","Arnold","Barney","Chris","Edgar","Henry","Jonah","Justin","Kyle","Martin","Marvin","Ralph","Raymond","Scott","Stephen","Wilton","Tully","Andrew","Barny","Carter","Claude","Dale","Elliot","Eugene","Ivan","Ned","Nolan","Roger","Ronald","Wade","Wayne","Darian","Kai","Chip","Hank","Kaden","Tommy","Tylor","Alec","Brett","Cameron","Cody","Cole","Cory","Erick","George","Joseph","Juan","Kenneth","Luc","Miguel","Travis","Walter","Zachary","Josh","Gideon","Kyler","Liam","Murphy","Bruce","Damon","Devon","Hubert","Jones","Lydon","Mick","Pete","Sean","Sid","Vince","Bucky","Dean","Eustace","Kenzo","Leroy","Mack","Ryder","Ewan","Finn","Murray","Seward","Shad","Wharton","Finley","Fisher","Fisk","River","Sheaffer","Timin","Carl","Ernest","Hal","Herbert","Hisato","Mike","Vernon","Harriet","Marina","Chase"], + [TrainerType.GUITARIST]: ["Anna","Beverly","January","Tina","Alicia","Claudia","Julia","Lidia","Mireia","Noelia","Sara","Sheila","Tatiana"], + [TrainerType.HARLEQUIN]: ["Charley","Ian","Jack","Kerry","Louis","Pat","Paul","Rick","Anders","Clarence","Gary"], + [TrainerType.HIKER]: ["Anthony","Bailey","Benjamin","Daniel","Erik","Jim","Kenny","Leonard","Michael","Parry","Phillip","Russell","Sidney","Tim","Timothy","Alan","Brice","Clark","Eric","Lenny","Lucas","Mike","Trent","Devan","Eli","Marc","Sawyer","Allen","Daryl","Dudley","Earl","Franklin","Jeremy","Marcos","Nob","Oliver","Wayne","Alexander","Damon","Jonathan","Justin","Kevin","Lorenzo","Louis","Maurice","Nicholas","Reginald","Robert","Theodore","Bruce","Clarke","Devin","Dwight","Edwin","Eoin","Noland","Russel","Andy","Bret","Darrell","Gene","Hardy","Hugh","Jebediah","Jeremiah","Kit","Neil","Terrell","Don","Doug","Hunter","Jared","Jerome","Keith","Manuel","Markus","Otto","Shelby","Stephen","Teppei","Tobias","Wade","Zaiem","Aaron","Alain","Bergin","Bernard","Brent","Corwin","Craig","Delmon","Dunstan","Orestes","Ross","Davian","Calhoun","David","Gabriel","Ryan","Thomas","Travis","Zachary","Anuhea","Barnaby","Claus","Collin","Colson","Dexter","Dillan","Eugine","Farkas","Hisato","Julius","Kenji","Irwin","Lionel","Paul","Richter","Valentino","Donald","Douglas","Kevyn","Angela","Carla","Celia","Daniela","Estela","Fatima","Helena","Leire","Lucia","Luna","Manuela","Mar","Marina","Miyu","Nancy","Nerea","Paula","Rocio","Yanira","Chester"], + [TrainerType.HOOLIGANS]: ["Jim & Cas","Rob & Sal"], + [TrainerType.HOOPSTER]: ["Bobby","John","Lamarcus","Derrick","Nicolas"], + [TrainerType.INFIELDER]: ["Alex","Connor","Todd"], + [TrainerType.JANITOR]: ["Caleb","Geoff","Brady","Felix","Orville","Melvin","Shawn"], + [TrainerType.LINEBACKER]: ["Bob","Dan","Jonah"], + [TrainerType.MAID]: ["Belinda","Sophie","Emily","Elena","Clare","Alica","Tanya","Tammy"], + [TrainerType.MUSICIAN]: ["Boris","Preston","Charles","Clyde","Vincent","Dalton","Kirk","Shawn","Fabian","Fernando","Joseph","Marcos","Arturo","Jerry","Lonnie","Tony"], + [TrainerType.NURSERY_AIDE]: ["Autumn","Briana","Leah","Miho","Ethel","Hollie","Ilse","June","Kimya","Rosalyn"], + [TrainerType.OFFICER]: ["Dirk","Keith","Alex","Bobby","Caleb","Danny","Dylan","Thomas","Daniel","Jeff","Braven","Dell","Neagle","Haruki","Mitchell","Raymond"], + [TrainerType.PARASOL_LADY]: ["Angelica","Clarissa","Madeline","Akari","Annabell","Kayley","Rachel","Alexa","Sabrina","April","Gwyneth","Laura","Lumi","Mariah","Melita","Nicole","Tihana","Ingrid","Tyra"], + [TrainerType.PILOT]: ["Chase","Leonard","Ted","Elron","Ewing","Flynn","Winslow"], + [TrainerType.POKEFAN]: [["Alex","Allan","Brandon","Carter","Colin","Derek","Jeremy","Joshua","Rex","Robert","Trevor","William","Colton","Miguel","Francisco","Kaleb","Leonard","Boone","Elliot","Jude","Norbert","Corey","Gabe","Baxter"],["Beverly","Georgia","Jaime","Ruth","Isabel","Marissa","Vanessa","Annika","Bethany","Kimberly","Meredith","Rebekah","Eleanor","Darcy","Lydia","Sachiko","Abigail","Agnes","Lydie","Roisin","Tara","Carmen","Janet"]], + [TrainerType.PRESCHOOLER]: [["Billy","Doyle","Evan","Homer","Tully","Albert","Buster","Greg","Ike","Jojo","Tyrone","Adrian","Oliver","Hayden","Hunter","Kaleb","Liam","Dylan"],["Juliet","Mia","Sarah","Wendy","Winter","Chrissy","Eva","Lin","Samantha","Ella","Lily","Natalie","Ailey","Hannah","Malia","Kindra","Nancy"]], + [TrainerType.PSYCHIC]: [["Fidel","Franklin","Gilbert","Greg","Herman","Jared","Mark","Nathan","Norman","Phil","Richard","Rodney","Cameron","Edward","Fritz","Joshua","Preston","Virgil","William","Alvaro","Blake","Cedric","Keenan","Nicholas","Dario","Johan","Lorenzo","Tyron","Bryce","Corbin","Deandre","Elijah","Kody","Landon","Maxwell","Mitchell","Sterling","Eli","Nelson","Vernon","Gaven","Gerard","Low","Micki","Perry","Rudolf","Tommy","Al","Nandor","Tully","Arthur","Emanuel","Franz","Harry","Paschal","Robert","Sayid","Angelo","Anton","Arin","Avery","Danny","Frasier","Harrison","Jaime","Ross","Rui","Vlad","Mason"],["Alexis","Hannah","Jacki","Jaclyn","Kayla","Maura","Samantha","Alix","Brandi","Edie","Macey","Mariella","Marlene","Laura","Rodette","Abigail","Brittney","Chelsey","Daisy","Desiree","Kendra","Lindsey","Rachael","Valencia","Belle","Cybil","Doreen","Dua","Future","Lin","Madhu","Alia","Ena","Joyce","Lynette","Olesia","Sarah"]], + [TrainerType.RANGER]: [["Carlos","Jackson","Sebastian","Gav","Lorenzo","Logan","Nicolas","Trenton","Deshawn","Dwayne","Jeffery","Kyler","Taylor","Alain","Claude","Crofton","Forrest","Harry","Jaden","Keith","Lewis","Miguel","Pedro","Ralph","Richard","Bret","Daryl","Eddie","Johan","Leaf","Louis","Maxwell","Parker","Rick","Steve","Bjorn","Chaise","Dean","Lee","Maurice","Nash","Ralf","Reed","Shinobu","Silas"],["Catherine","Jenna","Sophia","Merdith","Nora","Beth","Chelsea","Katelyn","Madeline","Allison","Ashlee","Felicia","Krista","Annie","Audra","Brenda","Chloris","Eliza","Heidi","Irene","Mary","Mylene","Shanti","Shelly","Thalia","Anja","Briana","Dianna","Elaine","Elle","Hillary","Katie","Lena","Lois","Malory","Melita","Mikiko","Naoko","Serenity","Ambre","Brooke","Clementine","Melina","Petra","Twiggy"]], + [TrainerType.RICH]: [["Alfred","Edward","Gregory","Preston","Thomas","Tucker","Walter","Clifford","Everett","Micah","Nate","Pierre","Terrance","Arthur","Brooks","Emanuel","Lamar","Jeremy","Leonardo","Milton","Frederic","Renaud","Robert","Yan","Daniel","Sheldon","Stonewall","Gerald","Ronald","Smith","Stanley","Reginald","Orson","Wilco","Caden","Glenn"],["Rebecca","Reina","Cassandra","Emilia","Grace","Marian","Elizabeth","Kathleen","Sayuri","Caroline","Judy"]], + [TrainerType.RICH_KID]: [["Garret","Winston","Dawson","Enrique","Jason","Roman","Trey","Liam","Anthony","Brad","Cody","Manuel","Martin","Pierce","Rolan","Keenan","Filbert","Antoin","Cyus","Diek","Dugo","Flitz","Jurek","Lond","Perd","Quint","Basto","Benit","Brot","Denc","Guyit","Marcon","Perc","Puros","Roex","Sainz","Symin","Tark","Venak"],["Anette","Brianna","Cindy","Colleen","Daphne","Elizabeth","Naomi","Sarah","Charlotte","Gillian","Jacki","Lady","Melissa","Celeste","Colette","Elizandra","Isabel","Lynette","Magnolia","Sophie","Lina","Dulcie","Auro","Brin","Caril","Eloos","Gwin","Illa","Kowly","Rima","Ristin","Vesey","Brena","Deasy","Denslon","Kylet","Nemi","Rene","Sanol","Stouner","Sturk","Talmen","Zoila"]], + [TrainerType.ROUGHNECK]: ["Camron","Corey","Gabriel","Isaiah","Jamal","Koji","Luke","Paxton","Raul","Zeek","Kirby","Chance","Dave","Fletcher","Johnny","Reese","Joey","Ricky","Silvester","Martin"], + [TrainerType.SCIENTIST]: [["Jed","Marc","Mitch","Rich","Ross","Beau","Braydon","Connor","Ed","Ivan","Jerry","Jose","Joshua","Parker","Rodney","Taylor","Ted","Travis","Zackery","Darrius","Emilio","Fredrick","Shaun","Stefano","Travon","Daniel","Garett","Gregg","Linden","Lowell","Trenton","Dudley","Luke","Markus","Nathan","Orville","Randall","Ron","Ronald","Simon","Steve","William","Franklin","Clarke","Jacques","Terrance","Ernst","Justus","Ikaika","Jayson","Kyle","Reid","Tyrone","Adam","Albert","Alphonse","Cory","Donnie","Elton","Francis","Gordon","Herbert","Humphrey","Jordan","Julian","Keaton","Levi","Melvin","Murray","West","Craig","Coren","Dubik","Kotan","Lethco","Mante","Mort","Myron","Odlow","Ribek","Roeck","Vogi","Vonder","Zogo","Doimo","Doton","Durel","Hildon","Kukla","Messa","Nanot","Platen","Raburn","Reman","Acrod","Coffy","Elrok","Foss","Hardig","Hombol","Hospel","Kaller","Klots","Krilok","Limar","Loket","Mesak","Morbit","Newin","Orill","Tabor","Tekot"],["Blythe","Chan","Kathrine","Marie","Maria","Naoko","Samantha","Satomi","Shannon","Athena","Caroline","Lumi","Lumina","Marissa","Sonia"]], + [TrainerType.SMASHER]: ["Aspen","Elena","Mari","Amy","Lizzy"], + [TrainerType.SNOW_WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], + [TrainerType.STRIKER]: ["Marco","Roberto","Tony"], + [TrainerType.SCHOOL_KID]: [["Alan","Billy","Chad","Danny","Dudley","Jack","Joe","Johnny","Kipp","Nate","Ricky","Tommy","Jerry","Paul","Ted","Chance","Esteban","Forrest","Harrison","Connor","Sherman","Torin","Travis","Al","Carter","Edgar","Jem","Sammy","Shane","Shayne","Alvin","Keston","Neil","Seymour","William","Carson","Clark","Nolan"],["Georgia","Karen","Meiko","Christine","Mackenzie","Tiera","Ann","Gina","Lydia","Marsha","Millie","Sally","Serena","Silvia","Alberta","Cassie","Mara","Rita","Georgie","Meena","Nitzel"]], + [TrainerType.SWIMMER]: [["Berke","Cameron","Charlie","George","Harold","Jerome","Kirk","Mathew","Parker","Randall","Seth","Simon","Tucker","Austin","Barry","Chad","Cody","Darrin","David","Dean","Douglas","Franklin","Gilbert","Herman","Jack","Luis","Matthew","Reed","Richard","Rodney","Roland","Spencer","Stan","Tony","Clarence","Declan","Dominik","Harrison","Kevin","Leonardo","Nolen","Pete","Santiago","Axle","Braden","Finn","Garrett","Mymo","Reece","Samir","Toby","Adrian","Colton","Dillon","Erik","Evan","Francisco","Glenn","Kurt","Oscar","Ricardo","Sam","Sheltin","Troy","Vincent","Wade","Wesley","Duane","Elmo","Esteban","Frankie","Ronald","Tyson","Bart","Matt","Tim","Wright","Jeffery","Kyle","Alessandro","Estaban","Kieran","Ramses","Casey","Dakota","Jared","Kalani","Keoni","Lawrence","Logan","Robert","Roddy","Yasu","Derek","Jacob","Bruce","Clayton"],["Briana","Dawn","Denise","Diana","Elaine","Kara","Kaylee","Lori","Nicole","Nikki","Paula","Susie","Wendy","Alice","Beth","Beverly","Brenda","Dana","Debra","Grace","Jenny","Katie","Laurel","Linda","Missy","Sharon","Tanya","Tara","Tisha","Carlee","Imani","Isabelle","Kyla","Sienna","Abigail","Amara","Anya","Connie","Maria","Melissa","Nora","Shirley","Shania","Tiffany","Aubree","Cassandra","Claire","Crystal","Erica","Gabrielle","Haley","Jessica","Joanna","Lydia","Mallory","Mary","Miranda","Paige","Sophia","Vanessa","Chelan","Debbie","Joy","Kendra","Leona","Mina","Caroline","Joyce","Larissa","Rebecca","Tyra","Dara","Desiree","Kaoru","Ruth","Coral","Genevieve","Isla","Marissa","Romy","Sheryl","Alexandria","Alicia","Chelsea","Jade","Kelsie","Laura","Portia","Shelby","Sara","Tiare","Kyra","Natasha","Layla","Scarlett","Cora"]], + [TrainerType.TWINS]: ["Amy & May","Jo & Zoe","Meg & Peg","Ann & Anne","Lea & Pia","Amy & Liv","Gina & Mia","Miu & Yuki","Tori & Tia","Eli & Anne","Jen & Kira","Joy & Meg","Kiri & Jan","Miu & Mia","Emma & Lil","Liv & Liz","Teri & Tia","Amy & Mimi","Clea & Gil","Day & Dani","Kay & Tia","Tori & Til","Saya & Aya","Emy & Lin","Kumi & Amy","Mayo & May","Ally & Amy","Lia & Lily","Rae & Ula","Sola & Ana","Tara & Val","Faith & Joy","Nana & Nina"], + [TrainerType.VETERAN]: [["Armando","Brenden","Brian","Clayton","Edgar","Emanuel","Grant","Harlan","Terrell","Arlen","Chester","Hugo","Martell","Ray","Shaun","Abraham","Carter","Claude","Jerry","Lucius","Murphy","Rayne","Ron","Sinan","Sterling","Vincent","Zach","Gerard","Gilles","Louis","Timeo","Akira","Don","Eric","Harry","Leon","Roger","Angus","Aristo","Brone","Johnny"],["Julia","Karla","Kim","Sayuri","Tiffany","Cathy","Cecile","Chloris","Denae","Gina","Maya","Oriana","Portia","Rhona","Rosaline","Catrina","Inga","Trisha","Heather","Lynn","Sheri","Alonsa","Ella","Leticia","Kiara"]], + [TrainerType.WAITER]: [["Bert","Clint","Maxwell","Lou"],["Kati","Aurora","Bonita","Flo","Tia","Jan","Olwen","Paget","Paula","Talia"]], + [TrainerType.WORKER]: [["Braden","Brendon","Colin","Conrad","Dillan","Gary","Gerardo","Holden","Jackson","Mason","Quentin","Willy","Noel","Arnold","Brady","Brand","Cairn","Cliff","Don","Eddie","Felix","Filipe","Glenn","Gus","Heath","Matthew","Patton","Rich","Rob","Ryan","Scott","Shelby","Sterling","Tyler","Victor","Zack","Friedrich","Herman","Isaac","Leo","Maynard","Mitchell","Morgann","Nathan","Niel","Pasqual","Paul","Tavarius","Tibor","Dimitri","Narek","Yusif","Frank","Jeff","Vaclav","Ovid","Francis","Keith","Russel","Sangon","Toway","Bomber","Chean","Demit","Hubor","Kebile","Laber","Ordo","Retay","Ronix","Wagel","Dobit","Kaster","Lobel","Releo","Saken","Rustix"],["Georgia","Sandra","Yvonne"]], + [TrainerType.YOUNGSTER]: [["Albert","Gordon","Ian","Jason","Jimmy","Mikey","Owen","Samuel","Warren","Allen","Ben","Billy","Calvin","Dillion","Eddie","Joey","Josh","Neal","Timmy","Tommy","Breyden","Deandre","Demetrius","Dillon","Jaylen","Johnson","Shigenobu","Chad","Cole","Cordell","Dan","Dave","Destin","Nash","Tyler","Yasu","Austin","Dallas","Darius","Donny","Jonathon","Logan","Michael","Oliver","Sebastian","Tristan","Wayne","Norman","Roland","Regis","Abe","Astor","Keita","Kenneth","Kevin","Kyle","Lester","Masao","Nicholas","Parker","Wes","Zachary","Cody","Henley","Jaye","Karl","Kenny","Masahiro","Pedro","Petey","Sinclair","Terrell","Waylon","Aidan","Anthony","David","Jacob","Jayden","Cutler","Ham","Caleb","Kai","Honus","Kenway","Bret","Chris","Cid","Dennis","Easton","Ken","Robby","Ronny","Shawn","Benjamin","Jake","Travis","Adan","Aday","Beltran","Elian","Hernan","Julen","Luka","Roi","Bernie","Dustin","Jonathan","Wyatt"],["Alice","Bridget","Carrie","Connie","Dana","Ellen","Krise","Laura","Linda","Michelle","Shannon","Andrea","Crissy","Janice","Robin","Sally","Tiana","Haley","Ali","Ann","Dalia","Dawn","Iris","Joana","Julia","Kay","Lisa","Megan","Mikaela","Miriam","Paige","Reli","Blythe","Briana","Caroline","Cassidy","Kaitlin","Madeline","Molly","Natalie","Samantha","Sarah","Cathy","Dye","Eri","Eva","Fey","Kara","Lurleen","Maki","Mali","Maya","Miki","Sibyl","Daya","Diana","Flo","Helia","Henrietta","Isabel","Mai","Persephone","Serena","Anna","Charlotte","Elin","Elsa","Lise","Sara","Suzette","Audrey","Emmy","Isabella","Madison","Rika","Rylee","Salla","Ellie","Alexandra","Amy","Lass","Brittany","Chel","Cindy","Dianne","Emily","Emma","Evelyn","Hana","Harleen","Hazel","Jocelyn","Katrina","Kimberly","Lina","Marge","Mila","Mizuki","Rena","Sal","Satoko","Summer","Tomoe","Vicky","Yue","Yumi","Lauren","Rei","Riley","Lois","Nancy","Tammy","Terry"]], + [TrainerType.HEX_MANIAC]: ["Kindra","Patricia","Tammy","Tasha","Valerie","Alaina","Kathleen","Leah","Makie","Sylvia","Anina","Arachna","Carrie","Desdemona","Josette","Luna","Melanie","Osanna","Raziah"], }; +// function used in a commented code +// eslint-disable-next-line @typescript-eslint/no-unused-vars function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNames: Set, femaleTrainerNames: Set, forceFemale: boolean = false) { return new Promise(resolve => { fetch(`https://bulbapedia.bulbagarden.net/wiki/${url}_(Trainer_class)`) .then(response => response.text()) .then(html => { console.log(url); - const htmlDoc = parser.parseFromString(html, 'text/html'); - const trainerListHeader = htmlDoc.querySelector('#Trainer_list').parentElement; + const htmlDoc = parser.parseFromString(html, "text/html"); + const trainerListHeader = htmlDoc.querySelector("#Trainer_list").parentElement; const elements = [...trainerListHeader.parentElement.childNodes]; const startChildIndex = elements.indexOf(trainerListHeader); - const endChildIndex = elements.findIndex(h => h.nodeName === 'H2' && elements.indexOf(h) > startChildIndex); + const endChildIndex = elements.findIndex(h => h.nodeName === "H2" && elements.indexOf(h) > startChildIndex); const tables = elements.filter(t => { - if (t.nodeName !== 'TABLE' || t['className'] !== 'expandable') + if (t.nodeName !== "TABLE" || t["className"] !== "expandable") { return false; + } const childIndex = elements.indexOf(t); return childIndex > startChildIndex && childIndex < endChildIndex; }).map(t => t as Element); - console.log(url, tables) - for (let table of tables) { - const trainerRows = [...table.querySelectorAll('tr:not(:first-child)')].filter(r => r.children.length === 9); - for (let row of trainerRows) { + console.log(url, tables); + for (const table of tables) { + const trainerRows = [...table.querySelectorAll("tr:not(:first-child)")].filter(r => r.children.length === 9); + for (const row of trainerRows) { const nameCell = row.firstElementChild; const content = nameCell.innerHTML; - if (content.indexOf(' -1) { + if (content.indexOf(" -1) { const female = /♀/.test(content); - if (url === 'Twins') - console.log(content) + if (url === "Twins") { + console.log(content); + } const nameMatch = />([a-z]+(?: & [a-z]+)?)<\/a>/i.exec(content); - if (nameMatch) - (female || forceFemale ? femaleTrainerNames : trainerNames).add(nameMatch[1].replace('&', '&')); + if (nameMatch) { + (female || forceFemale ? femaleTrainerNames : trainerNames).add(nameMatch[1].replace("&", "&")); + } } } } resolve(); }); - }); + }); } /*export function scrapeTrainerNames() { @@ -190,4 +197,4 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam output += `\n};`; console.log(output); }); -}*/ \ No newline at end of file +}*/ diff --git a/src/data/type.ts b/src/data/type.ts index 35c56aecd326..f4a7839e327c 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -19,528 +19,529 @@ export enum Type { DARK, FAIRY, STELLAR -}; +} export type TypeDamageMultiplier = 0 | 0.125 | 0.25 | 0.5 | 1 | 2 | 4 | 8; export function getTypeDamageMultiplier(attackType: integer, defType: integer): TypeDamageMultiplier { - if (attackType === Type.UNKNOWN || defType === Type.UNKNOWN) + if (attackType === Type.UNKNOWN || defType === Type.UNKNOWN) { return 1; + } switch (defType) { + case Type.NORMAL: + switch (attackType) { + case Type.FIGHTING: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.ROCK: + case Type.BUG: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.ICE: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; + case Type.GHOST: + default: + return 0; + } + case Type.FIGHTING: + switch (attackType) { + case Type.FLYING: + case Type.PSYCHIC: + case Type.FAIRY: + return 2; case Type.NORMAL: - switch (attackType) { - case Type.FIGHTING: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.ROCK: - case Type.BUG: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.GHOST: - default: - return 0; - } case Type.FIGHTING: - switch (attackType) { - case Type.FLYING: - case Type.PSYCHIC: - case Type.FAIRY: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.POISON: - case Type.GROUND: - case Type.GHOST: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.ICE: - case Type.DRAGON: - return 1; - case Type.ROCK: - case Type.BUG: - case Type.DARK: - return 0.5; - default: - return 0; - } + case Type.POISON: + case Type.GROUND: + case Type.GHOST: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.ICE: + case Type.DRAGON: + return 1; + case Type.ROCK: + case Type.BUG: + case Type.DARK: + return 0.5; + default: + return 0; + } + case Type.FLYING: + switch (attackType) { + case Type.ROCK: + case Type.ELECTRIC: + case Type.ICE: + return 2; + case Type.NORMAL: case Type.FLYING: - switch (attackType) { - case Type.ROCK: - case Type.ELECTRIC: - case Type.ICE: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.GHOST: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.FIGHTING: - case Type.BUG: - case Type.GRASS: - return 0.5; - case Type.GROUND: - default: - return 0; - } case Type.POISON: - switch (attackType) { - case Type.GROUND: - case Type.PSYCHIC: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.ROCK: - case Type.GHOST: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.ELECTRIC: - case Type.ICE: - case Type.DRAGON: - case Type.DARK: - return 1; - case Type.FIGHTING: - case Type.POISON: - case Type.BUG: - case Type.GRASS: - case Type.FAIRY: - return 0.5; - default: - return 0; - } + case Type.GHOST: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; + case Type.FIGHTING: + case Type.BUG: + case Type.GRASS: + return 0.5; + case Type.GROUND: + default: + return 0; + } + case Type.POISON: + switch (attackType) { case Type.GROUND: - switch (attackType) { - case Type.WATER: - case Type.GRASS: - case Type.ICE: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.FLYING: - case Type.GROUND: - case Type.BUG: - case Type.GHOST: - case Type.STEEL: - case Type.FIRE: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.POISON: - case Type.ROCK: - return 0.5; - case Type.ELECTRIC: - default: - return 0; - } + case Type.PSYCHIC: + return 2; + case Type.NORMAL: + case Type.FLYING: case Type.ROCK: - switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.STEEL: - case Type.WATER: - case Type.GRASS: - return 2; - case Type.ROCK: - case Type.BUG: - case Type.GHOST: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.FIRE: - return 0.5; - default: - return 0; - } + case Type.GHOST: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.ELECTRIC: + case Type.ICE: + case Type.DRAGON: + case Type.DARK: + return 1; + case Type.FIGHTING: + case Type.POISON: + case Type.BUG: + case Type.GRASS: + case Type.FAIRY: + return 0.5; + default: + return 0; + } + case Type.GROUND: + switch (attackType) { + case Type.WATER: + case Type.GRASS: + case Type.ICE: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.FLYING: + case Type.GROUND: case Type.BUG: - switch (attackType) { - case Type.FLYING: - case Type.ROCK: - case Type.FIRE: - return 2; - case Type.NORMAL: - case Type.POISON: - case Type.BUG: - case Type.GHOST: - case Type.STEEL: - case Type.WATER: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.FIGHTING: - case Type.GROUND: - case Type.GRASS: - return 0.5; - default: - return 0; - } case Type.GHOST: - switch (attackType) { - case Type.GHOST: - case Type.DARK: - return 2; - case Type.FLYING: - case Type.GROUND: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: - return 1; - case Type.POISON: - case Type.BUG: - return 0.5; - case Type.NORMAL: - case Type.FIGHTING: - default: - return 0; - } case Type.STEEL: - switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.FIRE: - return 2; - case Type.GHOST: - case Type.WATER: - case Type.ELECTRIC: - case Type.DARK: - return 1; - case Type.NORMAL: - case Type.FLYING: - case Type.ROCK: - case Type.BUG: - case Type.STEEL: - case Type.GRASS: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: - return 0.5; - case Type.POISON: - default: - return 0; - } case Type.FIRE: - switch (attackType) { - case Type.GROUND: - case Type.ROCK: - case Type.WATER: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.FLYING: - case Type.POISON: - case Type.GHOST: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - return 1; - case Type.BUG: - case Type.STEEL: - case Type.FIRE: - case Type.GRASS: - case Type.ICE: - case Type.FAIRY: - return 0.5; - default: - return 0; - } + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; + case Type.POISON: + case Type.ROCK: + return 0.5; + case Type.ELECTRIC: + default: + return 0; + } + case Type.ROCK: + switch (attackType) { + case Type.FIGHTING: + case Type.GROUND: + case Type.STEEL: case Type.WATER: - switch (attackType) { - case Type.GRASS: - case Type.ELECTRIC: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.ROCK: - case Type.BUG: - case Type.GHOST: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.ICE: - return 0.5; - default: - return 0; - } case Type.GRASS: - switch (attackType) { - case Type.FLYING: - case Type.POISON: - case Type.BUG: - case Type.FIRE: - case Type.ICE: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.ROCK: - case Type.GHOST: - case Type.STEEL: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.GROUND: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - return 0.5; - default: - return 0; - } + return 2; + case Type.ROCK: + case Type.BUG: + case Type.GHOST: case Type.ELECTRIC: - switch (attackType) { - case Type.GROUND: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.POISON: - case Type.ROCK: - case Type.BUG: - case Type.GHOST: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.PSYCHIC: - case Type.ICE: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.FLYING: - case Type.STEEL: - case Type.ELECTRIC: - return 0.5; - default: - return 0; - } case Type.PSYCHIC: - switch (attackType) { - case Type.BUG: - case Type.GHOST: - case Type.DARK: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: - return 1; - case Type.FIGHTING: - case Type.PSYCHIC: - return 0.5; - default: - return 0; - } case Type.ICE: - switch (attackType) { - case Type.FIGHTING: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.BUG: - case Type.GHOST: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.DRAGON: - case Type.DARK: - case Type.FAIRY: - return 1; - case Type.ICE: - return 0.5; - default: - return 0; - } case Type.DRAGON: - switch (attackType) { - case Type.ICE: - case Type.DRAGON: - case Type.FAIRY: - return 2; - case Type.NORMAL: - case Type.FIGHTING: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.ROCK: - case Type.BUG: - case Type.GHOST: - case Type.STEEL: - case Type.PSYCHIC: - case Type.DARK: - return 1; - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - return 0.5; - default: - return 0; - } case Type.DARK: - switch (attackType) { - case Type.FIGHTING: - case Type.BUG: - case Type.FAIRY: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.GROUND: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.ICE: - case Type.DRAGON: - return 1; - case Type.GHOST: - case Type.DARK: - return 0.5; - case Type.PSYCHIC: - default: - return 0; - } case Type.FAIRY: - switch (attackType) { - case Type.POISON: - case Type.STEEL: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.GROUND: - case Type.ROCK: - case Type.GHOST: - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - case Type.PSYCHIC: - case Type.ICE: - case Type.FAIRY: - return 1; - case Type.FIGHTING: - case Type.BUG: - case Type.DARK: - return 0.5; - case Type.DRAGON: - default: - return 0; - } - case Type.STELLAR: return 1; - } -} - -export function getTypeRgb(type: Type): [ integer, integer, integer ] { - switch (type) { case Type.NORMAL: - return [ 168, 168, 120 ]; + case Type.FLYING: + case Type.POISON: + case Type.FIRE: + return 0.5; + default: + return 0; + } + case Type.BUG: + switch (attackType) { + case Type.FLYING: + case Type.ROCK: + case Type.FIRE: + return 2; + case Type.NORMAL: + case Type.POISON: + case Type.BUG: + case Type.GHOST: + case Type.STEEL: + case Type.WATER: + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.ICE: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; case Type.FIGHTING: - return [ 192, 48, 40 ]; + case Type.GROUND: + case Type.GRASS: + return 0.5; + default: + return 0; + } + case Type.GHOST: + switch (attackType) { + case Type.GHOST: + case Type.DARK: + return 2; case Type.FLYING: - return [ 168, 144, 240 ]; + case Type.GROUND: + case Type.ROCK: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 1; case Type.POISON: - return [ 160, 64, 160 ]; + case Type.BUG: + return 0.5; + case Type.NORMAL: + case Type.FIGHTING: + default: + return 0; + } + case Type.STEEL: + switch (attackType) { + case Type.FIGHTING: case Type.GROUND: - return [ 224, 192, 104 ]; + case Type.FIRE: + return 2; + case Type.GHOST: + case Type.WATER: + case Type.ELECTRIC: + case Type.DARK: + return 1; + case Type.NORMAL: + case Type.FLYING: case Type.ROCK: - return [ 184, 160, 56 ]; case Type.BUG: - return [ 168, 184, 32 ]; + case Type.STEEL: + case Type.GRASS: + case Type.PSYCHIC: + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 0.5; + case Type.POISON: + default: + return 0; + } + case Type.FIRE: + switch (attackType) { + case Type.GROUND: + case Type.ROCK: + case Type.WATER: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.FLYING: + case Type.POISON: case Type.GHOST: - return [ 112, 88, 152 ]; + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + return 1; + case Type.BUG: + case Type.STEEL: + case Type.FIRE: + case Type.GRASS: + case Type.ICE: + case Type.FAIRY: + return 0.5; + default: + return 0; + } + case Type.WATER: + switch (attackType) { + case Type.GRASS: + case Type.ELECTRIC: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.ROCK: + case Type.BUG: + case Type.GHOST: + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; case Type.STEEL: - return [ 184, 184, 208 ]; case Type.FIRE: - return [ 240, 128, 48 ]; case Type.WATER: - return [ 104, 144, 240 ]; + case Type.ICE: + return 0.5; + default: + return 0; + } + case Type.GRASS: + switch (attackType) { + case Type.FLYING: + case Type.POISON: + case Type.BUG: + case Type.FIRE: + case Type.ICE: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.ROCK: + case Type.GHOST: + case Type.STEEL: + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; + case Type.GROUND: + case Type.WATER: case Type.GRASS: - return [ 120, 200, 80 ]; case Type.ELECTRIC: - return [ 248, 208, 48 ]; + return 0.5; + default: + return 0; + } + case Type.ELECTRIC: + switch (attackType) { + case Type.GROUND: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.POISON: + case Type.ROCK: + case Type.BUG: + case Type.GHOST: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: case Type.PSYCHIC: - return [ 248, 88, 136 ]; case Type.ICE: - return [ 152, 216, 216 ]; case Type.DRAGON: - return [ 112, 56, 248 ]; case Type.DARK: - return [ 112, 88, 72 ]; case Type.FAIRY: - return [ 232, 136, 200 ]; - case Type.STELLAR: - return [ 255, 255, 255 ]; + return 1; + case Type.FLYING: + case Type.STEEL: + case Type.ELECTRIC: + return 0.5; + default: + return 0; + } + case Type.PSYCHIC: + switch (attackType) { + case Type.BUG: + case Type.GHOST: + case Type.DARK: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.ROCK: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 1; + case Type.FIGHTING: + case Type.PSYCHIC: + return 0.5; default: - return [ 0, 0, 0 ]; + return 0; + } + case Type.ICE: + switch (attackType) { + case Type.FIGHTING: + case Type.ROCK: + case Type.STEEL: + case Type.FIRE: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.BUG: + case Type.GHOST: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.DRAGON: + case Type.DARK: + case Type.FAIRY: + return 1; + case Type.ICE: + return 0.5; + default: + return 0; + } + case Type.DRAGON: + switch (attackType) { + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 2; + case Type.NORMAL: + case Type.FIGHTING: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.ROCK: + case Type.BUG: + case Type.GHOST: + case Type.STEEL: + case Type.PSYCHIC: + case Type.DARK: + return 1; + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + return 0.5; + default: + return 0; + } + case Type.DARK: + switch (attackType) { + case Type.FIGHTING: + case Type.BUG: + case Type.FAIRY: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.POISON: + case Type.GROUND: + case Type.ROCK: + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.ICE: + case Type.DRAGON: + return 1; + case Type.GHOST: + case Type.DARK: + return 0.5; + case Type.PSYCHIC: + default: + return 0; + } + case Type.FAIRY: + switch (attackType) { + case Type.POISON: + case Type.STEEL: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.GROUND: + case Type.ROCK: + case Type.GHOST: + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + case Type.PSYCHIC: + case Type.ICE: + case Type.FAIRY: + return 1; + case Type.FIGHTING: + case Type.BUG: + case Type.DARK: + return 0.5; + case Type.DRAGON: + default: + return 0; + } + case Type.STELLAR: + return 1; + } +} + +export function getTypeRgb(type: Type): [ integer, integer, integer ] { + switch (type) { + case Type.NORMAL: + return [ 168, 168, 120 ]; + case Type.FIGHTING: + return [ 192, 48, 40 ]; + case Type.FLYING: + return [ 168, 144, 240 ]; + case Type.POISON: + return [ 160, 64, 160 ]; + case Type.GROUND: + return [ 224, 192, 104 ]; + case Type.ROCK: + return [ 184, 160, 56 ]; + case Type.BUG: + return [ 168, 184, 32 ]; + case Type.GHOST: + return [ 112, 88, 152 ]; + case Type.STEEL: + return [ 184, 184, 208 ]; + case Type.FIRE: + return [ 240, 128, 48 ]; + case Type.WATER: + return [ 104, 144, 240 ]; + case Type.GRASS: + return [ 120, 200, 80 ]; + case Type.ELECTRIC: + return [ 248, 208, 48 ]; + case Type.PSYCHIC: + return [ 248, 88, 136 ]; + case Type.ICE: + return [ 152, 216, 216 ]; + case Type.DRAGON: + return [ 112, 56, 248 ]; + case Type.DARK: + return [ 112, 88, 72 ]; + case Type.FAIRY: + return [ 232, 136, 200 ]; + case Type.STELLAR: + return [ 255, 255, 255 ]; + default: + return [ 0, 0, 0 ]; } } diff --git a/src/data/variant.ts b/src/data/variant.ts index 4e167e43291b..b16586108fd0 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -8,11 +8,11 @@ export const variantColorCache = {}; export function getVariantTint(variant: Variant): integer { switch (variant) { - case 0: - return 0xf8c020; - case 1: - return 0x20f8f0; - case 2: - return 0xe81048; + case 0: + return 0xf8c020; + case 1: + return 0x20f8f0; + case 2: + return 0xe81048; } -} \ No newline at end of file +} diff --git a/src/data/weather.ts b/src/data/weather.ts index c8bd47fc12dc..87500e69697d 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -32,20 +32,22 @@ export class Weather { } lapse(): boolean { - if (this.isImmutable()) + if (this.isImmutable()) { return true; - if (this.turnsLeft) + } + if (this.turnsLeft) { return !!--this.turnsLeft; + } return true; } isImmutable(): boolean { switch (this.weatherType) { - case WeatherType.HEAVY_RAIN: - case WeatherType.HARSH_SUN: - case WeatherType.STRONG_WINDS: - return true; + case WeatherType.HEAVY_RAIN: + case WeatherType.HARSH_SUN: + case WeatherType.STRONG_WINDS: + return true; } return false; @@ -53,9 +55,9 @@ export class Weather { isDamaging(): boolean { switch (this.weatherType) { - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - return true; + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + return true; } return false; @@ -63,10 +65,10 @@ export class Weather { isTypeDamageImmune(type: Type): boolean { switch (this.weatherType) { - case WeatherType.SANDSTORM: - return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; - case WeatherType.HAIL: - return type === Type.ICE; + case WeatherType.SANDSTORM: + return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; + case WeatherType.HAIL: + return type === Type.ICE; } return false; @@ -74,20 +76,24 @@ export class Weather { getAttackTypeMultiplier(attackType: Type): number { switch (this.weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - if (attackType === Type.FIRE) - return 1.5; - if (attackType === Type.WATER) - return 0.5; - break; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - if (attackType === Type.FIRE) - return 0.5; - if (attackType === Type.WATER) - return 1.5; - break; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + if (attackType === Type.FIRE) { + return 1.5; + } + if (attackType === Type.WATER) { + return 0.5; + } + break; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + if (attackType === Type.FIRE) { + return 0.5; + } + if (attackType === Type.WATER) { + return 1.5; + } + break; } return 1; @@ -95,10 +101,10 @@ export class Weather { isMoveWeatherCancelled(move: Move): boolean { switch (this.weatherType) { - case WeatherType.HARSH_SUN: - return move instanceof AttackMove && move.type === Type.WATER; - case WeatherType.HEAVY_RAIN: - return move instanceof AttackMove && move.type === Type.FIRE; + case WeatherType.HARSH_SUN: + return move instanceof AttackMove && move.type === Type.WATER; + case WeatherType.HEAVY_RAIN: + return move instanceof AttackMove && move.type === Type.FIRE; } return false; @@ -107,12 +113,14 @@ export class Weather { isEffectSuppressed(scene: BattleScene): boolean { const field = scene.getField(true); - for (let pokemon of field) { + for (const pokemon of field) { let suppressWeatherEffectAbAttr = pokemon.getAbility().getAttrs(SuppressWeatherEffectAbAttr).find(() => true) as SuppressWeatherEffectAbAttr; - if (!suppressWeatherEffectAbAttr) + if (!suppressWeatherEffectAbAttr) { suppressWeatherEffectAbAttr = pokemon.hasPassive() ? pokemon.getPassiveAbility().getAttrs(SuppressWeatherEffectAbAttr).find(() => true) as SuppressWeatherEffectAbAttr : null; - if (suppressWeatherEffectAbAttr && (!this.isImmutable() || suppressWeatherEffectAbAttr.affectsImmutable)) + } + if (suppressWeatherEffectAbAttr && (!this.isImmutable() || suppressWeatherEffectAbAttr.affectsImmutable)) { return true; + } } return false; @@ -121,24 +129,24 @@ export class Weather { export function getWeatherStartMessage(weatherType: WeatherType): string { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t('weather:sunnyStartMessage'); - case WeatherType.RAIN: - return i18next.t('weather:rainStartMessage'); - case WeatherType.SANDSTORM: - return i18next.t('weather:sandstormStartMessage'); - case WeatherType.HAIL: - return i18next.t('weather:hailStartMessage'); - case WeatherType.SNOW: - return i18next.t('weather:snowStartMessage'); - case WeatherType.FOG: - return i18next.t('weather:fogStartMessage'); - case WeatherType.HEAVY_RAIN: - return i18next.t('weather:heavyRainStartMessage'); - case WeatherType.HARSH_SUN: - return i18next.t('weather:harshSunStartMessage'); - case WeatherType.STRONG_WINDS: - return i18next.t('weather:strongWindsStartMessage'); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyStartMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainStartMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormStartMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailStartMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowStartMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogStartMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainStartMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunStartMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsStartMessage"); } return null; @@ -146,24 +154,24 @@ export function getWeatherStartMessage(weatherType: WeatherType): string { export function getWeatherLapseMessage(weatherType: WeatherType): string { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t('weather:sunnyLapseMessage'); - case WeatherType.RAIN: - return i18next.t('weather:rainLapseMessage'); - case WeatherType.SANDSTORM: - return i18next.t('weather:sandstormLapseMessage'); - case WeatherType.HAIL: - return i18next.t('weather:hailLapseMessage'); - case WeatherType.SNOW: - return i18next.t('weather:snowLapseMessage'); - case WeatherType.FOG: - return i18next.t('weather:fogLapseMessage'); - case WeatherType.HEAVY_RAIN: - return i18next.t('weather:heavyRainLapseMessage'); - case WeatherType.HARSH_SUN: - return i18next.t('weather:harshSunLapseMessage'); - case WeatherType.STRONG_WINDS: - return i18next.t('weather:strongWindsLapseMessage'); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyLapseMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainLapseMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormLapseMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailLapseMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowLapseMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogLapseMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainLapseMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunLapseMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsLapseMessage"); } return null; @@ -171,10 +179,10 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string { export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string { switch (weatherType) { - case WeatherType.SANDSTORM: - return i18next.t('weather:sandstormDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); - case WeatherType.HAIL: - return i18next.t('weather:hailDamageMessage', {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormDamageMessage", {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); + case WeatherType.HAIL: + return i18next.t("weather:hailDamageMessage", {pokemonPrefix: getPokemonPrefix(pokemon), pokemonName: pokemon.name}); } return null; @@ -182,24 +190,24 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem export function getWeatherClearMessage(weatherType: WeatherType): string { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t('weather:sunnyClearMessage'); - case WeatherType.RAIN: - return i18next.t('weather:rainClearMessage'); - case WeatherType.SANDSTORM: - return i18next.t('weather:sandstormClearMessage'); - case WeatherType.HAIL: - return i18next.t('weather:hailClearMessage'); - case WeatherType.SNOW: - return i18next.t('weather:snowClearMessage'); - case WeatherType.FOG: - return i18next.t('weather:fogClearMessage'); - case WeatherType.HEAVY_RAIN: - return i18next.t('weather:heavyRainClearMessage'); - case WeatherType.HARSH_SUN: - return i18next.t('weather:harshSunClearMessage'); - case WeatherType.STRONG_WINDS: - return i18next.t('weather:strongWindsClearMessage'); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyClearMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainClearMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormClearMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailClearMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowClearMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogClearMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainClearMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunClearMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsClearMessage"); } return null; @@ -207,33 +215,34 @@ export function getWeatherClearMessage(weatherType: WeatherType): string { export function getTerrainStartMessage(terrainType: TerrainType): string { switch (terrainType) { - case TerrainType.MISTY: - return 'Mist swirled around the battlefield!'; - case TerrainType.ELECTRIC: - return 'An electric current ran across the battlefield!'; - case TerrainType.GRASSY: - return 'Grass grew to cover the battlefield!'; - case TerrainType.PSYCHIC: - return 'The battlefield got weird!'; + case TerrainType.MISTY: + return "Mist swirled around the battlefield!"; + case TerrainType.ELECTRIC: + return "An electric current ran across the battlefield!"; + case TerrainType.GRASSY: + return "Grass grew to cover the battlefield!"; + case TerrainType.PSYCHIC: + return "The battlefield got weird!"; } } export function getTerrainClearMessage(terrainType: TerrainType): string { switch (terrainType) { - case TerrainType.MISTY: - return 'The mist disappeared from the battlefield.'; - case TerrainType.ELECTRIC: - return 'The electricity disappeared from the battlefield.'; - case TerrainType.GRASSY: - return 'The grass disappeared from the battlefield.'; - case TerrainType.PSYCHIC: - return 'The weirdness disappeared from the battlefield!'; + case TerrainType.MISTY: + return "The mist disappeared from the battlefield."; + case TerrainType.ELECTRIC: + return "The electricity disappeared from the battlefield."; + case TerrainType.GRASSY: + return "The grass disappeared from the battlefield."; + case TerrainType.PSYCHIC: + return "The weirdness disappeared from the battlefield!"; } } export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainType): string { - if (terrainType === TerrainType.MISTY) - return getPokemonMessage(pokemon, ` surrounds itself with a protective mist!`); + if (terrainType === TerrainType.MISTY) { + return getPokemonMessage(pokemon, " surrounds itself with a protective mist!"); + } return getPokemonMessage(pokemon, ` is protected by the ${Utils.toReadableString(TerrainType[terrainType])} Terrain!`); } @@ -246,119 +255,126 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a let weatherPool: WeatherPoolEntry[] = []; const hasSun = arena.getTimeOfDay() < 2; switch (arena.biomeType) { - case Biome.GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 7 } - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); - break; - case Biome.TALL_GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 }, - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 }); - break; - case Biome.FOREST: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 } - ]; - break; - case Biome.SEA: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 12 } - ]; - break; - case Biome.SWAMP: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 4 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.BEACH: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 3 } - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); - break; - case Biome.LAKE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 10 }, - { weatherType: WeatherType.RAIN, weight: 5 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.SEABED: - weatherPool = [ - { weatherType: WeatherType.RAIN, weight: 1 } - ]; - break; - case Biome.BADLANDS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); - break; - case Biome.DESERT: - weatherPool = [ - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - break; - case Biome.ICE_CAVE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.SNOW, weight: 4 }, - { weatherType: WeatherType.HAIL, weight: 1 } - ]; - break; - case Biome.MEADOW: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 2 } - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - case Biome.VOLCANO: - weatherPool = [ - { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } - ]; - break; - case Biome.GRAVEYARD: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.JUNGLE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 2 } - ]; - break; - case Biome.SNOWY_FOREST: - weatherPool = [ - { weatherType: WeatherType.SNOW, weight: 7 }, - { weatherType: WeatherType.HAIL, weight: 1 } - ]; - break; - case Biome.ISLAND: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 5 }, - { weatherType: WeatherType.RAIN, weight: 1 }, - ]; - if (hasSun) - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - break; + case Biome.GRASS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 7 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); + } + break; + case Biome.TALL_GRASS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 5 }, + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 }); + } + break; + case Biome.FOREST: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 5 } + ]; + break; + case Biome.SEA: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.RAIN, weight: 12 } + ]; + break; + case Biome.SWAMP: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.RAIN, weight: 4 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.BEACH: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 3 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); + } + break; + case Biome.LAKE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 10 }, + { weatherType: WeatherType.RAIN, weight: 5 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.SEABED: + weatherPool = [ + { weatherType: WeatherType.RAIN, weight: 1 } + ]; + break; + case Biome.BADLANDS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.SANDSTORM, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); + } + break; + case Biome.DESERT: + weatherPool = [ + { weatherType: WeatherType.SANDSTORM, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + break; + case Biome.ICE_CAVE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.SNOW, weight: 4 }, + { weatherType: WeatherType.HAIL, weight: 1 } + ]; + break; + case Biome.MEADOW: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + case Biome.VOLCANO: + weatherPool = [ + { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } + ]; + break; + case Biome.GRAVEYARD: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.JUNGLE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 2 } + ]; + break; + case Biome.SNOWY_FOREST: + weatherPool = [ + { weatherType: WeatherType.SNOW, weight: 7 }, + { weatherType: WeatherType.HAIL, weight: 1 } + ]; + break; + case Biome.ISLAND: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 5 }, + { weatherType: WeatherType.RAIN, weight: 1 }, + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + break; } if (weatherPool.length > 1) { @@ -367,14 +383,15 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a const rand = Utils.randSeedInt(totalWeight); let w = 0; - for (let weather of weatherPool) { + for (const weather of weatherPool) { w += weather.weight; - if (rand < w) + if (rand < w) { return weather.weatherType; + } } } return weatherPool.length ? weatherPool[0].weatherType : WeatherType.NONE; -} \ No newline at end of file +} diff --git a/src/debug.js b/src/debug.js index b627dba65b1e..e0f27332d3dd 100644 --- a/src/debug.js +++ b/src/debug.js @@ -1,13 +1,15 @@ export function getData() { - const dataStr = localStorage.getItem('data'); - if (!dataStr) + const dataStr = localStorage.getItem("data"); + if (!dataStr) { return null; - return JSON.parse(atob(dataStr), (k, v) => k.endsWith('Attr') && ![ 'natureAttr', 'abilityAttr', 'passiveAttr' ].includes(k) ? BigInt(v) : v); + } + return JSON.parse(atob(dataStr), (k, v) => k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v) : v); } export function getSession() { - const sessionStr = localStorage.getItem('sessionData'); - if (!sessionStr) + const sessionStr = localStorage.getItem("sessionData"); + if (!sessionStr) { return null; + } return JSON.parse(atob(sessionStr)); -} \ No newline at end of file +} diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 70f2d5f388e8..edb0f6589050 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -47,13 +47,15 @@ export class EggHatchPhase extends Phase { this.scene.ui.setModeForceTransition(Mode.EGG_HATCH_SCENE).then(() => { - if (!this.egg) + if (!this.egg) { return this.end(); + } const eggIndex = this.scene.gameData.eggs.findIndex(e => e.id === this.egg.id); - if (eggIndex === -1) + if (eggIndex === -1) { return this.end(); + } this.scene.gameData.eggs.splice(eggIndex, 1); @@ -63,17 +65,17 @@ export class EggHatchPhase extends Phase { this.eggHatchContainer = this.eggHatchHandler.eggHatchContainer; - this.eggHatchBg = this.scene.add.image(0, 0, 'default_bg'); + this.eggHatchBg = this.scene.add.image(0, 0, "default_bg"); this.eggHatchBg.setOrigin(0, 0); this.eggHatchContainer.add(this.eggHatchBg); this.eggContainer = this.scene.add.container(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2); - this.eggSprite = this.scene.add.sprite(0, 0, 'egg', `egg_${this.egg.getKey()}`); - this.eggCrackSprite = this.scene.add.sprite(0, 0, 'egg_crack', '0'); + this.eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${this.egg.getKey()}`); + this.eggCrackSprite = this.scene.add.sprite(0, 0, "egg_crack", "0"); this.eggCrackSprite.setVisible(false); - this.eggLightraysOverlay = this.scene.add.sprite((-this.eggHatchBg.displayWidth / 2) + 4, -this.eggHatchBg.displayHeight / 2, 'egg_lightrays', '3'); + this.eggLightraysOverlay = this.scene.add.sprite((-this.eggHatchBg.displayWidth / 2) + 4, -this.eggHatchBg.displayHeight / 2, "egg_lightrays", "3"); this.eggLightraysOverlay.setOrigin(0, 0); this.eggLightraysOverlay.setVisible(false); @@ -83,14 +85,14 @@ export class EggHatchPhase extends Phase { this.eggHatchContainer.add(this.eggContainer); const getPokemonSprite = () => { - const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, `pkmn__sub`); + const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub"); ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); return ret; }; this.eggHatchContainer.add((this.pokemonSprite = getPokemonSprite())); - this.pokemonShinySparkle = this.scene.add.sprite(this.pokemonSprite.x, this.pokemonSprite.y, 'shiny'); + this.pokemonShinySparkle = this.scene.add.sprite(this.pokemonSprite.x, this.pokemonSprite.y, "shiny"); this.pokemonShinySparkle.setVisible(false); this.eggHatchContainer.add(this.pokemonShinySparkle); @@ -106,8 +108,9 @@ export class EggHatchPhase extends Phase { this.eggHatchContainer.add(this.infoContainer); const pokemon = this.generatePokemon(); - if (pokemon.fusionSpecies) + if (pokemon.fusionSpecies) { pokemon.clearFusionSpecies(); + } this.pokemonSprite.setVisible(false); @@ -117,41 +120,48 @@ export class EggHatchPhase extends Phase { this.canSkip = true; this.scene.time.delayedCall(1000, () => { - if (!this.hatched) - this.evolutionBgm = this.scene.playSoundWithoutBgm('evolution'); + if (!this.hatched) { + this.evolutionBgm = this.scene.playSoundWithoutBgm("evolution"); + } }); this.scene.time.delayedCall(2000, () => { - if (this.hatched) + if (this.hatched) { return; + } this.eggCrackSprite.setVisible(true); this.doSpray(1, this.eggSprite.displayHeight / -2); this.doEggShake(2).then(() => { - if (this.hatched) + if (this.hatched) { return; + } this.scene.time.delayedCall(1000, () => { - if (this.hatched) + if (this.hatched) { return; + } this.doSpray(2, this.eggSprite.displayHeight / -4); - this.eggCrackSprite.setFrame('1'); - this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame('2')); + this.eggCrackSprite.setFrame("1"); + this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("2")); this.doEggShake(4).then(() => { - if (this.hatched) + if (this.hatched) { return; + } this.scene.time.delayedCall(1000, () => { - if (this.hatched) + if (this.hatched) { return; - this.scene.playSound('egg_crack'); + } + this.scene.playSound("egg_crack"); this.doSpray(4); - this.eggCrackSprite.setFrame('3'); - this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame('4')); + this.eggCrackSprite.setFrame("3"); + this.scene.time.delayedCall(125, () => this.eggCrackSprite.setFrame("4")); this.doEggShake(8, 2).then(() => { - if (!this.hatched) + if (!this.hatched) { this.doHatch(); + } }); }); }); - }) + }); }); }); }); @@ -159,74 +169,82 @@ export class EggHatchPhase extends Phase { } end() { - if (this.scene.findPhase((p) => p instanceof EggHatchPhase)) + if (this.scene.findPhase((p) => p instanceof EggHatchPhase)) { this.eggHatchHandler.clear(); - else + } else { this.scene.time.delayedCall(250, () => this.scene.setModifiersVisible(true)); + } super.end(); } doEggShake(intensity: number, repeatCount?: integer, count?: integer): Promise { return new Promise(resolve => { - if (repeatCount === undefined) + if (repeatCount === undefined) { repeatCount = 0; - if (count === undefined) + } + if (count === undefined) { count = 0; - this.scene.playSound('pb_move'); + } + this.scene.playSound("pb_move"); this.scene.tweens.add({ targets: this.eggContainer, x: `-=${intensity / (count ? 1 : 2)}`, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", duration: 125, onComplete: () => { this.scene.tweens.add({ targets: this.eggContainer, x: `+=${intensity}`, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", duration: 250, onComplete: () => { count++; - if (count < repeatCount) + if (count < repeatCount) { return this.doEggShake(intensity, repeatCount, count).then(() => resolve()); + } this.scene.tweens.add({ targets: this.eggContainer, x: `-=${intensity / 2}`, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", duration: 125, onComplete: () => resolve() }); } - }) + }); } }); }); } trySkip(): boolean { - if (!this.canSkip || this.skipped) + if (!this.canSkip || this.skipped) { return false; + } this.skipped = true; - if (!this.hatched) + if (!this.hatched) { this.doHatch(); - else + } else { this.doReveal(); + } return true; } doHatch(): void { this.canSkip = false; this.hatched = true; - if (this.evolutionBgm) + if (this.evolutionBgm) { SoundFade.fadeOut(this.scene, this.evolutionBgm, Utils.fixedInt(100)); - for (let e = 0; e < 5; e++) - this.scene.time.delayedCall(Utils.fixedInt(375 * e), () => this.scene.playSound('egg_hatch', { volume: 1 - (e * 0.2) })); + } + for (let e = 0; e < 5; e++) { + this.scene.time.delayedCall(Utils.fixedInt(375 * e), () => this.scene.playSound("egg_hatch", { volume: 1 - (e * 0.2) })); + } this.eggLightraysOverlay.setVisible(true); - this.eggLightraysOverlay.play('egg_lightrays'); + this.eggLightraysOverlay.play("egg_lightrays"); this.scene.tweens.add({ duration: Utils.fixedInt(125), targets: this.eggHatchOverlay, alpha: 1, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { this.skipped = false; this.canSkip = true; @@ -234,40 +252,45 @@ export class EggHatchPhase extends Phase { }); this.scene.time.delayedCall(Utils.fixedInt(1500), () => { this.canSkip = false; - if (!this.skipped) + if (!this.skipped) { this.doReveal(); + } }); } doReveal(): void { const isShiny = this.pokemon.isShiny(); - if (this.pokemon.species.subLegendary) + if (this.pokemon.species.subLegendary) { this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY); - if (this.pokemon.species.legendary) + } + if (this.pokemon.species.legendary) { this.scene.validateAchv(achvs.HATCH_LEGENDARY); - if (this.pokemon.species.mythical) + } + if (this.pokemon.species.mythical) { this.scene.validateAchv(achvs.HATCH_MYTHICAL); - if (isShiny) + } + if (isShiny) { this.scene.validateAchv(achvs.HATCH_SHINY); + } this.eggContainer.setVisible(false); this.pokemonSprite.play(this.pokemon.getSpriteKey(true)); - this.pokemonSprite.setPipelineData('ignoreTimeTint', true); - this.pokemonSprite.setPipelineData('spriteKey', this.pokemon.getSpriteKey()); - this.pokemonSprite.setPipelineData('shiny', this.pokemon.shiny); - this.pokemonSprite.setPipelineData('variant', this.pokemon.variant); + this.pokemonSprite.setPipelineData("ignoreTimeTint", true); + this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); + this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); + this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); this.pokemonSprite.setVisible(true); this.scene.time.delayedCall(Utils.fixedInt(250), () => { this.pokemon.cry(); if (isShiny) { this.scene.time.delayedCall(Utils.fixedInt(500), () => { - this.pokemonShinySparkle.play(`sparkle${this.pokemon.variant ? `_${this.pokemon.variant + 1}` : ''}`); - this.scene.playSound('sparkle'); + this.pokemonShinySparkle.play(`sparkle${this.pokemon.variant ? `_${this.pokemon.variant + 1}` : ""}`); + this.scene.playSound("sparkle"); }); } this.scene.time.delayedCall(Utils.fixedInt(!this.skipped ? !isShiny ? 1250 : 1750 : !isShiny ? 250 : 750), () => { this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); - this.scene.playSoundWithoutBgm('evolution_fanfare'); + this.scene.playSoundWithoutBgm("evolution_fanfare"); this.scene.ui.showText(`${this.pokemon.name} hatched from the egg!`, null, () => { this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); @@ -285,7 +308,7 @@ export class EggHatchPhase extends Phase { duration: Utils.fixedInt(this.skipped ? 500 : 3000), targets: this.eggHatchOverlay, alpha: 0, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }); } @@ -306,14 +329,14 @@ export class EggHatchPhase extends Phase { doSprayParticle(trigIndex: integer, offsetY: number) { const initialX = this.eggHatchBg.displayWidth / 2; const initialY = this.eggHatchBg.displayHeight / 2 + offsetY; - const shardKey = !this.egg.isManaphyEgg() ? this.egg.tier.toString() : '1'; - const particle = this.scene.add.image(initialX, initialY, 'egg_shard', `${shardKey}_${Math.floor(trigIndex / 2)}`); + const shardKey = !this.egg.isManaphyEgg() ? this.egg.tier.toString() : "1"; + const particle = this.scene.add.image(initialX, initialY, "egg_shard", `${shardKey}_${Math.floor(trigIndex / 2)}`); this.eggHatchContainer.add(particle); let f = 0; let yOffset = 0; - let speed = 3 - Utils.randInt(8); - let amp = 24 + Utils.randInt(32); + const speed = 3 - Utils.randInt(8); + const amp = 24 + Utils.randInt(32); const particleTimer = this.scene.tweens.addCounter({ repeat: -1, @@ -329,8 +352,9 @@ export class EggHatchPhase extends Phase { if (trigIndex < 160) { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -this.sin(trigIndex, amp); - if (f > 108) + if (f > 108) { particle.setScale((1 - (f - 108) / 20)); + } trigIndex += 2 * speedMultiplier; f += speedMultiplier; } else { @@ -354,8 +378,9 @@ export class EggHatchPhase extends Phase { speciesOverride = rand ? Species.PHIONE : Species.MANAPHY; } else if (this.egg.tier === EggTier.MASTER && this.egg.gachaType === GachaType.LEGENDARY) { - if (!Utils.randSeedInt(2)) + if (!Utils.randSeedInt(2)) { speciesOverride = getLegendaryGachaSpeciesForTimestamp(this.scene, this.egg.timestamp); + } } if (speciesOverride) { @@ -366,38 +391,39 @@ export class EggHatchPhase extends Phase { let maxStarterValue: integer; switch (this.egg.tier) { - case EggTier.GREAT: - minStarterValue = 4; - maxStarterValue = 5; - break; - case EggTier.ULTRA: - minStarterValue = 6; - maxStarterValue = 7; - break; - case EggTier.MASTER: - minStarterValue = 8; - maxStarterValue = 9; - break; - default: - minStarterValue = 1; - maxStarterValue = 3; - break; + case EggTier.GREAT: + minStarterValue = 4; + maxStarterValue = 5; + break; + case EggTier.ULTRA: + minStarterValue = 6; + maxStarterValue = 7; + break; + case EggTier.MASTER: + minStarterValue = 8; + maxStarterValue = 9; + break; + default: + minStarterValue = 1; + maxStarterValue = 3; + break; } const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; - let speciesPool = Object.keys(speciesStarters) + const speciesPool = Object.keys(speciesStarters) .filter(s => speciesStarters[s] >= minStarterValue && speciesStarters[s] <= maxStarterValue) .map(s => parseInt(s) as Species) .filter(s => !pokemonPrevolutions.hasOwnProperty(s) && getPokemonSpecies(s).isObtainable() && ignoredSpecies.indexOf(s) === -1); let totalWeight = 0; const speciesWeights = []; - for (let speciesId of speciesPool) { + for (const speciesId of speciesPool) { let weight = Math.floor((((maxStarterValue - speciesStarters[speciesId]) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); const species = getPokemonSpecies(speciesId); - if (species.isRegional()) + if (species.isRegional()) { weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + } speciesWeights.push(totalWeight + weight); totalWeight += weight; } @@ -422,8 +448,9 @@ export class EggHatchPhase extends Phase { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); - for (let s = 0; s < ret.ivs.length; s++) + for (let s = 0; s < ret.ivs.length; s++) { ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); + } const baseChance = this.egg.gachaType === GachaType.MOVE ? 3 : 6; this.eggMoveIndex = Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.egg.tier)) @@ -434,4 +461,4 @@ export class EggHatchPhase extends Phase { return ret; } -} \ No newline at end of file +} diff --git a/src/enums/ui-theme.ts b/src/enums/ui-theme.ts index e0fd92a20a8c..50b5c4f65a32 100644 --- a/src/enums/ui-theme.ts +++ b/src/enums/ui-theme.ts @@ -1,4 +1,4 @@ export enum UiTheme { DEFAULT, LEGACY -} \ No newline at end of file +} diff --git a/src/evolution-phase.ts b/src/evolution-phase.ts index 7684d7797a24..57b16ec5664f 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -48,8 +48,9 @@ export class EvolutionPhase extends Phase { this.setMode().then(() => { - if (!this.validate()) + if (!this.validate()) { return this.end(); + } this.scene.fadeOutBgm(null, false); @@ -57,11 +58,11 @@ export class EvolutionPhase extends Phase { this.evolutionContainer = evolutionHandler.evolutionContainer; - this.evolutionBaseBg = this.scene.add.image(0, 0, 'default_bg'); + this.evolutionBaseBg = this.scene.add.image(0, 0, "default_bg"); this.evolutionBaseBg.setOrigin(0, 0); this.evolutionContainer.add(this.evolutionBaseBg); - this.evolutionBg = this.scene.add.video(0, 0, 'evo_bg').stop(); + this.evolutionBg = this.scene.add.video(0, 0, "evo_bg").stop(); this.evolutionBg.setOrigin(0, 0); this.evolutionBg.setScale(0.4359673025); this.evolutionBg.setVisible(false); @@ -73,7 +74,7 @@ export class EvolutionPhase extends Phase { this.evolutionContainer.add(this.evolutionBgOverlay); const getPokemonSprite = () => { - const ret = this.scene.addPokemonSprite(this.pokemon, this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, `pkmn__sub`); + const ret = this.scene.addPokemonSprite(this.pokemon, this.evolutionBaseBg.displayWidth / 2, this.evolutionBaseBg.displayHeight / 2, "pkmn__sub"); ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); return ret; }; @@ -97,13 +98,14 @@ export class EvolutionPhase extends Phase { [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { sprite.play(this.pokemon.getSpriteKey(true)); sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); - sprite.setPipelineData('ignoreTimeTint', true); - sprite.setPipelineData('spriteKey', this.pokemon.getSpriteKey()); - sprite.setPipelineData('shiny', this.pokemon.shiny); - sprite.setPipelineData('variant', this.pokemon.variant); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (this.pokemon.summonData?.speciesForm) - k += 'Base'; + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); + sprite.setPipelineData("shiny", this.pokemon.shiny); + sprite.setPipelineData("variant", this.pokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (this.pokemon.summonData?.speciesForm) { + k += "Base"; + } sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); }); @@ -116,32 +118,33 @@ export class EvolutionPhase extends Phase { const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; const preName = this.pokemon.name; - this.scene.ui.showText(i18next.t('menu:evolving', { pokemonName: preName }), null, () => { + this.scene.ui.showText(i18next.t("menu:evolving", { pokemonName: preName }), null, () => { this.pokemon.cry(); this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { sprite.play(evolvedPokemon.getSpriteKey(true)); - sprite.setPipelineData('ignoreTimeTint', true); - sprite.setPipelineData('spriteKey', evolvedPokemon.getSpriteKey()); - sprite.setPipelineData('shiny', evolvedPokemon.shiny); - sprite.setPipelineData('variant', evolvedPokemon.variant); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (evolvedPokemon.summonData?.speciesForm) - k += 'Base'; + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", evolvedPokemon.shiny); + sprite.setPipelineData("variant", evolvedPokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (evolvedPokemon.summonData?.speciesForm) { + k += "Base"; + } sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; }); }); this.scene.time.delayedCall(1000, () => { - const evolutionBgm = this.scene.playSoundWithoutBgm('evolution'); + const evolutionBgm = this.scene.playSoundWithoutBgm("evolution"); this.scene.tweens.add({ targets: this.evolutionBgOverlay, alpha: 1, delay: 500, duration: 1500, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.scene.time.delayedCall(1000, () => { this.scene.tweens.add({ @@ -152,7 +155,7 @@ export class EvolutionPhase extends Phase { this.evolutionBg.setVisible(true); this.evolutionBg.play(); }); - this.scene.playSound('charge'); + this.scene.playSound("charge"); this.doSpiralUpward(); this.scene.tweens.addCounter({ from: 0, @@ -164,7 +167,7 @@ export class EvolutionPhase extends Phase { onComplete: () => { this.pokemonSprite.setVisible(false); this.scene.time.delayedCall(1100, () => { - this.scene.playSound('beam'); + this.scene.playSound("beam"); this.doArcDownward(); this.scene.time.delayedCall(1500, () => { this.pokemonEvoTintSprite.setScale(0.25); @@ -188,8 +191,8 @@ export class EvolutionPhase extends Phase { this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - this.scene.ui.showText(i18next.t('menu:stoppedEvolving', { pokemonName: preName }), null, () => { - this.scene.ui.showText(i18next.t('menu:pauseEvolutionsQuestion', { pokemonName: preName }), null, () => { + this.scene.ui.showText(i18next.t("menu:stoppedEvolving", { pokemonName: preName }), null, () => { + this.scene.ui.showText(i18next.t("menu:pauseEvolutionsQuestion", { pokemonName: preName }), null, () => { const end = () => { this.scene.ui.showText(null, 0); this.scene.playBgm(); @@ -199,7 +202,7 @@ export class EvolutionPhase extends Phase { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.revertMode(); this.pokemon.pauseEvolutions = true; - this.scene.ui.showText(i18next.t('menu:evolutionsPaused', { pokemonName: preName }), null, end, 3000); + this.scene.ui.showText(i18next.t("menu:evolutionsPaused", { pokemonName: preName }), null, end, 3000); }, () => { this.scene.ui.revertMode(); this.scene.time.delayedCall(3000, end); @@ -209,7 +212,7 @@ export class EvolutionPhase extends Phase { return; } - this.scene.playSound('sparkle'); + this.scene.playSound("sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); this.scene.time.delayedCall(900, () => { @@ -217,17 +220,18 @@ export class EvolutionPhase extends Phase { this.pokemon.evolve(this.evolution).then(() => { const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); - for (let lm of levelMoves) - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm[1])); + for (const lm of levelMoves) { + this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm[1])); + } this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - this.scene.playSound('shine'); + this.scene.playSound("shine"); this.doSpray(); this.scene.tweens.add({ targets: this.evolutionOverlay, alpha: 1, duration: 250, - easing: 'Sine.easeIn', + easing: "Sine.easeIn", onComplete: () => { this.evolutionBgOverlay.setAlpha(1); this.evolutionBg.setVisible(false); @@ -236,7 +240,7 @@ export class EvolutionPhase extends Phase { alpha: 0, duration: 2000, delay: 150, - easing: 'Sine.easeIn', + easing: "Sine.easeIn", onComplete: () => { this.scene.tweens.add({ targets: this.evolutionBgOverlay, @@ -247,10 +251,10 @@ export class EvolutionPhase extends Phase { this.scene.time.delayedCall(250, () => { this.pokemon.cry(); this.scene.time.delayedCall(1250, () => { - this.scene.playSoundWithoutBgm('evolution_fanfare'); + this.scene.playSoundWithoutBgm("evolution_fanfare"); evolvedPokemon.destroy(); - this.scene.ui.showText(i18next.t('menu:evolutionDone', { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); + this.scene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); }); }); @@ -266,7 +270,7 @@ export class EvolutionPhase extends Phase { }); }); } - }) + }); } }); }); @@ -283,8 +287,9 @@ export class EvolutionPhase extends Phase { onRepeat: () => { if (f < 64) { if (!(f & 7)) { - for (let i = 0; i < 4; i++) + for (let i = 0; i < 4; i++) { this.doSpiralUpwardParticle((f & 120) * 2 + i * 64); + } } f++; } @@ -301,8 +306,9 @@ export class EvolutionPhase extends Phase { onRepeat: () => { if (f < 96) { if (f < 6) { - for (let i = 0; i < 9; i++) + for (let i = 0; i < 9; i++) { this.doArcDownParticle(i * 16); + } } f++; } @@ -317,22 +323,23 @@ export class EvolutionPhase extends Phase { this.scene.tweens.add({ targets: this.pokemonTintSprite, scale: 0.25, - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", duration: 500 / l, yoyo: !isLastCycle }); this.scene.tweens.add({ targets: this.pokemonEvoTintSprite, scale: 1, - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", duration: 500 / l, yoyo: !isLastCycle, onComplete: () => { - if (evolutionHandler.cancelled) + if (evolutionHandler.cancelled) { return resolve(false); - if (l < lastCycle) + } + if (l < lastCycle) { this.doCycle(l + 0.5, lastCycle).then(success => resolve(success)); - else { + } else { this.pokemonTintSprite.setVisible(false); resolve(true); } @@ -349,11 +356,13 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { if (!f) { - for (let i = 0; i < 16; i++) + for (let i = 0; i < 16; i++) { this.doCircleInwardParticle(i * 16, 4); + } } else if (f === 32) { - for (let i = 0; i < 16; i++) + for (let i = 0; i < 16; i++) { this.doCircleInwardParticle(i * 16, 8); + } } f++; } @@ -368,10 +377,12 @@ export class EvolutionPhase extends Phase { duration: Utils.getFrameMs(1), onRepeat: () => { if (!f) { - for (let i = 0; i < 8; i++) + for (let i = 0; i < 8; i++) { this.doSprayParticle(i); - } else if (f < 50) + } + } else if (f < 50) { this.doSprayParticle(Utils.randInt(8)); + } f++; } }); @@ -379,7 +390,7 @@ export class EvolutionPhase extends Phase { doSpiralUpwardParticle(trigIndex: integer) { const initialX = this.evolutionBaseBg.displayWidth / 2; - const particle = this.scene.add.image(initialX, 0, 'evo_sparkle'); + const particle = this.scene.add.image(initialX, 0, "evo_sparkle"); this.evolutionContainer.add(particle); let f = 0; @@ -400,8 +411,9 @@ export class EvolutionPhase extends Phase { particle.x += cos(trigIndex, amp); particle.setScale(1 - (f / 80)); trigIndex += 4; - if (f & 1) + if (f & 1) { amp--; + } f++; } else { particle.destroy(); @@ -414,7 +426,7 @@ export class EvolutionPhase extends Phase { doArcDownParticle(trigIndex: integer) { const initialX = this.evolutionBaseBg.displayWidth / 2; - const particle = this.scene.add.image(initialX, 0, 'evo_sparkle'); + const particle = this.scene.add.image(initialX, 0, "evo_sparkle"); particle.setScale(0.5); this.evolutionContainer.add(particle); @@ -448,7 +460,7 @@ export class EvolutionPhase extends Phase { doCircleInwardParticle(trigIndex: integer, speed: integer) { const initialX = this.evolutionBaseBg.displayWidth / 2; const initialY = this.evolutionBaseBg.displayHeight / 2; - const particle = this.scene.add.image(initialX, initialY, 'evo_sparkle'); + const particle = this.scene.add.image(initialX, initialY, "evo_sparkle"); this.evolutionContainer.add(particle); let amp = 120; @@ -480,13 +492,13 @@ export class EvolutionPhase extends Phase { doSprayParticle(trigIndex: integer) { const initialX = this.evolutionBaseBg.displayWidth / 2; const initialY = this.evolutionBaseBg.displayHeight / 2; - const particle = this.scene.add.image(initialX, initialY, 'evo_sparkle'); + const particle = this.scene.add.image(initialX, initialY, "evo_sparkle"); this.evolutionContainer.add(particle); let f = 0; let yOffset = 0; - let speed = 3 - Utils.randInt(8); - let amp = 48 + Utils.randInt(64); + const speed = 3 - Utils.randInt(8); + const amp = 48 + Utils.randInt(64); const particleTimer = this.scene.tweens.addCounter({ repeat: -1, @@ -497,13 +509,15 @@ export class EvolutionPhase extends Phase { }); const updateParticle = () => { - if (!(f & 3)) + if (!(f & 3)) { yOffset++; + } if (trigIndex < 128) { particle.setPosition(initialX + (speed * f) / 3, initialY + yOffset); particle.y += -sin(trigIndex, amp); - if (f > 108) + if (f > 108) { particle.setScale((1 - (f - 108) / 20)); + } trigIndex++; f++; } else { @@ -522,4 +536,4 @@ export class EndEvolutionPhase extends Phase { this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); } -} \ No newline at end of file +} diff --git a/src/field/anims.ts b/src/field/anims.ts index bbe35d9312b1..0e6bef565f5b 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -4,35 +4,35 @@ import * as Utils from "../utils"; export function addPokeballOpenParticles(scene: BattleScene, x: number, y: number, pokeballType: PokeballType): void { switch (pokeballType) { - case PokeballType.POKEBALL: - doDefaultPbOpenParticles(scene, x, y, 48); - break; - case PokeballType.GREAT_BALL: - doDefaultPbOpenParticles(scene, x, y, 96); - break; - case PokeballType.ULTRA_BALL: - doUbOpenParticles(scene, x, y, 8); - break; - case PokeballType.ROGUE_BALL: - doUbOpenParticles(scene, x, y, 10); - break; - case PokeballType.MASTER_BALL: - doMbOpenParticles(scene, x, y); - break; + case PokeballType.POKEBALL: + doDefaultPbOpenParticles(scene, x, y, 48); + break; + case PokeballType.GREAT_BALL: + doDefaultPbOpenParticles(scene, x, y, 96); + break; + case PokeballType.ULTRA_BALL: + doUbOpenParticles(scene, x, y, 8); + break; + case PokeballType.ROGUE_BALL: + doUbOpenParticles(scene, x, y, 10); + break; + case PokeballType.MASTER_BALL: + doMbOpenParticles(scene, x, y); + break; } } function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radius: number) { - const pbOpenParticlesFrameNames = scene.anims.generateFrameNames('pb_particles', { start: 0, end: 3, suffix: '.png' }); + const pbOpenParticlesFrameNames = scene.anims.generateFrameNames("pb_particles", { start: 0, end: 3, suffix: ".png" }); scene.anims.create({ - key: 'pb_open_particle', + key: "pb_open_particle", frames: pbOpenParticlesFrameNames, frameRate: 16, repeat: -1 }); const addParticle = (index: integer) => { - const particle = scene.add.sprite(x, y, 'pb_open_particle'); + const particle = scene.add.sprite(x, y, "pb_open_particle"); scene.field.add(particle); const angle = index * 45; const [ xCoord, yCoord ] = [ radius * Math.cos(angle * Math.PI / 180), radius * Math.sin(angle * Math.PI / 180) ]; @@ -43,7 +43,7 @@ function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radi duration: 575 }); particle.play({ - key: 'pb_open_particle', + key: "pb_open_particle", startFrame: (index + 3) % 4, frameRate: Math.floor(16 * scene.gameSpeed) }); @@ -52,7 +52,7 @@ function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radi delay: 500, duration: 75, alpha: 0, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => particle.destroy() }); }; @@ -66,38 +66,42 @@ function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radi } function doUbOpenParticles(scene: BattleScene, x: number, y: number, frameIndex: integer) { - let particles: Phaser.GameObjects.Image[] = []; - for (let i = 0; i < 10; i++) + const particles: Phaser.GameObjects.Image[] = []; + for (let i = 0; i < 10; i++) { particles.push(doFanOutParticle(scene, i * 25, x, y, 1, 1, 5, frameIndex)); + } scene.tweens.add({ targets: particles, delay: 750, duration: 250, alpha: 0, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { - for (let particle of particles) + for (const particle of particles) { particle.destroy(); + } } }); } function doMbOpenParticles(scene: BattleScene, x: number, y: number) { - let particles: Phaser.GameObjects.Image[] = []; + const particles: Phaser.GameObjects.Image[] = []; for (let j = 0; j < 2; j++) { - for (let i = 0; i < 8; i++) + for (let i = 0; i < 8; i++) { particles.push(doFanOutParticle(scene, i * 32, x, y, j ? 1 : 2, j ? 2 : 1, 8, 4)); + } scene.tweens.add({ targets: particles, delay: 750, duration: 250, alpha: 0, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { - for (let particle of particles) + for (const particle of particles) { particle.destroy(); + } } }); } @@ -106,12 +110,13 @@ function doMbOpenParticles(scene: BattleScene, x: number, y: number) { function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: integer, xSpeed: integer, ySpeed: integer, angle: integer, frameIndex: integer): Phaser.GameObjects.Image { let f = 0; - const particle = scene.add.image(x, y, 'pb_particles', `${frameIndex}.png`); + const particle = scene.add.image(x, y, "pb_particles", `${frameIndex}.png`); scene.field.add(particle); const updateParticle = () => { - if (!particle.scene) + if (!particle.scene) { return particleTimer.remove(); + } particle.x = x + sin(trigIndex, f * xSpeed); particle.y = y + cos(trigIndex, f * ySpeed); trigIndex = (trigIndex + angle); @@ -131,7 +136,7 @@ function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: export function addPokeballCaptureStars(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite): void { const addParticle = () => { - const particle = scene.add.sprite(pokeball.x, pokeball.y, 'pb_particles', '4.png'); + const particle = scene.add.sprite(pokeball.x, pokeball.y, "pb_particles", "4.png"); particle.setOrigin(pokeball.originX, pokeball.originY); particle.setAlpha(0.5); scene.field.add(particle); @@ -139,14 +144,14 @@ export function addPokeballCaptureStars(scene: BattleScene, pokeball: Phaser.Gam scene.tweens.add({ targets: particle, y: pokeball.y - 10, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", duration: 250, onComplete: () => { scene.tweens.add({ targets: particle, y: pokeball.y, alpha: 0, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", duration: 250 }); } @@ -177,4 +182,4 @@ export function sin(index: integer, amplitude: integer): number { export function cos(index: integer, amplitude: integer): number { return amplitude * Math.cos(index * (Math.PI / 128)); -} \ No newline at end of file +} diff --git a/src/field/arena.ts b/src/field/arena.ts index 75cc86fcebc8..179fdf8d5d9b 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -18,7 +18,7 @@ import { TimeOfDay } from "../data/enums/time-of-day"; import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import Pokemon from "./pokemon"; -import * as Overrides from '../overrides'; +import * as Overrides from "../overrides"; export class Arena { public scene: BattleScene; @@ -58,16 +58,18 @@ export class Arena { const timeOfDay = this.getTimeOfDay(); if (timeOfDay !== this.lastTimeOfDay) { this.pokemonPool = {}; - for (let tier of Object.keys(biomePokemonPools[this.biomeType])) + for (const tier of Object.keys(biomePokemonPools[this.biomeType])) { this.pokemonPool[tier] = Object.assign([], biomePokemonPools[this.biomeType][tier][TimeOfDay.ALL]).concat(biomePokemonPools[this.biomeType][tier][timeOfDay]); + } this.lastTimeOfDay = timeOfDay; } } randomSpecies(waveIndex: integer, level: integer, attempt?: integer): PokemonSpecies { const overrideSpecies = this.scene.gameMode.getOverrideSpecies(waveIndex); - if (overrideSpecies) + if (overrideSpecies) { return overrideSpecies; + } const isBoss = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length && (this.biomeType !== Biome.END || this.scene.gameMode.isClassic || this.scene.gameMode.isWaveFinal(waveIndex)); const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64); @@ -82,23 +84,24 @@ export class Arena { const tierPool = this.pokemonPool[tier]; let ret: PokemonSpecies; let regen = false; - if (!tierPool.length) + if (!tierPool.length) { ret = this.scene.randomSpecies(waveIndex, level); - else { + } else { const entry = tierPool[Utils.randSeedInt(tierPool.length)]; let species: Species; - if (typeof entry === 'number') + if (typeof entry === "number") { species = entry as Species; - else { + } else { const levelThresholds = Object.keys(entry); for (let l = levelThresholds.length - 1; l >= 0; l--) { const levelThreshold = parseInt(levelThresholds[l]); if (level >= levelThreshold) { const speciesIds = entry[levelThreshold]; - if (speciesIds.length > 1) + if (speciesIds.length > 1) { species = speciesIds[Utils.randSeedInt(speciesIds.length)]; - else + } else { species = speciesIds[0]; + } break; } } @@ -108,30 +111,30 @@ export class Arena { if (ret.subLegendary || ret.legendary || ret.mythical) { switch (true) { - case (ret.baseTotal >= 720): - regen = level < 90; - break; - case (ret.baseTotal >= 670): - regen = level < 70; - break; - case (ret.baseTotal >= 580): - regen = level < 50; - break; - default: - regen = level < 30; - break; + case (ret.baseTotal >= 720): + regen = level < 90; + break; + case (ret.baseTotal >= 670): + regen = level < 70; + break; + case (ret.baseTotal >= 580): + regen = level < 50; + break; + default: + regen = level < 30; + break; } } } if (regen && (attempt || 0) < 10) { - console.log('Incompatible level: regenerating...'); + console.log("Incompatible level: regenerating..."); return this.randomSpecies(waveIndex, level, (attempt || 0) + 1); } const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss, this.scene.gameMode); if (newSpeciesId !== ret.speciesId) { - console.log('Replaced', Species[ret.speciesId], 'with', Species[newSpeciesId]); + console.log("Replaced", Species[ret.speciesId], "with", Species[newSpeciesId]); ret = getPokemonSpecies(newSpeciesId); } return ret; @@ -140,7 +143,7 @@ export class Arena { randomTrainerType(waveIndex: integer): TrainerType { const isBoss = !!this.trainerPool[BiomePoolTier.BOSS].length && this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym); - console.log(isBoss, this.trainerPool) + console.log(isBoss, this.trainerPool); const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64); let tier = !isBoss ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE @@ -156,41 +159,41 @@ export class Arena { getSpeciesFormIndex(species: PokemonSpecies): integer { switch (species.speciesId) { - case Species.BURMY: - case Species.WORMADAM: - switch (this.biomeType) { - case Biome.BEACH: - return 1; - case Biome.SLUM: - return 2; - } - break; - case Species.ROTOM: - switch (this.biomeType) { - 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; - } - break; - case Species.LYCANROC: - const timeOfDay = this.getTimeOfDay(); - switch (timeOfDay) { - case TimeOfDay.DAY: - case TimeOfDay.DAWN: - return 0; - case TimeOfDay.DUSK: - return 2; - case TimeOfDay.NIGHT: - return 1; - } - break; + case Species.BURMY: + case Species.WORMADAM: + switch (this.biomeType) { + case Biome.BEACH: + return 1; + case Biome.SLUM: + return 2; + } + break; + case Species.ROTOM: + switch (this.biomeType) { + 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; + } + break; + case Species.LYCANROC: + const timeOfDay = this.getTimeOfDay(); + switch (timeOfDay) { + case TimeOfDay.DAY: + case TimeOfDay.DAWN: + return 0; + case TimeOfDay.DUSK: + return 2; + case TimeOfDay.NIGHT: + return 1; + } + break; } return 0; @@ -198,70 +201,70 @@ export class Arena { getTypeForBiome() { switch (this.biomeType) { - case Biome.TOWN: - case Biome.PLAINS: - case Biome.METROPOLIS: - return Type.NORMAL; - case Biome.GRASS: - case Biome.TALL_GRASS: - return Type.GRASS; - case Biome.FOREST: - case Biome.JUNGLE: - return Type.BUG; - case Biome.SLUM: - case Biome.SWAMP: - return Type.POISON; - case Biome.SEA: - case Biome.BEACH: - case Biome.LAKE: - case Biome.SEABED: - return Type.WATER; - case Biome.MOUNTAIN: - return Type.FLYING; - case Biome.BADLANDS: - return Type.GROUND; - case Biome.CAVE: - case Biome.DESERT: - return Type.ROCK; - case Biome.ICE_CAVE: - case Biome.SNOWY_FOREST: - return Type.ICE; - case Biome.MEADOW: - case Biome.FAIRY_CAVE: - case Biome.ISLAND: - return Type.FAIRY; - case Biome.POWER_PLANT: - return Type.ELECTRIC; - case Biome.VOLCANO: - return Type.FIRE; - case Biome.GRAVEYARD: - case Biome.TEMPLE: - return Type.GHOST; - case Biome.DOJO: - case Biome.CONSTRUCTION_SITE: - return Type.FIGHTING; - case Biome.FACTORY: - case Biome.LABORATORY: - return Type.STEEL; - case Biome.RUINS: - case Biome.SPACE: - return Type.PSYCHIC; - case Biome.WASTELAND: - case Biome.END: - return Type.DRAGON; - case Biome.ABYSS: - return Type.DARK; - default: - return Type.UNKNOWN; + case Biome.TOWN: + case Biome.PLAINS: + case Biome.METROPOLIS: + return Type.NORMAL; + case Biome.GRASS: + case Biome.TALL_GRASS: + return Type.GRASS; + case Biome.FOREST: + case Biome.JUNGLE: + return Type.BUG; + case Biome.SLUM: + case Biome.SWAMP: + return Type.POISON; + case Biome.SEA: + case Biome.BEACH: + case Biome.LAKE: + case Biome.SEABED: + return Type.WATER; + case Biome.MOUNTAIN: + return Type.FLYING; + case Biome.BADLANDS: + return Type.GROUND; + case Biome.CAVE: + case Biome.DESERT: + return Type.ROCK; + case Biome.ICE_CAVE: + case Biome.SNOWY_FOREST: + return Type.ICE; + case Biome.MEADOW: + case Biome.FAIRY_CAVE: + case Biome.ISLAND: + return Type.FAIRY; + case Biome.POWER_PLANT: + return Type.ELECTRIC; + case Biome.VOLCANO: + return Type.FIRE; + case Biome.GRAVEYARD: + case Biome.TEMPLE: + return Type.GHOST; + case Biome.DOJO: + case Biome.CONSTRUCTION_SITE: + return Type.FIGHTING; + case Biome.FACTORY: + case Biome.LABORATORY: + return Type.STEEL; + case Biome.RUINS: + case Biome.SPACE: + return Type.PSYCHIC; + case Biome.WASTELAND: + case Biome.END: + return Type.DRAGON; + case Biome.ABYSS: + return Type.DARK; + default: + return Type.UNKNOWN; } } getBgTerrainColorRatioForBiome(): number { switch (this.biomeType) { - case Biome.SPACE: - return 1; - case Biome.END: - return 0; + case Biome.SPACE: + return 1; + case Biome.END: + return 0; } return 131 / 180; @@ -276,7 +279,7 @@ export class Arena { this.weather = new Weather(weather, 0); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); this.scene.queueMessage(getWeatherStartMessage(weather)); - return true + return true; } /** @@ -286,11 +289,13 @@ export class Arena { * @returns true if new weather set, false if no weather provided or attempting to set the same weather as currently in use */ trySetWeather(weather: WeatherType, hasPokemonSource: boolean): boolean { - if (Overrides.WEATHER_OVERRIDE) + if (Overrides.WEATHER_OVERRIDE) { return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE); + } - if (this.weather?.weatherType === (weather || undefined)) + if (this.weather?.weatherType === (weather || undefined)) { return false; + } const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; @@ -306,7 +311,7 @@ export class Arena { } this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => 'weatherTypes' in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather)); + pokemon.findAndRemoveTags(t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather)); applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); }); @@ -314,22 +319,25 @@ export class Arena { } trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim: boolean = false): boolean { - if (this.terrain?.terrainType === (terrain || undefined)) + if (this.terrain?.terrainType === (terrain || undefined)) { return false; + } const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; if (this.terrain) { - if (!ignoreAnim) + if (!ignoreAnim) { this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.MISTY_TERRAIN + (terrain - 1))); + } this.scene.queueMessage(getTerrainStartMessage(terrain)); - } else + } else { this.scene.queueMessage(getTerrainClearMessage(oldTerrainType)); + } this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { - pokemon.findAndRemoveTags(t => 'terrainTypes' in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); + pokemon.findAndRemoveTags(t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); }); @@ -350,131 +358,138 @@ export class Arena { getAttackTypeMultiplier(attackType: Type, grounded: boolean): number { let weatherMultiplier = 1; - if (this.weather && !this.weather.isEffectSuppressed(this.scene)) + if (this.weather && !this.weather.isEffectSuppressed(this.scene)) { weatherMultiplier = this.weather.getAttackTypeMultiplier(attackType); + } let terrainMultiplier = 1; - if (this.terrain && grounded) + if (this.terrain && grounded) { terrainMultiplier = this.terrain.getAttackTypeMultiplier(attackType); + } return weatherMultiplier * terrainMultiplier; } getTrainerChance(): integer { switch (this.biomeType) { - case Biome.METROPOLIS: - return 2; - case Biome.SLUM: - case Biome.BEACH: - case Biome.DOJO: - case Biome.CONSTRUCTION_SITE: - return 4; - case Biome.PLAINS: - case Biome.GRASS: - case Biome.LAKE: - case Biome.CAVE: - return 6; - case Biome.TALL_GRASS: - case Biome.FOREST: - case Biome.SEA: - case Biome.SWAMP: - case Biome.MOUNTAIN: - case Biome.BADLANDS: - case Biome.DESERT: - case Biome.MEADOW: - case Biome.POWER_PLANT: - case Biome.GRAVEYARD: - case Biome.FACTORY: - case Biome.SNOWY_FOREST: - return 8; - case Biome.ICE_CAVE: - case Biome.VOLCANO: - case Biome.RUINS: - case Biome.WASTELAND: - case Biome.JUNGLE: - case Biome.FAIRY_CAVE: - return 12; - case Biome.SEABED: - case Biome.ABYSS: - case Biome.SPACE: - case Biome.TEMPLE: - return 16; - default: - return 0; + case Biome.METROPOLIS: + return 2; + case Biome.SLUM: + case Biome.BEACH: + case Biome.DOJO: + case Biome.CONSTRUCTION_SITE: + return 4; + case Biome.PLAINS: + case Biome.GRASS: + case Biome.LAKE: + case Biome.CAVE: + return 6; + case Biome.TALL_GRASS: + case Biome.FOREST: + case Biome.SEA: + case Biome.SWAMP: + case Biome.MOUNTAIN: + case Biome.BADLANDS: + case Biome.DESERT: + case Biome.MEADOW: + case Biome.POWER_PLANT: + case Biome.GRAVEYARD: + case Biome.FACTORY: + case Biome.SNOWY_FOREST: + return 8; + case Biome.ICE_CAVE: + case Biome.VOLCANO: + case Biome.RUINS: + case Biome.WASTELAND: + case Biome.JUNGLE: + case Biome.FAIRY_CAVE: + return 12; + case Biome.SEABED: + case Biome.ABYSS: + case Biome.SPACE: + case Biome.TEMPLE: + return 16; + default: + return 0; } } getTimeOfDay(): TimeOfDay { switch (this.biomeType) { - case Biome.ABYSS: - return TimeOfDay.NIGHT; + case Biome.ABYSS: + return TimeOfDay.NIGHT; } const waveCycle = ((this.scene.currentBattle?.waveIndex || 0) + this.scene.waveCycleOffset) % 40; - if (waveCycle < 15) + if (waveCycle < 15) { return TimeOfDay.DAY; + } - if (waveCycle < 20) + if (waveCycle < 20) { return TimeOfDay.DUSK; + } - if (waveCycle < 35) + if (waveCycle < 35) { return TimeOfDay.NIGHT; + } return TimeOfDay.DAWN; } isOutside(): boolean { switch (this.biomeType) { - case Biome.SEABED: - case Biome.CAVE: - case Biome.ICE_CAVE: - case Biome.POWER_PLANT: - case Biome.DOJO: - case Biome.FACTORY: - case Biome.ABYSS: - case Biome.FAIRY_CAVE: - case Biome.TEMPLE: - case Biome.LABORATORY: - return false; - default: - return true; + case Biome.SEABED: + case Biome.CAVE: + case Biome.ICE_CAVE: + case Biome.POWER_PLANT: + case Biome.DOJO: + case Biome.FACTORY: + case Biome.ABYSS: + case Biome.FAIRY_CAVE: + case Biome.TEMPLE: + case Biome.LABORATORY: + return false; + default: + return true; } } getDayTint(): [integer, integer, integer] { switch (this.biomeType) { - case Biome.ABYSS: - return [ 64, 64, 64 ]; - default: - return [ 128, 128, 128 ]; + case Biome.ABYSS: + return [ 64, 64, 64 ]; + default: + return [ 128, 128, 128 ]; } } getDuskTint(): [integer, integer, integer] { - if (!this.isOutside()) + if (!this.isOutside()) { return [ 0, 0, 0 ]; + } switch (this.biomeType) { - default: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; + default: + return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; } } getNightTint(): [integer, integer, integer] { switch (this.biomeType) { - case Biome.ABYSS: - case Biome.SPACE: - case Biome.END: - return this.getDayTint(); + case Biome.ABYSS: + case Biome.SPACE: + case Biome.END: + return this.getDayTint(); } - if (!this.isOutside()) + if (!this.isOutside()) { return [ 64, 64, 64 ]; + } switch (this.biomeType) { - default: - return [ 48, 48, 98 ]; + default: + return [ 48, 48, 98 ]; } } @@ -483,17 +498,18 @@ export class Arena { } applyTagsForSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide, ...args: any[]): void { - let tags = typeof tagType === 'string' + let tags = typeof tagType === "string" ? this.tags.filter(t => t.tagType === tagType) : this.tags.filter(t => t instanceof tagType); - if (side !== ArenaTagSide.BOTH) + if (side !== ArenaTagSide.BOTH) { tags = tags.filter(t => t.side === side); + } tags.forEach(t => t.apply(this, args)); - } + } applyTags(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, ...args: any[]): void { this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); - } + } addTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide = ArenaTagSide.BOTH, targetIndex?: BattlerIndex): boolean { const existingTag = this.getTagOnSide(tagType, side); @@ -514,7 +530,7 @@ export class Arena { } getTagOnSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide): ArenaTag { - return typeof(tagType) === 'string' + return typeof(tagType) === "string" ? this.tags.find(t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)) : this.tags.find(t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side)); } @@ -567,110 +583,110 @@ export class Arena { getBgmLoopPoint(): number { switch (this.biomeType) { - case Biome.TOWN: - return 7.288; - case Biome.PLAINS: - return 7.693; - case Biome.GRASS: - return 1.995; - case Biome.TALL_GRASS: - return 9.608; - case Biome.METROPOLIS: - return 141.470; - case Biome.FOREST: - return 4.294; - case Biome.SEA: - return 1.672; - case Biome.SWAMP: - return 4.461; - case Biome.BEACH: - return 3.462; - case Biome.LAKE: - return 5.350; - case Biome.SEABED: - return 2.629; - case Biome.MOUNTAIN: - return 4.018; - case Biome.BADLANDS: - return 17.790; - case Biome.CAVE: - return 14.240; - case Biome.DESERT: - return 1.143; - case Biome.ICE_CAVE: - return 15.010; - case Biome.MEADOW: - return 3.891; - case Biome.POWER_PLANT: - return 2.810; - case Biome.VOLCANO: - return 5.116; - case Biome.GRAVEYARD: - return 3.232; - case Biome.DOJO: - return 6.205; - case Biome.FACTORY: - return 4.985; - case Biome.RUINS: - return 2.270; - case Biome.WASTELAND: - return 6.336; - case Biome.ABYSS: - return 5.130; - case Biome.SPACE: - return 21.347; - case Biome.CONSTRUCTION_SITE: - return 1.222; - case Biome.JUNGLE: - return 0.000; - case Biome.FAIRY_CAVE: - return 4.542; - case Biome.TEMPLE: - return 2.547; - case Biome.ISLAND: - return 2.751; - case Biome.LABORATORY: - return 114.862; - case Biome.SLUM: - return 1.221; - case Biome.SNOWY_FOREST: - return 3.047; - } - } -} - -export function getBiomeKey(biome: Biome): string { - return Biome[biome].toLowerCase(); -} - -export function getBiomeHasProps(biomeType: Biome): boolean { - switch (biomeType) { + case Biome.TOWN: + return 7.288; + case Biome.PLAINS: + return 7.693; + case Biome.GRASS: + return 1.995; + case Biome.TALL_GRASS: + return 9.608; case Biome.METROPOLIS: + return 141.470; + case Biome.FOREST: + return 4.294; + case Biome.SEA: + return 1.672; + case Biome.SWAMP: + return 4.461; case Biome.BEACH: + return 3.462; case Biome.LAKE: + return 5.350; case Biome.SEABED: + return 2.629; case Biome.MOUNTAIN: + return 4.018; case Biome.BADLANDS: + return 17.790; case Biome.CAVE: + return 14.240; case Biome.DESERT: + return 1.143; case Biome.ICE_CAVE: + return 15.010; case Biome.MEADOW: + return 3.891; case Biome.POWER_PLANT: + return 2.810; case Biome.VOLCANO: + return 5.116; case Biome.GRAVEYARD: + return 3.232; + case Biome.DOJO: + return 6.205; case Biome.FACTORY: + return 4.985; case Biome.RUINS: + return 2.270; case Biome.WASTELAND: + return 6.336; case Biome.ABYSS: + return 5.130; + case Biome.SPACE: + return 21.347; case Biome.CONSTRUCTION_SITE: + return 1.222; case Biome.JUNGLE: + return 0.000; case Biome.FAIRY_CAVE: + return 4.542; case Biome.TEMPLE: - case Biome.SNOWY_FOREST: + return 2.547; case Biome.ISLAND: + return 2.751; case Biome.LABORATORY: - case Biome.END: - return true; + return 114.862; + case Biome.SLUM: + return 1.221; + case Biome.SNOWY_FOREST: + return 3.047; + } + } +} + +export function getBiomeKey(biome: Biome): string { + return Biome[biome].toLowerCase(); +} + +export function getBiomeHasProps(biomeType: Biome): boolean { + switch (biomeType) { + case Biome.METROPOLIS: + case Biome.BEACH: + case Biome.LAKE: + case Biome.SEABED: + case Biome.MOUNTAIN: + case Biome.BADLANDS: + case Biome.CAVE: + case Biome.DESERT: + case Biome.ICE_CAVE: + case Biome.MEADOW: + case Biome.POWER_PLANT: + case Biome.VOLCANO: + case Biome.GRAVEYARD: + case Biome.FACTORY: + case Biome.RUINS: + case Biome.WASTELAND: + case Biome.ABYSS: + case Biome.CONSTRUCTION_SITE: + case Biome.JUNGLE: + case Biome.FAIRY_CAVE: + case Biome.TEMPLE: + case Biome.SNOWY_FOREST: + case Biome.ISLAND: + case Biome.LABORATORY: + case Biome.END: + return true; } return false; @@ -688,12 +704,12 @@ export class ArenaBase extends Phaser.GameObjects.Container { this.player = player; - this.base = scene.addFieldSprite(0, 0, 'plains_a', null, 1); + this.base = scene.addFieldSprite(0, 0, "plains_a", null, 1); this.base.setOrigin(0, 0); this.props = !player ? new Array(3).fill(null).map(() => { - const ret = scene.addFieldSprite(0, 0, 'plains_b', null, 1); + const ret = scene.addFieldSprite(0, 0, "plains_b", null, 1); ret.setOrigin(0, 0); ret.setVisible(false); return ret; @@ -703,7 +719,7 @@ export class ArenaBase extends Phaser.GameObjects.Container { setBiome(biome: Biome, propValue?: integer): void { const hasProps = getBiomeHasProps(biome); const biomeKey = getBiomeKey(biome); - const baseKey = `${biomeKey}_${this.player ? 'a' : 'b'}`; + const baseKey = `${biomeKey}_${this.player ? "a" : "b"}`; if (biome !== this.biome) { this.base.setTexture(baseKey); @@ -717,8 +733,9 @@ export class ArenaBase extends Phaser.GameObjects.Container { repeat: -1 }); this.base.play(baseKey); - } else + } else { this.base.stop(); + } this.add(this.base); } @@ -729,7 +746,7 @@ export class ArenaBase extends Phaser.GameObjects.Container { ? hasProps ? Utils.randSeedInt(8) : 0 : propValue; this.props.forEach((prop, p) => { - const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ''}`; + const propKey = `${biomeKey}_b${hasProps ? `_${p + 1}` : ""}`; prop.setTexture(propKey); if (hasProps && prop.texture.frameTotal > 1) { @@ -741,8 +758,9 @@ export class ArenaBase extends Phaser.GameObjects.Container { repeat: -1 }); prop.play(propKey); - } else + } else { prop.stop(); + } prop.setVisible(hasProps && !!(this.propValue & (1 << p))); this.add(prop); @@ -750,4 +768,4 @@ export class ArenaBase extends Phaser.GameObjects.Container { }, (this.scene as BattleScene).currentBattle?.waveIndex || 0, (this.scene as BattleScene).waveSeed); } } -} \ No newline at end of file +} diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 262ff8863d06..cebde7c3ae9d 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -13,8 +13,9 @@ export default class DamageNumberHandler { add(target: Pokemon, amount: integer, result: DamageResult | HitResult.HEAL = HitResult.EFFECTIVE, critical: boolean = false): void { const scene = target.scene; - if (!scene?.damageNumbersMode) + if (!scene?.damageNumbersMode) { return; + } const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; @@ -25,41 +26,45 @@ export default class DamageNumberHandler { let [ textColor, shadowColor ] = [ null, null ]; switch (result) { - case HitResult.SUPER_EFFECTIVE: - [ textColor, shadowColor ] = [ '#f8d030', '#b8a038' ]; - break; - case HitResult.NOT_VERY_EFFECTIVE: - [ textColor, shadowColor ] = [ '#f08030', '#c03028' ]; - break; - case HitResult.ONE_HIT_KO: - [ textColor, shadowColor ] = [ '#a040a0', '#483850' ]; - break; - case HitResult.HEAL: - [ textColor, shadowColor ] = [ '#78c850', '#588040' ]; - break; - default: - [ textColor, shadowColor ] = [ '#ffffff', '#636363' ]; - break; + case HitResult.SUPER_EFFECTIVE: + [ textColor, shadowColor ] = [ "#f8d030", "#b8a038" ]; + break; + case HitResult.NOT_VERY_EFFECTIVE: + [ textColor, shadowColor ] = [ "#f08030", "#c03028" ]; + break; + case HitResult.ONE_HIT_KO: + [ textColor, shadowColor ] = [ "#a040a0", "#483850" ]; + break; + case HitResult.HEAL: + [ textColor, shadowColor ] = [ "#78c850", "#588040" ]; + break; + default: + [ textColor, shadowColor ] = [ "#ffffff", "#636363" ]; + break; } - if (textColor) + if (textColor) { damageNumber.setColor(textColor); + } if (shadowColor) { if (critical) { damageNumber.setShadowOffset(0, 0); damageNumber.setStroke(shadowColor, 12); - } else + } else { damageNumber.setShadowColor(shadowColor); + } } scene.fieldUI.add(damageNumber); - if (!this.damageNumbers.has(battlerIndex)) + if (!this.damageNumbers.has(battlerIndex)) { this.damageNumbers.set(battlerIndex, []); + } const yOffset = this.damageNumbers.get(battlerIndex).length * -10; - if (yOffset) + if (yOffset) { damageNumber.y += yOffset; + } this.damageNumbers.get(battlerIndex).push(damageNumber); @@ -68,14 +73,14 @@ export default class DamageNumberHandler { targets: damageNumber, duration: Utils.fixedInt(750), alpha: 1, - y: '-=32' + y: "-=32" }); scene.tweens.add({ delay: 375, targets: damageNumber, duration: Utils.fixedInt(625), alpha: 0, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.damageNumbers.get(battlerIndex).splice(this.damageNumbers.get(battlerIndex).indexOf(damageNumber), 1); damageNumber.destroy(true); @@ -94,68 +99,68 @@ export default class DamageNumberHandler { alpha: 1, scaleX: 0.75 * baseScale, scaleY: 1.25 * baseScale, - y: '-=16', - ease: 'Cubic.easeOut' + y: "-=16", + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(175), alpha: 1, scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, - y: '+=16', - ease: 'Cubic.easeIn' + y: "+=16", + ease: "Cubic.easeIn" }, { duration: Utils.fixedInt(100), scaleX: 1.25 * baseScale, scaleY: 0.75 * baseScale, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(175), scaleX: 0.875 * baseScale, scaleY: 1.125 * baseScale, - y: '-=8', - ease: 'Cubic.easeOut' + y: "-=8", + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(50), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, - y: '+=8', - ease: 'Cubic.easeIn' + y: "+=8", + ease: "Cubic.easeIn" }, { duration: Utils.fixedInt(100), scaleX: 1.125 * baseScale, scaleY: 0.875 * baseScale, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(175), scaleX: 0.925 * baseScale, scaleY: 1.075 * baseScale, - y: '-=4', - ease: 'Cubic.easeOut' + y: "-=4", + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(50), scaleX: 0.975 * baseScale, scaleY: 1.025 * baseScale, - y: '+=4', - ease: 'Cubic.easeIn' + y: "+=4", + ease: "Cubic.easeIn" }, { duration: Utils.fixedInt(100), scaleX: 1.075 * baseScale, scaleY: 0.925 * baseScale, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }, { duration: Utils.fixedInt(25), scaleX: baseScale, scaleY: baseScale, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }, { delay: Utils.fixedInt(500), @@ -168,4 +173,4 @@ export default class DamageNumberHandler { ] }); } -} \ No newline at end of file +} diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 5ae54f2d2c10..9b55133bb501 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -20,11 +20,13 @@ export default class PokemonSpriteSparkleHandler { onLapse(): void { Array.from(this.sprites.values()).filter(s => !s.scene).map(s => this.sprites.delete(s)); - for (let s of this.sprites.values()) { - if (!s.pipelineData['teraColor'] || !(s.pipelineData['teraColor'] as number[]).find(c => c)) + for (const s of this.sprites.values()) { + if (!s.pipelineData["teraColor"] || !(s.pipelineData["teraColor"] as number[]).find(c => c)) { continue; - if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) + } + if (!s.visible || (s.parentContainer instanceof Pokemon && !s.parentContainer.parentContainer)) { continue; + } const pokemon = s.parentContainer instanceof Pokemon ? s.parentContainer as Pokemon : null; const parent = (pokemon || s).parentContainer; const texture = s.texture; @@ -32,12 +34,12 @@ export default class PokemonSpriteSparkleHandler { const [ pixelX, pixelY ] = [ Utils.randInt(width), Utils.randInt(height) ]; const ratioX = s.width / width; const ratioY = s.height / height; - const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, '__BASE'); + const pixel = texture.manager.getPixel(pixelX, pixelY, texture.key, "__BASE"); if (pixel.alpha) { const [ xOffset, yOffset ] = [ -s.originX * s.width, -s.originY * s.height]; - const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), 'tera_sparkle'); - sparkle.pipelineData['ignoreTimeTint'] = s.pipelineData['ignoreTimeTint']; - sparkle.play('tera_sparkle'); + const sparkle = (s.scene as BattleScene).addFieldSprite(((pokemon?.x || 0) + s.x + pixelX * ratioX + xOffset), ((pokemon?.y || 0) + s.y + pixelY * ratioY + yOffset), "tera_sparkle"); + sparkle.pipelineData["ignoreTimeTint"] = s.pipelineData["ignoreTimeTint"]; + sparkle.play("tera_sparkle"); parent.add(sparkle); s.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => sparkle.destroy()); } @@ -45,25 +47,29 @@ export default class PokemonSpriteSparkleHandler { } add(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { - if (!Array.isArray(sprites)) + if (!Array.isArray(sprites)) { sprites = [ sprites ]; - for (let s of sprites) { - if (this.sprites.has(s)) + } + for (const s of sprites) { + if (this.sprites.has(s)) { continue; + } this.sprites.add(s); } } remove(sprites: Phaser.GameObjects.Sprite | Phaser.GameObjects.Sprite[]): void { - if (!Array.isArray(sprites)) + if (!Array.isArray(sprites)) { sprites = [ sprites ]; - for (let s of sprites) { + } + for (const s of sprites) { this.sprites.delete(s); } } removeAll(): void { - for (let s of this.sprites.values()) + for (const s of this.sprites.values()) { this.sprites.delete(s); + } } -} \ No newline at end of file +} diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 75631c0f6d2a..b565c3b8ae21 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1,53 +1,53 @@ -import Phaser from 'phaser'; -import BattleScene, { AnySound } from '../battle-scene'; -import { Variant, VariantSet, variantColorCache } from '#app/data/variant'; -import { variantData } from '#app/data/variant'; -import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from '../ui/battle-info'; +import Phaser from "phaser"; +import BattleScene, { AnySound } from "../battle-scene"; +import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; +import { variantData } from "#app/data/variant"; +import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; import { Moves } from "../data/enums/moves"; import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit } from "../data/move"; -import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species'; -import * as Utils from '../utils'; -import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from '../data/type'; -import { getLevelTotalExp } from '../data/exp'; -import { Stat } from '../data/pokemon-stat'; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from '../modifier/modifier'; -import { PokeballType } from '../data/pokeball'; -import { Gender } from '../data/gender'; -import { initMoveAnim, loadMoveAnimAssets } from '../data/battle-anims'; -import { Status, StatusEffect, getRandomStatus } from '../data/status-effect'; -import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from '../data/pokemon-evolutions'; -import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from '../data/tms'; -import { DamagePhase, FaintPhase, LearnMovePhase, ObtainStatusEffectPhase, StatChangePhase, SwitchPhase, SwitchSummonPhase, ToggleDoublePositionPhase } from '../phases'; -import { BattleStat } from '../data/battle-stat'; -import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, getBattlerTag } from '../data/battler-tags'; +import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; +import * as Utils from "../utils"; +import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; +import { getLevelTotalExp } from "../data/exp"; +import { Stat } from "../data/pokemon-stat"; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; +import { PokeballType } from "../data/pokeball"; +import { Gender } from "../data/gender"; +import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; +import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; +import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; +import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; +import { DamagePhase, FaintPhase, LearnMovePhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { BattleStat } from "../data/battle-stat"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, getBattlerTag } from "../data/battler-tags"; import { BattlerTagType } from "../data/enums/battler-tag-type"; -import { Species } from '../data/enums/species'; -import { WeatherType } from '../data/weather'; -import { TempBattleStat } from '../data/temp-battle-stat'; -import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from '../data/arena-tag'; +import { Species } from "../data/enums/species"; +import { WeatherType } from "../data/weather"; +import { TempBattleStat } from "../data/temp-battle-stat"; +import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; import { ArenaTagType } from "../data/enums/arena-tag-type"; import { Biome } from "../data/enums/biome"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, NonSuperEffectiveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPostDefendAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr } from '../data/ability'; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, VariableMoveTypeAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr } from "../data/ability"; import { Abilities } from "#app/data/enums/abilities"; -import PokemonData from '../system/pokemon-data'; -import Battle, { BattlerIndex } from '../battle'; +import PokemonData from "../system/pokemon-data"; +import { BattlerIndex } from "../battle"; import { BattleSpec } from "../enums/battle-spec"; -import { Mode } from '../ui/ui'; -import PartyUiHandler, { PartyOption, PartyUiMode } from '../ui/party-ui-handler'; -import SoundFade from 'phaser3-rex-plugins/plugins/soundfade'; -import { LevelMoves } from '../data/pokemon-level-moves'; -import { DamageAchv, achvs } from '../system/achv'; -import { DexAttr, StarterDataEntry, StarterMoveset } from '../system/game-data'; -import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from '@material/material-color-utilities'; -import { Nature, getNatureStatMultiplier } from '../data/nature'; -import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from '../data/pokemon-forms'; -import { TerrainType } from '../data/terrain'; -import { TrainerSlot } from '../data/trainer-config'; -import * as Overrides from '../overrides'; -import { BerryType } from '../data/berry'; -import i18next from '../plugins/i18n'; -import { speciesEggMoves } from '../data/egg-moves'; -import { ModifierTier } from '../modifier/modifier-tier'; +import { Mode } from "../ui/ui"; +import PartyUiHandler, { PartyOption, PartyUiMode } from "../ui/party-ui-handler"; +import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import { LevelMoves } from "../data/pokemon-level-moves"; +import { DamageAchv, achvs } from "../system/achv"; +import { DexAttr, StarterDataEntry, StarterMoveset } from "../system/game-data"; +import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; +import { Nature, getNatureStatMultiplier } from "../data/nature"; +import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "../data/pokemon-forms"; +import { TerrainType } from "../data/terrain"; +import { TrainerSlot } from "../data/trainer-config"; +import * as Overrides from "../overrides"; +import { BerryType } from "../data/berry"; +import i18next from "../plugins/i18n"; +import { speciesEggMoves } from "../data/egg-moves"; +import { ModifierTier } from "../modifier/modifier-tier"; export enum FieldPosition { CENTER, @@ -109,12 +109,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) { super(scene, x, y); - if (!species.isObtainable() && this.isPlayer()) + if (!species.isObtainable() && this.isPlayer()) { throw `Cannot create a player Pokemon for species '${species.getName(formIndex)}'`; + } const hiddenAbilityChance = new Utils.IntegerHolder(256); - if (!this.hasTrainer()) + if (!this.hasTrainer()) { this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + } const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const randAbilityIndex = Utils.randSeedInt(2); @@ -125,14 +127,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.abilityIndex = abilityIndex !== undefined ? abilityIndex : (species.abilityHidden && hasHiddenAbility ? species.ability2 ? 2 : 1 : species.ability2 ? randAbilityIndex : 0); - if (formIndex !== undefined) + if (formIndex !== undefined) { this.formIndex = formIndex; - if (gender !== undefined) + } + if (gender !== undefined) { this.gender = gender; - if (shiny !== undefined) + } + if (shiny !== undefined) { this.shiny = shiny; - if (variant !== undefined) + } + if (variant !== undefined) { this.variant = variant; + } this.exp = dataSource?.exp || getLevelTotalExp(this.level, species.growthRate); this.levelExp = dataSource?.levelExp || 0; if (dataSource) { @@ -141,8 +147,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.stats = dataSource.stats; this.ivs = dataSource.ivs; this.passive = !!dataSource.passive; - if (this.variant === undefined) + if (this.variant === undefined) { this.variant = 0; + } this.nature = dataSource.nature || 0 as Nature; this.natureOverride = dataSource.natureOverride !== undefined ? dataSource.natureOverride : -1; this.moveset = dataSource.moveset; @@ -164,22 +171,27 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); - if (this.gender === undefined) + if (this.gender === undefined) { this.generateGender(); + } - if (this.formIndex === undefined) + if (this.formIndex === undefined) { this.formIndex = this.scene.getSpeciesFormIndex(species, this.gender, this.nature, this.isPlayer()); + } - if (this.shiny === undefined) + if (this.shiny === undefined) { this.trySetShiny(); + } - if (this.variant === undefined) + if (this.variant === undefined) { this.variant = this.shiny ? this.generateVariant() : 0; + } - if (nature !== undefined) + if (nature !== undefined) { this.setNature(nature); - else + } else { this.generateNature(); + } this.natureOverride = -1; @@ -190,8 +202,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (level > 1) { const fused = new Utils.BooleanHolder(scene.gameMode.isSplicedOnly); - if (!fused.value && !this.isPlayer() && !this.hasTrainer()) + if (!fused.value && !this.isPlayer() && !this.hasTrainer()) { this.scene.applyModifier(EnemyFusionChanceModifier, false, fused); + } if (fused.value) { this.calculateStats(); @@ -204,8 +217,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.generateName(); - if (!species.isObtainable()) + if (!species.isObtainable()) { this.shiny = false; + } this.calculateStats(); } @@ -218,7 +232,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.fieldUI.addAt(this.battleInfo, 0); const getSprite = (hasShadow?: boolean) => { - const ret = this.scene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? 'back__' : ''}sub`, undefined, true); + const ret = this.scene.addPokemonSprite(this, 0, 0, `pkmn__${this.isPlayer() ? "back__" : ""}sub`, undefined, true); ret.setOrigin(0.5, 1); ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow, teraColor: getTypeRgb(this.getTeraType()) }); return ret; @@ -234,15 +248,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.addAt(sprite, 0); this.addAt(tintSprite, 1); - if (this.isShiny() && !this.shinySparkle) + if (this.isShiny() && !this.shinySparkle) { this.initShinySparkle(); + } } abstract initBattleInfo(): void; isOnField(): boolean { - if (!this.scene) + if (!this.scene) { return false; + } return this.scene.field.getIndex(this) > -1; } @@ -251,8 +267,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isActive(onField?: boolean): boolean { - if (!this.scene) + if (!this.scene) { return false; + } return !this.isFainted() && !!this.scene && (!onField || this.isOnField()); } @@ -271,8 +288,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return; } this.name = getFusedSpeciesName(this.species.getName(this.formIndex), this.fusionSpecies.getName(this.fusionFormIndex)); - if (this.battleInfo) + if (this.battleInfo) { this.updateInfo(true); + } } abstract isPlayer(): boolean; @@ -290,8 +308,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { .then(() => { loadMoveAnimAssets(this.scene, moveIds); this.getSpeciesForm().loadAssets(this.scene, this.getGender() === Gender.FEMALE, this.formIndex, this.shiny, this.variant); - if (this.isPlayer() || this.getFusionSpeciesForm()) + if (this.isPlayer() || this.getFusionSpeciesForm()) { this.scene.loadPokemonAtlas(this.getBattleSpriteKey(true, ignoreOverride), this.getBattleSpriteAtlasPath(true, ignoreOverride)); + } if (this.getFusionSpeciesForm()) { this.getFusionSpeciesForm().loadAssets(this.scene, this.getFusionGender() === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant); this.scene.loadPokemonAtlas(this.getFusionBattleSpriteKey(true, ignoreOverride), this.getFusionBattleSpriteAtlasPath(true, ignoreOverride)); @@ -313,73 +332,81 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.playAnim(); const updateFusionPaletteAndResolve = () => { this.updateFusionPalette(); - if (this.summonData?.speciesForm) + if (this.summonData?.speciesForm) { this.updateFusionPalette(true); + } resolve(); }; if (this.shiny) { const populateVariantColors = (key: string, back: boolean = false): Promise => { return new Promise(resolve => { - const battleSpritePath = this.getBattleSpriteAtlasPath(back, ignoreOverride).replace('variant/', '').replace(/_[1-3]$/, ''); - let variantSet: VariantSet; + const battleSpritePath = this.getBattleSpriteAtlasPath(back, ignoreOverride).replace("variant/", "").replace(/_[1-3]$/, ""); let config = variantData; const useExpSprite = this.scene.experimentalSprites && this.scene.hasExpSprite(this.getBattleSpriteKey(back, ignoreOverride)); - battleSpritePath.split('/').map(p => config ? config = config[p] : null); - variantSet = config as VariantSet; + battleSpritePath.split("/").map(p => config ? config = config[p] : null); + const variantSet: VariantSet = config as VariantSet; if (variantSet && variantSet[this.variant] === 1) { - if (variantColorCache.hasOwnProperty(key)) + if (variantColorCache.hasOwnProperty(key)) { return resolve(); - this.scene.cachedFetch(`./images/pokemon/variant/${useExpSprite ? 'exp/' : ''}${battleSpritePath}.json`). + } + this.scene.cachedFetch(`./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`). then(res => { // Prevent the JSON from processing if it failed to load if (!res.ok) { console.error(`Could not load ${res.url}!`); return; } - return res.json() + return res.json(); }).then(c => { - variantColorCache[key] = c; - resolve(); - }); - } else + variantColorCache[key] = c; + resolve(); + }); + } else { resolve(); + } }); }; - if (this.isPlayer()) + if (this.isPlayer()) { Promise.all([ populateVariantColors(this.getBattleSpriteKey(false)), populateVariantColors(this.getBattleSpriteKey(true), true) ]).then(() => updateFusionPaletteAndResolve()); - else + } else { populateVariantColors(this.getBattleSpriteKey(false)).then(() => updateFusionPaletteAndResolve()); - } else + } + } else { updateFusionPaletteAndResolve(); + } }); - if (!this.scene.load.isLoading()) + if (!this.scene.load.isLoading()) { this.scene.load.start(); + } }); }); } getFormKey(): string { - if (!this.species.forms.length || this.species.forms.length <= this.formIndex) - return ''; + if (!this.species.forms.length || this.species.forms.length <= this.formIndex) { + return ""; + } return this.species.forms[this.formIndex].formKey; } getFusionFormKey(): string { - if (!this.fusionSpecies) + if (!this.fusionSpecies) { return null; - if (!this.fusionSpecies.forms.length || this.fusionSpecies.forms.length <= this.fusionFormIndex) - return ''; + } + if (!this.fusionSpecies.forms.length || this.fusionSpecies.forms.length <= this.fusionFormIndex) { + return ""; + } return this.fusionSpecies.forms[this.fusionFormIndex].formKey; } getSpriteAtlasPath(ignoreOverride?: boolean): string { - const spriteId = this.getSpriteId(ignoreOverride).replace(/\_{2}/g, '/'); - return `${/_[1-3]$/.test(spriteId) ? 'variant/' : ''}${spriteId}`; + const spriteId = this.getSpriteId(ignoreOverride).replace(/\_{2}/g, "/"); + return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, '/'); - return `${/_[1-3]$/.test(spriteId) ? 'variant/' : ''}${spriteId}`; + const spriteId = this.getBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); + return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } getSpriteId(ignoreOverride?: boolean): string { @@ -387,8 +414,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { - if (back === undefined) + if (back === undefined) { back = this.isPlayer(); + } return this.getSpeciesForm(ignoreOverride).getSpriteId(this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, this.shiny, this.variant, back); } @@ -405,8 +433,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionBattleSpriteId(back?: boolean, ignoreOverride?: boolean): string { - if (back === undefined) + if (back === undefined) { back = this.isPlayer(); + } return this.getFusionSpeciesForm(ignoreOverride).getSpriteId(this.getFusionGender(ignoreOverride) === Gender.FEMALE, this.fusionFormIndex, this.fusionShiny, this.fusionVariant, back); } @@ -415,7 +444,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionBattleSpriteAtlasPath(back?: boolean, ignoreOverride?: boolean): string { - return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, '/'); + return this.getFusionBattleSpriteId(back, ignoreOverride).replace(/\_{2}/g, "/"); } getIconAtlasKey(ignoreOverride?: boolean): string { @@ -435,18 +464,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm { - if (!ignoreOverride && this.summonData?.speciesForm) + if (!ignoreOverride && this.summonData?.speciesForm) { return this.summonData.speciesForm; - if (!this.species.forms?.length) + } + if (!this.species.forms?.length) { return this.species; + } return this.species.forms[this.formIndex]; } getFusionSpeciesForm(ignoreOverride?: boolean): PokemonSpeciesForm { - if (!ignoreOverride && this.summonData?.speciesForm) + if (!ignoreOverride && this.summonData?.speciesForm) { return this.summonData.fusionSpeciesForm; - if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length) + } + if (!this.fusionSpecies?.forms?.length || this.fusionFormIndex >= this.fusionSpecies?.forms.length) { return this.fusionSpecies; + } return this.fusionSpecies?.forms[this.fusionFormIndex]; } @@ -462,33 +495,35 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getSpriteScale(): number { const formKey = this.getFormKey(); - if (formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) + if (formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) { return 1.5; + } return 1; } getHeldItems(): PokemonHeldItemModifier[] { - if (!this.scene) + if (!this.scene) { return []; + } return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; - } + } updateScale(): void { this.setScale(this.getSpriteScale()); } updateSpritePipelineData(): void { - [ this.getSprite(), this.getTintSprite() ].map(s => s.pipelineData['teraColor'] = getTypeRgb(this.getTeraType())); + [ this.getSprite(), this.getTintSprite() ].map(s => s.pipelineData["teraColor"] = getTypeRgb(this.getTeraType())); this.updateInfo(true); } initShinySparkle(): void { - const keySuffix = this.variant ? `_${this.variant + 1}` : ''; + const keySuffix = this.variant ? `_${this.variant + 1}` : ""; const key = `shiny${keySuffix}`; const shinySparkle = this.scene.addFieldSprite(0, 0, key); shinySparkle.setVisible(false); shinySparkle.setOrigin(0.5, 1); - const frameNames = this.scene.anims.generateFrameNames(key, { suffix: '.png', end: 34 }); + const frameNames = this.scene.anims.generateFrameNames(key, { suffix: ".png", end: 34 }); this.scene.anims.create({ key: `sparkle${keySuffix}`, frames: frameNames, @@ -514,8 +549,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { try { sprite.play(key); tintSprite.play(key); - } - catch(error: unknown) { + } catch(error: unknown) { console.error(`Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, error); return false; @@ -530,12 +564,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getFieldPositionOffset(): [ number, number ] { switch (this.fieldPosition) { - case FieldPosition.CENTER: - return [ 0, 0 ]; - case FieldPosition.LEFT: - return [ -32, -8 ]; - case FieldPosition.RIGHT: - return [ 32, 0 ]; + case FieldPosition.CENTER: + return [ 0, 0 ]; + case FieldPosition.LEFT: + return [ -32, -8 ]; + case FieldPosition.RIGHT: + return [ 32, 0 ]; } } @@ -555,8 +589,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const newOffset = this.getFieldPositionOffset(); - let relX = newOffset[0] - initialOffset[0]; - let relY = newOffset[1] - initialOffset[1]; + const relX = newOffset[0] - initialOffset[0]; + const relY = newOffset[1] - initialOffset[1]; if (duration) { this.scene.tweens.add({ @@ -564,7 +598,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { x: (_target, _key, value: number) => value + relX, y: (_target, _key, value: number) => value + relY, duration: duration, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => resolve() }); } else { @@ -579,102 +613,118 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer { - if (stat === Stat.HP) + if (stat === Stat.HP) { return this.getStat(Stat.HP); + } const battleStat = (stat - 1) as BattleStat; const statLevel = new Utils.IntegerHolder(this.summonData.battleStats[battleStat]); if (opponent) { if (isCritical) { switch (stat) { - case Stat.ATK: - case Stat.SPATK: - statLevel.value = Math.max(statLevel.value, 0); - break; - case Stat.DEF: - case Stat.SPDEF: - statLevel.value = Math.min(statLevel.value, 0); - break; + case Stat.ATK: + case Stat.SPATK: + statLevel.value = Math.max(statLevel.value, 0); + break; + case Stat.DEF: + case Stat.SPDEF: + statLevel.value = Math.min(statLevel.value, 0); + break; } } applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, statLevel); - if (move) + if (move) { applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, opponent, move, statLevel); + } } - if (this.isPlayer()) + if (this.isPlayer()) { this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel); + } const statValue = new Utils.NumberHolder(this.getStat(stat)); applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, battleStat, statValue); let ret = statValue.value * (Math.max(2, 2 + statLevel.value) / Math.max(2, 2 - statLevel.value)); switch (stat) { - case Stat.ATK: - if (this.getTag(BattlerTagType.SLOW_START)) - ret >>= 1; - break; - case Stat.DEF: - if (this.isOfType(Type.ICE) && this.scene.arena.weather?.weatherType === WeatherType.SNOW) - ret *= 1.5; - break; - case Stat.SPATK: - break; - case Stat.SPDEF: - if (this.isOfType(Type.ROCK) && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) - ret *= 1.5; - break; - case Stat.SPD: - // Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon - if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) - || (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY))) - ret *= 2; - - if (this.getTag(BattlerTagType.SLOW_START)) - ret >>= 1; - if (this.status && this.status.effect === StatusEffect.PARALYSIS) - ret >>= 1; - break; + case Stat.ATK: + if (this.getTag(BattlerTagType.SLOW_START)) { + ret >>= 1; + } + break; + case Stat.DEF: + if (this.isOfType(Type.ICE) && this.scene.arena.weather?.weatherType === WeatherType.SNOW) { + ret *= 1.5; + } + break; + case Stat.SPATK: + break; + case Stat.SPDEF: + if (this.isOfType(Type.ROCK) && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + ret *= 1.5; + } + break; + case Stat.SPD: + // Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon + if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) + || (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY))) { + ret *= 2; + } + + if (this.getTag(BattlerTagType.SLOW_START)) { + ret >>= 1; + } + if (this.status && this.status.effect === StatusEffect.PARALYSIS) { + ret >>= 1; + } + break; } const highestStatBoost = this.findTag(t => t instanceof HighestStatBoostTag && (t as HighestStatBoostTag).stat === stat) as HighestStatBoostTag; - if (highestStatBoost) + if (highestStatBoost) { ret *= highestStatBoost.multiplier; + } return Math.floor(ret); } calculateStats(): void { - if (!this.stats) + if (!this.stats) { this.stats = [ 0, 0, 0, 0, 0, 0 ]; + } const baseStats = this.getSpeciesForm().baseStats.slice(0); if (this.fusionSpecies) { const fusionBaseStats = this.getFusionSpeciesForm().baseStats; - for (let s = 0; s < this.stats.length; s++) + for (let s = 0; s < this.stats.length; s++) { baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); + } } else if (this.scene.gameMode.isSplicedOnly) { - for (let s = 0; s < this.stats.length; s++) + for (let s = 0; s < this.stats.length; s++) { baseStats[s] = Math.ceil(baseStats[s] / 2); + } } this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats); const stats = Utils.getEnumValues(Stat); - for (let s of stats) { + for (const s of stats) { const isHp = s === Stat.HP; - let baseStat = baseStats[s]; + const baseStat = baseStats[s]; let value = Math.floor(((2 * baseStat + this.ivs[s]) * this.level) * 0.01); if (isHp) { value = value + this.level + 10; - if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) + if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) { value = 1; - if (this.hp > value || this.hp === undefined) + } + if (this.hp > value || this.hp === undefined) { this.hp = value; - else if (this.hp) { + } else if (this.hp) { const lastMaxHp = this.getMaxHp(); - if (lastMaxHp && value > lastMaxHp) + if (lastMaxHp && value > lastMaxHp) { this.hp += value - lastMaxHp; + } } } else { value += 5; const natureStatMultiplier = new Utils.NumberHolder(getNatureStatMultiplier(this.getNature(), s)); this.scene.applyModifier(PokemonNatureWeightModifier, this.isPlayer(), this, natureStatMultiplier); - if (natureStatMultiplier.value !== 1) - value = Math.max(Math[natureStatMultiplier.value > 1 ? 'ceil' : 'floor'](value * natureStatMultiplier.value), 1); + if (natureStatMultiplier.value !== 1) { + value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1); + } } this.stats[s] = value; } @@ -690,8 +740,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } generateNature(naturePool?: Nature[]): void { - if (naturePool === undefined) + if (naturePool === undefined) { naturePool = Utils.getEnumValues(Nature); + } const nature = naturePool[Utils.randSeedInt(naturePool.length)]; this.setNature(nature); } @@ -711,26 +762,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } generateGender(): void { - if (this.species.malePercent === null) + if (this.species.malePercent === null) { this.gender = Gender.GENDERLESS; - else { + } else { const genderChance = (this.id % 256) * 0.390625; - if (genderChance < this.species.malePercent) + if (genderChance < this.species.malePercent) { this.gender = Gender.MALE; - else + } else { this.gender = Gender.FEMALE; + } } } getGender(ignoreOverride?: boolean): Gender { - if (!ignoreOverride && this.summonData?.gender !== undefined) + if (!ignoreOverride && this.summonData?.gender !== undefined) { return this.summonData.gender; + } return this.gender; } getFusionGender(ignoreOverride?: boolean): Gender { - if (!ignoreOverride && this.summonData?.fusionGender !== undefined) + if (!ignoreOverride && this.summonData?.fusionGender !== undefined) { return this.summonData.fusionGender; + } return this.fusionGender; } @@ -762,7 +816,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (overrideArray.length > 0) { overrideArray.forEach((move: Moves, index: number) => { const ppUsed = this.moveset[index]?.ppUsed || 0; - this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)) + this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)); }); } @@ -778,44 +832,49 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (includeTeraType) { const teraType = this.getTeraType(); - if (teraType != Type.UNKNOWN) + if (teraType !== Type.UNKNOWN) { types.push(teraType); + } } if (!types.length || !includeTeraType) { - if (!ignoreOverride && this.summonData?.types) + if (!ignoreOverride && this.summonData?.types) { this.summonData.types.forEach(t => types.push(t)); - else { + } else { const speciesForm = this.getSpeciesForm(); types.push(speciesForm.type1); const fusionSpeciesForm = this.getFusionSpeciesForm(); if (fusionSpeciesForm) { - if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) + if (fusionSpeciesForm.type2 !== null && fusionSpeciesForm.type2 !== speciesForm.type1) { types.push(fusionSpeciesForm.type2); - else if (fusionSpeciesForm.type1 !== speciesForm.type1) + } else if (fusionSpeciesForm.type1 !== speciesForm.type1) { types.push(fusionSpeciesForm.type1); + } } - if (types.length === 1 && speciesForm.type2 !== null) + if (types.length === 1 && speciesForm.type2 !== null) { types.push(speciesForm.type2); + } } } if (forDefend && (this.getTag(BattlerTagType.IGNORE_FLYING) || this.scene.arena.getTag(ArenaTagType.GRAVITY) || this.getTag(BattlerTagType.GROUNDED))) { const flyingIndex = types.indexOf(Type.FLYING); - if (flyingIndex > -1) + if (flyingIndex > -1) { types.splice(flyingIndex, 1); + } } - if (!types.length) // become UNKNOWN if no types are present + if (!types.length) { // become UNKNOWN if no types are present types.push(Type.UNKNOWN); + } if (types.length > 1 && types.includes(Type.UNKNOWN)) { // remove UNKNOWN if other types are present const index = types.indexOf(Type.UNKNOWN); if (index !== -1) { - types.splice(index, 1); + types.splice(index, 1); } } @@ -835,17 +894,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {Ability} The non-passive ability of the pokemon */ getAbility(ignoreOverride?: boolean): Ability { - if (!ignoreOverride && this.summonData?.ability) + if (!ignoreOverride && this.summonData?.ability) { return allAbilities[this.summonData.ability]; - if (Overrides.ABILITY_OVERRIDE && this.isPlayer()) + } + if (Overrides.ABILITY_OVERRIDE && this.isPlayer()) { return allAbilities[Overrides.ABILITY_OVERRIDE]; - if (Overrides.OPP_ABILITY_OVERRIDE && !this.isPlayer()) + } + if (Overrides.OPP_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; - if (this.isFusion()) + } + if (this.isFusion()) { return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; + } let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex); - if (abilityId === Abilities.NONE) + if (abilityId === Abilities.NONE) { abilityId = this.species.ability1; + } return allAbilities[abilityId]; } @@ -857,14 +921,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {Ability} The passive ability of the pokemon */ getPassiveAbility(): Ability { - if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer()) + if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer()) { return allAbilities[Overrides.PASSIVE_ABILITY_OVERRIDE]; - if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) + } + if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; + } let starterSpeciesId = this.species.speciesId; - while (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) + while (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) { starterSpeciesId = pokemonPrevolutions[starterSpeciesId]; + } return allAbilities[starterPassiveAbilities[starterSpeciesId]]; } @@ -878,8 +945,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { hasPassive(): boolean { // returns override if valid for current case if ((Overrides.PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && this.isPlayer()) || - (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) + (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== Abilities.NONE && !this.isPlayer())) { return true; + } return this.passive || this.isBoss(); } @@ -891,25 +959,32 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {Ability} The passive ability of the pokemon */ canApplyAbility(passive: boolean = false): boolean { - if (passive && !this.hasPassive()) + if (passive && !this.hasPassive()) { return false; + } const ability = (!passive ? this.getAbility() : this.getPassiveAbility()); - if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) + if (this.isFusion() && ability.hasAttr(NoFusionAbilityAbAttr)) { return false; - if (this.scene?.arena.ignoreAbilities && ability.isIgnorable) + } + if (this.scene?.arena.ignoreAbilities && ability.isIgnorable) { return false; - if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) + } + if (this.summonData?.abilitySuppressed && !ability.hasAttr(UnsuppressableAbilityAbAttr)) { return false; + } if (this.isOnField() && !ability.hasAttr(SuppressFieldAbilitiesAbAttr)) { const suppressed = new Utils.BooleanHolder(false); this.scene.getField(true).map(p => { - if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) + if (p.getAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility()) { p.getAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, false, suppressed, [ability])); - if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) + } + if (p.getPassiveAbility().hasAttr(SuppressFieldAbilitiesAbAttr) && p.canApplyAbility(true)) { p.getPassiveAbility().getAttrs(SuppressFieldAbilitiesAbAttr).map(a => a.apply(this, true, suppressed, [ability])); + } }); - if (suppressed.value) + if (suppressed.value) { return false; + } } return (this.hp || ability.isBypassFaint) && !ability.conditions.find(condition => !condition(this)); } @@ -924,10 +999,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {boolean} Whether the ability is present and active */ hasAbility(ability: Abilities, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).id === ability) + if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).id === ability) { return true; - if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().id === ability) + } + if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().id === ability) { return true; + } return false; } @@ -942,10 +1019,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {boolean} Whether an ability with that attribute is present and active */ hasAbilityWithAttr(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): boolean { - if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) + if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) { return true; - if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().hasAttr(attrType)) + } + if (this.hasPassive() && (!canApply || this.canApplyAbility(true)) && this.getPassiveAbility().hasAttr(attrType)) { return true; + } return false; } @@ -959,8 +1038,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getTeraType(): Type { const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; - if (teraModifier) + if (teraModifier) { return teraModifier.teraType; + } return Type.UNKNOWN; } @@ -977,32 +1057,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const typeless = !!move.getMove().getAttrs(TypelessAttr).length; const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.getMove().type, source)); const cancelled = new Utils.BooleanHolder(false); - if (!typeless) + if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); - if (!cancelled.value) + } + if (!cancelled.value) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); + } return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; } getAttackTypeEffectiveness(moveType: Type, source?: Pokemon): TypeDamageMultiplier { - if (moveType === Type.STELLAR) + if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; + } const types = this.getTypes(true, true); let multiplier = types.map(defType => { if (source) { const ignoreImmunity = new Utils.BooleanHolder(false); applyAbAttrs(IgnoreTypeImmunityAbAttr, source, ignoreImmunity, moveType, defType); - if (ignoreImmunity.value) + if (ignoreImmunity.value) { return 1; + } } return getTypeDamageMultiplier(moveType, defType); }).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier; // Handle strong winds lowering effectiveness of types super effective against pure flying - if (this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) + if (this.scene.arena.weather?.weatherType === WeatherType.STRONG_WINDS && !this.scene.arena.weather.isEffectSuppressed(this.scene) && multiplier >= 2 && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) { multiplier /= 2; + } return multiplier; } @@ -1012,33 +1097,38 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, pokemon) : this.getStat(Stat.SPD)) <= pokemon.getBattleStat(Stat.SPD, this); let atkScore = pokemon.getAttackTypeEffectiveness(types[0], this) * (outspeed ? 1.25 : 1); let defScore = 1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[0], pokemon), 0.25); - if (types.length > 1) + if (types.length > 1) { atkScore *= pokemon.getAttackTypeEffectiveness(types[1], this); - if (enemyTypes.length > 1) + } + if (enemyTypes.length > 1) { defScore *= (1 / Math.max(this.getAttackTypeEffectiveness(enemyTypes[1], pokemon), 0.25)); + } let hpDiffRatio = this.getHpRatio() + (1 - pokemon.getHpRatio()); - if (outspeed) + if (outspeed) { hpDiffRatio = Math.min(hpDiffRatio * 1.5, 1); + } return (atkScore + defScore) * hpDiffRatio; } getEvolution(): SpeciesFormEvolution { if (pokemonEvolutions.hasOwnProperty(this.species.speciesId)) { const evolutions = pokemonEvolutions[this.species.speciesId]; - for (let e of evolutions) { + for (const e of evolutions) { if (!e.item && this.level >= e.level && (!e.preFormKey || this.getFormKey() === e.preFormKey)) { - if (e.condition === null || (e.condition as SpeciesEvolutionCondition).predicate(this)) + if (e.condition === null || (e.condition as SpeciesEvolutionCondition).predicate(this)) { return e; + } } } } if (this.isFusion() && pokemonEvolutions.hasOwnProperty(this.fusionSpecies.speciesId)) { const fusionEvolutions = pokemonEvolutions[this.fusionSpecies.speciesId].map(e => new FusionSpeciesFormEvolution(this.species.speciesId, e)); - for (let fe of fusionEvolutions) { + for (const fe of fusionEvolutions) { if (!fe.item && this.level >= fe.level && (!fe.preFormKey || this.getFusionFormKey() === fe.preFormKey)) { - if (fe.condition === null || (fe.condition as SpeciesEvolutionCondition).predicate(this)) + if (fe.condition === null || (fe.condition as SpeciesEvolutionCondition).predicate(this)) { return fe; + } } } } @@ -1049,8 +1139,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getLevelMoves(startingLevel?: integer, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false): LevelMoves { const ret: LevelMoves = []; let levelMoves: LevelMoves = []; - if (!startingLevel) + if (!startingLevel) { startingLevel = this.level; + } if (simulateEvolutionChain) { const evolutionChain = this.species.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); for (let e = 0; e < evolutionChain.length; e++) { @@ -1061,48 +1152,57 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { levelMoves.sort((lma: [integer, integer], lmb: [integer, integer]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); const uniqueMoves: Moves[] = []; levelMoves = levelMoves.filter(lm => { - if (uniqueMoves.find(m => m === lm[1])) + if (uniqueMoves.find(m => m === lm[1])) { return false; + } uniqueMoves.push(lm[1]); return true; }); - } else + } else { levelMoves = this.getSpeciesForm(true).getLevelMoves(); + } if (this.fusionSpecies) { const evolutionLevelMoves = levelMoves.slice(0, Math.max(levelMoves.findIndex(lm => !!lm[0]), 0)); const fusionLevelMoves = this.getFusionSpeciesForm(true).getLevelMoves(); const newLevelMoves: LevelMoves = []; - while (levelMoves.length && levelMoves[0][0] < startingLevel) + while (levelMoves.length && levelMoves[0][0] < startingLevel) { levelMoves.shift(); - while (fusionLevelMoves.length && fusionLevelMoves[0][0] < startingLevel) + } + while (fusionLevelMoves.length && fusionLevelMoves[0][0] < startingLevel) { fusionLevelMoves.shift(); + } if (includeEvolutionMoves) { - for (let elm of evolutionLevelMoves.reverse()) + for (const elm of evolutionLevelMoves.reverse()) { levelMoves.unshift(elm); + } } for (let l = includeEvolutionMoves ? 0 : startingLevel; l <= this.level; l++) { - if (l === 1 && startingLevel > 1) + if (l === 1 && startingLevel > 1) { l = startingLevel; + } while (levelMoves.length && levelMoves[0][0] === l) { const levelMove = levelMoves.shift(); - if (!newLevelMoves.find(lm => lm[1] === levelMove[1])) + if (!newLevelMoves.find(lm => lm[1] === levelMove[1])) { newLevelMoves.push(levelMove); + } } while (fusionLevelMoves.length && fusionLevelMoves[0][0] === l) { const fusionLevelMove = fusionLevelMoves.shift(); - if (!newLevelMoves.find(lm => lm[1] === fusionLevelMove[1])) + if (!newLevelMoves.find(lm => lm[1] === fusionLevelMove[1])) { newLevelMoves.push(fusionLevelMove); + } } } levelMoves = newLevelMoves; } if (levelMoves) { - for (let lm of levelMoves) { + for (const lm of levelMoves) { const level = lm[0]; - if ((!includeEvolutionMoves || level) && level < startingLevel) + if ((!includeEvolutionMoves || level) && level < startingLevel) { continue; - else if (level > this.level) + } else if (level > this.level) { break; + } ret.push(lm); } } @@ -1113,8 +1213,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { setMove(moveIndex: integer, moveId: Moves): void { const move = moveId ? new PokemonMove(moveId) : null; this.moveset[moveIndex] = move; - if (this.summonData?.moveset) + if (this.summonData?.moveset) { this.summonData.moveset[moveIndex] = move; + } } trySetShiny(thresholdOverride?: integer): boolean { @@ -1124,66 +1225,75 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId; const F = rand1 ^ rand2; - let shinyThreshold = new Utils.IntegerHolder(32); + const shinyThreshold = new Utils.IntegerHolder(32); if (thresholdOverride === undefined) { - if (!this.hasTrainer()) + if (!this.hasTrainer()) { this.scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold); - } else + } + } else { shinyThreshold.value = thresholdOverride; + } this.shiny = (E ^ F) < shinyThreshold.value; - if ((E ^ F) < 32) - console.log('REAL SHINY!!'); + if ((E ^ F) < 32) { + console.log("REAL SHINY!!"); + } - if (this.shiny) + if (this.shiny) { this.initShinySparkle(); + } return this.shiny; } generateVariant(): Variant { - if (!this.shiny || !variantData.hasOwnProperty(this.species.speciesId)) + if (!this.shiny || !variantData.hasOwnProperty(this.species.speciesId)) { return 0; + } const rand = Utils.randSeedInt(10); - if (rand > 3) + if (rand > 3) { return 0; - if (rand) + } + if (rand) { return 1; + } return 2; } generateFusionSpecies(forStarter?: boolean): void { const hiddenAbilityChance = new Utils.IntegerHolder(256); - if (!this.hasTrainer()) + if (!this.hasTrainer()) { this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + } const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value); const randAbilityIndex = Utils.randSeedInt(2); const filter = !forStarter ? this.species.getCompatibleFusionSpeciesFilter() - : species => { - return pokemonEvolutions.hasOwnProperty(species.speciesId) + : species => { + return pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && !species.pseudoLegendary && !species.legendary && !species.mythical && !species.isTrainerForbidden() - && species.speciesId !== this.species.speciesId - }; + && species.speciesId !== this.species.speciesId; + }; this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true); this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? this.fusionSpecies.ability2 ? 2 : 1 : this.fusionSpecies.ability2 ? randAbilityIndex : 0); this.fusionShiny = this.shiny; this.fusionVariant = this.variant; - if (this.fusionSpecies.malePercent === null) + if (this.fusionSpecies.malePercent === null) { this.fusionGender = Gender.GENDERLESS; - else { + } else { const genderChance = (this.id % 256) * 0.390625; - if (genderChance < this.fusionSpecies.malePercent) + if (genderChance < this.fusionSpecies.malePercent) { this.fusionGender = Gender.MALE; - else + } else { this.fusionGender = Gender.FEMALE; + } } this.fusionFormIndex = this.scene.getSpeciesFormIndex(this.fusionSpecies, this.fusionGender, this.getNature(), true); @@ -1210,31 +1320,36 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let movePool: [Moves, number][] = []; const allLevelMoves = this.getLevelMoves(1, true, true); if (!allLevelMoves) { - console.log(this.species.speciesId, 'ERROR'); + console.log(this.species.speciesId, "ERROR"); return; } for (let m = 0; m < allLevelMoves.length; m++) { const levelMove = allLevelMoves[m]; - if (this.level < levelMove[0]) + if (this.level < levelMove[0]) { break; + } let weight = levelMove[0]; - if (weight === 0) // Evo Moves + if (weight === 0){ // Evo Moves weight = 50; - if (weight === 1 && allMoves[levelMove[1]].power >= 80) // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight + } + if (weight === 1 && allMoves[levelMove[1]].power >= 80){ // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight weight = 40; - if (allMoves[levelMove[1]].name.endsWith(' (N)')) - weight /= 100; // Unimplemented level up moves are possible to generate, but 1% of their normal chance. - if (!movePool.some(m => m[0] === levelMove[1])) + } + if (allMoves[levelMove[1]].name.endsWith(" (N)")) { + weight /= 100; + } // Unimplemented level up moves are possible to generate, but 1% of their normal chance. + if (!movePool.some(m => m[0] === levelMove[1])) { movePool.push([levelMove[1], weight]); + } } if (this.hasTrainer()) { const tms = Object.keys(tmSpecies); - for (let tm of tms) { + for (const tm of tms) { const moveId = parseInt(tm) as Moves; let compatible = false; - for (let p of tmSpecies[tm]) { + for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { if (p[0] === this.species.speciesId || (this.fusionSpecies && p[0] === this.fusionSpecies.speciesId) && p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) { compatible = true; @@ -1245,41 +1360,47 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; } } - if (compatible && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) { - if (tmPoolTiers[moveId] === ModifierTier.COMMON && this.level >= 15) + if (compatible && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { + if (tmPoolTiers[moveId] === ModifierTier.COMMON && this.level >= 15) { movePool.push([moveId, 4]); - else if (tmPoolTiers[moveId] === ModifierTier.GREAT && this.level >= 30) + } else if (tmPoolTiers[moveId] === ModifierTier.GREAT && this.level >= 30) { movePool.push([moveId, 8]); - else if (tmPoolTiers[moveId] === ModifierTier.ULTRA && this.level >= 50) + } else if (tmPoolTiers[moveId] === ModifierTier.ULTRA && this.level >= 50) { movePool.push([moveId, 14]); + } } } if (this.level >= 60) { // No egg moves below level 60 for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.species.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) + if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { movePool.push([moveId, 40]); + } } const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4 + if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()){ // No rare egg moves before e4 movePool.push([moveId, 30]); + } if (this.fusionSpecies) { for (let i = 0; i < 3; i++) { const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][i]; - if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)')) + if (!movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)")) { movePool.push([moveId, 40]); + } } const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(' (N)') && !this.isBoss()) // No rare egg moves before e4 + if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()){// No rare egg moves before e4 movePool.push([moveId, 30]); + } } } } - if (this.isBoss()) // Bosses never get self ko moves + if (this.isBoss()){ // Bosses never get self ko moves movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttr).length); - movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttrOnHit).length); + } + movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttrOnHit).length); if (this.hasTrainer()) { // Trainers never get OHKO moves movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(OneHitKOAttr).length); @@ -1304,10 +1425,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1)]); let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight. - if (this.hasTrainer()) + if (this.hasTrainer()) { weightMultiplier += 0.7; - if (this.isBoss()) + } + if (this.isBoss()) { weightMultiplier += 0.4; + } const baseWeights: [Moves, number][] = movePool.map(m => [m[0], Math.ceil(Math.pow(m[1], weightMultiplier)*100)]); if (this.hasTrainer() || this.isBoss()) { // Trainers and bosses always force a stab move @@ -1317,8 +1440,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const totalWeight = stabMovePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); let index = 0; - while (rand > stabMovePool[index][1]) + while (rand > stabMovePool[index][1]) { rand -= stabMovePool[index++][1]; + } this.moveset.push(new PokemonMove(stabMovePool[index][0], 0, 0)); } } else { // Normal wild pokemon just force a random damaging move @@ -1327,8 +1451,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const totalWeight = attackMovePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); let index = 0; - while (rand > attackMovePool[index][1]) + while (rand > attackMovePool[index][1]) { rand -= attackMovePool[index++][1]; + } this.moveset.push(new PokemonMove(attackMovePool[index][0], 0, 0)); } } @@ -1345,8 +1470,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const totalWeight = movePool.reduce((v, m) => v + m[1], 0); let rand = Utils.randSeedInt(totalWeight); let index = 0; - while (rand > movePool[index][1]) + while (rand > movePool[index][1]) { rand -= movePool[index++][1]; + } this.moveset.push(new PokemonMove(movePool[index][0], 0, 0)); } @@ -1363,19 +1489,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { showInfo(): void { if (!this.battleInfo.visible) { const otherBattleInfo = this.scene.fieldUI.getAll().slice(0, 4).filter(ui => ui instanceof BattleInfo && ((ui as BattleInfo) instanceof PlayerBattleInfo) === this.isPlayer()).find(() => true); - if (!otherBattleInfo || !this.getFieldIndex()) + if (!otherBattleInfo || !this.getFieldIndex()) { this.scene.fieldUI.sendToBack(this.battleInfo); - else + } else { this.scene.fieldUI.moveAbove(this.battleInfo, otherBattleInfo); + } this.battleInfo.setX(this.battleInfo.x + (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); this.battleInfo.setVisible(true); - if (this.isPlayer()) + if (this.isPlayer()) { this.battleInfo.expMaskRect.x += 150; + } this.scene.tweens.add({ targets: [ this.battleInfo, this.battleInfo.expMaskRect ], - x: this.isPlayer() ? '-=150' : `+=${!this.isBoss() ? 150 : 246}`, + x: this.isPlayer() ? "-=150" : `+=${!this.isBoss() ? 150 : 246}`, duration: 1000, - ease: 'Cubic.easeOut' + ease: "Cubic.easeOut" }); } } @@ -1385,19 +1513,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.battleInfo.visible) { this.scene.tweens.add({ targets: [ this.battleInfo, this.battleInfo.expMaskRect ], - x: this.isPlayer() ? '+=150' : `-=${!this.isBoss() ? 150 : 246}`, + x: this.isPlayer() ? "+=150" : `-=${!this.isBoss() ? 150 : 246}`, duration: 500, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { - if (this.isPlayer()) + if (this.isPlayer()) { this.battleInfo.expMaskRect.x -= 150; + } this.battleInfo.setVisible(false); this.battleInfo.setX(this.battleInfo.x - (this.isPlayer() ? 150 : !this.isBoss() ? -150 : -198)); resolve(); } }); - } else + } else { resolve(); + } }); } @@ -1413,8 +1543,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const maxExpLevel = this.scene.getMaxExpLevel(); const initialExp = this.exp; this.exp += exp; - while (this.level < maxExpLevel && this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate)) + while (this.level < maxExpLevel && this.exp >= getLevelTotalExp(this.level + 1, this.species.growthRate)) { this.level++; + } if (this.level >= maxExpLevel) { console.log(initialExp, this.exp, getLevelTotalExp(this.level, this.species.growthRate)); this.exp = Math.max(getLevelTotalExp(this.level, this.species.growthRate), initialExp); @@ -1424,8 +1555,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getOpponent(targetIndex: integer): Pokemon { const ret = this.getOpponents()[targetIndex]; - if (ret.summonData) + if (ret.summonData) { return ret; + } return null; } @@ -1435,9 +1567,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getOpponentDescriptor(): string { const opponents = this.getOpponents(); - if (opponents.length === 1) + if (opponents.length === 1) { return opponents[0].name; - return this.isPlayer() ? 'the opposing team' : 'your team'; + } + return this.isPlayer() ? "the opposing team" : "your team"; } getAlly(): Pokemon { @@ -1447,7 +1580,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { apply(source: Pokemon, battlerMove: PokemonMove): HitResult { let result: HitResult; const move = battlerMove.getMove(); - let damage = new Utils.NumberHolder(0); + const damage = new Utils.NumberHolder(0); const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); const variableCategory = new Utils.IntegerHolder(move.category); @@ -1469,265 +1602,293 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { ? this.getAttackTypeEffectiveness(type, source) : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (typeless) + if (typeless) { typeMultiplier.value = 1; - if (types.find(t => move.isTypeImmune(t))) + } + if (types.find(t => move.isTypeImmune(t))) { typeMultiplier.value = 0; + } switch (moveCategory) { - case MoveCategory.PHYSICAL: - case MoveCategory.SPECIAL: - const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const power = new Utils.NumberHolder(move.power); - const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === type && power.value < 60 && move.priority <= 0 && !move.getAttrs(MultiHitAttr).length && !this.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) - power.value = 60; - applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, battlerMove, power); - this.scene.getField(true).map(p => applyPreAttackAbAttrs(FieldVariableMovePowerAbAttr, this, source, battlerMove, power)); - - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, battlerMove, cancelled, power); - - power.value *= typeChangeMovePowerMultiplier.value; - - if (!typeless) - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); - } - - if (cancelled.value) - result = HitResult.NO_EFFECT; - else { - let typeBoost = source.findTag(t => t instanceof TypeBoostTag && (t as TypeBoostTag).boostedType === type) as TypeBoostTag; - if (typeBoost) { - power.value *= typeBoost.boostValue; - if (typeBoost.oneUse) { - source.removeTag(typeBoost.tagType); - } - } - const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(type, source.isGrounded())); - applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); - if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) - power.value /= 2; - applyMoveAttrs(VariablePowerAttr, source, this, move, power); - this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); - if (!typeless) { - this.scene.arena.applyTags(WeakenMoveTypeTag, type, power); - this.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, type, power); + case MoveCategory.PHYSICAL: + case MoveCategory.SPECIAL: + const isPhysical = moveCategory === MoveCategory.PHYSICAL; + const power = new Utils.NumberHolder(move.power); + const sourceTeraType = source.getTeraType(); + if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === type && power.value < 60 && move.priority <= 0 && !move.getAttrs(MultiHitAttr).length && !this.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { + power.value = 60; + } + applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, battlerMove, power); + this.scene.getField(true).map(p => applyPreAttackAbAttrs(FieldVariableMovePowerAbAttr, this, source, battlerMove, power)); + + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, battlerMove, cancelled, power); + + power.value *= typeChangeMovePowerMultiplier.value; + + if (!typeless) { + applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); + } + if (!cancelled.value) { + applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); + defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); + } + + if (cancelled.value) { + result = HitResult.NO_EFFECT; + } else { + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && (t as TypeBoostTag).boostedType === type) as TypeBoostTag; + if (typeBoost) { + power.value *= typeBoost.boostValue; + if (typeBoost.oneUse) { + source.removeTag(typeBoost.tagType); } - if (source.getTag(HelpingHandTag)) - power.value *= 1.5; - let isCritical: boolean; - const critOnly = new Utils.BooleanHolder(false); - const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); - applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); - applyAbAttrs(ConditionalCritAbAttr, source, null, critOnly, this, move); - if (critOnly.value || critAlways) - isCritical = true; - else { - const critLevel = new Utils.IntegerHolder(0); - applyMoveAttrs(HighCritAttr, source, this, move, critLevel); - this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel); - const bonusCrit = new Utils.BooleanHolder(false); - if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { - if (bonusCrit.value) - critLevel.value += 1; + } + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(type, source.isGrounded())); + applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); + if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { + power.value /= 2; + } + applyMoveAttrs(VariablePowerAttr, source, this, move, power); + this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); + if (!typeless) { + this.scene.arena.applyTags(WeakenMoveTypeTag, type, power); + this.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, type, power); + } + if (source.getTag(HelpingHandTag)) { + power.value *= 1.5; + } + let isCritical: boolean; + const critOnly = new Utils.BooleanHolder(false); + const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); + applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); + applyAbAttrs(ConditionalCritAbAttr, source, null, critOnly, this, move); + if (critOnly.value || critAlways) { + isCritical = true; + } else { + const critLevel = new Utils.IntegerHolder(0); + applyMoveAttrs(HighCritAttr, source, this, move, critLevel); + this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel); + const bonusCrit = new Utils.BooleanHolder(false); + if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { + if (bonusCrit.value) { + critLevel.value += 1; } - if (source.getTag(BattlerTagType.CRIT_BOOST)) - critLevel.value += 2; - const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))]; - isCritical = !source.getTag(BattlerTagType.NO_CRIT) && (critChance === 1 || !this.scene.randBattleSeedInt(critChance)); } - if (isCritical) { - const blockCrit = new Utils.BooleanHolder(false); - applyAbAttrs(BlockCritAbAttr, this, null, blockCrit); - if (blockCrit.value) - isCritical = false; + if (source.getTag(BattlerTagType.CRIT_BOOST)) { + critLevel.value += 2; + } + const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))]; + isCritical = !source.getTag(BattlerTagType.NO_CRIT) && (critChance === 1 || !this.scene.randBattleSeedInt(critChance)); + } + if (isCritical) { + const blockCrit = new Utils.BooleanHolder(false); + applyAbAttrs(BlockCritAbAttr, this, null, blockCrit); + if (blockCrit.value) { + isCritical = false; } - const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, null, isCritical)); - const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); - const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1); - applyAbAttrs(MultCritAbAttr, source, null, criticalMultiplier); - const screenMultiplier = new Utils.NumberHolder(1); - if (!isCritical) { - this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier); - } - const isTypeImmune = (typeMultiplier.value * arenaAttackTypeMultiplier.value) === 0; - const sourceTypes = source.getTypes(); - const matchesSourceType = sourceTypes[0] === type || (sourceTypes.length > 1 && sourceTypes[1] === type); - let stabMultiplier = new Utils.NumberHolder(1); - if (sourceTeraType === Type.UNKNOWN && matchesSourceType) - stabMultiplier.value += 0.5; - else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === type) - stabMultiplier.value += 0.5; - - applyAbAttrs(StabBoostAbAttr, source, null, stabMultiplier); - - if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) - stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); - - applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); - applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); - - if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); - if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { - if(!move.getAttrs(BypassBurnDamageReductionAttr).length) { - const burnDamageReductionCancelled = new Utils.BooleanHolder(false); - applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); - if (!burnDamageReductionCancelled.value) - damage.value = Math.floor(damage.value / 2); + } + const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, null, isCritical)); + const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); + const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1); + applyAbAttrs(MultCritAbAttr, source, null, criticalMultiplier); + const screenMultiplier = new Utils.NumberHolder(1); + if (!isCritical) { + this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier); + } + const isTypeImmune = (typeMultiplier.value * arenaAttackTypeMultiplier.value) === 0; + const sourceTypes = source.getTypes(); + const matchesSourceType = sourceTypes[0] === type || (sourceTypes.length > 1 && sourceTypes[1] === type); + const stabMultiplier = new Utils.NumberHolder(1); + if (sourceTeraType === Type.UNKNOWN && matchesSourceType) { + stabMultiplier.value += 0.5; + } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === type) { + stabMultiplier.value += 0.5; + } + + applyAbAttrs(StabBoostAbAttr, source, null, stabMultiplier); + + if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) { + stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); + } + + applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); + applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); + + if (!isTypeImmune) { + damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { + if(!move.getAttrs(BypassBurnDamageReductionAttr).length) { + const burnDamageReductionCancelled = new Utils.BooleanHolder(false); + applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); + if (!burnDamageReductionCancelled.value) { + damage.value = Math.floor(damage.value / 2); } } + } - applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage); + applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage); - /** + /** * For each {@link HitsTagAttr} the move has, doubles the damage of the move if: * The target has a {@link BattlerTagType} that this move interacts with * AND * The move doubles damage when used against that tag * */ - move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { - if (this.getTag(hta.tagType)) - damage.value *= 2; - }); - } + move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { + if (this.getTag(hta.tagType)) { + damage.value *= 2; + } + }); + } - if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && type === Type.DRAGON) - damage.value = Math.floor(damage.value / 2); + if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && type === Type.DRAGON) { + damage.value = Math.floor(damage.value / 2); + } - const fixedDamage = new Utils.IntegerHolder(0); - applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); - if (!isTypeImmune && fixedDamage.value) { - damage.value = fixedDamage.value; - isCritical = false; - result = HitResult.EFFECTIVE; - } + const fixedDamage = new Utils.IntegerHolder(0); + applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); + if (!isTypeImmune && fixedDamage.value) { + damage.value = fixedDamage.value; + isCritical = false; + result = HitResult.EFFECTIVE; + } - if (!result) { - if (!typeMultiplier.value) - result = move.id == Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; - else { - const oneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); - if (oneHitKo.value) { - result = HitResult.ONE_HIT_KO; - isCritical = false; - damage.value = this.hp; - } else if (typeMultiplier.value >= 2) - result = HitResult.SUPER_EFFECTIVE; - else if (typeMultiplier.value >= 1) - result = HitResult.EFFECTIVE; - else - result = HitResult.NOT_VERY_EFFECTIVE; + if (!result) { + if (!typeMultiplier.value) { + result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; + } else { + const oneHitKo = new Utils.BooleanHolder(false); + applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); + if (oneHitKo.value) { + result = HitResult.ONE_HIT_KO; + isCritical = false; + damage.value = this.hp; + } else if (typeMultiplier.value >= 2) { + result = HitResult.SUPER_EFFECTIVE; + } else if (typeMultiplier.value >= 1) { + result = HitResult.EFFECTIVE; + } else { + result = HitResult.NOT_VERY_EFFECTIVE; } } + } - if (!fixedDamage.value) { - if (!source.isPlayer()) - this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); - if (!this.isPlayer()) - this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); + if (!fixedDamage.value) { + if (!source.isPlayer()) { + this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); + } + if (!this.isPlayer()) { + this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); } + } - applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); + applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - if (power.value === 0) { - damage.value = 0; - } + if (power.value === 0) { + damage.value = 0; + } - console.log('damage', damage.value, move.name, power.value, sourceAtk, targetDef); + console.log("damage", damage.value, move.name, power.value, sourceAtk, targetDef); - const oneHitKo = result === HitResult.ONE_HIT_KO; - if (damage.value) { - if (this.getHpRatio() === 1) - applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, battlerMove, cancelled, damage); - else if (!this.isPlayer() && damage.value >= this.hp) - this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); + const oneHitKo = result === HitResult.ONE_HIT_KO; + if (damage.value) { + if (this.getHpRatio() === 1) { + applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, battlerMove, cancelled, damage); + } else if (!this.isPlayer() && damage.value >= this.hp) { + this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); + } - /** + /** * We explicitly require to ignore the faint phase here, as we want to show the messages * about the critical hit and the super effective/not very effective messages before the faint phase. */ - damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo, true); - this.turnData.damageTaken += damage.value; - if (isCritical) - this.scene.queueMessage(i18next.t('battle:hitResultCriticalHit')); - if (source.isPlayer()) { - this.scene.validateAchvs(DamageAchv, damage); - if (damage.value > this.scene.gameData.gameStats.highestDamage) - this.scene.gameData.gameStats.highestDamage = damage.value; - } - source.turnData.damageDealt += damage.value; - source.turnData.currDamageDealt = damage.value; - this.battleData.hitCount++; - const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id }; - this.turnData.attacksReceived.unshift(attackResult); - if (source.isPlayer() && !this.isPlayer()) - this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage) + damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo, true); + this.turnData.damageTaken += damage.value; + if (isCritical) { + this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); } - - if (source.turnData.hitsLeft === 1) { - switch (result) { - case HitResult.SUPER_EFFECTIVE: - this.scene.queueMessage(i18next.t('battle:hitResultSuperEffective')); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.queueMessage(i18next.t('battle:hitResultNotVeryEffective')); - break; - case HitResult.NO_EFFECT: - this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name })); - break; - case HitResult.IMMUNE: - this.scene.queueMessage(`${this.name} is unaffected!`); - break; - case HitResult.ONE_HIT_KO: - this.scene.queueMessage(i18next.t('battle:hitResultOneHitKO')); - break; + if (source.isPlayer()) { + this.scene.validateAchvs(DamageAchv, damage); + if (damage.value > this.scene.gameData.gameStats.highestDamage) { + this.scene.gameData.gameStats.highestDamage = damage.value; } } + source.turnData.damageDealt += damage.value; + source.turnData.currDamageDealt = damage.value; + this.battleData.hitCount++; + const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id }; + this.turnData.attacksReceived.unshift(attackResult); + if (source.isPlayer() && !this.isPlayer()) { + this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); + } + } - if (this.isFainted()) { - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), oneHitKo)); - this.resetSummonData(); + if (source.turnData.hitsLeft === 1) { + switch (result) { + case HitResult.SUPER_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); + break; + case HitResult.NO_EFFECT: + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + break; + case HitResult.IMMUNE: + this.scene.queueMessage(`${this.name} is unaffected!`); + break; + case HitResult.ONE_HIT_KO: + this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); + break; } + } - if (damage) - this.scene.clearPhaseQueueSplice(); + if (this.isFainted()) { + this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), oneHitKo)); + this.resetSummonData(); } - break; - case MoveCategory.STATUS: - if (!typeless) - applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); - if (!cancelled.value) { - applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); - defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); - } - if (!typeMultiplier.value) - this.scene.queueMessage(i18next.t('battle:hitResultNoEffect', { pokemonName: this.name })); - result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; - break; + + if (damage) { + this.scene.clearPhaseQueueSplice(); + } + } + break; + case MoveCategory.STATUS: + if (!typeless) { + applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); + } + if (!cancelled.value) { + applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, battlerMove, cancelled, typeMultiplier); + defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, battlerMove, cancelled, typeMultiplier)); + } + if (!typeMultiplier.value) { + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + } + result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; + break; } return result; } damage(damage: integer, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { - if (this.isFainted()) + if (this.isFainted()) { return 0; + } const surviveDamage = new Utils.BooleanHolder(false); if (!preventEndure && this.hp - damage <= 0) { - if(this.hp >= 1 && this.getTag(BattlerTagType.ENDURING)) - surviveDamage.value = this.lapseTag(BattlerTagType.ENDURING) - else if (this.hp > 1 && this.getTag(BattlerTagType.STURDY)) - surviveDamage.value = this.lapseTag(BattlerTagType.STURDY) - if (!surviveDamage.value) + if(this.hp >= 1 && this.getTag(BattlerTagType.ENDURING)) { + surviveDamage.value = this.lapseTag(BattlerTagType.ENDURING); + } else if (this.hp > 1 && this.getTag(BattlerTagType.STURDY)) { + surviveDamage.value = this.lapseTag(BattlerTagType.STURDY); + } + if (!surviveDamage.value) { this.scene.applyModifiers(SurviveDamageModifier, this.isPlayer(), this, surviveDamage); - if (surviveDamage.value) + } + if (surviveDamage.value) { damage = this.hp - 1; + } } damage = Math.min(damage, this.hp); @@ -1788,30 +1949,34 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getTag(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag { - if (!this.summonData) + if (!this.summonData) { return null; - return typeof(tagType) === 'string' + } + return typeof(tagType) === "string" ? this.summonData.tags.find(t => t.tagType === tagType) : this.summonData.tags.find(t => t instanceof tagType); } findTag(tagFilter: ((tag: BattlerTag) => boolean)) { - if (!this.summonData) + if (!this.summonData) { return null; + } return this.summonData.tags.find(t => tagFilter(t)); } getTags(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag[] { - if (!this.summonData) + if (!this.summonData) { return []; - return typeof(tagType) === 'string' + } + return typeof(tagType) === "string" ? this.summonData.tags.filter(t => t.tagType === tagType) : this.summonData.tags.filter(t => t instanceof tagType); } findTags(tagFilter: ((tag: BattlerTag) => boolean)): BattlerTag[] { - if (!this.summonData) + if (!this.summonData) { return []; + } return this.summonData.tags.filter(t => tagFilter(t)); } @@ -1845,11 +2010,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } findAndRemoveTags(tagFilter: ((tag: BattlerTag) => boolean)): boolean { - if (!this.summonData) + if (!this.summonData) { return false; + } const tags = this.summonData.tags; const tagsToRemove = tags.filter(t => tagFilter(t)); - for (let tag of tagsToRemove) { + for (const tag of tagsToRemove) { tag.turnCount = 0; tag.onRemove(this); tags.splice(tags.indexOf(tag), 1); @@ -1862,20 +2028,24 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } transferTagsBySourceId(sourceId: integer, newSourceId: integer): void { - if (!this.summonData) + if (!this.summonData) { return; + } const tags = this.summonData.tags; tags.filter(t => t.sourceId === sourceId).forEach(t => t.sourceId = newSourceId); } transferSummon(source: Pokemon): void { const battleStats = Utils.getEnumValues(BattleStat); - for (let stat of battleStats) + for (const stat of battleStats) { this.summonData.battleStats[stat] = source.summonData.battleStats[stat]; - for (let tag of source.summonData.tags) + } + for (const tag of source.summonData.tags) { this.summonData.tags.push(tag); - if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) + } + if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) { this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT); + } this.updateInfo(); } @@ -1902,8 +2072,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) // Shouldn't happen + if (this.abilityIndex >= abilityCount){// Shouldn't happen this.abilityIndex = abilityCount - 1; + } this.scene.gameData.setPokemonSeen(this, false); this.setScale(this.getSpriteScale()); this.loadAssets().then(() => { @@ -1918,7 +2089,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const scene = sceneOverride || this.scene; const cry = this.getSpeciesForm().cry(scene, soundConfig); let duration = cry.totalDuration * 1000; - if (this.fusionSpecies && this.getSpeciesForm() != this.getFusionSpeciesForm()) { + if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { let fusionCry = this.getFusionSpeciesForm().cry(scene, soundConfig, true); duration = Math.min(duration, fusionCry.totalDuration * 1000); fusionCry.destroy(); @@ -1937,16 +2108,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } faintCry(callback: Function): void { - if (this.fusionSpecies && this.getSpeciesForm() != this.getFusionSpeciesForm()) + if (this.fusionSpecies && this.getSpeciesForm() !== this.getFusionSpeciesForm()) { return this.fusionFaintCry(callback); + } const key = this.getSpeciesForm().getCryKey(this.formIndex); + //eslint-disable-next-line @typescript-eslint/no-unused-vars let i = 0; let rate = 0.85; const cry = this.scene.playSound(key, { rate: rate }) as AnySound; const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); - const delay = Math.max(this.scene.sound.get(key).totalDuration * 50, 25); let frameProgress = 0; @@ -1975,21 +2147,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else { faintCryTimer.destroy(); faintCryTimer = null; - if (callback) + if (callback) { callback(); + } } } }); // Failsafe this.scene.time.delayedCall(Utils.fixedInt(3000), () => { - if (!faintCryTimer || !this.scene) + if (!faintCryTimer || !this.scene) { return; - if (cry?.isPlaying) + } + if (cry?.isPlaying) { cry.stop(); + } faintCryTimer.destroy(); - if (callback) + if (callback) { callback(); + } }); } @@ -1997,7 +2173,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const key = this.getSpeciesForm().getCryKey(this.formIndex); let i = 0; let rate = 0.85; - let cry = this.scene.playSound(key, { rate: rate }) as AnySound; + const cry = this.scene.playSound(key, { rate: rate }) as AnySound; const sprite = this.getSprite(); const tintSprite = this.getTintSprite(); let duration = cry.totalDuration * 1000; @@ -2050,30 +2226,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { SoundFade.fadeIn(this.scene, fusionCry, Utils.fixedInt(Math.ceil((duration / rate) * 0.2)), this.scene.masterVolume * this.scene.seVolume, 0); } rate *= 0.99; - if (cry && !cry.pendingRemove) + if (cry && !cry.pendingRemove) { cry.setRate(rate); - if (fusionCry && !fusionCry.pendingRemove) + } + if (fusionCry && !fusionCry.pendingRemove) { fusionCry.setRate(rate); + } if ((!cry || cry.pendingRemove) && (!fusionCry || fusionCry.pendingRemove)) { faintCryTimer.destroy(); faintCryTimer = null; - if (callback) + if (callback) { callback(); + } } } }); // Failsafe this.scene.time.delayedCall(Utils.fixedInt(3000), () => { - if (!faintCryTimer || !this.scene) + if (!faintCryTimer || !this.scene) { return; - if (cry?.isPlaying) + } + if (cry?.isPlaying) { cry.stop(); - if (fusionCry?.isPlaying) + } + if (fusionCry?.isPlaying) { fusionCry.stop(); + } faintCryTimer.destroy(); - if (callback) + if (callback) { callback(); + } }); } @@ -2083,69 +2266,80 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { canSetStatus(effect: StatusEffect, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon = null): boolean { if (effect !== StatusEffect.FAINT) { - if (overrideStatus ? this.status?.effect === effect : this.status) + if (overrideStatus ? this.status?.effect === effect : this.status) { return false; - if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.MISTY) + } + if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.MISTY) { return false; + } } const types = this.getTypes(true, true); switch (effect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity - let poisonImmunity = types.map(defType => { - // Check if the Pokemon is not immune to Poison/Toxic - if (defType !== Type.POISON && defType !== Type.STEEL) - return false; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity + const poisonImmunity = types.map(defType => { + // Check if the Pokemon is not immune to Poison/Toxic + if (defType !== Type.POISON && defType !== Type.STEEL) { + return false; + } - // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity - const cancelImmunity = new Utils.BooleanHolder(false); - if (sourcePokemon) { - applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType); - if (cancelImmunity.value) - return false; + // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity + const cancelImmunity = new Utils.BooleanHolder(false); + if (sourcePokemon) { + applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, effect, defType); + if (cancelImmunity.value) { + return false; } + } - return true; - }) + return true; + }); - if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { - if (poisonImmunity.includes(true)) - return false; - } - break; - case StatusEffect.PARALYSIS: - if (this.isOfType(Type.ELECTRIC)) - return false; - break; - case StatusEffect.SLEEP: - if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.ELECTRIC) - return false; - break; - case StatusEffect.FREEZE: - if (this.isOfType(Type.ICE) || [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(this.scene?.arena.weather?.weatherType)) + if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { + if (poisonImmunity.includes(true)) { return false; - break; - case StatusEffect.BURN: - if (this.isOfType(Type.FIRE)) - return false; - break; + } + } + break; + case StatusEffect.PARALYSIS: + if (this.isOfType(Type.ELECTRIC)) { + return false; + } + break; + case StatusEffect.SLEEP: + if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.ELECTRIC) { + return false; + } + break; + case StatusEffect.FREEZE: + if (this.isOfType(Type.ICE) || [WeatherType.SUNNY, WeatherType.HARSH_SUN].includes(this.scene?.arena.weather?.weatherType)) { + return false; + } + break; + case StatusEffect.BURN: + if (this.isOfType(Type.FIRE)) { + return false; + } + break; } const cancelled = new Utils.BooleanHolder(false); applyPreSetStatusAbAttrs(StatusEffectImmunityAbAttr, this, effect, cancelled, quiet); - if (cancelled.value) + if (cancelled.value) { return false; + } return true; } trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean { - if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) + if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; + } if (asPhase) { this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon)); @@ -2178,8 +2372,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.status = new Status(effect, 0, statusCureTurn?.value); - if (effect !== StatusEffect.FAINT) + if (effect !== StatusEffect.FAINT) { this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true); + } return true; } @@ -2196,8 +2391,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.status = undefined; if (lastStatus === StatusEffect.SLEEP) { this.setFrameRate(12); - if (this.getTag(BattlerTagType.NIGHTMARE)) + if (this.getTag(BattlerTagType.NIGHTMARE)) { this.lapseTag(BattlerTagType.NIGHTMARE); + } } } @@ -2211,13 +2407,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.updateFusionPalette(); } this.summonData = new PokemonSummonData(); - if (!this.battleData) + if (!this.battleData) { this.resetBattleData(); + } this.resetBattleSummonData(); if (this.summonDataPrimer) { - for (let k of Object.keys(this.summonData)) { - if (this.summonDataPrimer[k]) + for (const k of Object.keys(this.summonData)) { + if (this.summonDataPrimer[k]) { this.summonData[k] = this.summonDataPrimer[k]; + } } this.summonDataPrimer = null; } @@ -2230,10 +2428,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { resetBattleSummonData(): void { this.battleSummonData = new PokemonBattleSummonData(); - if (this.getTag(BattlerTagType.SEEDED)) + if (this.getTag(BattlerTagType.SEEDED)) { this.lapseTag(BattlerTagType.SEEDED); - if (this.scene) + } + if (this.scene) { this.scene.triggerPokemonFormChange(this, SpeciesFormChangePostMoveTrigger, true); + } } resetTurnData(): void { @@ -2263,10 +2463,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || 'Linear' + ease: ease || "Linear" }); - } else + } else { tintSprite.setAlpha(alpha); + } } untint(duration: integer, ease?: string) { @@ -2277,7 +2478,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { targets: tintSprite, alpha: 0, duration: duration, - ease: ease || 'Linear', + ease: ease || "Linear", onComplete: () => { tintSprite.setVisible(false); tintSprite.setAlpha(1); @@ -2294,7 +2495,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.maskSprite = this.getTintSprite(); this.maskSprite.setVisible(true); this.maskSprite.setPosition(this.x * this.parentContainer.scale + this.parentContainer.x, - this.y * this.parentContainer.scale + this.parentContainer.y); + this.y * this.parentContainer.scale + this.parentContainer.y); this.maskSprite.setScale(this.getSpriteScale() * this.parentContainer.scale); this.maskEnabled = true; } @@ -2312,16 +2513,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sparkle(): void { if (this.shinySparkle) { - this.shinySparkle.play(`sparkle${this.variant ? `_${this.variant + 1}` : ''}`); - this.scene.playSound('sparkle'); + this.shinySparkle.play(`sparkle${this.variant ? `_${this.variant + 1}` : ""}`); + this.scene.playSound("sparkle"); } } updateFusionPalette(ignoreOveride?: boolean): void { if (!this.getFusionSpeciesForm(ignoreOveride)) { [ this.getSprite(), this.getTintSprite() ].map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = []; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = []; + s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; + s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = []; }); return; } @@ -2330,9 +2531,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOveride); const spriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant); - const backSpriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant).replace('pkmn__', 'pkmn__back__'); + const backSpriteKey = speciesForm.getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant).replace("pkmn__", "pkmn__back__"); const fusionSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant); - const fusionBackSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant).replace('pkmn__', 'pkmn__back__'); + const fusionBackSpriteKey = fusionSpeciesForm.getSpriteKey(this.getFusionGender(ignoreOveride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant).replace("pkmn__", "pkmn__back__"); const sourceTexture = this.scene.textures.get(spriteKey); const sourceBackTexture = this.scene.textures.get(backSpriteKey); @@ -2342,16 +2543,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(texture => texture.frames[texture.firstFrame]); const [ sourceImage, sourceBackImage, fusionImage, fusionBackImage ] = [ sourceTexture, sourceBackTexture, fusionTexture, fusionBackTexture ].map(i => i.getSourceImage() as HTMLImageElement); - const canvas = document.createElement('canvas'); - const backCanvas = document.createElement('canvas'); - const fusionCanvas = document.createElement('canvas'); - const fusionBackCanvas = document.createElement('canvas'); + const canvas = document.createElement("canvas"); + const backCanvas = document.createElement("canvas"); + const fusionCanvas = document.createElement("canvas"); + const fusionBackCanvas = document.createElement("canvas"); const spriteColors: integer[][] = []; const pixelData: Uint8ClampedArray[] = []; [ canvas, backCanvas, fusionCanvas, fusionBackCanvas ].forEach((canv: HTMLCanvasElement, c: integer) => { - const context = canv.getContext('2d'); + const context = canv.getContext("2d"); const frame = [ sourceFrame, sourceBackFrame, fusionFrame, fusionBackFrame ][c]; canv.width = frame.width; canv.height = frame.height; @@ -2362,7 +2563,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { for (let f = 0; f < 2; f++) { const variantColors = variantColorCache[!f ? spriteKey : backSpriteKey]; - let variantColorSet = new Map(); + const variantColorSet = new Map(); if (this.shiny && variantColors && variantColors[this.variant]) { Object.keys(variantColors[this.variant]).forEach(k => { variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.variant][k])))); @@ -2380,8 +2581,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { [ r, g, b, a ] = mappedPixel; } } - if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) + if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { spriteColors.push([ r, g, b, a ]); + } } } } @@ -2392,8 +2594,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { for (let f = 0; f < 2; f++) { for (let i = 0; i < pixelData[f].length; i += 4) { const total = pixelData[f].slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); - if (!total) + if (!total) { continue; + } pixelColors.push(argbFromRgba({ r: pixelData[f][i], g: pixelData[f][i + 1], b: pixelData[f][i + 2], a: pixelData[f][i + 3] })); } } @@ -2401,7 +2604,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const fusionPixelColors = []; for (let f = 0; f < 2; f++) { const variantColors = variantColorCache[!f ? fusionSpriteKey : fusionBackSpriteKey]; - let variantColorSet = new Map(); + const variantColorSet = new Map(); if (this.fusionShiny && variantColors && variantColors[this.fusionVariant]) { Object.keys(variantColors[this.fusionVariant]).forEach(k => { variantColorSet.set(Utils.rgbaToInt(Array.from(Object.values(Utils.rgbHexToRgba(k)))), Array.from(Object.values(Utils.rgbHexToRgba(variantColors[this.fusionVariant][k])))); @@ -2409,8 +2612,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } for (let i = 0; i < pixelData[2 + f].length; i += 4) { const total = pixelData[2 + f].slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); - if (!total) + if (!total) { continue; + } let [ r, g, b, a ] = [ pixelData[2 + f][i], pixelData[2 + f][i + 1], pixelData[2 + f][i + 2], pixelData[2 + f][i + 3] ]; if (variantColors) { const color = Utils.rgbaToInt([r, g, b, a]); @@ -2432,7 +2636,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.executeWithSeedOffset(() => { paletteColors = QuantizerCelebi.quantize(pixelColors, 4); fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); - }, 0, 'This result should not vary'); + }, 0, "This result should not vary"); Math.random = originalRandom; @@ -2447,7 +2651,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { do { mappedColors.clear(); - rgbaColors = keys.reduce((map: Map, k: number) => { map.set(k, Object.values(rgbaFromArgb(k))); return map; }, new Map()); + rgbaColors = keys.reduce((map: Map, k: number) => { + map.set(k, Object.values(rgbaFromArgb(k))); return map; + }, new Map()); hsvColors = Array.from(rgbaColors.keys()).reduce((map: Map, k: number) => { const rgb = rgbaColors.get(k).slice(0, 3); map.set(k, Utils.rgbToHsv(rgb[0], rgb[1], rgb[2])); @@ -2460,10 +2666,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const hsv2 = hsvColors.get(keys[c2]); const diff = Math.abs(hsv[0] - hsv2[0]); if (diff < 30 || diff >= 330) { - if (mappedColors.has(keys[c])) + if (mappedColors.has(keys[c])) { mappedColors.get(keys[c]).push(keys[c2]); - else + } else { mappedColors.set(keys[c], [ keys[c2] ]); + } break; } } @@ -2472,12 +2679,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { mappedColors.forEach((values: integer[], key: integer) => { const keyColor = rgbaColors.get(key); const valueColors = values.map(v => rgbaColors.get(v)); - let color = keyColor.slice(0); + const color = keyColor.slice(0); let count = paletteColors.get(key); - for (let value of values) { + for (const value of values) { const valueCount = paletteColors.get(value); - if (!valueCount) + if (!valueCount) { continue; + } count += valueCount; } @@ -2493,10 +2701,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } paletteColors.delete(key); - for (let value of values) { + for (const value of values) { paletteColors.delete(value); - if (mappedColors.has(value)) + if (mappedColors.has(value)) { mappedColors.delete(value); + } } paletteColors.set(argbFromRgba({ r: color[0], g: color[1], b: color[2], a: color[3] }), count); @@ -2505,35 +2714,37 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a) < paletteColors.get(b) ? 1 : -1); } while (mappedColors.size); - return keys.map(c => Object.values(rgbaFromArgb(c))) + return keys.map(c => Object.values(rgbaFromArgb(c))); } - ); + ); const paletteDeltas: number[][] = []; spriteColors.forEach((sc: integer[], i: integer) => { paletteDeltas.push([]); - for (let p = 0; p < palette.length; p++) + for (let p = 0; p < palette.length; p++) { paletteDeltas[i].push(Utils.deltaRgb(sc, palette[p])); + } }); - const easeFunc = Phaser.Tweens.Builders.GetEaseFunction('Cubic.easeIn'); + const easeFunc = Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn"); for (let sc = 0; sc < spriteColors.length; sc++) { const delta = Math.min(...paletteDeltas[sc]); const paletteIndex = Math.min(paletteDeltas[sc].findIndex(pd => pd === delta), fusionPalette.length - 1); if (delta < 255) { const ratio = easeFunc(delta / 255); - let color = [ 0, 0, 0, fusionSpriteColors[sc][3] ]; - for (let c = 0; c < 3; c++) + const color = [ 0, 0, 0, fusionSpriteColors[sc][3] ]; + for (let c = 0; c < 3; c++) { color[c] = Math.round((fusionSpriteColors[sc][c] * ratio) + (fusionPalette[paletteIndex][c] * (1 - ratio))); - fusionSpriteColors[sc] = color; + } + fusionSpriteColors[sc] = color; } } [ this.getSprite(), this.getTintSprite() ].map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = spriteColors; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? 'Base' : ''}`] = fusionSpriteColors; + s.pipelineData[`spriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = spriteColors; + s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData?.speciesForm ? "Base" : ""}`] = fusionSpriteColors; }); canvas.remove(); @@ -2569,12 +2780,14 @@ export class PlayerPokemon extends Pokemon { if (Overrides.SHINY_OVERRIDE) { this.shiny = true; this.initShinySparkle(); - if (Overrides.VARIANT_OVERRIDE) + if (Overrides.VARIANT_OVERRIDE) { this.variant = Overrides.VARIANT_OVERRIDE; + } } - if (!dataSource) + if (!dataSource) { this.generateAndPopulateMoveset(); + } this.generateCompatibleTms(); } @@ -2607,10 +2820,10 @@ export class PlayerPokemon extends Pokemon { this.compatibleTms = []; const tms = Object.keys(tmSpecies); - for (let tm of tms) { + for (const tm of tms) { const moveId = parseInt(tm) as Moves; let compatible = false; - for (let p of tmSpecies[tm]) { + for (const p of tmSpecies[tm]) { if (Array.isArray(p)) { if (p[0] === this.species.speciesId || (this.fusionSpecies && p[0] === this.fusionSpecies.speciesId) && p.slice(1).indexOf(this.species.forms[this.formIndex]) > -1) { compatible = true; @@ -2621,16 +2834,19 @@ export class PlayerPokemon extends Pokemon { break; } } - if (reverseCompatibleTms.indexOf(moveId) > -1) + if (reverseCompatibleTms.indexOf(moveId) > -1) { compatible = !compatible; - if (compatible) + } + if (compatible) { this.compatibleTms.push(moveId); + } } } tryPopulateMoveset(moveset: StarterMoveset): boolean { - if (!this.getSpeciesForm().validateStarterMoveset(moveset, this.scene.gameData.starterData[this.species.getRootSpeciesId()].eggMoves)) + if (!this.getSpeciesForm().validateStarterMoveset(moveset, this.scene.gameData.starterData[this.species.getRootSpeciesId()].eggMoves)) { return false; + } this.moveset = moveset.map(m => new PokemonMove(m)); @@ -2640,14 +2856,16 @@ export class PlayerPokemon extends Pokemon { switchOut(batonPass: boolean, removeFromField: boolean = false): Promise { return new Promise(resolve => { this.resetTurnData(); - if (!batonPass) + if (!batonPass) { this.resetSummonData(); + } this.hideInfo(); this.setVisible(false); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.FAINT_SWITCH, this.getFieldIndex(), (slotIndex: integer, option: PartyOption) => { - if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) + if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass)); + } if (removeFromField) { this.setVisible(false); this.scene.field.remove(this); @@ -2672,8 +2890,9 @@ export class PlayerPokemon extends Pokemon { this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); this.friendship = Math.min(this.friendship + amount.value, 255); - if (this.friendship === 255) + if (this.friendship === 255) { this.scene.validateAchv(achvs.MAX_FRIENDSHIP); + } starterData.forEach((sd: StarterDataEntry, i: integer) => { const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species; sd.friendship = (sd.friendship || 0) + starterAmount.value; @@ -2684,8 +2903,9 @@ export class PlayerPokemon extends Pokemon { }); } else { this.friendship = Math.max(this.friendship + amount.value, 0); - for (let sd of starterData) + for (const sd of starterData) { sd.friendship = Math.max((sd.friendship || 0) + starterAmount.value, 0); + } } } /** @@ -2698,8 +2918,9 @@ export class PlayerPokemon extends Pokemon { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:integer, option: PartyOption) => { if(slotIndex >= 0 && slotIndex<6) { const pokemon = this.scene.getParty()[slotIndex]; - if(!pokemon || !pokemon.isFainted()) + if(!pokemon || !pokemon.isFainted()) { resolve(); + } pokemon.resetTurnData(); pokemon.resetStatus(); @@ -2721,8 +2942,8 @@ export class PlayerPokemon extends Pokemon { } this.scene.ui.setMode(Mode.MESSAGE).then(() => resolve()); - }, PartyUiHandler.FilterFainted) - }) + }, PartyUiHandler.FilterFainted); + }); } getPossibleEvolution(evolution: SpeciesFormEvolution): Promise { @@ -2751,26 +2972,30 @@ export class PlayerPokemon extends Pokemon { this.pauseEvolutions = false; this.handleSpecialEvolutions(evolution); const isFusion = evolution instanceof FusionSpeciesFormEvolution; - if (!isFusion) + if (!isFusion) { this.species = getPokemonSpecies(evolution.speciesId); - else + } else { this.fusionSpecies = getPokemonSpecies(evolution.speciesId); + } if (evolution.preFormKey !== null) { const formIndex = Math.max((!isFusion ? this.species : this.fusionSpecies).forms.findIndex(f => f.formKey === evolution.evoFormKey), 0); - if (!isFusion) + if (!isFusion) { this.formIndex = formIndex; - else + } else { this.fusionFormIndex = formIndex; + } } this.generateName(); if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) // Shouldn't happen + if (this.abilityIndex >= abilityCount){ // Shouldn't happen this.abilityIndex = abilityCount - 1; + } } else { const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); - if (this.fusionAbilityIndex >= abilityCount) // Shouldn't happen + if (this.fusionAbilityIndex >= abilityCount){// Shouldn't happen this.fusionAbilityIndex = abilityCount - 1; + } } this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); @@ -2784,15 +3009,16 @@ export class PlayerPokemon extends Pokemon { this.scene.gameData.updateSpeciesDexIvs(this.species.speciesId, this.ivs); this.scene.gameData.setPokemonSeen(this, false); this.scene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); - } else + } else { updateAndResolve(); + } }); } private handleSpecialEvolutions(evolution: SpeciesFormEvolution) { const isFusion = evolution instanceof FusionSpeciesFormEvolution; - const evoSpecies = (!isFusion ? this.species : this.fusionSpecies) + const evoSpecies = (!isFusion ? this.species : this.fusionSpecies); if (evoSpecies.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; @@ -2838,8 +3064,9 @@ export class PlayerPokemon extends Pokemon { this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) // Shouldn't happen + if (this.abilityIndex >= abilityCount) { // Shouldn't happen this.abilityIndex = abilityCount - 1; + } this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); const updateAndResolve = () => { @@ -2852,8 +3079,9 @@ export class PlayerPokemon extends Pokemon { if (!this.scene.gameMode.isDaily || this.metBiome > -1) { this.scene.gameData.setPokemonSeen(this, false); this.scene.gameData.setPokemonCaught(this, false).then(() => updateAndResolve()); - } else + } else { updateAndResolve(); + } }); } @@ -2891,8 +3119,7 @@ export class PlayerPokemon extends Pokemon { // If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum this.hp = Math.min(this.hp, this.stats[Stat.HP]); this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two - } - else if (!pokemon.isFainted()) { + } else if (!pokemon.isFainted()) { // If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero this.hp = Math.max(this.hp, 1); this.status = pokemon.status; // Inherit the other Pokemon's status @@ -2902,13 +3129,15 @@ export class PlayerPokemon extends Pokemon { this.updateInfo(true); const fusedPartyMemberIndex = this.scene.getParty().indexOf(pokemon); let partyMemberIndex = this.scene.getParty().indexOf(this); - if (partyMemberIndex > fusedPartyMemberIndex) + if (partyMemberIndex > fusedPartyMemberIndex) { partyMemberIndex--; + } const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; const transferModifiers: Promise[] = []; - for (let modifier of fusedPartyMemberHeldModifiers) + for (const modifier of fusedPartyMemberHeldModifiers) { transferModifiers.push(this.scene.tryTransferHeldItemModifier(modifier, this, true, false, true, true)); + } Promise.allSettled(transferModifiers).then(() => { this.scene.updateModifiers(true, true).then(() => { this.scene.removePartyMemberModifiers(fusedPartyMemberIndex); @@ -2934,7 +3163,7 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { - let newMoveset = []; + const newMoveset = []; this.moveset.forEach(move => newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual))); @@ -2953,8 +3182,9 @@ export class EnemyPokemon extends Pokemon { dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, null, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; - if (boss) + if (boss) { this.setBoss(); + } if (!dataSource) { this.generateAndPopulateMoveset(); @@ -2966,8 +3196,9 @@ export class EnemyPokemon extends Pokemon { } if (this.shiny) { this.variant = this.generateVariant(); - if (Overrides.OPP_VARIANT_OVERRIDE) + if (Overrides.OPP_VARIANT_OVERRIDE) { this.variant = Overrides.OPP_VARIANT_OVERRIDE; + } } this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); @@ -2976,8 +3207,9 @@ export class EnemyPokemon extends Pokemon { let speciesId = species.speciesId; while ((prevolution = pokemonPrevolutions[speciesId])) { const evolution = pokemonEvolutions[prevolution].find(pe => pe.speciesId === speciesId && (!pe.evoFormKey || pe.evoFormKey === this.getFormKey())); - if (evolution.condition?.enforceFunc) + if (evolution.condition?.enforceFunc) { evolution.condition.enforceFunc(this); + } speciesId = prevolution; } } @@ -2990,8 +3222,9 @@ export class EnemyPokemon extends Pokemon { this.battleInfo = new EnemyBattleInfo(this.scene); this.battleInfo.updateBossSegments(this); this.battleInfo.initInfo(this); - } else + } else { this.battleInfo.updateBossSegments(this); + } } setBoss(boss: boolean = true, bossSegments: integer = 0): void { @@ -3006,32 +3239,32 @@ export class EnemyPokemon extends Pokemon { generateAndPopulateMoveset(formIndex?: integer): void { switch (true) { - case (this.species.speciesId === Species.SMEARGLE): - this.moveset = [ - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH) + case (this.species.speciesId === Species.SMEARGLE): + this.moveset = [ + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH) + ]; + break; + case (this.species.speciesId === Species.ETERNATUS): + this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) + ? [ + new PokemonMove(Moves.DYNAMAX_CANNON), + new PokemonMove(Moves.CROSS_POISON), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.RECOVER, 0, -4) + ] + : [ + new PokemonMove(Moves.ETERNABEAM), + new PokemonMove(Moves.SLUDGE_BOMB), + new PokemonMove(Moves.DRAGON_DANCE), + new PokemonMove(Moves.COSMIC_POWER) ]; - break; - case (this.species.speciesId === Species.ETERNATUS): - this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) - ? [ - new PokemonMove(Moves.DYNAMAX_CANNON), - new PokemonMove(Moves.CROSS_POISON), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.RECOVER, 0, -4) - ] - : [ - new PokemonMove(Moves.ETERNABEAM), - new PokemonMove(Moves.SLUDGE_BOMB), - new PokemonMove(Moves.DRAGON_DANCE), - new PokemonMove(Moves.COSMIC_POWER) - ]; break; - default: - super.generateAndPopulateMoveset(); - break; + default: + super.generateAndPopulateMoveset(); + break; } } @@ -3040,9 +3273,9 @@ export class EnemyPokemon extends Pokemon { ? this.getMoveset().find(m => m.moveId === this.getMoveQueue()[0].move) : null; if (queuedMove) { - if (queuedMove.isUsable(this, this.getMoveQueue()[0].ignorePP)) + if (queuedMove.isUsable(this, this.getMoveQueue()[0].ignorePP)) { return { move: queuedMove.moveId, targets: this.getMoveQueue()[0].targets, ignorePP: this.getMoveQueue()[0].ignorePP }; - else { + } else { this.getMoveQueue().shift(); return this.getNextMove(); } @@ -3050,84 +3283,92 @@ export class EnemyPokemon extends Pokemon { const movePool = this.getMoveset().filter(m => m.isUsable(this)); if (movePool.length) { - if (movePool.length === 1) + if (movePool.length === 1) { return { move: movePool[0].moveId, targets: this.getNextTargets(movePool[0].moveId) }; + } const encoreTag = this.getTag(EncoreTag) as EncoreTag; if (encoreTag) { const encoreMove = movePool.find(m => m.moveId === encoreTag.moveId); - if (encoreMove) + if (encoreMove) { return { move: encoreMove.moveId, targets: this.getNextTargets(encoreMove.moveId) }; + } } switch (this.aiType) { - case AiType.RANDOM: - const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)].moveId; - return { move: moveId, targets: this.getNextTargets(moveId) }; - case AiType.SMART_RANDOM: - case AiType.SMART: - const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries(movePool.map(m => [ m.moveId, this.getNextTargets(m.moveId) ])); - for (let m in movePool) { - const pokemonMove = movePool[m]; - const move = pokemonMove.getMove(); - - const variableType = new Utils.IntegerHolder(move.type); - applyAbAttrs(VariableMoveTypeAbAttr, this, null, variableType); - const moveType = variableType.value as Type; - - let moveScore = moveScores[m]; - let targetScores: integer[] = []; - - for (let mt of moveTargets[move.id]) { - // Prevent a target score from being calculated when the target is whoever attacks the user - if (mt === BattlerIndex.ATTACKER) - break; + case AiType.RANDOM: + const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)].moveId; + return { move: moveId, targets: this.getNextTargets(moveId) }; + case AiType.SMART_RANDOM: + case AiType.SMART: + const moveScores = movePool.map(() => 0); + const moveTargets = Object.fromEntries(movePool.map(m => [ m.moveId, this.getNextTargets(m.moveId) ])); + for (const m in movePool) { + const pokemonMove = movePool[m]; + const move = pokemonMove.getMove(); + + const variableType = new Utils.IntegerHolder(move.type); + applyAbAttrs(VariableMoveTypeAbAttr, this, null, variableType); + const moveType = variableType.value as Type; + + let moveScore = moveScores[m]; + const targetScores: integer[] = []; + + for (const mt of moveTargets[move.id]) { + // Prevent a target score from being calculated when the target is whoever attacks the user + if (mt === BattlerIndex.ATTACKER) { + break; + } - const target = this.scene.getField()[mt]; - let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); - if ((move.name.endsWith(' (N)') || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND].includes(move.id)) - targetScore = -20; - else if (move instanceof AttackMove) { - const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); - if (target.isPlayer() !== this.isPlayer()) { - targetScore *= effectiveness; - if (this.isOfType(moveType)) - targetScore *= 1.5; - } else if (effectiveness) { - targetScore /= effectiveness; - if (this.isOfType(moveType)) - targetScore /= 1.5; + const target = this.scene.getField()[mt]; + let targetScore = move.getUserBenefitScore(this, target, move) + move.getTargetBenefitScore(this, target, move) * (mt < BattlerIndex.ENEMY === this.isPlayer() ? 1 : -1); + if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND].includes(move.id)) { + targetScore = -20; + } else if (move instanceof AttackMove) { + const effectiveness = target.getAttackMoveEffectiveness(this, pokemonMove); + if (target.isPlayer() !== this.isPlayer()) { + targetScore *= effectiveness; + if (this.isOfType(moveType)) { + targetScore *= 1.5; } - if (!targetScore) - targetScore = -20; + } else if (effectiveness) { + targetScore /= effectiveness; + if (this.isOfType(moveType)) { + targetScore /= 1.5; + } + } + if (!targetScore) { + targetScore = -20; } - targetScores.push(targetScore); } + targetScores.push(targetScore); + } - moveScore += Math.max(...targetScores); + moveScore += Math.max(...targetScores); - // could make smarter by checking opponent def/spdef - moveScores[m] = moveScore; - } + // could make smarter by checking opponent def/spdef + moveScores[m] = moveScore; + } - console.log(moveScores); + console.log(moveScores); - const sortedMovePool = movePool.slice(0); - sortedMovePool.sort((a, b) => { - const scoreA = moveScores[movePool.indexOf(a)]; - const scoreB = moveScores[movePool.indexOf(b)]; - return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; - }); - let r = 0; - if (this.aiType === AiType.SMART_RANDOM) { - while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) - r++; - } else if (this.aiType === AiType.SMART) { - while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 - && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) - r++; + const sortedMovePool = movePool.slice(0); + sortedMovePool.sort((a, b) => { + const scoreA = moveScores[movePool.indexOf(a)]; + const scoreB = moveScores[movePool.indexOf(b)]; + return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; + }); + let r = 0; + if (this.aiType === AiType.SMART_RANDOM) { + while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) { + r++; + } + } else if (this.aiType === AiType.SMART) { + while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 + && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { + r++; } - console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName())); - return { move: sortedMovePool[r].moveId, targets: moveTargets[sortedMovePool[r].moveId] }; + } + console.log(movePool.map(m => m.getName()), moveScores, r, sortedMovePool.map(m => m.getName())); + return { move: sortedMovePool[r].moveId, targets: moveTargets[sortedMovePool[r].moveId] }; } } @@ -3137,8 +3378,9 @@ export class EnemyPokemon extends Pokemon { getNextTargets(moveId: Moves): BattlerIndex[] { const moveTargets = getMoveTargets(this, moveId); const targets = this.scene.getField(true).filter(p => moveTargets.targets.indexOf(p.getBattlerIndex()) > -1); - if (moveTargets.multiple) + if (moveTargets.multiple) { return targets.map(p => p.getBattlerIndex()); + } const move = allMoves[moveId]; @@ -3155,8 +3397,9 @@ export class EnemyPokemon extends Pokemon { if (!sortedBenefitScores.length) { // Set target to BattlerIndex.ATTACKER when using a counter move // This is the same as when the player does so - if (!!move.findAttr(attr => attr instanceof CounterDamageAttr)) + if (!!move.findAttr(attr => attr instanceof CounterDamageAttr)) { return [BattlerIndex.ATTACKER]; + } return []; } @@ -3165,13 +3408,15 @@ export class EnemyPokemon extends Pokemon { const lowestWeight = targetWeights[targetWeights.length - 1]; if (lowestWeight < 1) { - for (let w = 0; w < targetWeights.length; w++) + for (let w = 0; w < targetWeights.length; w++) { targetWeights[w] += Math.abs(lowestWeight - 1); + } } const benefitCutoffIndex = targetWeights.findIndex(s => s < targetWeights[0] / 2); - if (benefitCutoffIndex > -1) + if (benefitCutoffIndex > -1) { targetWeights = targetWeights.slice(0, benefitCutoffIndex); + } const thresholds: integer[] = []; let totalWeight: integer; @@ -3186,8 +3431,9 @@ export class EnemyPokemon extends Pokemon { let targetIndex: integer; thresholds.every((t, i) => { - if (randValue >= t) + if (randValue >= t) { return true; + } targetIndex = i; return false; @@ -3222,8 +3468,9 @@ export class EnemyPokemon extends Pokemon { } damage(damage: integer, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { - if (this.isFainted()) + if (this.isFainted()) { return 0; + } let clearedBossSegmentIndex = this.isBoss() ? this.bossSegmentIndex + 1 @@ -3252,20 +3499,22 @@ export class EnemyPokemon extends Pokemon { } switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - if (!this.formIndex && this.bossSegmentIndex < 1) - damage = Math.min(damage, this.hp - 1); + case BattleSpec.FINAL_BOSS: + if (!this.formIndex && this.bossSegmentIndex < 1) { + damage = Math.min(damage, this.hp - 1); + } } - let ret = super.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); + const ret = super.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); if (this.isBoss()) { if (ignoreSegments) { const segmentSize = this.getMaxHp() / this.bossSegments; clearedBossSegmentIndex = Math.ceil(this.hp / segmentSize); } - if (clearedBossSegmentIndex <= this.bossSegmentIndex) + if (clearedBossSegmentIndex <= this.bossSegmentIndex) { this.handleBossSegmentCleared(clearedBossSegmentIndex); + } this.battleInfo.updateBossSegments(this); } @@ -3274,8 +3523,9 @@ export class EnemyPokemon extends Pokemon { canBypassBossSegments(segmentCount: integer = 1): boolean { if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - if (!this.formIndex && (this.bossSegmentIndex - segmentCount) < 1) + if (!this.formIndex && (this.bossSegmentIndex - segmentCount) < 1) { return false; + } } return true; @@ -3289,14 +3539,14 @@ export class EnemyPokemon extends Pokemon { const statWeights = new Array().fill(battleStats.length).filter((bs: BattleStat) => this.summonData.battleStats[bs] < 6).map((bs: BattleStat) => this.getStat(bs + 1)); const statThresholds: integer[] = []; let totalWeight = 0; - for (let bs of battleStats) { + for (const bs of battleStats) { totalWeight += statWeights[bs]; statThresholds.push(totalWeight); } const randInt = Utils.randSeedInt(totalWeight); - for (let bs of battleStats) { + for (const bs of battleStats) { if (randInt < statThresholds[bs]) { boostedStat = bs; break; @@ -3306,14 +3556,16 @@ export class EnemyPokemon extends Pokemon { let statLevels = 1; switch (segmentIndex) { - case 1: - if (this.bossSegments >= 3) - statLevels++; - break; - case 2: - if (this.bossSegments >= 5) - statLevels++; - break; + case 1: + if (this.bossSegments >= 3) { + statLevels++; + } + break; + case 2: + if (this.bossSegments >= 5) { + statLevels++; + } + break; } this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels, true, true)); @@ -3324,8 +3576,8 @@ export class EnemyPokemon extends Pokemon { heal(amount: integer): integer { if (this.isBoss()) { - let amountRatio = amount / this.getMaxHp(); - let segmentBypassCount = Math.floor(amountRatio / (1 / this.bossSegments)); + const amountRatio = amount / this.getMaxHp(); + const segmentBypassCount = Math.floor(amountRatio / (1 / this.bossSegments)); const segmentSize = this.getMaxHp() / this.bossSegments; for (let s = 1; s < this.bossSegments; s++) { const hpThreshold = segmentSize * s; @@ -3333,8 +3585,9 @@ export class EnemyPokemon extends Pokemon { const healAmount = Math.min(amount, this.getMaxHp() - this.hp, Math.round(hpThreshold + (segmentSize * segmentBypassCount) - this.hp)); this.hp += healAmount; return healAmount; - } else if (s >= this.bossSegmentIndex) + } else if (s >= this.bossSegmentIndex) { return super.heal(amount); + } } } @@ -3474,9 +3727,10 @@ export class PokemonMove { } isUsable(pokemon: Pokemon, ignorePp?: boolean): boolean { - if (this.moveId && pokemon.summonData?.disabledMove === this.moveId) + if (this.moveId && pokemon.summonData?.disabledMove === this.moveId) { return false; - return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1) && !this.getMove().name.endsWith(' (N)'); + } + return (ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1) && !this.getMove().name.endsWith(" (N)"); } getMove(): Move { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 8cd06cac12f1..177aee2f3d06 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -8,8 +8,7 @@ import { EnemyPokemon } from "./pokemon"; import * as Utils from "../utils"; import { PersistentModifier } from "../modifier/modifier"; import { trainerNamePools } from "../data/trainer-names"; -import { ArenaTagType } from "#app/data/enums/arena-tag-type"; -import { ArenaTag, ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; import {getIsInitialized, initI18n} from "#app/plugins/i18n"; import i18next from "i18next"; @@ -39,24 +38,28 @@ export default class Trainer extends Phaser.GameObjects.Container { this.name = name || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[variant === TrainerVariant.FEMALE ? 1 : 0] : namePool); if (variant === TrainerVariant.DOUBLE) { if (this.config.doubleOnly) { - if (partnerName) + if (partnerName) { this.partnerName = partnerName; - else - [ this.name, this.partnerName ] = this.name.split(' & '); - } else + } else { + [ this.name, this.partnerName ] = this.name.split(" & "); + } + } else { this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); + } } } switch (this.variant) { - case TrainerVariant.FEMALE: - if (!this.config.hasGenders) - variant = TrainerVariant.DEFAULT; - break; - case TrainerVariant.DOUBLE: - if (!this.config.hasDouble) - variant = TrainerVariant.DEFAULT; - break; + case TrainerVariant.FEMALE: + if (!this.config.hasGenders) { + variant = TrainerVariant.DEFAULT; + } + break; + case TrainerVariant.DOUBLE: + if (!this.config.hasDouble) { + variant = TrainerVariant.DEFAULT; + } + break; } console.log(Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())]); @@ -120,7 +123,7 @@ export default class Trainer extends Phaser.GameObjects.Container { } // Get the localized trainer class name from the i18n file and set it as the title. // This is used for trainer class names, not titles like "Elite Four, Champion, etc." - title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, '_')}`); + title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); } // If no specific trainer slot is set. @@ -169,8 +172,9 @@ export default class Trainer extends Phaser.GameObjects.Container { } getPartyTemplate(): TrainerPartyTemplate { - if (this.config.partyTemplateFunc) + if (this.config.partyTemplateFunc) { return this.config.partyTemplateFunc(this.scene); + } return this.config.partyTemplates[this.partyTemplateIndex]; } @@ -179,10 +183,11 @@ export default class Trainer extends Phaser.GameObjects.Container { const partyTemplate = this.getPartyTemplate(); const difficultyWaveIndex = this.scene.gameMode.getWaveForDifficulty(waveIndex); - let baseLevel = 1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2); + const baseLevel = 1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2); - if (this.isDouble() && partyTemplate.size < 2) + if (this.isDouble() && partyTemplate.size < 2) { partyTemplate.size = 2; + } for (let i = 0; i < partyTemplate.size; i++) { let multiplier = 1; @@ -190,21 +195,21 @@ export default class Trainer extends Phaser.GameObjects.Container { const strength = partyTemplate.getStrength(i); switch (strength) { - case PartyMemberStrength.WEAKER: - multiplier = 0.95; - break; - case PartyMemberStrength.WEAK: - multiplier = 1.0; - break; - case PartyMemberStrength.AVERAGE: - multiplier = 1.1; - break; - case PartyMemberStrength.STRONG: - multiplier = 1.2; - break; - case PartyMemberStrength.STRONGER: - multiplier = 1.25; - break; + case PartyMemberStrength.WEAKER: + multiplier = 0.95; + break; + case PartyMemberStrength.WEAK: + multiplier = 1.0; + break; + case PartyMemberStrength.AVERAGE: + multiplier = 1.1; + break; + case PartyMemberStrength.STRONG: + multiplier = 1.2; + break; + case PartyMemberStrength.STRONGER: + multiplier = 1.25; + break; } let levelOffset = 0; @@ -243,9 +248,10 @@ export default class Trainer extends Phaser.GameObjects.Container { let offset = 0; if (template instanceof TrainerPartyCompoundTemplate) { - for (let innerTemplate of template.templates) { - if (offset + innerTemplate.size > index) + for (const innerTemplate of template.templates) { + if (offset + innerTemplate.size > index) { break; + } offset += innerTemplate.size; } } @@ -267,7 +273,7 @@ export default class Trainer extends Phaser.GameObjects.Container { let species: PokemonSpecies; if (this.config.speciesPools) { const tierValue = Utils.randSeedInt(512); - let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE + let tier = tierValue >= 156 ? TrainerPoolTier.COMMON : tierValue >= 32 ? TrainerPoolTier.UNCOMMON : tierValue >= 6 ? TrainerPoolTier.RARE : tierValue >= 1 ? TrainerPoolTier.SUPER_RARE : TrainerPoolTier.ULTRA_RARE; console.log(TrainerPoolTier[tier]); while (!this.config.speciesPools.hasOwnProperty(tier) || !this.config.speciesPools[tier].length) { console.log(`Downgraded trainer Pokemon rarity tier from ${TrainerPoolTier[tier]} to ${TrainerPoolTier[tier - 1]}`); @@ -275,36 +281,39 @@ export default class Trainer extends Phaser.GameObjects.Container { } const tierPool = this.config.speciesPools[tier]; species = getPokemonSpecies(Utils.randSeedItem(tierPool)); - } else + } else { species = this.scene.randomSpecies(battle.waveIndex, level, false, this.config.speciesFilter); + } let ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); let retry = false; console.log(ret.getName()); - if (pokemonPrevolutions.hasOwnProperty(species.speciesId) && ret.speciesId !== species.speciesId) + if (pokemonPrevolutions.hasOwnProperty(species.speciesId) && ret.speciesId !== species.speciesId) { retry = true; - else if (template.isBalanced(battle.enemyParty.length)) { + } else if (template.isBalanced(battle.enemyParty.length)) { const partyMemberTypes = battle.enemyParty.map(p => p.getTypes(true)).flat(); - if (partyMemberTypes.indexOf(ret.type1) > -1 || (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1)) + if (partyMemberTypes.indexOf(ret.type1) > -1 || (ret.type2 !== null && partyMemberTypes.indexOf(ret.type2) > -1)) { retry = true; + } } if (!retry && this.config.specialtyTypes.length && !this.config.specialtyTypes.find(t => ret.isOfType(t))) { retry = true; - console.log('Attempting reroll of species evolution to fit specialty type...'); + console.log("Attempting reroll of species evolution to fit specialty type..."); let evoAttempt = 0; while (retry && evoAttempt++ < 10) { ret = getPokemonSpecies(species.getTrainerSpeciesForLevel(level, true, strength)); console.log(ret.name); - if (this.config.specialtyTypes.find(t => ret.isOfType(t))) + if (this.config.specialtyTypes.find(t => ret.isOfType(t))) { retry = false; + } } } if (retry && (attempt || 0) < 10) { - console.log('Rerolling party member...') + console.log("Rerolling party member..."); ret = this.genNewPartyMemberSpecies(level, strength, (attempt || 0) + 1); } @@ -312,25 +321,26 @@ export default class Trainer extends Phaser.GameObjects.Container { } getPartyMemberMatchupScores(trainerSlot: TrainerSlot = TrainerSlot.NONE, forSwitch: boolean = false): [integer, integer][] { - if (trainerSlot && !this.isDouble()) + if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; + } const party = this.scene.getEnemyParty(); const nonFaintedPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => !p.isFainted()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); const partyMemberScores = nonFaintedPartyMembers.map(p => { const playerField = this.scene.getPlayerField(); let score = 0; - let ret: [integer, integer]; - for (let playerPokemon of playerField) { + for (const playerPokemon of playerField) { score += p.getMatchupScore(playerPokemon); - if (playerPokemon.species.legendary) + if (playerPokemon.species.legendary) { score /= 2; + } } score /= playerField.length; - if (forSwitch && !p.isOnField()) + if (forSwitch && !p.isOnField()) { this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); - ret = [ party.indexOf(p), score ]; - return ret; + } + return [ party.indexOf(p), score ]; }); return partyMemberScores; @@ -348,8 +358,9 @@ export default class Trainer extends Phaser.GameObjects.Container { } getNextSummonIndex(trainerSlot: TrainerSlot = TrainerSlot.NONE, partyMemberScores: [integer, integer][] = this.getPartyMemberMatchupScores(trainerSlot)): integer { - if (trainerSlot && !this.isDouble()) + if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; + } const sortedPartyMemberScores = this.getSortedPartyMemberMatchupScores(partyMemberScores); @@ -366,22 +377,23 @@ export default class Trainer extends Phaser.GameObjects.Container { getPartyMemberModifierChanceMultiplier(index: integer): number { switch (this.getPartyTemplate().getStrength(index)) { - case PartyMemberStrength.WEAKER: - return 0.75; - case PartyMemberStrength.WEAK: - return 0.675; - case PartyMemberStrength.AVERAGE: - return 0.5625; - case PartyMemberStrength.STRONG: - return 0.45; - case PartyMemberStrength.STRONGER: - return 0.375; + case PartyMemberStrength.WEAKER: + return 0.75; + case PartyMemberStrength.WEAK: + return 0.675; + case PartyMemberStrength.AVERAGE: + return 0.5625; + case PartyMemberStrength.STRONG: + return 0.45; + case PartyMemberStrength.STRONGER: + return 0.375; } } genModifiers(party: EnemyPokemon[]): PersistentModifier[] { - if (this.config.genModifiersFunc) + if (this.config.genModifiersFunc) { return this.config.genModifiersFunc(party); + } return []; } @@ -404,7 +416,7 @@ export default class Trainer extends Phaser.GameObjects.Container { */ tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { // Show an error in the console if there isn't a texture loaded - if (sprite.texture.key === '__MISSING') { + if (sprite.texture.key === "__MISSING") { console.error(`No texture found for '${animConfig.key}'!`); return false; @@ -449,8 +461,9 @@ export default class Trainer extends Phaser.GameObjects.Container { const ret: Phaser.GameObjects.Sprite[] = [ this.getAt(0) ]; - if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) + if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(2)); + } return ret; } @@ -458,8 +471,9 @@ export default class Trainer extends Phaser.GameObjects.Container { const ret: Phaser.GameObjects.Sprite[] = [ this.getAt(1) ]; - if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) + if (this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { ret.push(this.getAt(3)); + } return ret; } @@ -476,10 +490,11 @@ export default class Trainer extends Phaser.GameObjects.Container { targets: tintSprite, alpha: alpha || 1, duration: duration, - ease: ease || 'Linear' + ease: ease || "Linear" }); - } else + } else { tintSprite.setAlpha(alpha); + } }); } @@ -491,7 +506,7 @@ export default class Trainer extends Phaser.GameObjects.Container { targets: tintSprite, alpha: 0, duration: duration, - ease: ease || 'Linear', + ease: ease || "Linear", onComplete: () => { tintSprite.setVisible(false); tintSprite.setAlpha(1); @@ -507,4 +522,4 @@ export default class Trainer extends Phaser.GameObjects.Container { export default interface Trainer { scene: BattleScene -} \ No newline at end of file +} diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index db325bd3d4f4..c42932d931c6 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -27,8 +27,9 @@ export class FormChangePhase extends EvolutionPhase { } setMode(): Promise { - if (!this.modal) + if (!this.modal) { return super.setMode(); + } return this.scene.ui.setOverlayMode(Mode.EVOLUTION_SCENE); } @@ -39,13 +40,14 @@ export class FormChangePhase extends EvolutionPhase { [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { sprite.play(transformedPokemon.getSpriteKey(true)); - sprite.setPipelineData('ignoreTimeTint', true); - sprite.setPipelineData('spriteKey', transformedPokemon.getSpriteKey()); - sprite.setPipelineData('shiny', transformedPokemon.shiny); - sprite.setPipelineData('variant', transformedPokemon.variant); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (transformedPokemon.summonData?.speciesForm) - k += 'Base'; + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", transformedPokemon.shiny); + sprite.setPipelineData("variant", transformedPokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (transformedPokemon.summonData?.speciesForm) { + k += "Base"; + } sprite.pipelineData[k] = transformedPokemon.getSprite().pipelineData[k]; }); }); @@ -56,7 +58,7 @@ export class FormChangePhase extends EvolutionPhase { alpha: 1, delay: 500, duration: 1500, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.scene.time.delayedCall(1000, () => { this.scene.tweens.add({ @@ -67,7 +69,7 @@ export class FormChangePhase extends EvolutionPhase { this.evolutionBg.setVisible(true); this.evolutionBg.play(); }); - this.scene.playSound('charge'); + this.scene.playSound("charge"); this.doSpiralUpward(); this.scene.tweens.addCounter({ from: 0, @@ -79,27 +81,28 @@ export class FormChangePhase extends EvolutionPhase { onComplete: () => { this.pokemonSprite.setVisible(false); this.scene.time.delayedCall(1100, () => { - this.scene.playSound('beam'); + this.scene.playSound("beam"); this.doArcDownward(); this.scene.time.delayedCall(1000, () => { this.pokemonEvoTintSprite.setScale(0.25); this.pokemonEvoTintSprite.setVisible(true); this.doCycle(1, 1).then(_success => { - this.scene.playSound('sparkle'); + this.scene.playSound("sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); this.scene.time.delayedCall(900, () => { this.pokemon.changeForm(this.formChange).then(() => { - if (!this.modal) + if (!this.modal) { this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); + } - this.scene.playSound('shine'); + this.scene.playSound("shine"); this.doSpray(); this.scene.tweens.add({ targets: this.evolutionOverlay, alpha: 1, duration: 250, - easing: 'Sine.easeIn', + easing: "Sine.easeIn", onComplete: () => { this.evolutionBgOverlay.setAlpha(1); this.evolutionBg.setVisible(false); @@ -108,7 +111,7 @@ export class FormChangePhase extends EvolutionPhase { alpha: 0, duration: 2000, delay: 150, - easing: 'Sine.easeIn', + easing: "Sine.easeIn", onComplete: () => { this.scene.tweens.add({ targets: this.evolutionBgOverlay, @@ -128,7 +131,7 @@ export class FormChangePhase extends EvolutionPhase { } const delay = playEvolutionFanfare ? 4000 : 1750; - this.scene.playSoundWithoutBgm(playEvolutionFanfare ? 'evolution_fanfare' : 'minor_fanfare'); + this.scene.playSoundWithoutBgm(playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare"); transformedPokemon.destroy(); this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), null, true, Utils.fixedInt(delay)); @@ -147,7 +150,7 @@ export class FormChangePhase extends EvolutionPhase { }); }); } - }) + }); } }); }); @@ -165,8 +168,9 @@ export class FormChangePhase extends EvolutionPhase { super.end(); }); - } else + } else { super.end(); + } } } @@ -183,8 +187,9 @@ export class QuietFormChangePhase extends BattlePhase { start(): void { super.start(); - if (this.pokemon.formIndex === this.pokemon.species.forms.findIndex(f => f.formKey === this.formChange.formKey)) + if (this.pokemon.formIndex === this.pokemon.species.forms.findIndex(f => f.formKey === this.formChange.formKey)) { return this.end(); + } const preName = this.pokemon.name; @@ -196,26 +201,28 @@ export class QuietFormChangePhase extends BattlePhase { } const getPokemonSprite = () => { - const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, `pkmn__sub`); + const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, "pkmn__sub"); sprite.setOrigin(0.5, 1); sprite.play(this.pokemon.getBattleSpriteKey()).stop(); sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (this.pokemon.summonData?.speciesForm) - k += 'Base'; + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (this.pokemon.summonData?.speciesForm) { + k += "Base"; + } sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); this.scene.field.add(sprite); return sprite; - } + }; const [ pokemonTintSprite, pokemonFormTintSprite ] = [ getPokemonSprite(), getPokemonSprite() ]; - this.pokemon.getSprite().on('animationupdate', (_anim, frame) => { - if (frame.textureKey === pokemonTintSprite.texture.key) + this.pokemon.getSprite().on("animationupdate", (_anim, frame) => { + if (frame.textureKey === pokemonTintSprite.texture.key) { pokemonTintSprite.setFrame(frame.textureFrame); - else + } else { pokemonFormTintSprite.setFrame(frame.textureFrame); + } }); pokemonTintSprite.setAlpha(0); @@ -223,13 +230,13 @@ export class QuietFormChangePhase extends BattlePhase { pokemonFormTintSprite.setVisible(false); pokemonFormTintSprite.setTintFill(0xFFFFFF); - this.scene.playSound('PRSFX- Transform'); + this.scene.playSound("PRSFX- Transform"); this.scene.tweens.add({ targets: pokemonTintSprite, alpha: 1, duration: 1000, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { this.pokemon.setVisible(false); this.pokemon.changeForm(this.formChange).then(() => { @@ -240,7 +247,7 @@ export class QuietFormChangePhase extends BattlePhase { targets: pokemonTintSprite, delay: 250, scale: 0.01, - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", duration: 500, onComplete: () => pokemonTintSprite.destroy() }); @@ -248,7 +255,7 @@ export class QuietFormChangePhase extends BattlePhase { targets: pokemonFormTintSprite, delay: 250, scale: this.pokemon.getSpriteScale(), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", duration: 500, onComplete: () => { this.pokemon.setVisible(true); @@ -256,7 +263,7 @@ export class QuietFormChangePhase extends BattlePhase { targets: pokemonFormTintSprite, delay: 250, alpha: 0, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", duration: 1000, onComplete: () => { pokemonTintSprite.setVisible(false); @@ -282,10 +289,11 @@ export class QuietFormChangePhase extends BattlePhase { this.pokemon.cry(); const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; - if (movePhase) + if (movePhase) { movePhase.cancel(); + } } super.end(); } -} \ No newline at end of file +} diff --git a/src/game-mode.ts b/src/game-mode.ts index bedcf4297572..69bc5ea109a3 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -5,7 +5,7 @@ import { Species } from "./data/enums/species"; import PokemonSpecies, { allSpecies } from "./data/pokemon-species"; import { Arena } from "./field/arena"; import * as Utils from "./utils"; -import * as Overrides from './overrides'; +import * as Overrides from "./overrides"; export enum GameModes { CLASSIC, @@ -52,13 +52,14 @@ export class GameMode implements GameModeConfig { * - 5 for all other modes */ getStartingLevel(): integer { - if (Overrides.STARTING_LEVEL_OVERRIDE) + if (Overrides.STARTING_LEVEL_OVERRIDE) { return Overrides.STARTING_LEVEL_OVERRIDE; + } switch (this.modeId) { - case GameModes.DAILY: - return 20; - default: - return 5; + case GameModes.DAILY: + return 20; + default: + return 5; } } @@ -80,46 +81,50 @@ export class GameMode implements GameModeConfig { */ getStartingBiome(scene: BattleScene): Biome { switch (this.modeId) { - case GameModes.DAILY: - return scene.generateRandomBiome(this.getWaveForDifficulty(1)); - default: - return Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN; + case GameModes.DAILY: + return scene.generateRandomBiome(this.getWaveForDifficulty(1)); + default: + return Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN; } } getWaveForDifficulty(waveIndex: integer, ignoreCurveChanges: boolean = false): integer { switch (this.modeId) { - case GameModes.DAILY: - return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); - default: - return waveIndex; + case GameModes.DAILY: + return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); + default: + return waveIndex; } } isWaveTrainer(waveIndex: integer, arena: Arena): boolean { - if (this.isDaily) + if (this.isDaily) { return waveIndex % 10 === 5 || (!(waveIndex % 10) && waveIndex > 10 && !this.isWaveFinal(waveIndex)); - if ((waveIndex % 30) === (arena.scene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) + } + if ((waveIndex % 30) === (arena.scene.offsetGym ? 0 : 20) && !this.isWaveFinal(waveIndex)) { return true; - else if (waveIndex % 10 !== 1 && waveIndex % 10) { + } else if (waveIndex % 10 !== 1 && waveIndex % 10) { const trainerChance = arena.getTrainerChance(); let allowTrainerBattle = true; if (trainerChance) { const waveBase = Math.floor(waveIndex / 10) * 10; for (let w = Math.max(waveIndex - 3, waveBase + 2); w <= Math.min(waveIndex + 3, waveBase + 9); w++) { - if (w === waveIndex) + if (w === waveIndex) { continue; + } if ((w % 30) === (arena.scene.offsetGym ? 0 : 20) || fixedBattles.hasOwnProperty(w)) { allowTrainerBattle = false; break; } else if (w < waveIndex) { arena.scene.executeWithSeedOffset(() => { const waveTrainerChance = arena.getTrainerChance(); - if (!Utils.randSeedInt(waveTrainerChance)) + if (!Utils.randSeedInt(waveTrainerChance)) { allowTrainerBattle = false; + } }, w); - if (!allowTrainerBattle) + if (!allowTrainerBattle) { break; + } } } } @@ -130,10 +135,10 @@ export class GameMode implements GameModeConfig { isTrainerBoss(waveIndex: integer, biomeType: Biome, offsetGym: boolean): boolean { switch (this.modeId) { - case GameModes.DAILY: - return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); - default: - return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); + case GameModes.DAILY: + return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); + default: + return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); } } @@ -155,85 +160,85 @@ export class GameMode implements GameModeConfig { */ isWaveFinal(waveIndex: integer, modeId: GameModes = this.modeId): boolean { switch (modeId) { - case GameModes.CLASSIC: - return waveIndex === 200; - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - return !(waveIndex % 250); - case GameModes.DAILY: - return waveIndex === 50; + case GameModes.CLASSIC: + return waveIndex === 200; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + return !(waveIndex % 250); + case GameModes.DAILY: + return waveIndex === 50; } } - /** + /** * Every 10 waves is a boss battle * @returns true if waveIndex is a multiple of 10 */ - isBoss(waveIndex: integer): boolean { - return waveIndex % 10 === 0; - } + isBoss(waveIndex: integer): boolean { + return waveIndex % 10 === 0; + } - /** + /** * Every 50 waves of an Endless mode is a boss * At this time it is paradox pokemon * @returns true if waveIndex is a multiple of 50 in Endless */ - isEndlessBoss(waveIndex: integer): boolean { - return waveIndex % 50 && + isEndlessBoss(waveIndex: integer): boolean { + return waveIndex % 50 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); - } + } - /** + /** * Every 250 waves of an Endless mode is a minor boss * At this time it is Eternatus * @returns true if waveIndex is a multiple of 250 in Endless */ - isEndlessMinorBoss(waveIndex: integer): boolean { - return waveIndex % 250 === 0 && + isEndlessMinorBoss(waveIndex: integer): boolean { + return waveIndex % 250 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); - } + } - /** + /** * Every 1000 waves of an Endless mode is a major boss * At this time it is Eternamax Eternatus * @returns true if waveIndex is a multiple of 1000 in Endless */ - isEndlessMajorBoss(waveIndex: integer): boolean { - return waveIndex % 1000 === 0 && + isEndlessMajorBoss(waveIndex: integer): boolean { + return waveIndex % 1000 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); - } + } getClearScoreBonus(): integer { switch (this.modeId) { - case GameModes.CLASSIC: - return 5000; - case GameModes.DAILY: - return 2500; + case GameModes.CLASSIC: + return 5000; + case GameModes.DAILY: + return 2500; } } getEnemyModifierChance(isBoss: boolean): integer { switch (this.modeId) { - case GameModes.CLASSIC: - case GameModes.DAILY: - return !isBoss ? 18 : 6; - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - return !isBoss ? 12 : 4; + case GameModes.CLASSIC: + case GameModes.DAILY: + return !isBoss ? 18 : 6; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + return !isBoss ? 12 : 4; } } getName(): string { switch (this.modeId) { - case GameModes.CLASSIC: - return 'Classic'; - case GameModes.ENDLESS: - return 'Endless'; - case GameModes.SPLICED_ENDLESS: - return 'Endless (Spliced)'; - case GameModes.DAILY: - return 'Daily Run'; + case GameModes.CLASSIC: + return "Classic"; + case GameModes.ENDLESS: + return "Endless"; + case GameModes.SPLICED_ENDLESS: + return "Endless (Spliced)"; + case GameModes.DAILY: + return "Daily Run"; } } } @@ -243,4 +248,4 @@ export const gameModes = Object.freeze({ [GameModes.ENDLESS]: new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }), [GameModes.SPLICED_ENDLESS]: new GameMode(GameModes.SPLICED_ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true, isSplicedOnly: true }), [GameModes.DAILY]: new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }) -}); \ No newline at end of file +}); diff --git a/src/inputs-controller.ts b/src/inputs-controller.ts index 7de0969869d7..3d3b1382e913 100644 --- a/src/inputs-controller.ts +++ b/src/inputs-controller.ts @@ -1,6 +1,6 @@ import Phaser, {Time} from "phaser"; import * as Utils from "./utils"; -import {initTouchControls} from './touch-controls'; +import {initTouchControls} from "./touch-controls"; import pad_generic from "./configs/pad_generic"; import pad_unlicensedSNES from "./configs/pad_unlicensedSNES"; import pad_xbox360 from "./configs/pad_xbox360"; @@ -46,19 +46,19 @@ const repeatInputDelayMillis = 250; * providing a unified interface for all input-related interactions. */ export class InputsController { - private buttonKeys: Phaser.Input.Keyboard.Key[][]; - private gamepads: Array = new Array(); - private scene: Phaser.Scene; + private buttonKeys: Phaser.Input.Keyboard.Key[][]; + private gamepads: Array = new Array(); + private scene: Phaser.Scene; - private buttonLock: Button; - private buttonLock2: Button; - private interactions: Map> = new Map(); - private time: Time; - private player: Map = new Map(); + private buttonLock: Button; + private buttonLock2: Button; + private interactions: Map> = new Map(); + private time: Time; + private player: Map = new Map(); - private gamepadSupport: boolean = true; + private gamepadSupport: boolean = true; - /** + /** * Initializes a new instance of the game control system, setting up initial state and configurations. * * @param scene - The Phaser scene associated with this instance. @@ -69,25 +69,25 @@ export class InputsController { * Specific buttons like MENU and STATS are set not to repeat their actions. * It concludes by calling the `init` method to complete the setup. */ - constructor(scene: Phaser.Scene) { - this.scene = scene; - this.time = this.scene.time; - this.buttonKeys = []; - - for (const b of Utils.getEnumValues(Button)) { - this.interactions[b] = { - pressTime: false, - isPressed: false, - source: null, - } - } - // We don't want the menu key to be repeated - delete this.interactions[Button.MENU]; - delete this.interactions[Button.STATS]; - this.init(); + constructor(scene: Phaser.Scene) { + this.scene = scene; + this.time = this.scene.time; + this.buttonKeys = []; + + for (const b of Utils.getEnumValues(Button)) { + this.interactions[b] = { + pressTime: false, + isPressed: false, + source: null, + }; } + // We don't want the menu key to be repeated + delete this.interactions[Button.MENU]; + delete this.interactions[Button.STATS]; + this.init(); + } - /** + /** * Sets up event handlers and initializes gamepad and keyboard controls. * * @remarks @@ -95,46 +95,46 @@ export class InputsController { * It handles gamepad connections/disconnections and button press events, and ensures keyboard controls are set up. * Additionally, it manages the game's behavior when it loses focus to prevent unwanted game actions during this state. */ - init(): void { - this.events = new Phaser.Events.EventEmitter(); - this.scene.game.events.on(Phaser.Core.Events.BLUR, () => { - this.loseFocus() - }) - - if (typeof this.scene.input.gamepad !== 'undefined') { - this.scene.input.gamepad.on('connected', function (thisGamepad) { - this.refreshGamepads(); - this.setupGamepad(thisGamepad); - }, this); - - // Check to see if the gamepad has already been setup by the browser - this.scene.input.gamepad.refreshPads(); - if (this.scene.input.gamepad.total) { - this.refreshGamepads(); - for (const thisGamepad of this.gamepads) { - this.scene.input.gamepad.emit('connected', thisGamepad); - } - } - - this.scene.input.gamepad.on('down', this.gamepadButtonDown, this); - this.scene.input.gamepad.on('up', this.gamepadButtonUp, this); + init(): void { + this.events = new Phaser.Events.EventEmitter(); + this.scene.game.events.on(Phaser.Core.Events.BLUR, () => { + this.loseFocus(); + }); + + if (typeof this.scene.input.gamepad !== "undefined") { + this.scene.input.gamepad.on("connected", function (thisGamepad) { + this.refreshGamepads(); + this.setupGamepad(thisGamepad); + }, this); + + // Check to see if the gamepad has already been setup by the browser + this.scene.input.gamepad.refreshPads(); + if (this.scene.input.gamepad.total) { + this.refreshGamepads(); + for (const thisGamepad of this.gamepads) { + this.scene.input.gamepad.emit("connected", thisGamepad); } + } - // Keyboard - this.setupKeyboardControls(); + this.scene.input.gamepad.on("down", this.gamepadButtonDown, this); + this.scene.input.gamepad.on("up", this.gamepadButtonUp, this); } - /** + // Keyboard + this.setupKeyboardControls(); + } + + /** * Handles actions to take when the game loses focus, such as deactivating pressed keys. * * @remarks * This method is triggered when the game or the browser tab loses focus. It ensures that any keys pressed are deactivated to prevent stuck keys affecting gameplay when the game is not active. */ - loseFocus(): void { - this.deactivatePressedKey(); - } + loseFocus(): void { + this.deactivatePressedKey(); + } - /** + /** * Enables or disables support for gamepad input. * * @param value - A boolean indicating whether gamepad support should be enabled (true) or disabled (false). @@ -142,17 +142,17 @@ export class InputsController { * @remarks * This method toggles gamepad support. If disabled, it also ensures that all currently pressed gamepad buttons are deactivated to avoid stuck inputs. */ - setGamepadSupport(value: boolean): void { - if (value) { - this.gamepadSupport = true; - } else { - this.gamepadSupport = false; - // if we disable the gamepad, we want to release every key pressed - this.deactivatePressedKey(); - } + setGamepadSupport(value: boolean): void { + if (value) { + this.gamepadSupport = true; + } else { + this.gamepadSupport = false; + // if we disable the gamepad, we want to release every key pressed + this.deactivatePressedKey(); } + } - /** + /** * Updates the interaction handling by processing input states. * This method gives priority to certain buttons by reversing the order in which they are checked. * @@ -165,30 +165,30 @@ export class InputsController { * Special handling is applied if gamepad support is disabled but a gamepad source is still triggering inputs, * preventing potential infinite loops by removing the last processed movement time for the button. */ - update(): void { - for (const b of Utils.getEnumValues(Button).reverse()) { - if ( - this.interactions.hasOwnProperty(b) && + update(): void { + for (const b of Utils.getEnumValues(Button).reverse()) { + if ( + this.interactions.hasOwnProperty(b) && this.repeatInputDurationJustPassed(b) && this.interactions[b].isPressed - ) { - // Prevents repeating button interactions when gamepad support is disabled. - if (!this.gamepadSupport && this.interactions[b].source === 'gamepad') { - // Deletes the last interaction for a button if gamepad is disabled. - this.delLastProcessedMovementTime(b); - return; - } - // Emits an event for the button press. - this.events.emit('input_down', { - controller_type: this.interactions[b].source, - button: b, - }); - this.setLastProcessedMovementTime(b, this.interactions[b].source); - } + ) { + // Prevents repeating button interactions when gamepad support is disabled. + if (!this.gamepadSupport && this.interactions[b].source === "gamepad") { + // Deletes the last interaction for a button if gamepad is disabled. + this.delLastProcessedMovementTime(b); + return; } + // Emits an event for the button press. + this.events.emit("input_down", { + controller_type: this.interactions[b].source, + button: b, + }); + this.setLastProcessedMovementTime(b, this.interactions[b].source); + } } + } - /** + /** * Configures a gamepad for use based on its device ID. * * @param thisGamepad - The gamepad to set up. @@ -198,13 +198,13 @@ export class InputsController { * It updates the player's gamepad mapping based on the identified configuration, ensuring * that the gamepad controls are correctly mapped to in-game actions. */ - setupGamepad(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { - let gamepadID = thisGamepad.id.toLowerCase(); - const mappedPad = this.mapGamepad(gamepadID); - this.player['mapping'] = mappedPad.gamepadMapping; - } + setupGamepad(thisGamepad: Phaser.Input.Gamepad.Gamepad): void { + const gamepadID = thisGamepad.id.toLowerCase(); + const mappedPad = this.mapGamepad(gamepadID); + this.player["mapping"] = mappedPad.gamepadMapping; + } - /** + /** * Refreshes and re-indexes the list of connected gamepads. * * @remarks @@ -212,18 +212,18 @@ export class InputsController { * It corrects the index of each gamepad to account for any previously undefined entries, * ensuring that all gamepads are properly indexed and can be accurately referenced within the game. */ - refreshGamepads(): void { - // Sometimes, gamepads are undefined. For some reason. - this.gamepads = this.scene.input.gamepad.gamepads.filter(function (el) { - return el != null; - }); - - for (const [index, thisGamepad] of this.gamepads.entries()) { - thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier - } + refreshGamepads(): void { + // Sometimes, gamepads are undefined. For some reason. + this.gamepads = this.scene.input.gamepad.gamepads.filter(function (el) { + return el !== null; + }); + + for (const [index, thisGamepad] of this.gamepads.entries()) { + thisGamepad.index = index; // Overwrite the gamepad index, in case we had undefined gamepads earlier } + } - /** + /** * Retrieves the current gamepad mapping for in-game actions. * * @returns An object mapping gamepad buttons to in-game actions based on the player's current gamepad configuration. @@ -234,31 +234,33 @@ export class InputsController { * The mapping includes directional controls, action buttons, and system commands among others, * adjusted for any custom settings such as swapped action buttons. */ - getActionGamepadMapping(): ActionGamepadMapping { - const gamepadMapping = {}; - if (!this.player?.mapping) return gamepadMapping; - gamepadMapping[this.player.mapping.LC_N] = Button.UP; - gamepadMapping[this.player.mapping.LC_S] = Button.DOWN; - gamepadMapping[this.player.mapping.LC_W] = Button.LEFT; - gamepadMapping[this.player.mapping.LC_E] = Button.RIGHT; - gamepadMapping[this.player.mapping.TOUCH] = Button.SUBMIT; - gamepadMapping[this.player.mapping.RC_S] = this.scene.abSwapped ? Button.CANCEL : Button.ACTION; - gamepadMapping[this.player.mapping.RC_E] = this.scene.abSwapped ? Button.ACTION : Button.CANCEL; - gamepadMapping[this.player.mapping.SELECT] = Button.STATS; - gamepadMapping[this.player.mapping.START] = Button.MENU; - gamepadMapping[this.player.mapping.RB] = Button.CYCLE_SHINY; - gamepadMapping[this.player.mapping.LB] = Button.CYCLE_FORM; - gamepadMapping[this.player.mapping.LT] = Button.CYCLE_GENDER; - gamepadMapping[this.player.mapping.RT] = Button.CYCLE_ABILITY; - gamepadMapping[this.player.mapping.RC_W] = Button.CYCLE_NATURE; - gamepadMapping[this.player.mapping.RC_N] = Button.CYCLE_VARIANT; - gamepadMapping[this.player.mapping.LS] = Button.SPEED_UP; - gamepadMapping[this.player.mapping.RS] = Button.SLOW_DOWN; - - return gamepadMapping; + getActionGamepadMapping(): ActionGamepadMapping { + const gamepadMapping = {}; + if (!this.player?.mapping) { + return gamepadMapping; } - - /** + gamepadMapping[this.player.mapping.LC_N] = Button.UP; + gamepadMapping[this.player.mapping.LC_S] = Button.DOWN; + gamepadMapping[this.player.mapping.LC_W] = Button.LEFT; + gamepadMapping[this.player.mapping.LC_E] = Button.RIGHT; + gamepadMapping[this.player.mapping.TOUCH] = Button.SUBMIT; + gamepadMapping[this.player.mapping.RC_S] = this.scene.abSwapped ? Button.CANCEL : Button.ACTION; + gamepadMapping[this.player.mapping.RC_E] = this.scene.abSwapped ? Button.ACTION : Button.CANCEL; + gamepadMapping[this.player.mapping.SELECT] = Button.STATS; + gamepadMapping[this.player.mapping.START] = Button.MENU; + gamepadMapping[this.player.mapping.RB] = Button.CYCLE_SHINY; + gamepadMapping[this.player.mapping.LB] = Button.CYCLE_FORM; + gamepadMapping[this.player.mapping.LT] = Button.CYCLE_GENDER; + gamepadMapping[this.player.mapping.RT] = Button.CYCLE_ABILITY; + gamepadMapping[this.player.mapping.RC_W] = Button.CYCLE_NATURE; + gamepadMapping[this.player.mapping.RC_N] = Button.CYCLE_VARIANT; + gamepadMapping[this.player.mapping.LS] = Button.SPEED_UP; + gamepadMapping[this.player.mapping.RS] = Button.SLOW_DOWN; + + return gamepadMapping; + } + + /** * Handles the 'down' event for gamepad buttons, emitting appropriate events and updating the interaction state. * * @param pad - The gamepad on which the button press occurred. @@ -271,20 +273,22 @@ export class InputsController { * - Checks if the pressed button is mapped to a game action. * - If mapped, emits an 'input_down' event with the controller type and button action, and updates the interaction of this button. */ - gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { - if (!this.gamepadSupport) return; - const actionMapping = this.getActionGamepadMapping(); - const buttonDown = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index]; - if (buttonDown !== undefined) { - this.events.emit('input_down', { - controller_type: 'gamepad', - button: buttonDown, - }); - this.setLastProcessedMovementTime(buttonDown, 'gamepad'); - } + gamepadButtonDown(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + if (!this.gamepadSupport) { + return; } + const actionMapping = this.getActionGamepadMapping(); + const buttonDown = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index]; + if (buttonDown !== undefined) { + this.events.emit("input_down", { + controller_type: "gamepad", + button: buttonDown, + }); + this.setLastProcessedMovementTime(buttonDown, "gamepad"); + } + } - /** + /** * Handles the 'up' event for gamepad buttons, emitting appropriate events and clearing the interaction state. * * @param pad - The gamepad on which the button release occurred. @@ -297,20 +301,22 @@ export class InputsController { * - Checks if the released button is mapped to a game action. * - If mapped, emits an 'input_up' event with the controller type and button action, and clears the interaction for this button. */ - gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { - if (!this.gamepadSupport) return; - const actionMapping = this.getActionGamepadMapping(); - const buttonUp = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index]; - if (buttonUp !== undefined) { - this.events.emit('input_up', { - controller_type: 'gamepad', - button: buttonUp, - }); - this.delLastProcessedMovementTime(buttonUp); - } + gamepadButtonUp(pad: Phaser.Input.Gamepad.Gamepad, button: Phaser.Input.Gamepad.Button, value: number): void { + if (!this.gamepadSupport) { + return; + } + const actionMapping = this.getActionGamepadMapping(); + const buttonUp = actionMapping.hasOwnProperty(button.index) && actionMapping[button.index]; + if (buttonUp !== undefined) { + this.events.emit("input_up", { + controller_type: "gamepad", + button: buttonUp, + }); + this.delLastProcessedMovementTime(buttonUp); } + } - /** + /** * Configures keyboard controls for the game, mapping physical keys to game actions. * * @remarks @@ -328,43 +334,44 @@ export class InputsController { * Post-setup, it initializes touch controls (if applicable) and starts listening for keyboard inputs using * `listenInputKeyboard`, ensuring that all configured keys are actively monitored for player interactions. */ - setupKeyboardControls(): void { - const keyCodes = Phaser.Input.Keyboard.KeyCodes; - const keyConfig = { - [Button.UP]: [keyCodes.UP, keyCodes.W], - [Button.DOWN]: [keyCodes.DOWN, keyCodes.S], - [Button.LEFT]: [keyCodes.LEFT, keyCodes.A], - [Button.RIGHT]: [keyCodes.RIGHT, keyCodes.D], - [Button.SUBMIT]: [keyCodes.ENTER], - [Button.ACTION]: [keyCodes.SPACE, keyCodes.Z], - [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], - [Button.MENU]: [keyCodes.ESC, keyCodes.M], - [Button.STATS]: [keyCodes.SHIFT, keyCodes.C], - [Button.CYCLE_SHINY]: [keyCodes.R], - [Button.CYCLE_FORM]: [keyCodes.F], - [Button.CYCLE_GENDER]: [keyCodes.G], - [Button.CYCLE_ABILITY]: [keyCodes.E], - [Button.CYCLE_NATURE]: [keyCodes.N], - [Button.CYCLE_VARIANT]: [keyCodes.V], - [Button.SPEED_UP]: [keyCodes.PLUS], - [Button.SLOW_DOWN]: [keyCodes.MINUS] - }; - const mobileKeyConfig = {}; - for (const b of Utils.getEnumValues(Button)) { - const keys: Phaser.Input.Keyboard.Key[] = []; - if (keyConfig.hasOwnProperty(b)) { - for (let k of keyConfig[b]) - keys.push(this.scene.input.keyboard.addKey(k, false)); - mobileKeyConfig[Button[b]] = keys[0]; - } - this.buttonKeys[b] = keys; + setupKeyboardControls(): void { + const keyCodes = Phaser.Input.Keyboard.KeyCodes; + const keyConfig = { + [Button.UP]: [keyCodes.UP, keyCodes.W], + [Button.DOWN]: [keyCodes.DOWN, keyCodes.S], + [Button.LEFT]: [keyCodes.LEFT, keyCodes.A], + [Button.RIGHT]: [keyCodes.RIGHT, keyCodes.D], + [Button.SUBMIT]: [keyCodes.ENTER], + [Button.ACTION]: [keyCodes.SPACE, keyCodes.Z], + [Button.CANCEL]: [keyCodes.BACKSPACE, keyCodes.X], + [Button.MENU]: [keyCodes.ESC, keyCodes.M], + [Button.STATS]: [keyCodes.SHIFT, keyCodes.C], + [Button.CYCLE_SHINY]: [keyCodes.R], + [Button.CYCLE_FORM]: [keyCodes.F], + [Button.CYCLE_GENDER]: [keyCodes.G], + [Button.CYCLE_ABILITY]: [keyCodes.E], + [Button.CYCLE_NATURE]: [keyCodes.N], + [Button.CYCLE_VARIANT]: [keyCodes.V], + [Button.SPEED_UP]: [keyCodes.PLUS], + [Button.SLOW_DOWN]: [keyCodes.MINUS] + }; + const mobileKeyConfig = {}; + for (const b of Utils.getEnumValues(Button)) { + const keys: Phaser.Input.Keyboard.Key[] = []; + if (keyConfig.hasOwnProperty(b)) { + for (const k of keyConfig[b]) { + keys.push(this.scene.input.keyboard.addKey(k, false)); } - - initTouchControls(mobileKeyConfig); - this.listenInputKeyboard(); + mobileKeyConfig[Button[b]] = keys[0]; + } + this.buttonKeys[b] = keys; } - /** + initTouchControls(mobileKeyConfig); + this.listenInputKeyboard(); + } + + /** * Sets up event listeners for keyboard inputs on all registered keys. * * @remarks @@ -382,28 +389,28 @@ export class InputsController { * This setup ensures that each key on the keyboard is monitored for press and release events, * and that these events are properly communicated within the system. */ - listenInputKeyboard(): void { - this.buttonKeys.forEach((row, index) => { - for (const key of row) { - key.on('down', () => { - this.events.emit('input_down', { - controller_type: 'keyboard', - button: index, - }); - this.setLastProcessedMovementTime(index, 'keyboard'); - }); - key.on('up', () => { - this.events.emit('input_up', { - controller_type: 'keyboard', - button: index, - }); - this.delLastProcessedMovementTime(index); - }); - } + listenInputKeyboard(): void { + this.buttonKeys.forEach((row, index) => { + for (const key of row) { + key.on("down", () => { + this.events.emit("input_down", { + controller_type: "keyboard", + button: index, + }); + this.setLastProcessedMovementTime(index, "keyboard"); }); - } + key.on("up", () => { + this.events.emit("input_up", { + controller_type: "keyboard", + button: index, + }); + this.delLastProcessedMovementTime(index); + }); + } + }); + } - /** + /** * Maps a gamepad ID to a specific gamepad configuration based on the ID's characteristics. * * @param id - The gamepad ID string, typically representing a unique identifier for a gamepad model or make. @@ -416,33 +423,35 @@ export class InputsController { * - If the ID contains '054c', it is identified as a DualShock gamepad. * If no specific identifiers are recognized, a generic gamepad configuration is returned. */ - mapGamepad(id: string): GamepadConfig { - id = id.toLowerCase(); - - if (id.includes('081f') && id.includes('e401')) { - return pad_unlicensedSNES; - } else if (id.includes('xbox') && id.includes('360')) { - return pad_xbox360; - } else if (id.includes('054c')) { - return pad_dualshock; - } - - return pad_generic; + mapGamepad(id: string): GamepadConfig { + id = id.toLowerCase(); + + if (id.includes("081f") && id.includes("e401")) { + return pad_unlicensedSNES; + } else if (id.includes("xbox") && id.includes("360")) { + return pad_xbox360; + } else if (id.includes("054c")) { + return pad_dualshock; } - /** + return pad_generic; + } + + /** * repeatInputDurationJustPassed returns true if @param button has been held down long * enough to fire a repeated input. A button must claim the buttonLock before * firing a repeated input - this is to prevent multiple buttons from firing repeatedly. */ - repeatInputDurationJustPassed(button: Button): boolean { - if (!this.isButtonLocked(button)) return false; - if (this.time.now - this.interactions[button].pressTime >= repeatInputDelayMillis) { - return true; - } + repeatInputDurationJustPassed(button: Button): boolean { + if (!this.isButtonLocked(button)) { + return false; + } + if (this.time.now - this.interactions[button].pressTime >= repeatInputDelayMillis) { + return true; } + } - /** + /** * This method updates the interaction state to reflect that the button is pressed. * * @param button - The button for which to set the interaction. @@ -457,15 +466,17 @@ export class InputsController { * * Additionally, this method locks the button (by calling `setButtonLock`) to prevent it from being re-processed until it is released, ensuring that each press is handled distinctly. */ - setLastProcessedMovementTime(button: Button, source: String = 'keyboard'): void { - if (!this.interactions.hasOwnProperty(button)) return; - this.setButtonLock(button); - this.interactions[button].pressTime = this.time.now; - this.interactions[button].isPressed = true; - this.interactions[button].source = source; + setLastProcessedMovementTime(button: Button, source: String = "keyboard"): void { + if (!this.interactions.hasOwnProperty(button)) { + return; } + this.setButtonLock(button); + this.interactions[button].pressTime = this.time.now; + this.interactions[button].isPressed = true; + this.interactions[button].source = source; + } - /** + /** * Clears the last interaction for a specified button. * * @param button - The button for which to clear the interaction. @@ -479,15 +490,17 @@ export class InputsController { * * It releases the button lock, which prevents the button from being processed repeatedly until it's explicitly released. */ - delLastProcessedMovementTime(button: Button): void { - if (!this.interactions.hasOwnProperty(button)) return; - this.releaseButtonLock(button); - this.interactions[button].pressTime = null; - this.interactions[button].isPressed = false; - this.interactions[button].source = null; + delLastProcessedMovementTime(button: Button): void { + if (!this.interactions.hasOwnProperty(button)) { + return; } + this.releaseButtonLock(button); + this.interactions[button].pressTime = null; + this.interactions[button].isPressed = false; + this.interactions[button].source = null; + } - /** + /** * Deactivates all currently pressed keys and resets their interaction states. * * @remarks @@ -505,19 +518,19 @@ export class InputsController { * * This method is typically called when needing to ensure that all inputs are neutralized. */ - deactivatePressedKey(): void { - this.releaseButtonLock(this.buttonLock); - this.releaseButtonLock(this.buttonLock2); - for (const b of Utils.getEnumValues(Button)) { - if (this.interactions.hasOwnProperty(b)) { - this.interactions[b].pressTime = null; - this.interactions[b].isPressed = false; - this.interactions[b].source = null; - } - } + deactivatePressedKey(): void { + this.releaseButtonLock(this.buttonLock); + this.releaseButtonLock(this.buttonLock2); + for (const b of Utils.getEnumValues(Button)) { + if (this.interactions.hasOwnProperty(b)) { + this.interactions[b].pressTime = null; + this.interactions[b].isPressed = false; + this.interactions[b].source = null; + } } + } - /** + /** * Checks if a specific button is currently locked. * * @param button - The button to check for a lock status. @@ -527,11 +540,11 @@ export class InputsController { * This method is used to determine if a given button is currently prevented from being processed due to a lock. * It checks against two separate lock variables, allowing for up to two buttons to be locked simultaneously. */ - isButtonLocked(button: Button): boolean { - return (this.buttonLock === button || this.buttonLock2 === button); - } + isButtonLocked(button: Button): boolean { + return (this.buttonLock === button || this.buttonLock2 === button); + } - /** + /** * Sets a lock on a given button if it is not already locked. * * @param button - The button to lock. @@ -542,15 +555,22 @@ export class InputsController { * If not, it locks the button using the first available lock variable. * This mechanism allows for up to two buttons to be locked at the same time. */ - setButtonLock(button: Button): void { - if (this.buttonLock === button || this.buttonLock2 === button) return; - if (this.buttonLock === button) this.buttonLock2 = button; - else if (this.buttonLock2 === button) this.buttonLock = button; - else if (!!this.buttonLock) this.buttonLock2 = button; - else this.buttonLock = button; + setButtonLock(button: Button): void { + if (this.buttonLock === button || this.buttonLock2 === button) { + return; + } + if (this.buttonLock === button) { + this.buttonLock2 = button; + } else if (this.buttonLock2 === button) { + this.buttonLock = button; + } else if (!!this.buttonLock) { + this.buttonLock2 = button; + } else { + this.buttonLock = button; } + } - /** + /** * Releases a lock on a specific button, allowing it to be processed again. * * @param button - The button whose lock is to be released. @@ -560,8 +580,11 @@ export class InputsController { * If either lock matches the specified button, that lock is cleared. * This action frees the button to be processed again, ensuring it can respond to new inputs. */ - releaseButtonLock(button: Button): void { - if (this.buttonLock === button) this.buttonLock = null; - else if (this.buttonLock2 === button) this.buttonLock2 = null; + releaseButtonLock(button: Button): void { + if (this.buttonLock === button) { + this.buttonLock = null; + } else if (this.buttonLock2 === button) { + this.buttonLock2 = null; } -} \ No newline at end of file + } +} diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 56d0ab47f13f..3bbae27ffc1c 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -12,268 +12,276 @@ import { initI18n } from "./plugins/i18n"; export class LoadingScene extends SceneBase { constructor() { - super('loading'); + super("loading"); - Phaser.Plugins.PluginCache.register('Loader', CacheBustedLoaderPlugin, 'load'); + Phaser.Plugins.PluginCache.register("Loader", CacheBustedLoaderPlugin, "load"); initI18n(); } preload() { - this.load['manifest'] = this.game['manifest']; + this.load["manifest"] = this.game["manifest"]; - if (!isMobile()) - this.load.video('intro_dark', 'images/intro_dark.mp4', true); + if (!isMobile()) { + this.load.video("intro_dark", "images/intro_dark.mp4", true); + } - this.loadImage('loading_bg', 'arenas'); - this.loadImage('logo', ''); + this.loadImage("loading_bg", "arenas"); + this.loadImage("logo", ""); // Load menu images - this.loadAtlas('bg', 'ui'); - this.loadImage('command_fight_labels', 'ui'); - this.loadAtlas('prompt', 'ui'); - this.loadImage('candy', 'ui'); - this.loadImage('candy_overlay', 'ui'); - this.loadImage('cursor', 'ui'); - this.loadImage('cursor_reverse', 'ui'); - for (let wv of Utils.getEnumValues(WindowVariant)) { - for (let w = 1; w <= 5; w++) - this.loadImage(`window_${w}${getWindowVariantSuffix(wv)}`, 'ui/windows'); + this.loadAtlas("bg", "ui"); + this.loadImage("command_fight_labels", "ui"); + this.loadAtlas("prompt", "ui"); + this.loadImage("candy", "ui"); + this.loadImage("candy_overlay", "ui"); + this.loadImage("cursor", "ui"); + this.loadImage("cursor_reverse", "ui"); + for (const wv of Utils.getEnumValues(WindowVariant)) { + for (let w = 1; w <= 5; w++) { + this.loadImage(`window_${w}${getWindowVariantSuffix(wv)}`, "ui/windows"); + } } - this.loadAtlas('namebox', 'ui'); - this.loadImage('pbinfo_player', 'ui'); - this.loadImage('pbinfo_player_stats', 'ui'); - this.loadImage('pbinfo_player_mini', 'ui'); - this.loadImage('pbinfo_player_mini_stats', 'ui'); - this.loadAtlas('pbinfo_player_type', 'ui'); - this.loadAtlas('pbinfo_player_type1', 'ui'); - this.loadAtlas('pbinfo_player_type2', 'ui'); - this.loadImage('pbinfo_enemy_mini', 'ui'); - this.loadImage('pbinfo_enemy_mini_stats', 'ui'); - this.loadImage('pbinfo_enemy_boss', 'ui'); - this.loadImage('pbinfo_enemy_boss_stats', 'ui'); - this.loadAtlas('pbinfo_enemy_type', 'ui'); - this.loadAtlas('pbinfo_enemy_type1', 'ui'); - this.loadAtlas('pbinfo_enemy_type2', 'ui'); - this.loadAtlas('pbinfo_stat', 'ui'); - this.loadAtlas('pbinfo_stat_numbers', 'ui'); - this.loadImage('overlay_lv', 'ui'); - this.loadAtlas('numbers', 'ui'); - this.loadAtlas('numbers_red', 'ui'); - this.loadAtlas('overlay_hp', 'ui'); - this.loadAtlas('overlay_hp_boss', 'ui'); - this.loadImage('overlay_exp', 'ui'); - this.loadImage('icon_owned', 'ui'); - this.loadImage('ability_bar_left', 'ui'); - this.loadImage('party_exp_bar', 'ui'); - this.loadImage('achv_bar', 'ui'); - this.loadImage('achv_bar_2', 'ui'); - this.loadImage('achv_bar_3', 'ui'); - this.loadImage('achv_bar_4', 'ui'); - this.loadImage('achv_bar_5', 'ui'); - this.loadImage('shiny_star', 'ui', 'shiny.png'); - this.loadImage('shiny_star_1', 'ui', 'shiny_1.png'); - this.loadImage('shiny_star_2', 'ui', 'shiny_2.png'); - this.loadImage('shiny_star_small', 'ui', 'shiny_small.png'); - this.loadImage('shiny_star_small_1', 'ui', 'shiny_small_1.png'); - this.loadImage('shiny_star_small_2', 'ui', 'shiny_small_2.png'); - this.loadImage('ha_capsule', 'ui', 'ha_capsule.png'); - this.loadImage('champion_ribbon', 'ui', 'champion_ribbon.png'); - this.loadImage('icon_spliced', 'ui'); - this.loadImage('icon_tera', 'ui'); - this.loadImage('type_tera', 'ui'); - this.loadAtlas('type_bgs', 'ui'); - - this.loadImage('pb_tray_overlay_player', 'ui'); - this.loadImage('pb_tray_overlay_enemy', 'ui'); - this.loadAtlas('pb_tray_ball', 'ui'); - - this.loadImage('party_bg', 'ui'); - this.loadImage('party_bg_double', 'ui'); - this.loadAtlas('party_slot_main', 'ui'); - this.loadAtlas('party_slot', 'ui'); - this.loadImage('party_slot_overlay_lv', 'ui'); - this.loadImage('party_slot_hp_bar', 'ui'); - this.loadAtlas('party_slot_hp_overlay', 'ui'); - this.loadAtlas('party_pb', 'ui'); - this.loadAtlas('party_cancel', 'ui'); - - this.loadImage('summary_bg', 'ui'); - this.loadImage('summary_overlay_shiny', 'ui'); - this.loadImage('summary_profile', 'ui'); - this.loadImage('summary_profile_prompt_z', 'ui') // The pixel Z button prompt - this.loadImage('summary_profile_prompt_a', 'ui'); // The pixel A button prompt - this.loadImage('summary_profile_ability', 'ui'); // Pixel text 'ABILITY' - this.loadImage('summary_profile_passive', 'ui'); // Pixel text 'PASSIVE' - this.loadImage('summary_status', 'ui'); - this.loadImage('summary_stats', 'ui'); - this.loadImage('summary_stats_overlay_exp', 'ui'); - this.loadImage('summary_moves', 'ui'); - this.loadImage('summary_moves_effect', 'ui'); - this.loadImage('summary_moves_overlay_row', 'ui'); - this.loadImage('summary_moves_overlay_pp', 'ui'); - this.loadAtlas('summary_moves_cursor', 'ui'); - for (let t = 1; t <= 3; t++) - this.loadImage(`summary_tabs_${t}`, 'ui'); - - this.loadImage('starter_select_bg', 'ui'); - this.loadImage('select_cursor', 'ui'); - this.loadImage('select_cursor_highlight', 'ui'); - this.loadImage('select_cursor_highlight_thick', 'ui'); - this.loadImage('select_cursor_pokerus', 'ui'); - this.loadImage('select_gen_cursor', 'ui'); - this.loadImage('select_gen_cursor_highlight', 'ui'); - - this.loadImage('saving_icon', 'ui'); - - this.loadImage('default_bg', 'arenas'); + this.loadAtlas("namebox", "ui"); + this.loadImage("pbinfo_player", "ui"); + this.loadImage("pbinfo_player_stats", "ui"); + this.loadImage("pbinfo_player_mini", "ui"); + this.loadImage("pbinfo_player_mini_stats", "ui"); + this.loadAtlas("pbinfo_player_type", "ui"); + this.loadAtlas("pbinfo_player_type1", "ui"); + this.loadAtlas("pbinfo_player_type2", "ui"); + this.loadImage("pbinfo_enemy_mini", "ui"); + this.loadImage("pbinfo_enemy_mini_stats", "ui"); + this.loadImage("pbinfo_enemy_boss", "ui"); + this.loadImage("pbinfo_enemy_boss_stats", "ui"); + this.loadAtlas("pbinfo_enemy_type", "ui"); + this.loadAtlas("pbinfo_enemy_type1", "ui"); + this.loadAtlas("pbinfo_enemy_type2", "ui"); + this.loadAtlas("pbinfo_stat", "ui"); + this.loadAtlas("pbinfo_stat_numbers", "ui"); + this.loadImage("overlay_lv", "ui"); + this.loadAtlas("numbers", "ui"); + this.loadAtlas("numbers_red", "ui"); + this.loadAtlas("overlay_hp", "ui"); + this.loadAtlas("overlay_hp_boss", "ui"); + this.loadImage("overlay_exp", "ui"); + this.loadImage("icon_owned", "ui"); + this.loadImage("ability_bar_left", "ui"); + this.loadImage("party_exp_bar", "ui"); + this.loadImage("achv_bar", "ui"); + this.loadImage("achv_bar_2", "ui"); + this.loadImage("achv_bar_3", "ui"); + this.loadImage("achv_bar_4", "ui"); + this.loadImage("achv_bar_5", "ui"); + this.loadImage("shiny_star", "ui", "shiny.png"); + this.loadImage("shiny_star_1", "ui", "shiny_1.png"); + this.loadImage("shiny_star_2", "ui", "shiny_2.png"); + this.loadImage("shiny_star_small", "ui", "shiny_small.png"); + this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); + this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.loadImage("ha_capsule", "ui", "ha_capsule.png"); + this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); + this.loadImage("icon_spliced", "ui"); + this.loadImage("icon_tera", "ui"); + this.loadImage("type_tera", "ui"); + this.loadAtlas("type_bgs", "ui"); + + this.loadImage("pb_tray_overlay_player", "ui"); + this.loadImage("pb_tray_overlay_enemy", "ui"); + this.loadAtlas("pb_tray_ball", "ui"); + + this.loadImage("party_bg", "ui"); + this.loadImage("party_bg_double", "ui"); + this.loadAtlas("party_slot_main", "ui"); + this.loadAtlas("party_slot", "ui"); + this.loadImage("party_slot_overlay_lv", "ui"); + this.loadImage("party_slot_hp_bar", "ui"); + this.loadAtlas("party_slot_hp_overlay", "ui"); + this.loadAtlas("party_pb", "ui"); + this.loadAtlas("party_cancel", "ui"); + + this.loadImage("summary_bg", "ui"); + this.loadImage("summary_overlay_shiny", "ui"); + this.loadImage("summary_profile", "ui"); + this.loadImage("summary_profile_prompt_z", "ui"); // The pixel Z button prompt + this.loadImage("summary_profile_prompt_a", "ui"); // The pixel A button prompt + this.loadImage("summary_profile_ability", "ui"); // Pixel text 'ABILITY' + this.loadImage("summary_profile_passive", "ui"); // Pixel text 'PASSIVE' + this.loadImage("summary_status", "ui"); + this.loadImage("summary_stats", "ui"); + this.loadImage("summary_stats_overlay_exp", "ui"); + this.loadImage("summary_moves", "ui"); + this.loadImage("summary_moves_effect", "ui"); + this.loadImage("summary_moves_overlay_row", "ui"); + this.loadImage("summary_moves_overlay_pp", "ui"); + this.loadAtlas("summary_moves_cursor", "ui"); + for (let t = 1; t <= 3; t++) { + this.loadImage(`summary_tabs_${t}`, "ui"); + } + + this.loadImage("starter_select_bg", "ui"); + this.loadImage("select_cursor", "ui"); + this.loadImage("select_cursor_highlight", "ui"); + this.loadImage("select_cursor_highlight_thick", "ui"); + this.loadImage("select_cursor_pokerus", "ui"); + this.loadImage("select_gen_cursor", "ui"); + this.loadImage("select_gen_cursor_highlight", "ui"); + + this.loadImage("saving_icon", "ui"); + + this.loadImage("default_bg", "arenas"); // Load arena images Utils.getEnumValues(Biome).map(bt => { const btKey = Biome[bt].toLowerCase(); - const isBaseAnimated = btKey === 'end'; + const isBaseAnimated = btKey === "end"; const baseAKey = `${btKey}_a`; const baseBKey = `${btKey}_b`; - this.loadImage(`${btKey}_bg`, 'arenas'); - if (!isBaseAnimated) - this.loadImage(baseAKey, 'arenas'); - else - this.loadAtlas(baseAKey, 'arenas'); - if (!isBaseAnimated) - this.loadImage(baseBKey, 'arenas'); - else - this.loadAtlas(baseBKey, 'arenas'); + this.loadImage(`${btKey}_bg`, "arenas"); + if (!isBaseAnimated) { + this.loadImage(baseAKey, "arenas"); + } else { + this.loadAtlas(baseAKey, "arenas"); + } + if (!isBaseAnimated) { + this.loadImage(baseBKey, "arenas"); + } else { + this.loadAtlas(baseBKey, "arenas"); + } if (getBiomeHasProps(bt)) { for (let p = 1; p <= 3; p++) { - const isPropAnimated = p === 3 && [ 'power_plant', 'end' ].find(b => b === btKey); + const isPropAnimated = p === 3 && [ "power_plant", "end" ].find(b => b === btKey); const propKey = `${btKey}_b_${p}`; - if (!isPropAnimated) - this.loadImage(propKey, 'arenas'); - else - this.loadAtlas(propKey, 'arenas'); + if (!isPropAnimated) { + this.loadImage(propKey, "arenas"); + } else { + this.loadAtlas(propKey, "arenas"); + } } } }); // Load bitmap fonts - this.load.bitmapFont('item-count', 'fonts/item-count.png', 'fonts/item-count.xml'); + this.load.bitmapFont("item-count", "fonts/item-count.png", "fonts/item-count.xml"); // Load trainer images - this.loadAtlas('trainer_m_back', 'trainer'); - this.loadAtlas('trainer_m_back_pb', 'trainer'); - this.loadAtlas('trainer_f_back', 'trainer'); - this.loadAtlas('trainer_f_back_pb', 'trainer'); + this.loadAtlas("trainer_m_back", "trainer"); + this.loadAtlas("trainer_m_back_pb", "trainer"); + this.loadAtlas("trainer_f_back", "trainer"); + this.loadAtlas("trainer_f_back_pb", "trainer"); Utils.getEnumValues(TrainerType).map(tt => { const config = trainerConfigs[tt]; - this.loadAtlas(config.getSpriteKey(), 'trainer'); - if (config.doubleOnly || config.hasDouble) - this.loadAtlas(config.getSpriteKey(true), 'trainer'); + this.loadAtlas(config.getSpriteKey(), "trainer"); + if (config.doubleOnly || config.hasDouble) { + this.loadAtlas(config.getSpriteKey(true), "trainer"); + } }); // Load character sprites - this.loadAtlas('c_rival_m', 'character', 'rival_m'); - this.loadAtlas('c_rival_f', 'character', 'rival_f'); + this.loadAtlas("c_rival_m", "character", "rival_m"); + this.loadAtlas("c_rival_f", "character", "rival_f"); // Load pokemon-related images - this.loadImage(`pkmn__back__sub`, 'pokemon/back', 'sub.png'); - this.loadImage(`pkmn__sub`, 'pokemon', 'sub.png'); - this.loadAtlas('battle_stats', 'effects'); - this.loadAtlas('shiny', 'effects'); - this.loadAtlas('shiny_2', 'effects'); - this.loadAtlas('shiny_3', 'effects'); - this.loadImage('tera', 'effects'); - this.loadAtlas('pb_particles', 'effects'); - this.loadImage('evo_sparkle', 'effects'); - this.loadAtlas('tera_sparkle', 'effects'); - this.load.video('evo_bg', 'images/effects/evo_bg.mp4', true); - - this.loadAtlas('pb', ''); - this.loadAtlas('items', ''); - this.loadAtlas('types', ''); - this.loadAtlas('statuses', ''); - this.loadAtlas('categories', ''); + this.loadImage("pkmn__back__sub", "pokemon/back", "sub.png"); + this.loadImage("pkmn__sub", "pokemon", "sub.png"); + this.loadAtlas("battle_stats", "effects"); + this.loadAtlas("shiny", "effects"); + this.loadAtlas("shiny_2", "effects"); + this.loadAtlas("shiny_3", "effects"); + this.loadImage("tera", "effects"); + this.loadAtlas("pb_particles", "effects"); + this.loadImage("evo_sparkle", "effects"); + this.loadAtlas("tera_sparkle", "effects"); + this.load.video("evo_bg", "images/effects/evo_bg.mp4", true); + + this.loadAtlas("pb", ""); + this.loadAtlas("items", ""); + this.loadAtlas("types", ""); + this.loadAtlas("statuses", ""); + this.loadAtlas("categories", ""); - this.loadAtlas('egg', 'egg'); - this.loadAtlas('egg_crack', 'egg'); - this.loadAtlas('egg_icons', 'egg'); - this.loadAtlas('egg_shard', 'egg'); - this.loadAtlas('egg_lightrays', 'egg'); + this.loadAtlas("egg", "egg"); + this.loadAtlas("egg_crack", "egg"); + this.loadAtlas("egg_icons", "egg"); + this.loadAtlas("egg_shard", "egg"); + this.loadAtlas("egg_lightrays", "egg"); Utils.getEnumKeys(GachaType).forEach(gt => { const key = gt.toLowerCase(); - this.loadImage(`gacha_${key}`, 'egg'); - this.loadAtlas(`gacha_underlay_${key}`, 'egg'); + this.loadImage(`gacha_${key}`, "egg"); + this.loadAtlas(`gacha_underlay_${key}`, "egg"); }); - this.loadImage('gacha_glass', 'egg'); - this.loadImage('gacha_eggs', 'egg'); - this.loadAtlas('gacha_hatch', 'egg'); - this.loadImage('gacha_knob', 'egg'); + this.loadImage("gacha_glass", "egg"); + this.loadImage("gacha_eggs", "egg"); + this.loadAtlas("gacha_hatch", "egg"); + this.loadImage("gacha_knob", "egg"); - this.loadImage('egg_list_bg', 'ui'); + this.loadImage("egg_list_bg", "ui"); - this.loadImage('end_m', 'cg'); - this.loadImage('end_f', 'cg'); + this.loadImage("end_m", "cg"); + this.loadImage("end_f", "cg"); for (let i = 0; i < 10; i++) { - this.loadAtlas(`pokemon_icons_${i}`, ''); - if (i) - this.loadAtlas(`pokemon_icons_${i}v`, ''); + this.loadAtlas(`pokemon_icons_${i}`, ""); + if (i) { + this.loadAtlas(`pokemon_icons_${i}v`, ""); + } } - this.loadSe('select'); - this.loadSe('menu_open'); - this.loadSe('hit'); - this.loadSe('hit_strong'); - this.loadSe('hit_weak'); - this.loadSe('stat_up'); - this.loadSe('stat_down'); - this.loadSe('faint'); - this.loadSe('flee'); - this.loadSe('low_hp'); - this.loadSe('exp'); - this.loadSe('level_up'); - this.loadSe('sparkle'); - this.loadSe('restore'); - this.loadSe('shine'); - this.loadSe('shing'); - this.loadSe('charge'); - this.loadSe('beam'); - this.loadSe('upgrade'); - this.loadSe('buy'); - this.loadSe('achv'); - this.loadSe('error'); - - this.loadSe('pb_rel'); - this.loadSe('pb_throw'); - this.loadSe('pb_bounce_1'); - this.loadSe('pb_bounce_2'); - this.loadSe('pb_move'); - this.loadSe('pb_catch'); - this.loadSe('pb_lock'); - - this.loadSe('pb_tray_enter'); - this.loadSe('pb_tray_ball'); - this.loadSe('pb_tray_empty'); - - this.loadSe('egg_crack'); - this.loadSe('egg_hatch'); - this.loadSe('gacha_dial'); - this.loadSe('gacha_running'); - this.loadSe('gacha_dispense'); - - this.loadSe('PRSFX- Transform', 'battle_anims'); - - this.loadBgm('menu'); - - this.loadBgm('level_up_fanfare', 'bw/level_up_fanfare.mp3'); - this.loadBgm('item_fanfare', 'bw/item_fanfare.mp3'); - this.loadBgm('minor_fanfare', 'bw/minor_fanfare.mp3'); - this.loadBgm('heal', 'bw/heal.mp3'); - this.loadBgm('victory_trainer', 'bw/victory_trainer.mp3'); - this.loadBgm('victory_gym', 'bw/victory_gym.mp3'); - this.loadBgm('victory_champion', 'bw/victory_champion.mp3'); - this.loadBgm('evolution', 'bw/evolution.mp3'); - this.loadBgm('evolution_fanfare', 'bw/evolution_fanfare.mp3'); - - this.load.plugin('rextexteditplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js', true); + this.loadSe("select"); + this.loadSe("menu_open"); + this.loadSe("hit"); + this.loadSe("hit_strong"); + this.loadSe("hit_weak"); + this.loadSe("stat_up"); + this.loadSe("stat_down"); + this.loadSe("faint"); + this.loadSe("flee"); + this.loadSe("low_hp"); + this.loadSe("exp"); + this.loadSe("level_up"); + this.loadSe("sparkle"); + this.loadSe("restore"); + this.loadSe("shine"); + this.loadSe("shing"); + this.loadSe("charge"); + this.loadSe("beam"); + this.loadSe("upgrade"); + this.loadSe("buy"); + this.loadSe("achv"); + this.loadSe("error"); + + this.loadSe("pb_rel"); + this.loadSe("pb_throw"); + this.loadSe("pb_bounce_1"); + this.loadSe("pb_bounce_2"); + this.loadSe("pb_move"); + this.loadSe("pb_catch"); + this.loadSe("pb_lock"); + + this.loadSe("pb_tray_enter"); + this.loadSe("pb_tray_ball"); + this.loadSe("pb_tray_empty"); + + this.loadSe("egg_crack"); + this.loadSe("egg_hatch"); + this.loadSe("gacha_dial"); + this.loadSe("gacha_running"); + this.loadSe("gacha_dispense"); + + this.loadSe("PRSFX- Transform", "battle_anims"); + + this.loadBgm("menu"); + + this.loadBgm("level_up_fanfare", "bw/level_up_fanfare.mp3"); + this.loadBgm("item_fanfare", "bw/item_fanfare.mp3"); + this.loadBgm("minor_fanfare", "bw/minor_fanfare.mp3"); + this.loadBgm("heal", "bw/heal.mp3"); + this.loadBgm("victory_trainer", "bw/victory_trainer.mp3"); + this.loadBgm("victory_gym", "bw/victory_gym.mp3"); + this.loadBgm("victory_champion", "bw/victory_champion.mp3"); + this.loadBgm("evolution", "bw/evolution.mp3"); + this.loadBgm("evolution_fanfare", "bw/evolution_fanfare.mp3"); + + this.load.plugin("rextexteditplugin", "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", true); this.loadLoadingScreen(); } @@ -283,7 +291,7 @@ export class LoadingScene extends SceneBase { const loadingGraphics: any[] = []; - const bg = this.add.image(0, 0, ''); + const bg = this.add.image(0, 0, ""); bg.setOrigin(0, 0); bg.setScale(6); bg.setVisible(false); @@ -300,7 +308,7 @@ export class LoadingScene extends SceneBase { const width = this.cameras.main.width; const height = this.cameras.main.height; - const logo = this.add.image(width / 2, 240, ''); + const logo = this.add.image(width / 2, 240, ""); logo.setVisible(false); logo.setOrigin(0.5, 0.5); logo.setScale(4); @@ -308,7 +316,7 @@ export class LoadingScene extends SceneBase { const percentText = this.make.text({ x: width / 2, y: height / 2 - 24, - text: '0%', + text: "0%", style: { font: "72px emerald", color: "#ffffff", @@ -345,8 +353,9 @@ export class LoadingScene extends SceneBase { loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText); - if (!mobile) + if (!mobile) { loadingGraphics.map(g => g.setVisible(false)); + } const destroyLoadingAssets = () => { intro.destroy(); @@ -358,31 +367,33 @@ export class LoadingScene extends SceneBase { assetText.destroy(); }; - this.load.on('filecomplete', key => { + this.load.on("filecomplete", key => { switch (key) { - case 'intro_dark': - intro.load('intro_dark'); - intro.on('complete', () => { - this.tweens.add({ - targets: intro, - duration: 500, - alpha: 0, - ease: 'Sine.easeIn' - }); - loadingGraphics.map(g => g.setVisible(true)); + case "intro_dark": + intro.load("intro_dark"); + intro.on("complete", () => { + this.tweens.add({ + targets: intro, + duration: 500, + alpha: 0, + ease: "Sine.easeIn" }); - intro.play(); - break; - case 'loading_bg': - bg.setTexture('loading_bg'); - if (mobile) - bg.setVisible(true); - break; - case 'logo': - logo.setTexture('logo'); - if (mobile) - logo.setVisible(true); - break; + loadingGraphics.map(g => g.setVisible(true)); + }); + intro.play(); + break; + case "loading_bg": + bg.setTexture("loading_bg"); + if (mobile) { + bg.setVisible(true); + } + break; + case "logo": + logo.setTexture("logo"); + if (mobile) { + logo.setVisible(true); + } + break; } }); @@ -400,4 +411,4 @@ export class LoadingScene extends SceneBase { async create() { this.scene.start("battle"); } -} \ No newline at end of file +} diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index eb5022996d43..da8ef3f7ab0c 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!`, - 'badDreams': `{{pokemonName}} ist in einem Alptraum gefangen!`, + "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!", + "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", } as const; diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 5504e541be06..4a09bfc5f8fa 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "Los! {{pokemonName}}!", "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", - "trainerDefeated": `{{trainerName}}\nwurde besiegt!`, + "trainerDefeated": "{{trainerName}}\nwurde besiegt!", "pokemonCaught": "{{pokemonName}} wurde gefangen!", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Es hat keine Wirkung auf {{pokemonName}}…", "hitResultOneHitKO": "Ein K.O.-Treffer!", "attackFailed": "Es ist fehlgeschlagen!", - "attackHitsCount": `{{count}}-mal getroffen!`, + "attackHitsCount": "{{count}}-mal getroffen!", "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!", "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!", "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!", @@ -46,7 +46,7 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", "runAwaySuccess": "Du bist entkommen!", - "runAwayCannotEscape": 'Flucht gescheitert!', + "runAwayCannotEscape": "Flucht gescheitert!", "escapeVerbSwitch": "auswechseln", "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", diff --git a/src/locales/de/berry.ts b/src/locales/de/berry.ts index bba64597f6b3..37e4dd47573c 100644 --- a/src/locales/de/berry.ts +++ b/src/locales/de/berry.ts @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "Jonagobeere", effect: "Stellt 10 AP für eine Attacke wieder her, wenn deren AP auf 0 fallen" }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/command-ui-handler.ts b/src/locales/de/command-ui-handler.ts index c7842c6127ce..fcc70e5d59de 100644 --- a/src/locales/de/command-ui-handler.ts +++ b/src/locales/de/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Kampf", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Fliehen", - "actionMessage": "Was soll\n{{pokemonName}} tun?", -} as const; \ No newline at end of file + "fight": "Kampf", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Fliehen", + "actionMessage": "Was soll\n{{pokemonName}} tun?", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 3580d74876d1..450383e2fdb7 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const deConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.ts index 3950d6729ff6..1551d832bfc5 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "Du hast schon zu viele Eier!", "pull": "Pull", "pulls": "Pulls" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/fight-ui-handler.ts b/src/locales/de/fight-ui-handler.ts index 4d94d24f34f3..300272ab83fe 100644 --- a/src/locales/de/fight-ui-handler.ts +++ b/src/locales/de/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "AP", - "power": "Stärke", - "accuracy": "Genauigkeit", -} as const; \ No newline at end of file + "pp": "AP", + "power": "Stärke", + "accuracy": "Genauigkeit", +} as const; diff --git a/src/locales/de/growth.ts b/src/locales/de/growth.ts index 28dcf8de4bb3..dbd0e119e5f8 100644 --- a/src/locales/de/growth.ts +++ b/src/locales/de/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Unregelmäßig", - "Fast": "Schnell", - "Medium_Fast": "Schneller", - "Medium_Slow": "Langsamer", - "Slow": "Langsam", - "Fluctuating": "Schwankend" -} as const; \ No newline at end of file + "Erratic": "Unregelmäßig", + "Fast": "Schnell", + "Medium_Fast": "Schneller", + "Medium_Slow": "Langsamer", + "Slow": "Langsam", + "Fluctuating": "Schwankend" +} as const; diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index aa09a3b4c6f8..de30785b731c 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": 'Spieleinstellungen', - "ACHIEVEMENTS": "Erfolge", - "STATS": "Statistiken", - "VOUCHERS": "Gutscheine", - "EGG_LIST": "Eierliste", - "EGG_GACHA": "Eier-Gacha", - "MANAGE_DATA": "Daten verwalten", - "COMMUNITY": "Community", - "SAVE_AND_QUIT": "Speichern und Beenden", - "LOG_OUT": "Abmelden", - "slot": "Slot {{slotNumber}}", - "importSession": "Sitzung importieren", - "importSlotSelect": "Wähle einen Slot zum Importieren.", - "exportSession": "Sitzung exportieren", - "exportSlotSelect": "Wähle einen Slot zum Exportieren.", - "importData": "Daten importieren", - "exportData": "Daten exportieren", - "cancel": "Abbrechen", - "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?" + "GAME_SETTINGS": "Spieleinstellungen", + "ACHIEVEMENTS": "Erfolge", + "STATS": "Statistiken", + "VOUCHERS": "Gutscheine", + "EGG_LIST": "Eierliste", + "EGG_GACHA": "Eier-Gacha", + "MANAGE_DATA": "Daten verwalten", + "COMMUNITY": "Community", + "SAVE_AND_QUIT": "Speichern und Beenden", + "LOG_OUT": "Abmelden", + "slot": "Slot {{slotNumber}}", + "importSession": "Sitzung importieren", + "importSlotSelect": "Wähle einen Slot zum Importieren.", + "exportSession": "Sitzung exportieren", + "exportSlotSelect": "Wähle einen Slot zum Exportieren.", + "importData": "Daten importieren", + "exportData": "Daten exportieren", + "cancel": "Abbrechen", + "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?" } as const; diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index 0d33fb4cbd85..baa345eee8d1 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "Abbrechen", - "continue": "Fortfahren", - "dailyRun": "Täglicher Run (Beta)", - "loadGame": "Spiel laden", - "newGame": "Neues Spiel", - "selectGameMode": "Wähle einen Spielmodus", - "logInOrCreateAccount": "Melde dich an oder erstelle einen Account zum starten. Keine Email nötig!", - "username": "Benutzername", - "password": "Passwort", - "login": "Anmelden", - "register": "Registrieren", - "emptyUsername": "Benutzername darf nicht leer sein", - "invalidLoginUsername": "Der eingegebene Benutzername ist ungültig", - "invalidRegisterUsername": "Benutzername darf nur Buchstaben, Zahlen oder Unterstriche enthalten", - "invalidLoginPassword": "Das eingegebene Passwort ist ungültig", - "invalidRegisterPassword": "Passwort muss 6 Zeichen oder länger sein", - "usernameAlreadyUsed": "Der eingegebene Benutzername wird bereits verwendet", - "accountNonExistent": "Der eingegebene Benutzer existiert nicht", - "unmatchingPassword": "Das eingegebene Passwort stimmt nicht überein", - "passwordNotMatchingConfirmPassword": "Passwort muss mit Bestätigungspasswort übereinstimmen", - "confirmPassword": "Bestätige Passwort", - "registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.", - "backToLogin": "Zurück zur Anmeldung", - "failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.", - "sessionSuccess": "Sitzung erfolgreich geladen.", - "failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.", - "boyOrGirl": "Bist du ein Junge oder ein Mädchen?", - "boy": "Junge", - "girl": "Mädchen", - "evolving": "Nanu?\n{{pokemonName}} entwickelt sich!", - "stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", // "Hm? Entwicklung wurde abgebrochen!" without naming the pokemon seems to be the original. - "pauseEvolutionsQuestion": "Die Entwicklung von {{pokemonName}} vorübergehend pausieren?\nEntwicklungen können im Gruppenmenü wieder aktiviert werden.", - "evolutionsPaused": "Entwicklung von {{pokemonName}} pausiert.", - "evolutionDone": "Glückwunsch!\nDein {{pokemonName}} entwickelte sich zu {{evolvedPokemonName}}!", - "dailyRankings": "Tägliche Rangliste", - "weeklyRankings": "Wöchentliche Rangliste", - "noRankings": "Keine Rangliste", - "loading": "Lade…", - "playersOnline": "Spieler Online", - "empty":"Leer", - "yes":"Ja", - "no":"Nein", + "cancel": "Abbrechen", + "continue": "Fortfahren", + "dailyRun": "Täglicher Run (Beta)", + "loadGame": "Spiel laden", + "newGame": "Neues Spiel", + "selectGameMode": "Wähle einen Spielmodus", + "logInOrCreateAccount": "Melde dich an oder erstelle einen Account zum starten. Keine Email nötig!", + "username": "Benutzername", + "password": "Passwort", + "login": "Anmelden", + "register": "Registrieren", + "emptyUsername": "Benutzername darf nicht leer sein", + "invalidLoginUsername": "Der eingegebene Benutzername ist ungültig", + "invalidRegisterUsername": "Benutzername darf nur Buchstaben, Zahlen oder Unterstriche enthalten", + "invalidLoginPassword": "Das eingegebene Passwort ist ungültig", + "invalidRegisterPassword": "Passwort muss 6 Zeichen oder länger sein", + "usernameAlreadyUsed": "Der eingegebene Benutzername wird bereits verwendet", + "accountNonExistent": "Der eingegebene Benutzer existiert nicht", + "unmatchingPassword": "Das eingegebene Passwort stimmt nicht überein", + "passwordNotMatchingConfirmPassword": "Passwort muss mit Bestätigungspasswort übereinstimmen", + "confirmPassword": "Bestätige Passwort", + "registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.", + "backToLogin": "Zurück zur Anmeldung", + "failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.", + "sessionSuccess": "Sitzung erfolgreich geladen.", + "failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.", + "boyOrGirl": "Bist du ein Junge oder ein Mädchen?", + "boy": "Junge", + "girl": "Mädchen", + "evolving": "Nanu?\n{{pokemonName}} entwickelt sich!", + "stoppedEvolving": "Hm? {{pokemonName}} hat die Entwicklung \nabgebrochen.", // "Hm? Entwicklung wurde abgebrochen!" without naming the pokemon seems to be the original. + "pauseEvolutionsQuestion": "Die Entwicklung von {{pokemonName}} vorübergehend pausieren?\nEntwicklungen können im Gruppenmenü wieder aktiviert werden.", + "evolutionsPaused": "Entwicklung von {{pokemonName}} pausiert.", + "evolutionDone": "Glückwunsch!\nDein {{pokemonName}} entwickelte sich zu {{evolvedPokemonName}}!", + "dailyRankings": "Tägliche Rangliste", + "weeklyRankings": "Wöchentliche Rangliste", + "noRankings": "Keine Rangliste", + "loading": "Lade…", + "playersOnline": "Spieler Online", + "empty":"Leer", + "yes":"Ja", + "no":"Nein", } as const; diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index a2e7dda72988..57468a8ad1b5 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -226,13 +226,13 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_DAMAGE_REDUCTION": { name: "Schutzmarke", description: "Verringert den erhaltenen Schaden um 2,5%" }, "ENEMY_HEAL": { name: "Wiederherstellungsmarke", description: "Heilt 2% der maximalen KP pro Runde" }, "ENEMY_ATTACK_POISON_CHANCE": { name: "Giftmarke" }, - "ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Lähmungsmarke" }, - "ENEMY_ATTACK_SLEEP_CHANCE": { "name": "Schlafmarke" }, - "ENEMY_ATTACK_FREEZE_CHANCE": { "name": "Gefriermarke" }, - "ENEMY_ATTACK_BURN_CHANCE": { "name": "Brandmarke" }, - "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 10%ige Chance hinzu, jede Runde einen Statuszustand zu heilen" }, - "ENEMY_ENDURE_CHANCE": { "name": "Ausdauer-Marke" }, - "ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist" }, + "ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Lähmungsmarke" }, + "ENEMY_ATTACK_SLEEP_CHANCE": { "name": "Schlafmarke" }, + "ENEMY_ATTACK_FREEZE_CHANCE": { "name": "Gefriermarke" }, + "ENEMY_ATTACK_BURN_CHANCE": { "name": "Brandmarke" }, + "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 10%ige Chance hinzu, jede Runde einen Statuszustand zu heilen" }, + "ENEMY_ENDURE_CHANCE": { "name": "Ausdauer-Marke" }, + "ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist" }, }, TempBattleStatBoosterItem: { @@ -385,4 +385,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "Gefriermodul", "DOUSE_DRIVE": "Aquamodul", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts index a7750942e93a..a616ffa42762 100644 --- a/src/locales/de/move.ts +++ b/src/locales/de/move.ts @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "Giftkettung", effect: "Der Anwender umwickelt das Ziel mit einer Kette aus Toxinen, die in dessen Körper eindringen und ihm schaden. Das Ziel wird eventuell schwer vergiftet." } -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/nature.ts b/src/locales/de/nature.ts index b6e3d05b8c00..3b730dd04558 100644 --- a/src/locales/de/nature.ts +++ b/src/locales/de/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Forsch", "Careful": "Sacht", "Quirky": "Kauzig" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/pokeball.ts b/src/locales/de/pokeball.ts index 5f4557f4b633..0b850b5c7754 100644 --- a/src/locales/de/pokeball.ts +++ b/src/locales/de/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Pokéball", - "greatBall": "Superball", - "ultraBall": "Hyperball", - "rogueBall": "Rogueball", - "masterBall": "Meisterball", - "luxuryBall": "Luxusball", -} as const; \ No newline at end of file + "pokeBall": "Pokéball", + "greatBall": "Superball", + "ultraBall": "Hyperball", + "rogueBall": "Rogueball", + "masterBall": "Meisterball", + "luxuryBall": "Luxusball", +} as const; diff --git a/src/locales/de/pokemon-info.ts b/src/locales/de/pokemon-info.ts index 772a09cb6567..d61e64752995 100644 --- a/src/locales/de/pokemon-info.ts +++ b/src/locales/de/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "Max. KP", - "HPshortened": "MaxKP", - "ATK": "Angriff", - "ATKshortened": "Ang", - "DEF": "Verteidigung", - "DEFshortened": "Vert", - "SPATK": "Sp. Ang", - "SPATKshortened": "SpAng", - "SPDEF": "Sp. Vert", - "SPDEFshortened": "SpVert", - "SPD": "Initiative", - "SPDshortened": "Init", - }, + Stat: { + "HP": "Max. KP", + "HPshortened": "MaxKP", + "ATK": "Angriff", + "ATKshortened": "Ang", + "DEF": "Verteidigung", + "DEFshortened": "Vert", + "SPATK": "Sp. Ang", + "SPATKshortened": "SpAng", + "SPDEF": "Sp. Vert", + "SPDEFshortened": "SpVert", + "SPD": "Initiative", + "SPDshortened": "Init", + }, - Type: { - "UNKNOWN": "Unbekannt", - "NORMAL": "Normal", - "FIGHTING": "Kampf", - "FLYING": "Flug", - "POISON": "Gift", - "GROUND": "Boden", - "ROCK": "Gestein", - "BUG": "Käfer", - "GHOST": "Geist", - "STEEL": "Stahl", - "FIRE": "Feuer", - "WATER": "Wasser", - "GRASS": "Pflanze", - "ELECTRIC": "Elektro", - "PSYCHIC": "Psycho", - "ICE": "Eis", - "DRAGON": "Drache", - "DARK": "Unlicht", - "FAIRY": "Fee", - "STELLAR": "Stellar", - }, -} as const; \ No newline at end of file + Type: { + "UNKNOWN": "Unbekannt", + "NORMAL": "Normal", + "FIGHTING": "Kampf", + "FLYING": "Flug", + "POISON": "Gift", + "GROUND": "Boden", + "ROCK": "Gestein", + "BUG": "Käfer", + "GHOST": "Geist", + "STEEL": "Stahl", + "FIRE": "Feuer", + "WATER": "Wasser", + "GRASS": "Pflanze", + "ELECTRIC": "Elektro", + "PSYCHIC": "Psycho", + "ICE": "Eis", + "DRAGON": "Drache", + "DARK": "Unlicht", + "FAIRY": "Fee", + "STELLAR": "Stellar", + }, +} as const; diff --git a/src/locales/de/pokemon.ts b/src/locales/de/pokemon.ts index 69644ff83c38..91b970528794 100644 --- a/src/locales/de/pokemon.ts +++ b/src/locales/de/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bisasam", - "ivysaur": "Bisaknosp", - "venusaur": "Bisaflor", - "charmander": "Glumanda", - "charmeleon": "Glutexo", - "charizard": "Glurak", - "squirtle": "Schiggy", - "wartortle": "Schillok", - "blastoise": "Turtok", - "caterpie": "Raupy", - "metapod": "Safcon", - "butterfree": "Smettbo", - "weedle": "Hornliu", - "kakuna": "Kokuna", - "beedrill": "Bibor", - "pidgey": "Taubsi", - "pidgeotto": "Tauboga", - "pidgeot": "Tauboss", - "rattata": "Rattfratz", - "raticate": "Rattikarl", - "spearow": "Habitak", - "fearow": "Ibitak", - "ekans": "Rettan", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandan", - "sandslash": "Sandamer", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Piepi", - "clefable": "Pixi", - "vulpix": "Vulpix", - "ninetales": "Vulnona", - "jigglypuff": "Pummeluff", - "wigglytuff": "Knuddeluff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Myrapla", - "gloom": "Duflor", - "vileplume": "Giflor", - "paras": "Paras", - "parasect": "Parasek", - "venonat": "Bluzuk", - "venomoth": "Omot", - "diglett": "Digda", - "dugtrio": "Digdri", - "meowth": "Mauzi", - "persian": "Snobilikat", - "psyduck": "Enton", - "golduck": "Entoron", - "mankey": "Menki", - "primeape": "Rasaff", - "growlithe": "Fukano", - "arcanine": "Arkani", - "poliwag": "Quapsel", - "poliwhirl": "Quaputzi", - "poliwrath": "Quappo", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Simsala", - "machop": "Machollo", - "machoke": "Maschock", - "machamp": "Machomei", - "bellsprout": "Knofensa", - "weepinbell": "Ultrigaria", - "victreebel": "Sarzenia", - "tentacool": "Tentacha", - "tentacruel": "Tentoxa", - "geodude": "Kleinstein", - "graveler": "Georok", - "golem": "Geowaz", - "ponyta": "Ponita", - "rapidash": "Gallopa", - "slowpoke": "Flegmon", - "slowbro": "Lahmus", - "magnemite": "Magnetilo", - "magneton": "Magneton", - "farfetchd": "Porenta", - "doduo": "Dodu", - "dodrio": "Dodri", - "seel": "Jurob", - "dewgong": "Jugong", - "grimer": "Sleima", - "muk": "Sleimok", - "shellder": "Muschas", - "cloyster": "Austos", - "gastly": "Nebulak", - "haunter": "Alpollo", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Traumato", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltobal", - "electrode": "Lektrobal", - "exeggcute": "Owei", - "exeggutor": "Kokowei", - "cubone": "Tragosso", - "marowak": "Knogga", - "hitmonlee": "Kicklee", - "hitmonchan": "Nockchan", - "lickitung": "Schlurp", - "koffing": "Smogon", - "weezing": "Smogmog", - "rhyhorn": "Rihorn", - "rhydon": "Rizeros", - "chansey": "Chaneira", - "tangela": "Tangela", - "kangaskhan": "Kangama", - "horsea": "Seeper", - "seadra": "Seemon", - "goldeen": "Goldini", - "seaking": "Golking", - "staryu": "Sterndu", - "starmie": "Starmie", - "mr_mime": "Pantimos", - "scyther": "Sichlor", - "jynx": "Rossana", - "electabuzz": "Elektek", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Karpador", - "gyarados": "Garados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Evoli", - "vaporeon": "Aquana", - "jolteon": "Blitza", - "flareon": "Flamara", - "porygon": "Porygon", - "omanyte": "Amonitas", - "omastar": "Amoroso", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Relaxo", - "articuno": "Arktos", - "zapdos": "Zapdos", - "moltres": "Lavados", - "dratini": "Dratini", - "dragonair": "Dragonir", - "dragonite": "Dragoran", - "mewtwo": "Mewtu", - "mew": "Mew", - "chikorita": "Endivie", - "bayleef": "Lorblatt", - "meganium": "Meganie", - "cyndaquil": "Feurigel", - "quilava": "Igelavar", - "typhlosion": "Tornupto", - "totodile": "Karnimani", - "croconaw": "Tyracroc", - "feraligatr": "Impergator", - "sentret": "Wiesor", - "furret": "Wiesenior", - "hoothoot": "Hoothoot", - "noctowl": "Noctuh", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Webarak", - "ariados": "Ariados", - "crobat": "Iksbat", - "chinchou": "Lampi", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Pii", - "igglybuff": "Fluffeluff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Voltilamm", - "flaaffy": "Waaty", - "ampharos": "Ampharos", - "bellossom": "Blubella", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Mogelbaum", - "politoed": "Quaxo", - "hoppip": "Hoppspross", - "skiploom": "Hubelupf", - "jumpluff": "Papungha", - "aipom": "Griffel", - "sunkern": "Sonnkern", - "sunflora": "Sonnflora", - "yanma": "Yanma", - "wooper": "Felino", - "quagsire": "Morlord", - "espeon": "Psiana", - "umbreon": "Nachtara", - "murkrow": "Kramurx", - "slowking": "Laschoking", - "misdreavus": "Traunfugil", - "unown": "Icognito", - "wobbuffet": "Woingenau", - "girafarig": "Girafarig", - "pineco": "Tannza", - "forretress": "Forstellka", - "dunsparce": "Dummisel", - "gligar": "Skorgla", - "steelix": "Stahlos", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Baldorfish", - "scizor": "Scherox", - "shuckle": "Pottrott", - "heracross": "Skaraborn", - "sneasel": "Sniebel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Schneckmag", - "magcargo": "Magcargo", - "swinub": "Quiekel", - "piloswine": "Keifel", - "corsola": "Corasonn", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Botogel", - "mantine": "Mantax", - "skarmory": "Panzaeron", - "houndour": "Hunduster", - "houndoom": "Hundemon", - "kingdra": "Seedraking", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Damhirplex", - "smeargle": "Farbeagle", - "tyrogue": "Rabauz", - "hitmontop": "Kapoera", - "smoochum": "Kussilla", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Heiteira", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Despotar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Geckarbor", - "grovyle": "Reptain", - "sceptile": "Gewaldro", - "torchic": "Flemmli", - "combusken": "Jungglut", - "blaziken": "Lohgock", - "mudkip": "Hydropi", - "marshtomp": "Moorabbel", - "swampert": "Sumpex", - "poochyena": "Fiffyen", - "mightyena": "Magnayen", - "zigzagoon": "Zigzachs", - "linoone": "Geradaks", - "wurmple": "Waumpel", - "silcoon": "Schaloko", - "beautifly": "Papinella", - "cascoon": "Panekon", - "dustox": "Pudox", - "lotad": "Loturzel", - "lombre": "Lombrero", - "ludicolo": "Kappalores", - "seedot": "Samurzel", - "nuzleaf": "Blanas", - "shiftry": "Tengulist", - "taillow": "Schwalbini", - "swellow": "Schwalboss", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Trasla", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Geweiher", - "masquerain": "Maskeregen", - "shroomish": "Knilz", - "breloom": "Kapilz", - "slakoth": "Bummelz", - "vigoroth": "Muntier", - "slaking": "Letarking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Ninjatom", - "whismur": "Flurmel", - "loudred": "Krakeelo", - "exploud": "Krawumms", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nasgnet", - "skitty": "Eneco", - "delcatty": "Enekoro", - "sableye": "Zobiris", - "mawile": "Flunkifer", - "aron": "Stollunior", - "lairon": "Stollrak", - "aggron": "Stolloss", - "meditite": "Meditite", - "medicham": "Meditalis", - "electrike": "Frizelbliz", - "manectric": "Voltenso", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Schluppuck", - "swalot": "Schluckwech", - "carvanha": "Kanivanha", - "sharpedo": "Tohaido", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Camaub", - "camerupt": "Camerupt", - "torkoal": "Qurtel", - "spoink": "Spoink", - "grumpig": "Groink", - "spinda": "Pandir", - "trapinch": "Knacklion", - "vibrava": "Vibrava", - "flygon": "Libelldra", - "cacnea": "Tuska", - "cacturne": "Noktuska", - "swablu": "Wablu", - "altaria": "Altaria", - "zangoose": "Sengo", - "seviper": "Vipitis", - "lunatone": "Lunastein", - "solrock": "Sonnfel", - "barboach": "Schmerbe", - "whiscash": "Welsar", - "corphish": "Krebscorps", - "crawdaunt": "Krebutack", - "baltoy": "Puppance", - "claydol": "Lepumentas", - "lileep": "Liliep", - "cradily": "Wielie", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Barschwa", - "milotic": "Milotic", - "castform": "Formeo", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Zwirrlicht", - "dusclops": "Zwirrklop", - "tropius": "Tropius", - "chimecho": "Palimpalim", - "absol": "Absol", - "wynaut": "Isso", - "snorunt": "Schneppke", - "glalie": "Firnontor", - "spheal": "Seemops", - "sealeo": "Seejong", - "walrein": "Walraisa", - "clamperl": "Perlu", - "huntail": "Aalabyss", - "gorebyss": "Saganabyss", - "relicanth": "Relicanth", - "luvdisc": "Liebiskus", - "bagon": "Kindwurm", - "shelgon": "Draschel", - "salamence": "Brutalanda", - "beldum": "Tanhel", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Chelast", - "grotle": "Chelcarain", - "torterra": "Chelterrar", - "chimchar": "Panflam", - "monferno": "Panpyro", - "infernape": "Panferno", - "piplup": "Plinfa", - "prinplup": "Pilprin", - "empoleon": "Impoleon", - "starly": "Staralili", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidiza", - "bibarel": "Bidifas", - "kricketot": "Zirpurze", - "kricketune": "Zirpeise", - "shinx": "Sheinux", - "luxio": "Luxio", - "luxray": "Luxtra", - "budew": "Knospi", - "roserade": "Roserade", - "cranidos": "Koknodon", - "rampardos": "Rameidon", - "shieldon": "Schilterus", - "bastiodon": "Bollterus", - "burmy": "Burmy", - "wormadam": "Burmadame", - "mothim": "Moterpel", - "combee": "Wadribie", - "vespiquen": "Honweisel", - "pachirisu": "Pachirisu", - "buizel": "Bamelin", - "floatzel": "Bojelin", - "cherubi": "Kikugi", - "cherrim": "Kinoso", - "shellos": "Schalellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambidiffel", - "drifloon": "Driftlon", - "drifblim": "Drifzepeli", - "buneary": "Haspiror", - "lopunny": "Schlapor", - "mismagius": "Traunmagil", - "honchkrow": "Kramshef", - "glameow": "Charmian", - "purugly": "Shnurgarst", - "chingling": "Klingplim", - "stunky": "Skunkapuh", - "skuntank": "Skuntank", - "bronzor": "Bronzel", - "bronzong": "Bronzong", - "bonsly": "Mobai", - "mime_jr": "Pantimimi", - "happiny": "Wonneira", - "chatot": "Plaudagei", - "spiritomb": "Kryppuk", - "gible": "Kaumalat", - "gabite": "Knarksel", - "garchomp": "Knackrack", - "munchlax": "Mampfaxo", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippoterus", - "skorupi": "Pionskora", - "drapion": "Piondragi", - "croagunk": "Glibunkel", - "toxicroak": "Toxiquak", - "carnivine": "Venuflibis", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantirps", - "snover": "Shnebedeck", - "abomasnow": "Rexblisar", - "weavile": "Snibunna", - "magnezone": "Magnezone", - "lickilicky": "Schlurplek", - "rhyperior": "Rihornior", - "tangrowth": "Tangoloss", - "electivire": "Elevoltek", - "magmortar": "Magbrant", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Folipurba", - "glaceon": "Glaziola", - "gliscor": "Skorgro", - "mamoswine": "Mamutel", - "porygon_z": "Porygon-Z", - "gallade": "Galagladi", - "probopass": "Voluminas", - "dusknoir": "Zwirrfinst", - "froslass": "Frosdedje", - "rotom": "Rotom", - "uxie": "Selfe", - "mesprit": "Vesprit", - "azelf": "Tobutz", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Serpifeu", - "servine": "Efoserp", - "serperior": "Serpiroyal", - "tepig": "Floink", - "pignite": "Ferkokel", - "emboar": "Flambirex", - "oshawott": "Ottaro", - "dewott": "Zwottronin", - "samurott": "Admurai", - "patrat": "Nagelotz", - "watchog": "Kukmarda", - "lillipup": "Yorkleff", - "herdier": "Terribark", - "stoutland": "Bissbark", - "purrloin": "Felilou", - "liepard": "Kleoparda", - "pansage": "Vegimak", - "simisage": "Vegichita", - "pansear": "Grillmak", - "simisear": "Grillchita", - "panpour": "Sodamak", - "simipour": "Sodachita", - "munna": "Somniam", - "musharna": "Somnivora", - "pidove": "Dusselgurr", - "tranquill": "Navitaub", - "unfezant": "Fasasnob", - "blitzle": "Elezeba", - "zebstrika": "Zebritz", - "roggenrola": "Kiesling", - "boldore": "Sedimantur", - "gigalith": "Brockoloss", - "woobat": "Fleknoil", - "swoobat": "Fletiamo", - "drilbur": "Rotomurf", - "excadrill": "Stalobor", - "audino": "Ohrdoch", - "timburr": "Praktibalk", - "gurdurr": "Strepoli", - "conkeldurr": "Meistagrif", - "tympole": "Schallquap", - "palpitoad": "Mebrana", - "seismitoad": "Branawarz", - "throh": "Jiutesto", - "sawk": "Karadonis", - "sewaddle": "Strawickl", - "swadloon": "Folikon", - "leavanny": "Matrifol", - "venipede": "Toxiped", - "whirlipede": "Rollum", - "scolipede": "Cerapendra", - "cottonee": "Waumboll", - "whimsicott": "Elfun", - "petilil": "Lilminip", - "lilligant": "Dressella", - "basculin": "Barschuft", - "sandile": "Ganovil", - "krokorok": "Rokkaiman", - "krookodile": "Rabigator", - "darumaka": "Flampion", - "darmanitan": "Flampivian", - "maractus": "Maracamba", - "dwebble": "Lithomith", - "crustle": "Castellith", - "scraggy": "Zurrokex", - "scrafty": "Irokex", - "sigilyph": "Symvolara", - "yamask": "Makabaja", - "cofagrigus": "Echnatoll", - "tirtouga": "Galapaflos", - "carracosta": "Karippas", - "archen": "Flapteryx", - "archeops": "Aeropteryx", - "trubbish": "Unratütox", - "garbodor": "Deponitox", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Picochilla", - "cinccino": "Chillabell", - "gothita": "Mollimorba", - "gothorita": "Hypnomorba", - "gothitelle": "Morbitesse", - "solosis": "Monozyto", - "duosion": "Mitodos", - "reuniclus": "Zytomega", - "ducklett": "Piccolente", - "swanna": "Swaroness", - "vanillite": "Gelatini", - "vanillish": "Gelatroppo", - "vanilluxe": "Gelatwino", - "deerling": "Sesokitz", - "sawsbuck": "Kronjuwild", - "emolga": "Emolga", - "karrablast": "Laukaps", - "escavalier": "Cavalanzas", - "foongus": "Tarnpignon", - "amoonguss": "Hutsassa", - "frillish": "Quabbel", - "jellicent": "Apoquallyp", - "alomomola": "Mamolida", - "joltik": "Wattzapf", - "galvantula": "Voltula", - "ferroseed": "Kastadur", - "ferrothorn": "Tentantel", - "klink": "Klikk", - "klang": "Kliklak", - "klinklang": "Klikdiklak", - "tynamo": "Zapplardin", - "eelektrik": "Zapplalek", - "eelektross": "Zapplarang", - "elgyem": "Pygraulon", - "beheeyem": "Megalon", - "litwick": "Lichtel", - "lampent": "Laternecto", - "chandelure": "Skelabra", - "axew": "Milza", - "fraxure": "Sharfax", - "haxorus": "Maxax", - "cubchoo": "Petznief", - "beartic": "Siberio", - "cryogonal": "Frigometri", - "shelmet": "Schnuthelm", - "accelgor": "Hydragil", - "stunfisk": "Flunschlik", - "mienfoo": "Lin-Fu", - "mienshao": "Wie-Shu", - "druddigon": "Shardrago", - "golett": "Golbit", - "golurk": "Golgantes", - "pawniard": "Gladiantri", - "bisharp": "Caesurio", - "bouffalant": "Bisofank", - "rufflet": "Geronimatz", - "braviary": "Washakwil", - "vullaby": "Skallyk", - "mandibuzz": "Grypheldis", - "heatmor": "Furnifraß", - "durant": "Fermicula", - "deino": "Kapuno", - "zweilous": "Duodino", - "hydreigon": "Trikephalo", - "larvesta": "Ignivor", - "volcarona": "Ramoth", - "cobalion": "Kobalium", - "terrakion": "Terrakium", - "virizion": "Viridium", - "tornadus": "Boreos", - "thundurus": "Voltolos", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Demeteros", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Igamaro", - "quilladin": "Igastarnish", - "chesnaught": "Brigaron", - "fennekin": "Fynx", - "braixen": "Rutena", - "delphox": "Fennexis", - "froakie": "Froxy", - "frogadier": "Amphizel", - "greninja": "Quajutsu", - "bunnelby": "Scoppel", - "diggersby": "Grebbit", - "fletchling": "Dartiri", - "fletchinder": "Dartignis", - "talonflame": "Fiaro", - "scatterbug": "Purmel", - "spewpa": "Puponcho", - "vivillon": "Vivillon", - "litleo": "Leufeo", - "pyroar": "Pyroleo", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Mähikel", - "gogoat": "Chevrumm", - "pancham": "Pam-Pam", - "pangoro": "Pandagro", - "furfrou": "Coiffwaff", - "espurr": "Psiau", - "meowstic": "Psiaugon", - "honedge": "Gramokles", - "doublade": "Duokles", - "aegislash": "Durengard", - "spritzee": "Parfi", - "aromatisse": "Parfinesse", - "swirlix": "Flauschling", - "slurpuff": "Sabbaione", - "inkay": "Iscalar", - "malamar": "Calamanero", - "binacle": "Bithora", - "barbaracle": "Thanathora", - "skrelp": "Algitt", - "dragalge": "Tandrak", - "clauncher": "Scampisto", - "clawitzer": "Wummer", - "helioptile": "Eguana", - "heliolisk": "Elezard", - "tyrunt": "Balgoras", - "tyrantrum": "Monargoras", - "amaura": "Amarino", - "aurorus": "Amagarga", - "sylveon": "Feelinara", - "hawlucha": "Resladero", - "dedenne": "Dedenne", - "carbink": "Rocara", - "goomy": "Viscora", - "sliggoo": "Viscargot", - "goodra": "Viscogon", - "klefki": "Clavion", - "phantump": "Paragoni", - "trevenant": "Trombork", - "pumpkaboo": "Irrbis", - "gourgeist": "Pumpdjinn", - "bergmite": "Arktip", - "avalugg": "Arktilas", - "noibat": "eF-eM", - "noivern": "UHaFnir", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Bauz", - "dartrix": "Arboretoss", - "decidueye": "Silvarro", - "litten": "Flamiau", - "torracat": "Miezunder", - "incineroar": "Fuegro", - "popplio": "Robball", - "brionne": "Marikeck", - "primarina": "Primarene", - "pikipek": "Peppeck", - "trumbeak": "Trompeck", - "toucannon": "Tukanon", - "yungoos": "Mangunior", - "gumshoos": "Manguspektor", - "grubbin": "Mabula", - "charjabug": "Akkup", - "vikavolt": "Donarion", - "crabrawler": "Krabbox", - "crabominable": "Krawell", - "oricorio": "Choreogel", - "cutiefly": "Wommel", - "ribombee": "Bandelby", - "rockruff": "Wuffels", - "lycanroc": "Wolwerock", - "wishiwashi": "Lusardin", - "mareanie": "Garstella", - "toxapex": "Aggrostella", - "mudbray": "Pampuli", - "mudsdale": "Pampross", - "dewpider": "Araqua", - "araquanid": "Aranestro", - "fomantis": "Imantis", - "lurantis": "Mantidea", - "morelull": "Bubungus", - "shiinotic": "Lamellux", - "salandit": "Molunk", - "salazzle": "Amfira", - "stufful": "Velursi", - "bewear": "Kosturso", - "bounsweet": "Frubberl", - "steenee": "Frubaila", - "tsareena": "Fruyal", - "comfey": "Curelei", - "oranguru": "Kommandutan", - "passimian": "Quartermak", - "wimpod": "Reißlaus", - "golisopod": "Tectass", - "sandygast": "Sankabuh", - "palossand": "Colossand", - "pyukumuku": "Gufa", - "type_null": "Typ:Null", - "silvally": "Amigento", - "minior": "Meteno", - "komala": "Koalelu", - "turtonator": "Tortunator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimigma", - "bruxish": "Knirfish", - "drampa": "Sen-Long", - "dhelmise": "Moruda", - "jangmo_o": "Miniras", - "hakamo_o": "Mediras", - "kommo_o": "Grandiras", - "tapu_koko": "Kapu-Riki", - "tapu_lele": "Kapu-Fala", - "tapu_bulu": "Kapu-Toro", - "tapu_fini": "Kapu-Kime", - "cosmog": "Cosmog", - "cosmoem": "Cosmovum", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Anego", - "buzzwole": "Masskito", - "pheromosa": "Schabelle", - "xurkitree": "Voltriant", - "celesteela": "Kaguron", - "kartana": "Katagami", - "guzzlord": "Schlingking", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Venicro", - "naganadel": "Agoyon", - "stakataka": "Muramura", - "blacephalon": "Kopplosio", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Chimpep", - "thwackey": "Chimstix", - "rillaboom": "Gortrom", - "scorbunny": "Hopplo", - "raboot": "Kickerlo", - "cinderace": "Liberlo", - "sobble": "Memmeon", - "drizzile": "Phlegleon", - "inteleon": "Intelleon", - "skwovet": "Raffel", - "greedent": "Schlaraffel", - "rookidee": "Meikro", - "corvisquire": "Kranoviz", - "corviknight": "Krarmor", - "blipbug": "Sensect", - "dottler": "Keradar", - "orbeetle": "Maritellit", - "nickit": "Kleptifux", - "thievul": "Gaunux", - "gossifleur": "Cottini", - "eldegoss": "Cottomi", - "wooloo": "Wolly", - "dubwool": "Zwollock", - "chewtle": "Kamehaps", - "drednaw": "Kamalm", - "yamper": "Voldi", - "boltund": "Bellektro", - "rolycoly": "Klonkett", - "carkol": "Wagong", - "coalossal": "Montecarbo", - "applin": "Knapfel", - "flapple": "Drapfel", - "appletun": "Schlapfel", - "silicobra": "Salanga", - "sandaconda": "Sanaconda", - "cramorant": "Urgl", - "arrokuda": "Pikuda", - "barraskewda": "Barrakiefa", - "toxel": "Toxel", - "toxtricity": "Riffex", - "sizzlipede": "Thermopod", - "centiskorch": "Infernopod", - "clobbopus": "Klopptopus", - "grapploct": "Kaocto", - "sinistea": "Fatalitee", - "polteageist": "Mortipot", - "hatenna": "Brimova", - "hattrem": "Brimano", - "hatterene": "Silembrim", - "impidimp": "Bähmon", - "morgrem": "Pelzebub", - "grimmsnarl": "Olangaar", - "obstagoon": "Barrikadax", - "perrserker": "Mauzinger", - "cursola": "Gorgasonn", - "sirfetchd": "Lauchzelot", - "mr_rime": "Pantifrost", - "runerigus": "Oghnatoll", - "milcery": "Hokumil", - "alcremie": "Pokusan", - "falinks": "Legios", - "pincurchin": "Britzigel", - "snom": "Snomnom", - "frosmoth": "Mottineva", - "stonjourner": "Humanolith", - "eiscue": "Kubuin", - "indeedee": "Servol", - "morpeko": "Morpeko", - "cufant": "Kupfanti", - "copperajah": "Patinaraja", - "dracozolt": "Lectragon", - "arctozolt": "Lecryodon", - "dracovish": "Pescragon", - "arctovish": "Pescryodon", - "duraludon": "Duraludon", - "dreepy": "Grolldra", - "drakloak": "Phandra", - "dragapult": "Katapuldra", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Endynalos", - "kubfu": "Dakuma", - "urshifu": "Wulaosu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Polaross", - "spectrier": "Phantoross", - "calyrex": "Coronospa", - "wyrdeer": "Damythir", - "kleavor": "Axantor", - "ursaluna": "Ursaluna", - "basculegion": "Salmagnis", - "sneasler": "Snieboss", - "overqwil": "Myriador", - "enamorus": "Cupidos", - "sprigatito": "Felori", - "floragato": "Feliospa", - "meowscarada": "Maskagato", - "fuecoco": "Krokel", - "crocalor": "Lokroko", - "skeledirge": "Skelokrok", - "quaxly": "Kwaks", - "quaxwell": "Fuentente", - "quaquaval": "Bailonda", - "lechonk": "Ferkuli", - "oinkologne": "Fragrunz", - "tarountula": "Tarundel", - "spidops": "Spinsidias", - "nymble": "Micrick", - "lokix": "Lextremo", - "pawmi": "Pamo", - "pawmo": "Pamamo", - "pawmot": "Pamomamo", - "tandemaus": "Zwieps", - "maushold": "Famieps", - "fidough": "Hefel", - "dachsbun": "Backel", - "smoliv": "Olini", - "dolliv": "Olivinio", - "arboliva": "Olithena", - "squawkabilly": "Krawalloro", - "nacli": "Geosali", - "naclstack": "Sedisal", - "garganacl": "Saltigant", - "charcadet": "Knarbon", - "armarouge": "Crimanzo", - "ceruledge": "Azugladis", - "tadbulb": "Blipp", - "bellibolt": "Wampitz", - "wattrel": "Voltrel", - "kilowattrel": "Voltrean", - "maschiff": "Mobtiff", - "mabosstiff": "Mastifioso", - "shroodle": "Sproxi", - "grafaiai": "Affiti", - "bramblin": "Weherba", - "brambleghast": "Horrerba", - "toedscool": "Tentagra", - "toedscruel": "Tenterra", - "klawf": "Klibbe", - "capsakid": "Chilingel", - "scovillain": "Halupenjo", - "rellor": "Relluk", - "rabsca": "Skarabaks", - "flittle": "Flattutu", - "espathra": "Psiopatra", - "tinkatink": "Forgita", - "tinkatuff": "Tafforgita", - "tinkaton": "Granforgita", - "wiglett": "Schligda", - "wugtrio": "Schligdri", - "bombirdier": "Adebom", - "finizen": "Normifin", - "palafin": "Delfinator", - "varoom": "Knattox", - "revavroom": "Knattatox", - "cyclizar": "Mopex", - "orthworm": "Schlurm", - "glimmet": "Lumispross", - "glimmora": "Lumiflora", - "greavard": "Gruff", - "houndstone": "Friedwuff", - "flamigo": "Flaminkno", - "cetoddle": "Flaniwal", - "cetitan": "Kolowal", - "veluza": "Agiluza", - "dondozo": "Heerashai", - "tatsugiri": "Nigiragi", - "annihilape": "Epitaff", - "clodsire": "Suelord", - "farigiraf": "Farigiraf", - "dudunsparce": "Dummimisel", - "kingambit": "Gladimperio", - "great_tusk": "Riesenzahn", - "scream_tail": "Brüllschweif", - "brute_bonnet": "Wutpilz", - "flutter_mane": "Flatterhaar", - "slither_wing": "Kriechflügel", - "sandy_shocks": "Sandfell", - "iron_treads": "Eisenrad", - "iron_bundle": "Eisenbündel", - "iron_hands": "Eisenhand", - "iron_jugulis": "Eisenhals", - "iron_moth": "Eisenfalter", - "iron_thorns": "Eisendorn", - "frigibax": "Frospino", - "arctibax": "Cryospino", - "baxcalibur": "Espinodon", - "gimmighoul": "Gierspenst", - "gholdengo": "Monetigo", - "wo_chien": "Chongjian", - "chien_pao": "Baojian", - "ting_lu": "Dinglu", - "chi_yu": "Yuyu", - "roaring_moon": "Donnersichel", - "iron_valiant": "Eisenkrieger", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Windewoge", - "iron_leaves": "Eisenblatt", - "dipplin": "Sirapfel", - "poltchageist": "Mortcha", - "sinistcha": "Fatalitcha", - "okidogi": "Boninu", - "munkidori": "Benesaru", - "fezandipiti": "Beatori", - "ogerpon": "Ogerpon", - "archaludon": "Briduradon", - "hydrapple": "Hydrapfel", - "gouging_fire": "Keilflamme", - "raging_bolt": "Furienblitz", - "iron_boulder": "Eisenfels", - "iron_crown": "Eisenhaupt", - "terapagos": "Terapagos", - "pecharunt": "Infamomo", - "alola_rattata": "Rattfratz", - "alola_raticate": "Rattikarl", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandan", - "alola_sandslash": "Sandamer", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Vulnona", - "alola_diglett": "Digda", - "alola_dugtrio": "Digdri", - "alola_meowth": "Mauzi", - "alola_persian": "Snobilikat", - "alola_geodude": "Kleinstein", - "alola_graveler": "Georok", - "alola_golem": "Geowaz", - "alola_grimer": "Sleima", - "alola_muk": "Sleimok", - "alola_exeggutor": "Kokowei", - "alola_marowak": "Knogga", - "eternal_floette": "Floette", - "galar_meowth": "Mauzi", - "galar_ponyta": "Ponita", - "galar_rapidash": "Gallopa", - "galar_slowpoke": "Flegmon", - "galar_slowbro": "Lahmus", - "galar_farfetchd": "Porenta", - "galar_weezing": "Smogmog", - "galar_mr_mime": "Pantimos", - "galar_articuno": "Arktos", - "galar_zapdos": "Zapdos", - "galar_moltres": "Lavados", - "galar_slowking": "Laschoking", - "galar_corsola": "Corasonn", - "galar_zigzagoon": "Zigzachs", - "galar_linoone": "Geradaks", - "galar_darumaka": "Flampion", - "galar_darmanitan": "Flampivian", - "galar_yamask": "Makabaja", - "galar_stunfisk": "Flunschlik", - "hisui_growlithe": "Fukano", - "hisui_arcanine": "Arkani", - "hisui_voltorb": "Voltobal", - "hisui_electrode": "Lektrobal", - "hisui_typhlosion": "Tornupto", - "hisui_qwilfish": "Baldorfish", - "hisui_sneasel": "Sniebel", - "hisui_samurott": "Admurai", - "hisui_lilligant": "Dressella", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Washakwil", - "hisui_sliggoo": "Viscargot", - "hisui_goodra": "Viscogon", - "hisui_avalugg": "Arktilas", - "hisui_decidueye": "Silvarro", - "paldea_tauros": "Tauros", - "paldea_wooper": "Felino", - "bloodmoon_ursaluna": "Ursaluna", -} as const; \ No newline at end of file + "bulbasaur": "Bisasam", + "ivysaur": "Bisaknosp", + "venusaur": "Bisaflor", + "charmander": "Glumanda", + "charmeleon": "Glutexo", + "charizard": "Glurak", + "squirtle": "Schiggy", + "wartortle": "Schillok", + "blastoise": "Turtok", + "caterpie": "Raupy", + "metapod": "Safcon", + "butterfree": "Smettbo", + "weedle": "Hornliu", + "kakuna": "Kokuna", + "beedrill": "Bibor", + "pidgey": "Taubsi", + "pidgeotto": "Tauboga", + "pidgeot": "Tauboss", + "rattata": "Rattfratz", + "raticate": "Rattikarl", + "spearow": "Habitak", + "fearow": "Ibitak", + "ekans": "Rettan", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandan", + "sandslash": "Sandamer", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Piepi", + "clefable": "Pixi", + "vulpix": "Vulpix", + "ninetales": "Vulnona", + "jigglypuff": "Pummeluff", + "wigglytuff": "Knuddeluff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Myrapla", + "gloom": "Duflor", + "vileplume": "Giflor", + "paras": "Paras", + "parasect": "Parasek", + "venonat": "Bluzuk", + "venomoth": "Omot", + "diglett": "Digda", + "dugtrio": "Digdri", + "meowth": "Mauzi", + "persian": "Snobilikat", + "psyduck": "Enton", + "golduck": "Entoron", + "mankey": "Menki", + "primeape": "Rasaff", + "growlithe": "Fukano", + "arcanine": "Arkani", + "poliwag": "Quapsel", + "poliwhirl": "Quaputzi", + "poliwrath": "Quappo", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Simsala", + "machop": "Machollo", + "machoke": "Maschock", + "machamp": "Machomei", + "bellsprout": "Knofensa", + "weepinbell": "Ultrigaria", + "victreebel": "Sarzenia", + "tentacool": "Tentacha", + "tentacruel": "Tentoxa", + "geodude": "Kleinstein", + "graveler": "Georok", + "golem": "Geowaz", + "ponyta": "Ponita", + "rapidash": "Gallopa", + "slowpoke": "Flegmon", + "slowbro": "Lahmus", + "magnemite": "Magnetilo", + "magneton": "Magneton", + "farfetchd": "Porenta", + "doduo": "Dodu", + "dodrio": "Dodri", + "seel": "Jurob", + "dewgong": "Jugong", + "grimer": "Sleima", + "muk": "Sleimok", + "shellder": "Muschas", + "cloyster": "Austos", + "gastly": "Nebulak", + "haunter": "Alpollo", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Traumato", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltobal", + "electrode": "Lektrobal", + "exeggcute": "Owei", + "exeggutor": "Kokowei", + "cubone": "Tragosso", + "marowak": "Knogga", + "hitmonlee": "Kicklee", + "hitmonchan": "Nockchan", + "lickitung": "Schlurp", + "koffing": "Smogon", + "weezing": "Smogmog", + "rhyhorn": "Rihorn", + "rhydon": "Rizeros", + "chansey": "Chaneira", + "tangela": "Tangela", + "kangaskhan": "Kangama", + "horsea": "Seeper", + "seadra": "Seemon", + "goldeen": "Goldini", + "seaking": "Golking", + "staryu": "Sterndu", + "starmie": "Starmie", + "mr_mime": "Pantimos", + "scyther": "Sichlor", + "jynx": "Rossana", + "electabuzz": "Elektek", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Karpador", + "gyarados": "Garados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Evoli", + "vaporeon": "Aquana", + "jolteon": "Blitza", + "flareon": "Flamara", + "porygon": "Porygon", + "omanyte": "Amonitas", + "omastar": "Amoroso", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Relaxo", + "articuno": "Arktos", + "zapdos": "Zapdos", + "moltres": "Lavados", + "dratini": "Dratini", + "dragonair": "Dragonir", + "dragonite": "Dragoran", + "mewtwo": "Mewtu", + "mew": "Mew", + "chikorita": "Endivie", + "bayleef": "Lorblatt", + "meganium": "Meganie", + "cyndaquil": "Feurigel", + "quilava": "Igelavar", + "typhlosion": "Tornupto", + "totodile": "Karnimani", + "croconaw": "Tyracroc", + "feraligatr": "Impergator", + "sentret": "Wiesor", + "furret": "Wiesenior", + "hoothoot": "Hoothoot", + "noctowl": "Noctuh", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Webarak", + "ariados": "Ariados", + "crobat": "Iksbat", + "chinchou": "Lampi", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Pii", + "igglybuff": "Fluffeluff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Voltilamm", + "flaaffy": "Waaty", + "ampharos": "Ampharos", + "bellossom": "Blubella", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Mogelbaum", + "politoed": "Quaxo", + "hoppip": "Hoppspross", + "skiploom": "Hubelupf", + "jumpluff": "Papungha", + "aipom": "Griffel", + "sunkern": "Sonnkern", + "sunflora": "Sonnflora", + "yanma": "Yanma", + "wooper": "Felino", + "quagsire": "Morlord", + "espeon": "Psiana", + "umbreon": "Nachtara", + "murkrow": "Kramurx", + "slowking": "Laschoking", + "misdreavus": "Traunfugil", + "unown": "Icognito", + "wobbuffet": "Woingenau", + "girafarig": "Girafarig", + "pineco": "Tannza", + "forretress": "Forstellka", + "dunsparce": "Dummisel", + "gligar": "Skorgla", + "steelix": "Stahlos", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Baldorfish", + "scizor": "Scherox", + "shuckle": "Pottrott", + "heracross": "Skaraborn", + "sneasel": "Sniebel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Schneckmag", + "magcargo": "Magcargo", + "swinub": "Quiekel", + "piloswine": "Keifel", + "corsola": "Corasonn", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Botogel", + "mantine": "Mantax", + "skarmory": "Panzaeron", + "houndour": "Hunduster", + "houndoom": "Hundemon", + "kingdra": "Seedraking", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Damhirplex", + "smeargle": "Farbeagle", + "tyrogue": "Rabauz", + "hitmontop": "Kapoera", + "smoochum": "Kussilla", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Heiteira", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Despotar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Geckarbor", + "grovyle": "Reptain", + "sceptile": "Gewaldro", + "torchic": "Flemmli", + "combusken": "Jungglut", + "blaziken": "Lohgock", + "mudkip": "Hydropi", + "marshtomp": "Moorabbel", + "swampert": "Sumpex", + "poochyena": "Fiffyen", + "mightyena": "Magnayen", + "zigzagoon": "Zigzachs", + "linoone": "Geradaks", + "wurmple": "Waumpel", + "silcoon": "Schaloko", + "beautifly": "Papinella", + "cascoon": "Panekon", + "dustox": "Pudox", + "lotad": "Loturzel", + "lombre": "Lombrero", + "ludicolo": "Kappalores", + "seedot": "Samurzel", + "nuzleaf": "Blanas", + "shiftry": "Tengulist", + "taillow": "Schwalbini", + "swellow": "Schwalboss", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Trasla", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Geweiher", + "masquerain": "Maskeregen", + "shroomish": "Knilz", + "breloom": "Kapilz", + "slakoth": "Bummelz", + "vigoroth": "Muntier", + "slaking": "Letarking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Ninjatom", + "whismur": "Flurmel", + "loudred": "Krakeelo", + "exploud": "Krawumms", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nasgnet", + "skitty": "Eneco", + "delcatty": "Enekoro", + "sableye": "Zobiris", + "mawile": "Flunkifer", + "aron": "Stollunior", + "lairon": "Stollrak", + "aggron": "Stolloss", + "meditite": "Meditite", + "medicham": "Meditalis", + "electrike": "Frizelbliz", + "manectric": "Voltenso", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Schluppuck", + "swalot": "Schluckwech", + "carvanha": "Kanivanha", + "sharpedo": "Tohaido", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Camaub", + "camerupt": "Camerupt", + "torkoal": "Qurtel", + "spoink": "Spoink", + "grumpig": "Groink", + "spinda": "Pandir", + "trapinch": "Knacklion", + "vibrava": "Vibrava", + "flygon": "Libelldra", + "cacnea": "Tuska", + "cacturne": "Noktuska", + "swablu": "Wablu", + "altaria": "Altaria", + "zangoose": "Sengo", + "seviper": "Vipitis", + "lunatone": "Lunastein", + "solrock": "Sonnfel", + "barboach": "Schmerbe", + "whiscash": "Welsar", + "corphish": "Krebscorps", + "crawdaunt": "Krebutack", + "baltoy": "Puppance", + "claydol": "Lepumentas", + "lileep": "Liliep", + "cradily": "Wielie", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Barschwa", + "milotic": "Milotic", + "castform": "Formeo", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Zwirrlicht", + "dusclops": "Zwirrklop", + "tropius": "Tropius", + "chimecho": "Palimpalim", + "absol": "Absol", + "wynaut": "Isso", + "snorunt": "Schneppke", + "glalie": "Firnontor", + "spheal": "Seemops", + "sealeo": "Seejong", + "walrein": "Walraisa", + "clamperl": "Perlu", + "huntail": "Aalabyss", + "gorebyss": "Saganabyss", + "relicanth": "Relicanth", + "luvdisc": "Liebiskus", + "bagon": "Kindwurm", + "shelgon": "Draschel", + "salamence": "Brutalanda", + "beldum": "Tanhel", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Chelast", + "grotle": "Chelcarain", + "torterra": "Chelterrar", + "chimchar": "Panflam", + "monferno": "Panpyro", + "infernape": "Panferno", + "piplup": "Plinfa", + "prinplup": "Pilprin", + "empoleon": "Impoleon", + "starly": "Staralili", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidiza", + "bibarel": "Bidifas", + "kricketot": "Zirpurze", + "kricketune": "Zirpeise", + "shinx": "Sheinux", + "luxio": "Luxio", + "luxray": "Luxtra", + "budew": "Knospi", + "roserade": "Roserade", + "cranidos": "Koknodon", + "rampardos": "Rameidon", + "shieldon": "Schilterus", + "bastiodon": "Bollterus", + "burmy": "Burmy", + "wormadam": "Burmadame", + "mothim": "Moterpel", + "combee": "Wadribie", + "vespiquen": "Honweisel", + "pachirisu": "Pachirisu", + "buizel": "Bamelin", + "floatzel": "Bojelin", + "cherubi": "Kikugi", + "cherrim": "Kinoso", + "shellos": "Schalellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambidiffel", + "drifloon": "Driftlon", + "drifblim": "Drifzepeli", + "buneary": "Haspiror", + "lopunny": "Schlapor", + "mismagius": "Traunmagil", + "honchkrow": "Kramshef", + "glameow": "Charmian", + "purugly": "Shnurgarst", + "chingling": "Klingplim", + "stunky": "Skunkapuh", + "skuntank": "Skuntank", + "bronzor": "Bronzel", + "bronzong": "Bronzong", + "bonsly": "Mobai", + "mime_jr": "Pantimimi", + "happiny": "Wonneira", + "chatot": "Plaudagei", + "spiritomb": "Kryppuk", + "gible": "Kaumalat", + "gabite": "Knarksel", + "garchomp": "Knackrack", + "munchlax": "Mampfaxo", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippoterus", + "skorupi": "Pionskora", + "drapion": "Piondragi", + "croagunk": "Glibunkel", + "toxicroak": "Toxiquak", + "carnivine": "Venuflibis", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantirps", + "snover": "Shnebedeck", + "abomasnow": "Rexblisar", + "weavile": "Snibunna", + "magnezone": "Magnezone", + "lickilicky": "Schlurplek", + "rhyperior": "Rihornior", + "tangrowth": "Tangoloss", + "electivire": "Elevoltek", + "magmortar": "Magbrant", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Folipurba", + "glaceon": "Glaziola", + "gliscor": "Skorgro", + "mamoswine": "Mamutel", + "porygon_z": "Porygon-Z", + "gallade": "Galagladi", + "probopass": "Voluminas", + "dusknoir": "Zwirrfinst", + "froslass": "Frosdedje", + "rotom": "Rotom", + "uxie": "Selfe", + "mesprit": "Vesprit", + "azelf": "Tobutz", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Serpifeu", + "servine": "Efoserp", + "serperior": "Serpiroyal", + "tepig": "Floink", + "pignite": "Ferkokel", + "emboar": "Flambirex", + "oshawott": "Ottaro", + "dewott": "Zwottronin", + "samurott": "Admurai", + "patrat": "Nagelotz", + "watchog": "Kukmarda", + "lillipup": "Yorkleff", + "herdier": "Terribark", + "stoutland": "Bissbark", + "purrloin": "Felilou", + "liepard": "Kleoparda", + "pansage": "Vegimak", + "simisage": "Vegichita", + "pansear": "Grillmak", + "simisear": "Grillchita", + "panpour": "Sodamak", + "simipour": "Sodachita", + "munna": "Somniam", + "musharna": "Somnivora", + "pidove": "Dusselgurr", + "tranquill": "Navitaub", + "unfezant": "Fasasnob", + "blitzle": "Elezeba", + "zebstrika": "Zebritz", + "roggenrola": "Kiesling", + "boldore": "Sedimantur", + "gigalith": "Brockoloss", + "woobat": "Fleknoil", + "swoobat": "Fletiamo", + "drilbur": "Rotomurf", + "excadrill": "Stalobor", + "audino": "Ohrdoch", + "timburr": "Praktibalk", + "gurdurr": "Strepoli", + "conkeldurr": "Meistagrif", + "tympole": "Schallquap", + "palpitoad": "Mebrana", + "seismitoad": "Branawarz", + "throh": "Jiutesto", + "sawk": "Karadonis", + "sewaddle": "Strawickl", + "swadloon": "Folikon", + "leavanny": "Matrifol", + "venipede": "Toxiped", + "whirlipede": "Rollum", + "scolipede": "Cerapendra", + "cottonee": "Waumboll", + "whimsicott": "Elfun", + "petilil": "Lilminip", + "lilligant": "Dressella", + "basculin": "Barschuft", + "sandile": "Ganovil", + "krokorok": "Rokkaiman", + "krookodile": "Rabigator", + "darumaka": "Flampion", + "darmanitan": "Flampivian", + "maractus": "Maracamba", + "dwebble": "Lithomith", + "crustle": "Castellith", + "scraggy": "Zurrokex", + "scrafty": "Irokex", + "sigilyph": "Symvolara", + "yamask": "Makabaja", + "cofagrigus": "Echnatoll", + "tirtouga": "Galapaflos", + "carracosta": "Karippas", + "archen": "Flapteryx", + "archeops": "Aeropteryx", + "trubbish": "Unratütox", + "garbodor": "Deponitox", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Picochilla", + "cinccino": "Chillabell", + "gothita": "Mollimorba", + "gothorita": "Hypnomorba", + "gothitelle": "Morbitesse", + "solosis": "Monozyto", + "duosion": "Mitodos", + "reuniclus": "Zytomega", + "ducklett": "Piccolente", + "swanna": "Swaroness", + "vanillite": "Gelatini", + "vanillish": "Gelatroppo", + "vanilluxe": "Gelatwino", + "deerling": "Sesokitz", + "sawsbuck": "Kronjuwild", + "emolga": "Emolga", + "karrablast": "Laukaps", + "escavalier": "Cavalanzas", + "foongus": "Tarnpignon", + "amoonguss": "Hutsassa", + "frillish": "Quabbel", + "jellicent": "Apoquallyp", + "alomomola": "Mamolida", + "joltik": "Wattzapf", + "galvantula": "Voltula", + "ferroseed": "Kastadur", + "ferrothorn": "Tentantel", + "klink": "Klikk", + "klang": "Kliklak", + "klinklang": "Klikdiklak", + "tynamo": "Zapplardin", + "eelektrik": "Zapplalek", + "eelektross": "Zapplarang", + "elgyem": "Pygraulon", + "beheeyem": "Megalon", + "litwick": "Lichtel", + "lampent": "Laternecto", + "chandelure": "Skelabra", + "axew": "Milza", + "fraxure": "Sharfax", + "haxorus": "Maxax", + "cubchoo": "Petznief", + "beartic": "Siberio", + "cryogonal": "Frigometri", + "shelmet": "Schnuthelm", + "accelgor": "Hydragil", + "stunfisk": "Flunschlik", + "mienfoo": "Lin-Fu", + "mienshao": "Wie-Shu", + "druddigon": "Shardrago", + "golett": "Golbit", + "golurk": "Golgantes", + "pawniard": "Gladiantri", + "bisharp": "Caesurio", + "bouffalant": "Bisofank", + "rufflet": "Geronimatz", + "braviary": "Washakwil", + "vullaby": "Skallyk", + "mandibuzz": "Grypheldis", + "heatmor": "Furnifraß", + "durant": "Fermicula", + "deino": "Kapuno", + "zweilous": "Duodino", + "hydreigon": "Trikephalo", + "larvesta": "Ignivor", + "volcarona": "Ramoth", + "cobalion": "Kobalium", + "terrakion": "Terrakium", + "virizion": "Viridium", + "tornadus": "Boreos", + "thundurus": "Voltolos", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Demeteros", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Igamaro", + "quilladin": "Igastarnish", + "chesnaught": "Brigaron", + "fennekin": "Fynx", + "braixen": "Rutena", + "delphox": "Fennexis", + "froakie": "Froxy", + "frogadier": "Amphizel", + "greninja": "Quajutsu", + "bunnelby": "Scoppel", + "diggersby": "Grebbit", + "fletchling": "Dartiri", + "fletchinder": "Dartignis", + "talonflame": "Fiaro", + "scatterbug": "Purmel", + "spewpa": "Puponcho", + "vivillon": "Vivillon", + "litleo": "Leufeo", + "pyroar": "Pyroleo", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Mähikel", + "gogoat": "Chevrumm", + "pancham": "Pam-Pam", + "pangoro": "Pandagro", + "furfrou": "Coiffwaff", + "espurr": "Psiau", + "meowstic": "Psiaugon", + "honedge": "Gramokles", + "doublade": "Duokles", + "aegislash": "Durengard", + "spritzee": "Parfi", + "aromatisse": "Parfinesse", + "swirlix": "Flauschling", + "slurpuff": "Sabbaione", + "inkay": "Iscalar", + "malamar": "Calamanero", + "binacle": "Bithora", + "barbaracle": "Thanathora", + "skrelp": "Algitt", + "dragalge": "Tandrak", + "clauncher": "Scampisto", + "clawitzer": "Wummer", + "helioptile": "Eguana", + "heliolisk": "Elezard", + "tyrunt": "Balgoras", + "tyrantrum": "Monargoras", + "amaura": "Amarino", + "aurorus": "Amagarga", + "sylveon": "Feelinara", + "hawlucha": "Resladero", + "dedenne": "Dedenne", + "carbink": "Rocara", + "goomy": "Viscora", + "sliggoo": "Viscargot", + "goodra": "Viscogon", + "klefki": "Clavion", + "phantump": "Paragoni", + "trevenant": "Trombork", + "pumpkaboo": "Irrbis", + "gourgeist": "Pumpdjinn", + "bergmite": "Arktip", + "avalugg": "Arktilas", + "noibat": "eF-eM", + "noivern": "UHaFnir", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Bauz", + "dartrix": "Arboretoss", + "decidueye": "Silvarro", + "litten": "Flamiau", + "torracat": "Miezunder", + "incineroar": "Fuegro", + "popplio": "Robball", + "brionne": "Marikeck", + "primarina": "Primarene", + "pikipek": "Peppeck", + "trumbeak": "Trompeck", + "toucannon": "Tukanon", + "yungoos": "Mangunior", + "gumshoos": "Manguspektor", + "grubbin": "Mabula", + "charjabug": "Akkup", + "vikavolt": "Donarion", + "crabrawler": "Krabbox", + "crabominable": "Krawell", + "oricorio": "Choreogel", + "cutiefly": "Wommel", + "ribombee": "Bandelby", + "rockruff": "Wuffels", + "lycanroc": "Wolwerock", + "wishiwashi": "Lusardin", + "mareanie": "Garstella", + "toxapex": "Aggrostella", + "mudbray": "Pampuli", + "mudsdale": "Pampross", + "dewpider": "Araqua", + "araquanid": "Aranestro", + "fomantis": "Imantis", + "lurantis": "Mantidea", + "morelull": "Bubungus", + "shiinotic": "Lamellux", + "salandit": "Molunk", + "salazzle": "Amfira", + "stufful": "Velursi", + "bewear": "Kosturso", + "bounsweet": "Frubberl", + "steenee": "Frubaila", + "tsareena": "Fruyal", + "comfey": "Curelei", + "oranguru": "Kommandutan", + "passimian": "Quartermak", + "wimpod": "Reißlaus", + "golisopod": "Tectass", + "sandygast": "Sankabuh", + "palossand": "Colossand", + "pyukumuku": "Gufa", + "type_null": "Typ:Null", + "silvally": "Amigento", + "minior": "Meteno", + "komala": "Koalelu", + "turtonator": "Tortunator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimigma", + "bruxish": "Knirfish", + "drampa": "Sen-Long", + "dhelmise": "Moruda", + "jangmo_o": "Miniras", + "hakamo_o": "Mediras", + "kommo_o": "Grandiras", + "tapu_koko": "Kapu-Riki", + "tapu_lele": "Kapu-Fala", + "tapu_bulu": "Kapu-Toro", + "tapu_fini": "Kapu-Kime", + "cosmog": "Cosmog", + "cosmoem": "Cosmovum", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Anego", + "buzzwole": "Masskito", + "pheromosa": "Schabelle", + "xurkitree": "Voltriant", + "celesteela": "Kaguron", + "kartana": "Katagami", + "guzzlord": "Schlingking", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Venicro", + "naganadel": "Agoyon", + "stakataka": "Muramura", + "blacephalon": "Kopplosio", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Chimpep", + "thwackey": "Chimstix", + "rillaboom": "Gortrom", + "scorbunny": "Hopplo", + "raboot": "Kickerlo", + "cinderace": "Liberlo", + "sobble": "Memmeon", + "drizzile": "Phlegleon", + "inteleon": "Intelleon", + "skwovet": "Raffel", + "greedent": "Schlaraffel", + "rookidee": "Meikro", + "corvisquire": "Kranoviz", + "corviknight": "Krarmor", + "blipbug": "Sensect", + "dottler": "Keradar", + "orbeetle": "Maritellit", + "nickit": "Kleptifux", + "thievul": "Gaunux", + "gossifleur": "Cottini", + "eldegoss": "Cottomi", + "wooloo": "Wolly", + "dubwool": "Zwollock", + "chewtle": "Kamehaps", + "drednaw": "Kamalm", + "yamper": "Voldi", + "boltund": "Bellektro", + "rolycoly": "Klonkett", + "carkol": "Wagong", + "coalossal": "Montecarbo", + "applin": "Knapfel", + "flapple": "Drapfel", + "appletun": "Schlapfel", + "silicobra": "Salanga", + "sandaconda": "Sanaconda", + "cramorant": "Urgl", + "arrokuda": "Pikuda", + "barraskewda": "Barrakiefa", + "toxel": "Toxel", + "toxtricity": "Riffex", + "sizzlipede": "Thermopod", + "centiskorch": "Infernopod", + "clobbopus": "Klopptopus", + "grapploct": "Kaocto", + "sinistea": "Fatalitee", + "polteageist": "Mortipot", + "hatenna": "Brimova", + "hattrem": "Brimano", + "hatterene": "Silembrim", + "impidimp": "Bähmon", + "morgrem": "Pelzebub", + "grimmsnarl": "Olangaar", + "obstagoon": "Barrikadax", + "perrserker": "Mauzinger", + "cursola": "Gorgasonn", + "sirfetchd": "Lauchzelot", + "mr_rime": "Pantifrost", + "runerigus": "Oghnatoll", + "milcery": "Hokumil", + "alcremie": "Pokusan", + "falinks": "Legios", + "pincurchin": "Britzigel", + "snom": "Snomnom", + "frosmoth": "Mottineva", + "stonjourner": "Humanolith", + "eiscue": "Kubuin", + "indeedee": "Servol", + "morpeko": "Morpeko", + "cufant": "Kupfanti", + "copperajah": "Patinaraja", + "dracozolt": "Lectragon", + "arctozolt": "Lecryodon", + "dracovish": "Pescragon", + "arctovish": "Pescryodon", + "duraludon": "Duraludon", + "dreepy": "Grolldra", + "drakloak": "Phandra", + "dragapult": "Katapuldra", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Endynalos", + "kubfu": "Dakuma", + "urshifu": "Wulaosu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Polaross", + "spectrier": "Phantoross", + "calyrex": "Coronospa", + "wyrdeer": "Damythir", + "kleavor": "Axantor", + "ursaluna": "Ursaluna", + "basculegion": "Salmagnis", + "sneasler": "Snieboss", + "overqwil": "Myriador", + "enamorus": "Cupidos", + "sprigatito": "Felori", + "floragato": "Feliospa", + "meowscarada": "Maskagato", + "fuecoco": "Krokel", + "crocalor": "Lokroko", + "skeledirge": "Skelokrok", + "quaxly": "Kwaks", + "quaxwell": "Fuentente", + "quaquaval": "Bailonda", + "lechonk": "Ferkuli", + "oinkologne": "Fragrunz", + "tarountula": "Tarundel", + "spidops": "Spinsidias", + "nymble": "Micrick", + "lokix": "Lextremo", + "pawmi": "Pamo", + "pawmo": "Pamamo", + "pawmot": "Pamomamo", + "tandemaus": "Zwieps", + "maushold": "Famieps", + "fidough": "Hefel", + "dachsbun": "Backel", + "smoliv": "Olini", + "dolliv": "Olivinio", + "arboliva": "Olithena", + "squawkabilly": "Krawalloro", + "nacli": "Geosali", + "naclstack": "Sedisal", + "garganacl": "Saltigant", + "charcadet": "Knarbon", + "armarouge": "Crimanzo", + "ceruledge": "Azugladis", + "tadbulb": "Blipp", + "bellibolt": "Wampitz", + "wattrel": "Voltrel", + "kilowattrel": "Voltrean", + "maschiff": "Mobtiff", + "mabosstiff": "Mastifioso", + "shroodle": "Sproxi", + "grafaiai": "Affiti", + "bramblin": "Weherba", + "brambleghast": "Horrerba", + "toedscool": "Tentagra", + "toedscruel": "Tenterra", + "klawf": "Klibbe", + "capsakid": "Chilingel", + "scovillain": "Halupenjo", + "rellor": "Relluk", + "rabsca": "Skarabaks", + "flittle": "Flattutu", + "espathra": "Psiopatra", + "tinkatink": "Forgita", + "tinkatuff": "Tafforgita", + "tinkaton": "Granforgita", + "wiglett": "Schligda", + "wugtrio": "Schligdri", + "bombirdier": "Adebom", + "finizen": "Normifin", + "palafin": "Delfinator", + "varoom": "Knattox", + "revavroom": "Knattatox", + "cyclizar": "Mopex", + "orthworm": "Schlurm", + "glimmet": "Lumispross", + "glimmora": "Lumiflora", + "greavard": "Gruff", + "houndstone": "Friedwuff", + "flamigo": "Flaminkno", + "cetoddle": "Flaniwal", + "cetitan": "Kolowal", + "veluza": "Agiluza", + "dondozo": "Heerashai", + "tatsugiri": "Nigiragi", + "annihilape": "Epitaff", + "clodsire": "Suelord", + "farigiraf": "Farigiraf", + "dudunsparce": "Dummimisel", + "kingambit": "Gladimperio", + "great_tusk": "Riesenzahn", + "scream_tail": "Brüllschweif", + "brute_bonnet": "Wutpilz", + "flutter_mane": "Flatterhaar", + "slither_wing": "Kriechflügel", + "sandy_shocks": "Sandfell", + "iron_treads": "Eisenrad", + "iron_bundle": "Eisenbündel", + "iron_hands": "Eisenhand", + "iron_jugulis": "Eisenhals", + "iron_moth": "Eisenfalter", + "iron_thorns": "Eisendorn", + "frigibax": "Frospino", + "arctibax": "Cryospino", + "baxcalibur": "Espinodon", + "gimmighoul": "Gierspenst", + "gholdengo": "Monetigo", + "wo_chien": "Chongjian", + "chien_pao": "Baojian", + "ting_lu": "Dinglu", + "chi_yu": "Yuyu", + "roaring_moon": "Donnersichel", + "iron_valiant": "Eisenkrieger", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Windewoge", + "iron_leaves": "Eisenblatt", + "dipplin": "Sirapfel", + "poltchageist": "Mortcha", + "sinistcha": "Fatalitcha", + "okidogi": "Boninu", + "munkidori": "Benesaru", + "fezandipiti": "Beatori", + "ogerpon": "Ogerpon", + "archaludon": "Briduradon", + "hydrapple": "Hydrapfel", + "gouging_fire": "Keilflamme", + "raging_bolt": "Furienblitz", + "iron_boulder": "Eisenfels", + "iron_crown": "Eisenhaupt", + "terapagos": "Terapagos", + "pecharunt": "Infamomo", + "alola_rattata": "Rattfratz", + "alola_raticate": "Rattikarl", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandan", + "alola_sandslash": "Sandamer", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Vulnona", + "alola_diglett": "Digda", + "alola_dugtrio": "Digdri", + "alola_meowth": "Mauzi", + "alola_persian": "Snobilikat", + "alola_geodude": "Kleinstein", + "alola_graveler": "Georok", + "alola_golem": "Geowaz", + "alola_grimer": "Sleima", + "alola_muk": "Sleimok", + "alola_exeggutor": "Kokowei", + "alola_marowak": "Knogga", + "eternal_floette": "Floette", + "galar_meowth": "Mauzi", + "galar_ponyta": "Ponita", + "galar_rapidash": "Gallopa", + "galar_slowpoke": "Flegmon", + "galar_slowbro": "Lahmus", + "galar_farfetchd": "Porenta", + "galar_weezing": "Smogmog", + "galar_mr_mime": "Pantimos", + "galar_articuno": "Arktos", + "galar_zapdos": "Zapdos", + "galar_moltres": "Lavados", + "galar_slowking": "Laschoking", + "galar_corsola": "Corasonn", + "galar_zigzagoon": "Zigzachs", + "galar_linoone": "Geradaks", + "galar_darumaka": "Flampion", + "galar_darmanitan": "Flampivian", + "galar_yamask": "Makabaja", + "galar_stunfisk": "Flunschlik", + "hisui_growlithe": "Fukano", + "hisui_arcanine": "Arkani", + "hisui_voltorb": "Voltobal", + "hisui_electrode": "Lektrobal", + "hisui_typhlosion": "Tornupto", + "hisui_qwilfish": "Baldorfish", + "hisui_sneasel": "Sniebel", + "hisui_samurott": "Admurai", + "hisui_lilligant": "Dressella", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Washakwil", + "hisui_sliggoo": "Viscargot", + "hisui_goodra": "Viscogon", + "hisui_avalugg": "Arktilas", + "hisui_decidueye": "Silvarro", + "paldea_tauros": "Tauros", + "paldea_wooper": "Felino", + "bloodmoon_ursaluna": "Ursaluna", +} as const; diff --git a/src/locales/de/splash-messages.ts b/src/locales/de/splash-messages.ts index 4bbe9a254925..cceb3043fd39 100644 --- a/src/locales/de/splash-messages.ts +++ b/src/locales/de/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Kämpfe gewonnen!", - "joinTheDiscord": "Tritt dem Discord bei!", - "infiniteLevels": "Unendliche Level!", - "everythingStacks": "Alles stapelt sich!", - "optionalSaveScumming": "Optionales Save Scumming!", - "biomes": "35 Biome!", - "openSource": "Open Source!", - "playWithSpeed": "Spiele mit fünffacher Geschwindigkeit!", - "liveBugTesting": "Live-Bug-Tests!", - "heavyInfluence": "Starker RoR2-Einfluss!", - "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", - "nowWithMoreSalt": "Jetzt mit 33% mehr Salz!", - "infiniteFusionAtHome": "Wir haben Infinite Fusionen zu Hause!", - "brokenEggMoves": "Übermächtige Ei-Attacken!", - "magnificent": "Herrlich!", - "mubstitute": "Melegator!", - "thatsCrazy": "Das ist verrückt!", - "oranceJuice": "Orangensaft!", - "questionableBalancing": "Fragwürdiges Balancing!", - "coolShaders": "Coole Shader!", - "aiFree": "Ohne KI!", - "suddenDifficultySpikes": "Plötzliche Schwierigkeitsspitzen!", - "basedOnAnUnfinishedFlashGame": "Basierend auf einem unfertigen Flash-Spiel!", - "moreAddictiveThanIntended": "Süchtig machender als beabsichtigt!", - "mostlyConsistentSeeds": "Meistens konsistente Seeds!", - "achievementPointsDontDoAnything": "Erungenschaftspunkte tun nichts!", - "youDoNotStartAtLevel": "Du startest nicht auf Level 2000!", - "dontTalkAboutTheManaphyEggIncident": "Wir reden nicht über den Manaphy-Ei-Vorfall!", - "alsoTryPokengine": "Versuche auch Pokéngine!", - "alsoTryEmeraldRogue": "Versuche auch Emerald Rogue!", - "alsoTryRadicalRed": "Versuche auch Radical Red!", - "eeveeExpo": "Evoli-Expo!", - "ynoproject": "YNO-Projekt!", -} as const; \ No newline at end of file + "battlesWon": "Kämpfe gewonnen!", + "joinTheDiscord": "Tritt dem Discord bei!", + "infiniteLevels": "Unendliche Level!", + "everythingStacks": "Alles stapelt sich!", + "optionalSaveScumming": "Optionales Save Scumming!", + "biomes": "35 Biome!", + "openSource": "Open Source!", + "playWithSpeed": "Spiele mit fünffacher Geschwindigkeit!", + "liveBugTesting": "Live-Bug-Tests!", + "heavyInfluence": "Starker RoR2-Einfluss!", + "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", + "nowWithMoreSalt": "Jetzt mit 33% mehr Salz!", + "infiniteFusionAtHome": "Wir haben Infinite Fusionen zu Hause!", + "brokenEggMoves": "Übermächtige Ei-Attacken!", + "magnificent": "Herrlich!", + "mubstitute": "Melegator!", + "thatsCrazy": "Das ist verrückt!", + "oranceJuice": "Orangensaft!", + "questionableBalancing": "Fragwürdiges Balancing!", + "coolShaders": "Coole Shader!", + "aiFree": "Ohne KI!", + "suddenDifficultySpikes": "Plötzliche Schwierigkeitsspitzen!", + "basedOnAnUnfinishedFlashGame": "Basierend auf einem unfertigen Flash-Spiel!", + "moreAddictiveThanIntended": "Süchtig machender als beabsichtigt!", + "mostlyConsistentSeeds": "Meistens konsistente Seeds!", + "achievementPointsDontDoAnything": "Erungenschaftspunkte tun nichts!", + "youDoNotStartAtLevel": "Du startest nicht auf Level 2000!", + "dontTalkAboutTheManaphyEggIncident": "Wir reden nicht über den Manaphy-Ei-Vorfall!", + "alsoTryPokengine": "Versuche auch Pokéngine!", + "alsoTryEmeraldRogue": "Versuche auch Emerald Rogue!", + "alsoTryRadicalRed": "Versuche auch Radical Red!", + "eeveeExpo": "Evoli-Expo!", + "ynoproject": "YNO-Projekt!", +} as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index 0723c14ad827..c1d3633e7bfd 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam": "Mit diesen Pokémon losziehen?", - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "Wachstum:", - "ability": "Fähgkeit:", - "passive": "Passiv:", - "nature": "Wesen:", - "eggMoves": "Ei-Attacken", - "start": "Start", - "addToParty": "Zum Team hinzufügen", - "toggleIVs": "DVs anzeigen/verbergen", - "manageMoves": "Attacken ändern", - "useCandies": "Bonbons verwenden", - "selectMoveSwapOut": "Wähle die zu ersetzende Attacke.", - "selectMoveSwapWith": "Wähle die gewünschte Attacke.", - "unlockPassive": "Passiv-Skill freischalten", - "reduceCost": "Preis reduzieren", - "cycleShiny": "R: Schillernd Ja/Nein", - "cycleForm": "F: Form ändern", - "cycleGender": "G: Geschlecht ändern", - "cycleAbility": "E: Fähigkeit ändern", - "cycleNature": "N: Wesen Ändern", - "cycleVariant": "V: Seltenheit ändern", - "enablePassive": "Passiv-Skill aktivieren", - "disablePassive": "Passiv-Skill deaktivieren", - "locked": "Gesperrt", - "disabled": "Deaktiviert", - "uncaught": "Ungefangen" -} + "confirmStartTeam": "Mit diesen Pokémon losziehen?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "Wachstum:", + "ability": "Fähgkeit:", + "passive": "Passiv:", + "nature": "Wesen:", + "eggMoves": "Ei-Attacken", + "start": "Start", + "addToParty": "Zum Team hinzufügen", + "toggleIVs": "DVs anzeigen/verbergen", + "manageMoves": "Attacken ändern", + "useCandies": "Bonbons verwenden", + "selectMoveSwapOut": "Wähle die zu ersetzende Attacke.", + "selectMoveSwapWith": "Wähle die gewünschte Attacke.", + "unlockPassive": "Passiv-Skill freischalten", + "reduceCost": "Preis reduzieren", + "cycleShiny": "R: Schillernd Ja/Nein", + "cycleForm": "F: Form ändern", + "cycleGender": "G: Geschlecht ändern", + "cycleAbility": "E: Fähigkeit ändern", + "cycleNature": "N: Wesen Ändern", + "cycleVariant": "V: Seltenheit ändern", + "enablePassive": "Passiv-Skill aktivieren", + "disablePassive": "Passiv-Skill deaktivieren", + "locked": "Gesperrt", + "disabled": "Deaktiviert", + "uncaught": "Ungefangen" +}; diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index 93eb04cca676..b221330fcf0c 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -2,243 +2,243 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Top Vier", - "gym_leader": "Arenaleiter", - "gym_leader_female": "Arenaleiterin", - "champion": "Champion", - "rival": "Rivale", - "professor": "Professor", - "frontier_brain": "Kampfkoryphäen", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Top Vier", + "gym_leader": "Arenaleiter", + "gym_leader_female": "Arenaleiterin", + "champion": "Champion", + "rival": "Rivale", + "professor": "Professor", + "frontier_brain": "Kampfkoryphäen", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ass-Trainer", - "ace_trainer_female": "Ass-Trainerin", - "ace_duo": "Ass-Duo", - "artist": "Künstler", - "artist_female": "Künstlerin", - "backers": "Anhänger", - "backpacker": "Backpacker", - "backpacker_female": "Backpackerin", - "backpackers": "Backpacker", - "baker": "Bäckerin", - "battle_girl": "Kämpferin", - "beauty": "Schönheit", - "beginners": "Anfänger", - "biker": "Rowdy", - "black_belt": "Schwarzgurt", - "breeder": "Pokémon Züchter", - "breeder_female": "Pokémon Züchterin", - "breeders": "Pokémon Züchter", - "clerk": "Angestellter", - "clerk_female": "Angestellte", - "colleagues": "Geschäftspartner", - "crush_kin": "Mühlensippe", - "cyclist": "Biker", - "cyclist_female": "Bikerin", - "cyclists": "Biker", - "dancer": "Tänzer", - "dancer_female": "Tänzerin", - "depot_agent": "Bahnangestellter", - "doctor": "Arzt", - "doctor_female": "Ärztin", - "fisherman": "Angler", - "fisherman_female": "Angler", // Seems to be the same in german but exists in other languages like italian - "gentleman": "Gentleman", - "guitarist": "Gitarrist", - "guitarist_female": "Gitarristin", - "harlequin": "Kasper", - "hiker": "Wanderer", - "hooligans": "Rabauken", - "hoopster": "Basketballer", - "infielder": "Baseballer", - "janitor": "Hausmeister", - "lady": "Lady", - "lass": "Göre", - "linebacker": "Footballer", - "maid": "Zofe", - "madame": "Madam", - "medical_team": "Mediziner", - "musician": "Musiker", - "hex_maniac": "Hexe", - "nurse": "Pflegerin", - "nursery_aide": "Erzieherin", - "officer": "Polizist", - "parasol_lady": "Schirmdame", - "pilot": "Pilot", - "pokéfan": "Pokéfan", - "pokéfan_female": "Pokéfan", - "pokéfan_family": "Pokéfan-Pärchen", - "preschooler": "Vorschüler", - "preschooler_female": "Vorschülerin", - "preschoolers": "Vorschüler", - "psychic": "Seher", - "psychic_female": "Seherin", - "psychics": "Seher", - "pokémon_ranger": "Pokémon-Ranger", - "pokémon_ranger_female": "Pokémon-Ranger", - "pokémon_rangers": "Pokémon-Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Angestellte", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Schnösel", - "rich_couple": "Reiches Paar", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "Schnösel", - "roughneck": "Raufbold", - "scientist": "Forscher", - "scientist_female": "Forscherin", - "scientists": "Forscher", - "smasher": "Tennis-Ass", - "snow_worker": "Schneearbeiter", // There is a trainer type for this but no actual trainer class? They seem to be just workers but dressed differently - "snow_worker_female": "Schneearbeiterin", - "striker": "Fußballer", - "school_kid": "Schulkind", - "school_kid_female": "Schulkind", // Same in german but different in italian - "school_kids": "Schüler", - "swimmer": "Schwimmer", - "swimmer_female": "Schwimmerin", - "swimmers": "Schwimmerpaar", - "twins": "Zwillinge", - "veteran": "Veteran", - "veteran_female": "Veteran", // same in german, different in other languages - "veteran_duo": "Veteranen", - "waiter": "Servierer", - "waitress": "Serviererin", - "worker": "Arbeiter", - "worker_female": "Arbeiterin", - "workers": "Arbeiter", - "youngster": "Knirps" + "ace_trainer": "Ass-Trainer", + "ace_trainer_female": "Ass-Trainerin", + "ace_duo": "Ass-Duo", + "artist": "Künstler", + "artist_female": "Künstlerin", + "backers": "Anhänger", + "backpacker": "Backpacker", + "backpacker_female": "Backpackerin", + "backpackers": "Backpacker", + "baker": "Bäckerin", + "battle_girl": "Kämpferin", + "beauty": "Schönheit", + "beginners": "Anfänger", + "biker": "Rowdy", + "black_belt": "Schwarzgurt", + "breeder": "Pokémon Züchter", + "breeder_female": "Pokémon Züchterin", + "breeders": "Pokémon Züchter", + "clerk": "Angestellter", + "clerk_female": "Angestellte", + "colleagues": "Geschäftspartner", + "crush_kin": "Mühlensippe", + "cyclist": "Biker", + "cyclist_female": "Bikerin", + "cyclists": "Biker", + "dancer": "Tänzer", + "dancer_female": "Tänzerin", + "depot_agent": "Bahnangestellter", + "doctor": "Arzt", + "doctor_female": "Ärztin", + "fisherman": "Angler", + "fisherman_female": "Angler", // Seems to be the same in german but exists in other languages like italian + "gentleman": "Gentleman", + "guitarist": "Gitarrist", + "guitarist_female": "Gitarristin", + "harlequin": "Kasper", + "hiker": "Wanderer", + "hooligans": "Rabauken", + "hoopster": "Basketballer", + "infielder": "Baseballer", + "janitor": "Hausmeister", + "lady": "Lady", + "lass": "Göre", + "linebacker": "Footballer", + "maid": "Zofe", + "madame": "Madam", + "medical_team": "Mediziner", + "musician": "Musiker", + "hex_maniac": "Hexe", + "nurse": "Pflegerin", + "nursery_aide": "Erzieherin", + "officer": "Polizist", + "parasol_lady": "Schirmdame", + "pilot": "Pilot", + "pokéfan": "Pokéfan", + "pokéfan_female": "Pokéfan", + "pokéfan_family": "Pokéfan-Pärchen", + "preschooler": "Vorschüler", + "preschooler_female": "Vorschülerin", + "preschoolers": "Vorschüler", + "psychic": "Seher", + "psychic_female": "Seherin", + "psychics": "Seher", + "pokémon_ranger": "Pokémon-Ranger", + "pokémon_ranger_female": "Pokémon-Ranger", + "pokémon_rangers": "Pokémon-Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Angestellte", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "Schnösel", + "rich_couple": "Reiches Paar", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "Schnösel", + "roughneck": "Raufbold", + "scientist": "Forscher", + "scientist_female": "Forscherin", + "scientists": "Forscher", + "smasher": "Tennis-Ass", + "snow_worker": "Schneearbeiter", // There is a trainer type for this but no actual trainer class? They seem to be just workers but dressed differently + "snow_worker_female": "Schneearbeiterin", + "striker": "Fußballer", + "school_kid": "Schulkind", + "school_kid_female": "Schulkind", // Same in german but different in italian + "school_kids": "Schüler", + "swimmer": "Schwimmer", + "swimmer_female": "Schwimmerin", + "swimmers": "Schwimmerpaar", + "twins": "Zwillinge", + "veteran": "Veteran", + "veteran_female": "Veteran", // same in german, different in other languages + "veteran_duo": "Veteranen", + "waiter": "Servierer", + "waitress": "Serviererin", + "worker": "Arbeiter", + "worker_female": "Arbeiterin", + "workers": "Arbeiter", + "youngster": "Knirps" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Rocko", - "misty": "Misty", - "lt_surge": "Major Bob", - "erika": "Erika", - "janine": "Janina", - "sabrina": "Sabrina", - "blaine": "Pyro", - "giovanni": "Giovanni", - "falkner": "Falk", - "bugsy": "Kai", - "whitney": "Bianka", - "morty": "Jens", - "chuck": "Hartwig", - "jasmine": "Jasmin", - "pryce": "Norbert", - "clair": "Sandra", - "roxanne": "Felizia", - "brawly": "Kamillo", - "wattson": "Walter", - "flannery": "Flavia", - "norman": "Norman", - "winona": "Wibke", - "tate": "Ben", - "liza": "Svenja", - "juan": "Juan", - "roark": "Veit", - "gardenia": "Silvana", - "maylene": "Hilda", - "crasher_wake": "Wellenbrecher Marinus", - "fantina": "Lamina", - "byron": "Adam", - "candice": "Frida", - "volkner": "Volkner", - "cilan": "Benny", - "chili": "Maik", - "cress": "Colin", - "cheren": "Cheren", - "lenora": "Aloe", - "roxie": "Mica", - "burgh": "Artie", - "elesa": "Kamilla", - "clay": "Turner", - "skyla": "Géraldine", - "brycen": "Sandro", - "drayden": "Lysander", - "marlon": "Benson", - "viola": "Viola", - "grant": "Lino", - "korrina": "Connie", - "ramos": "Amaro", - "clemont": "Citro", - "valerie": "Valerie", - "olympia": "Astrid", - "wulfric": "Galantho", - "milo": "Yarro", - "nessa": "Kate", - "kabu": "Kabu", - "bea": "Saida", - "allister": "Nio", - "opal": "Papella", - "bede": "Betys", - "gordie": "Mac", - "melony": "Mel", - "piers": "Nezz", - "marnie": "Mary", - "raihan": "Roy", - "katy": "Ronah", - "brassius": "Colzo", - "iono": "Enigmara", - "kofu": "Kombu", - "larry": "Aoki", - "ryme": "Etta", - "tulip": "Tulia", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agathe", - "lance": "Siegfried", - "will": "Willi", - "koga": "Koga", - "karen": "Melanie", - "sidney": "Ulrich", - "phoebe": "Antonia", - "glacia": "Frosina", - "drake": "Dragan", - "aaron": "Herbaro", - "bertha": "Teresa", - "flint": "Ignaz", - "lucian": "Lucian", - "shauntal": "Anissa", - "marshal": "Eugen", - "grimsley": "Astor", - "caitlin": "Kattlea", - "malva": "Pachira", - "siebold": "Narcisse", - "wikstrom": "Thymelot", - "drasna": "Dracena", - "hala": "Hala", - "molayne": "Marlon", - "olivia": "Mayla", - "acerola": "Lola", - "kahili": "Kahili", - "rika": "Cay", - "poppy": "Poppy", - "hassel": "Sinius", - "crispin": "Matt", - "amarys": "Erin", - "lacey": "Tara", - "drayton": "Levy", - "blue": "Blau", - "red": "Rot", - "steven": "Troy", - "wallace": "Wassili", - "cynthia": "Cynthia", - "alder": "Lauro", - "iris": "Lilia", - "diantha": "Diantha", - "hau": "Tali", - "geeta": "Sagaria", - "nemona": "Nemila", - "kieran": "Jo", - "leon": "Delion", - "rival": "Finn", - "rival_female": "Ivy", -} as const; \ No newline at end of file + "brock": "Rocko", + "misty": "Misty", + "lt_surge": "Major Bob", + "erika": "Erika", + "janine": "Janina", + "sabrina": "Sabrina", + "blaine": "Pyro", + "giovanni": "Giovanni", + "falkner": "Falk", + "bugsy": "Kai", + "whitney": "Bianka", + "morty": "Jens", + "chuck": "Hartwig", + "jasmine": "Jasmin", + "pryce": "Norbert", + "clair": "Sandra", + "roxanne": "Felizia", + "brawly": "Kamillo", + "wattson": "Walter", + "flannery": "Flavia", + "norman": "Norman", + "winona": "Wibke", + "tate": "Ben", + "liza": "Svenja", + "juan": "Juan", + "roark": "Veit", + "gardenia": "Silvana", + "maylene": "Hilda", + "crasher_wake": "Wellenbrecher Marinus", + "fantina": "Lamina", + "byron": "Adam", + "candice": "Frida", + "volkner": "Volkner", + "cilan": "Benny", + "chili": "Maik", + "cress": "Colin", + "cheren": "Cheren", + "lenora": "Aloe", + "roxie": "Mica", + "burgh": "Artie", + "elesa": "Kamilla", + "clay": "Turner", + "skyla": "Géraldine", + "brycen": "Sandro", + "drayden": "Lysander", + "marlon": "Benson", + "viola": "Viola", + "grant": "Lino", + "korrina": "Connie", + "ramos": "Amaro", + "clemont": "Citro", + "valerie": "Valerie", + "olympia": "Astrid", + "wulfric": "Galantho", + "milo": "Yarro", + "nessa": "Kate", + "kabu": "Kabu", + "bea": "Saida", + "allister": "Nio", + "opal": "Papella", + "bede": "Betys", + "gordie": "Mac", + "melony": "Mel", + "piers": "Nezz", + "marnie": "Mary", + "raihan": "Roy", + "katy": "Ronah", + "brassius": "Colzo", + "iono": "Enigmara", + "kofu": "Kombu", + "larry": "Aoki", + "ryme": "Etta", + "tulip": "Tulia", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agathe", + "lance": "Siegfried", + "will": "Willi", + "koga": "Koga", + "karen": "Melanie", + "sidney": "Ulrich", + "phoebe": "Antonia", + "glacia": "Frosina", + "drake": "Dragan", + "aaron": "Herbaro", + "bertha": "Teresa", + "flint": "Ignaz", + "lucian": "Lucian", + "shauntal": "Anissa", + "marshal": "Eugen", + "grimsley": "Astor", + "caitlin": "Kattlea", + "malva": "Pachira", + "siebold": "Narcisse", + "wikstrom": "Thymelot", + "drasna": "Dracena", + "hala": "Hala", + "molayne": "Marlon", + "olivia": "Mayla", + "acerola": "Lola", + "kahili": "Kahili", + "rika": "Cay", + "poppy": "Poppy", + "hassel": "Sinius", + "crispin": "Matt", + "amarys": "Erin", + "lacey": "Tara", + "drayton": "Levy", + "blue": "Blau", + "red": "Rot", + "steven": "Troy", + "wallace": "Wassili", + "cynthia": "Cynthia", + "alder": "Lauro", + "iris": "Lilia", + "diantha": "Diantha", + "hau": "Tali", + "geeta": "Sagaria", + "nemona": "Nemila", + "kieran": "Jo", + "leon": "Delion", + "rival": "Finn", + "rival_female": "Ivy", +} as const; diff --git a/src/locales/de/tutorial.ts b/src/locales/de/tutorial.ts index 1c4ada3c149e..7d45314717dc 100644 --- a/src/locales/de/tutorial.ts +++ b/src/locales/de/tutorial.ts @@ -1,34 +1,34 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Willkommen bei PokéRogue! Dies ist ein kampforientiertes Pokémon-Fangame mit Roguelite-Elementen. + "intro": `Willkommen bei PokéRogue! Dies ist ein kampforientiertes Pokémon-Fangame mit Roguelite-Elementen. $Dieses Spiel ist nicht monetarisiert. $Wir erheben keinen Eigentumsanspruch an Pokémon oder\nverwendeten, urheberrechtlich geschützten Inhalten. $Das Spiel befindet sich noch in der Entwicklung, ist aber voll spielbar. $Für Fehlerberichte nutze bitte den PokéRogue Discord-Server. $Sollte das Spiel langsam laufen, überprüfe, ob in deinem Browser "Hardwarebeschleunigung" aktiviert ist.`, - "accessMenu": `Nutze M oder Esc, um das Menü zu öffnen. Dort hast du Zugriff auf die Einstellungen und andere Funktionen.`, + "accessMenu": "Nutze M oder Esc, um das Menü zu öffnen. Dort hast du Zugriff auf die Einstellungen und andere Funktionen.", - "menu": `In diesem Menü hast du Zugriff auf die Einstellungen. + "menu": `In diesem Menü hast du Zugriff auf die Einstellungen. $Dort kannst du u. A. die Spielgeschwin-\ndigkeit und das Fensterdesign ändern. $Das Menü verbirgt noch andere Funktionen - probier' sie gerne aus!`, - "starterSelect": `Hier kannst du deine Starter-Pokémon auswählen.\nSie begleiten dich am Anfang deines Abenteuers. + "starterSelect": `Hier kannst du deine Starter-Pokémon auswählen.\nSie begleiten dich am Anfang deines Abenteuers. $Jeder Starter hat einen Preis. Dein Team kann bis zu sechs\nMitglieder haben, solange der Gesamtpreis max. 10 beträgt. $Du kannst Geschlecht, Fähigkeit und Form beliebig auswählen,\nsobald du sie mindestens einmal gefangen hast. $Die DVs ergeben sich aus den Höchstwerten aller Pokémon,\ndie du bereits gefangen hast. $Es lohnt sich also, das selbe Pokémon mehrmals zu fangen!`, - "pokerus": `Jeden Tag haben drei zufällige Pokémon einen lila Rahmen. + "pokerus": `Jeden Tag haben drei zufällige Pokémon einen lila Rahmen. $Wenn du eins von ihnen besitzt, $nimm es doch mal mit und sieh dir seinen Bericht an!`, - "statChange": `Statuswertveränderungen halten solange an, wie dein Pokémon auf dem Feld bleibt. + "statChange": `Statuswertveränderungen halten solange an, wie dein Pokémon auf dem Feld bleibt. $Pokémon werden am Anfang eines Trainerkampfes oder bei einem Arealwechsel automatisch zurückgerufen. $Nutze C oder Shift, um aktuelle Statuswertveränderungen anzuzeigen.`, - "selectItem": `Nach jedem Kampf kannst du aus 3 zufälligen Items exakt eines auswählen. + "selectItem": `Nach jedem Kampf kannst du aus 3 zufälligen Items exakt eines auswählen. $Es gibt u. A. Heilitems, tragbare Items und Basis-Items, die dir einen permanenten Vorteil verschaffen. $Die meisten tragbaren und permanenten Items werden stärker, wenn du sie mehrfach sammelst. $Manche Items, wie Entwicklungssteine, tauchen nur auf, wenn du sie auch nutzen kannst. @@ -37,10 +37,10 @@ export const tutorial: SimpleTranslationEntries = { $Du kannst Heilitems auch gegen Geld erwerben. Je weiter du kommst, desto mehr stehen dir zur Auswahl. $Erledige deine Einkäufe als erstes, denn sobald du dein zufälliges Item auswählst, beginnt der nächste Kampf.`, - "eggGacha": `Hier kannst du deine Gutscheine gegen Pokémon-Eier\ntauschen. + "eggGacha": `Hier kannst du deine Gutscheine gegen Pokémon-Eier\ntauschen. $Eier schlüpfen, nachdem du eine gewisse Anzahl Kämpfe\nabsolviert hast. Je seltener das Ei, desto länger dauert es. $Geschlüpfte Pokémon werden nicht deinem Team hinzugefügt,\nsondern deinen verfügbaren Startern. $In der Regel haben sie bessere DVs als in der Wildnis\ngefangene Pokémon. $Es gibt sogar Pokémon, die du nur aus Eiern erhalten kannst. $Es gibt drei Gacha-Maschinen mit je unterschiedlichen Boni,\nalso such' dir die aus, die dir am besten gefällt!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/voucher.ts b/src/locales/de/voucher.ts index b7a6d5d23036..757cc8a0f60a 100644 --- a/src/locales/de/voucher.ts +++ b/src/locales/de/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Ei-Gutschein Gold", "locked": "Gesperrt", "defeatTrainer": "Besiege {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/de/weather.ts b/src/locales/de/weather.ts index 6e40714f88f6..56c6584fdcb0 100644 --- a/src/locales/de/weather.ts +++ b/src/locales/de/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "Die Sonnenlicht wird stärker!", - "sunnyLapseMessage": "Die Sonnenlicht ist stark.", - "sunnyClearMessage": "Die Sonnenlicht verliert wieder an Intensität.", - - "rainStartMessage": "Es fängt an zu regnen!", - "rainLapseMessage": "Es regnet weiter.", - "rainClearMessage": "Der Regen lässt nach.", - - "sandstormStartMessage": "Ein Sandsturm kommt auf!", - "sandstormLapseMessage": "Der Sandsturm tobt.", - "sandstormClearMessage": "Der Sandsturm legt sich.", - "sandstormDamageMessage": " Der Sandsturm fügt {{pokemonPrefix}}{{pokemonName}} Schaden zu!", - - "hailStartMessage": "Es fängt an zu hageln!", - "hailLapseMessage": "Der Hagelsturm tobt.", - "hailClearMessage": "Der Hagelsturm legt sich.", - "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} wird von Hagelkörnern getroffen!", - - "snowStartMessage": "Es fängt an zu schneien!", - "snowLapseMessage": "Der Schneesturm tobt.", - "snowClearMessage": "Der Schneesturm legt sich.", - - "fogStartMessage": "Am Boden breitet sich dichter Nebel aus!", - "fogLapseMessage": "Der Nebel bleibt dicht.", - "fogClearMessage": "Der Nebel lichtet sich.", - - "heavyRainStartMessage": "Es fängt an, in Strömen zu regnen!", - "heavyRainLapseMessage": "Der strömende Regen hält an.", - "heavyRainClearMessage": "Der strömende Regen lässt nach.", + "sunnyStartMessage": "Die Sonnenlicht wird stärker!", + "sunnyLapseMessage": "Die Sonnenlicht ist stark.", + "sunnyClearMessage": "Die Sonnenlicht verliert wieder an Intensität.", + + "rainStartMessage": "Es fängt an zu regnen!", + "rainLapseMessage": "Es regnet weiter.", + "rainClearMessage": "Der Regen lässt nach.", + + "sandstormStartMessage": "Ein Sandsturm kommt auf!", + "sandstormLapseMessage": "Der Sandsturm tobt.", + "sandstormClearMessage": "Der Sandsturm legt sich.", + "sandstormDamageMessage": " Der Sandsturm fügt {{pokemonPrefix}}{{pokemonName}} Schaden zu!", + + "hailStartMessage": "Es fängt an zu hageln!", + "hailLapseMessage": "Der Hagelsturm tobt.", + "hailClearMessage": "Der Hagelsturm legt sich.", + "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} wird von Hagelkörnern getroffen!", + + "snowStartMessage": "Es fängt an zu schneien!", + "snowLapseMessage": "Der Schneesturm tobt.", + "snowClearMessage": "Der Schneesturm legt sich.", + + "fogStartMessage": "Am Boden breitet sich dichter Nebel aus!", + "fogLapseMessage": "Der Nebel bleibt dicht.", + "fogClearMessage": "Der Nebel lichtet sich.", + + "heavyRainStartMessage": "Es fängt an, in Strömen zu regnen!", + "heavyRainLapseMessage": "Der strömende Regen hält an.", + "heavyRainClearMessage": "Der strömende Regen lässt nach.", - "harshSunStartMessage": "Das Sonnenlicht wird sehr viel stärker!", - "harshSunLapseMessage": "Das Sonnenlicht ist sehr stark.", - "harshSunClearMessage": "Das Sonnenlicht verliert an Intensität.", - - "strongWindsStartMessage": "Alle Flug-Pokémon werden von rätselhaften Luftströmungen geschützt!", - "strongWindsLapseMessage": "Die rätselhafte Luftströmung hält an.", - "strongWindsClearMessage": "Die rätselhafte Luftströmung hat sich wieder geleget.", -} + "harshSunStartMessage": "Das Sonnenlicht wird sehr viel stärker!", + "harshSunLapseMessage": "Das Sonnenlicht ist sehr stark.", + "harshSunClearMessage": "Das Sonnenlicht verliert an Intensität.", + + "strongWindsStartMessage": "Alle Flug-Pokémon werden von rätselhaften Luftströmungen geschützt!", + "strongWindsLapseMessage": "Die rätselhafte Luftströmung hält an.", + "strongWindsClearMessage": "Die rätselhafte Luftströmung hat sich wieder geleget.", +}; diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index 495052171264..562ddd9c2507 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`, - 'badDreams': `{{pokemonName}} is tormented!`, -} as const; \ No newline at end of file + "blockRecoilDamage" : "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "badDreams": "{{pokemonName}} is tormented!", +} as const; diff --git a/src/locales/en/ability.ts b/src/locales/en/ability.ts index a39208ae9262..2ba837f8c69f 100644 --- a/src/locales/en/ability.ts +++ b/src/locales/en/ability.ts @@ -439,7 +439,7 @@ export const ability: AbilityTranslationEntries = { }, tintedLens: { name: "Tinted Lens", - description: 'The Pokémon can use "not very effective" moves to deal regular damage.', + description: "The Pokémon can use \"not very effective\" moves to deal regular damage.", }, filter: { name: "Filter", @@ -751,7 +751,7 @@ export const ability: AbilityTranslationEntries = { }, auraBreak: { name: "Aura Break", - description: 'The effects of "Aura" Abilities are reversed to lower the power of affected moves.', + description: "The effects of \"Aura\" Abilities are reversed to lower the power of affected moves.", }, primordialSea: { name: "Primordial Sea", diff --git a/src/locales/en/battle-message-ui-handler.ts b/src/locales/en/battle-message-ui-handler.ts index 346f856872ce..6f09770808f6 100644 --- a/src/locales/en/battle-message-ui-handler.ts +++ b/src/locales/en/battle-message-ui-handler.ts @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "Pretty Good", "ivDecent": "Decent", "ivNoGood": "No Good", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index a6ed2fabc644..5ba0a588e192 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "Go! {{pokemonName}}!", "trainerGo": "{{trainerName}} sent out {{pokemonName}}!", "switchQuestion": "Will you switch\n{{pokemonName}}?", - "trainerDefeated": `You defeated\n{{trainerName}}!`, + "trainerDefeated": "You defeated\n{{trainerName}}!", "pokemonCaught": "{{pokemonName}} was caught!", "pokemon": "Pokémon", "sendOutPokemon": "Go! {{pokemonName}}!", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "It doesn't affect {{pokemonName}}!", "hitResultOneHitKO": "It's a one-hit KO!", "attackFailed": "But it failed!", - "attackHitsCount": `Hit {{count}} time(s)!`, + "attackHitsCount": "Hit {{count}} time(s)!", "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "learnMove": "{{pokemonName}} learned\n{{moveName}}!", @@ -46,11 +46,11 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "You can't run\nfrom a trainer battle!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!", "runAwaySuccess": "You got away safely!", - "runAwayCannotEscape": 'You can\'t escape!', + "runAwayCannotEscape": "You can't escape!", "escapeVerbSwitch": "switching", "escapeVerbFlee": "fleeing", "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/berry.ts b/src/locales/en/berry.ts index 8c8bc5ee280d..1063b84046d4 100644 --- a/src/locales/en/berry.ts +++ b/src/locales/en/berry.ts @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "Leppa Berry", effect: "Restores 10 PP to a move if its PP reaches 0", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/command-ui-handler.ts b/src/locales/en/command-ui-handler.ts index 889c1378b08d..b5a87b72ffdf 100644 --- a/src/locales/en/command-ui-handler.ts +++ b/src/locales/en/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Fight", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Run", - "actionMessage": "What will\n{{pokemonName}} do?", -} as const; \ No newline at end of file + "fight": "Fight", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Run", + "actionMessage": "What will\n{{pokemonName}} do?", +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index f25c0b5e2780..aae53e61b42a 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const enConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index 358c1b4a5034..b9ed9a71fd1d 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "You have too many eggs!", "pull": "Pull", "pulls": "Pulls" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/fight-ui-handler.ts b/src/locales/en/fight-ui-handler.ts index 7546e9af66ac..1924041fe3ba 100644 --- a/src/locales/en/fight-ui-handler.ts +++ b/src/locales/en/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Power", - "accuracy": "Accuracy", -} as const; \ No newline at end of file + "pp": "PP", + "power": "Power", + "accuracy": "Accuracy", +} as const; diff --git a/src/locales/en/growth.ts b/src/locales/en/growth.ts index a0d1cb5eeaad..ea4dad72240d 100644 --- a/src/locales/en/growth.ts +++ b/src/locales/en/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Erratic", - "Fast": "Fast", - "Medium_Fast": "Medium Fast", - "Medium_Slow": "Medium Slow", - "Slow": "Slow", - "Fluctuating": "Fluctuating" -} as const; \ No newline at end of file + "Erratic": "Erratic", + "Fast": "Fast", + "Medium_Fast": "Medium Fast", + "Medium_Slow": "Medium Slow", + "Slow": "Slow", + "Fluctuating": "Fluctuating" +} as const; diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index eb8e474ee602..5958981968ba 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": 'Game Settings', - "ACHIEVEMENTS": "Achievements", - "STATS": "Stats", - "VOUCHERS": "Vouchers", - "EGG_LIST": "Egg List", - "EGG_GACHA": "Egg Gacha", - "MANAGE_DATA": "Manage Data", - "COMMUNITY": "Community", - "SAVE_AND_QUIT": "Save and Quit", - "LOG_OUT": "Log Out", - "slot": "Slot {{slotNumber}}", - "importSession": "Import Session", - "importSlotSelect": "Select a slot to import to.", - "exportSession": "Export Session", - "exportSlotSelect": "Select a slot to export from.", - "importData": "Import Data", - "exportData": "Export Data", - "cancel": "Cancel", - "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?" -} as const; \ No newline at end of file + "GAME_SETTINGS": "Game Settings", + "ACHIEVEMENTS": "Achievements", + "STATS": "Stats", + "VOUCHERS": "Vouchers", + "EGG_LIST": "Egg List", + "EGG_GACHA": "Egg Gacha", + "MANAGE_DATA": "Manage Data", + "COMMUNITY": "Community", + "SAVE_AND_QUIT": "Save and Quit", + "LOG_OUT": "Log Out", + "slot": "Slot {{slotNumber}}", + "importSession": "Import Session", + "importSlotSelect": "Select a slot to import to.", + "exportSession": "Export Session", + "exportSlotSelect": "Select a slot to export from.", + "importData": "Import Data", + "exportData": "Export Data", + "cancel": "Cancel", + "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?" +} as const; diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 7db9ea3aa6a9..9e4cfdf3f094 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "Cancel", - "continue": "Continue", - "dailyRun": "Daily Run (Beta)", - "loadGame": "Load Game", - "newGame": "New Game", - "selectGameMode": "Select a game mode.", - "logInOrCreateAccount": "Log in or create an account to start. No email required!", - "username": "Username", - "password": "Password", - "login": "Login", - "register": "Register", - "emptyUsername": "Username must not be empty", - "invalidLoginUsername": "The provided username is invalid", - "invalidRegisterUsername": "Username must only contain letters, numbers, or underscores", - "invalidLoginPassword": "The provided password is invalid", - "invalidRegisterPassword": "Password must be 6 characters or longer", - "usernameAlreadyUsed": "The provided username is already in use", - "accountNonExistent": "The provided user does not exist", - "unmatchingPassword": "The provided password does not match", - "passwordNotMatchingConfirmPassword": "Password must match confirm password", - "confirmPassword": "Confirm Password", - "registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.", - "backToLogin": "Back to Login", - "failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.", - "sessionSuccess": "Session loaded successfully.", - "failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.", - "boyOrGirl": "Are you a boy or a girl?", - "boy": "Boy", - "girl": "Girl", - "evolving": "What?\n{{pokemonName}} is evolving!", - "stoppedEvolving": "{{pokemonName}} stopped evolving.", - "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", - "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", - "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", - "dailyRankings": "Daily Rankings", - "weeklyRankings": "Weekly Rankings", - "noRankings": "No Rankings", - "loading": "Loading…", - "playersOnline": "Players Online", - "empty":"Empty", - "yes":"Yes", - "no":"No", -} as const; \ No newline at end of file + "cancel": "Cancel", + "continue": "Continue", + "dailyRun": "Daily Run (Beta)", + "loadGame": "Load Game", + "newGame": "New Game", + "selectGameMode": "Select a game mode.", + "logInOrCreateAccount": "Log in or create an account to start. No email required!", + "username": "Username", + "password": "Password", + "login": "Login", + "register": "Register", + "emptyUsername": "Username must not be empty", + "invalidLoginUsername": "The provided username is invalid", + "invalidRegisterUsername": "Username must only contain letters, numbers, or underscores", + "invalidLoginPassword": "The provided password is invalid", + "invalidRegisterPassword": "Password must be 6 characters or longer", + "usernameAlreadyUsed": "The provided username is already in use", + "accountNonExistent": "The provided user does not exist", + "unmatchingPassword": "The provided password does not match", + "passwordNotMatchingConfirmPassword": "Password must match confirm password", + "confirmPassword": "Confirm Password", + "registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.", + "backToLogin": "Back to Login", + "failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.", + "sessionSuccess": "Session loaded successfully.", + "failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.", + "boyOrGirl": "Are you a boy or a girl?", + "boy": "Boy", + "girl": "Girl", + "evolving": "What?\n{{pokemonName}} is evolving!", + "stoppedEvolving": "{{pokemonName}} stopped evolving.", + "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", + "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", + "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", + "dailyRankings": "Daily Rankings", + "weeklyRankings": "Weekly Rankings", + "noRankings": "No Rankings", + "loading": "Loading…", + "playersOnline": "Players Online", + "empty":"Empty", + "yes":"Yes", + "no":"No", +} as const; diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 3e0de14dc75f..85261c0cabe8 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -384,4 +384,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "Chill Drive", "DOUSE_DRIVE": "Douse Drive", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts index 11f92dda5a6c..fceab24b6a86 100644 --- a/src/locales/en/move.ts +++ b/src/locales/en/move.ts @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "Malignant Chain", effect: "The user pours toxins into the target by wrapping them in a toxic, corrosive chain. This may also leave the target badly poisoned." } -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/nature.ts b/src/locales/en/nature.ts index f29917ff60d7..983252b9802f 100644 --- a/src/locales/en/nature.ts +++ b/src/locales/en/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Sassy", "Careful": "Careful", "Quirky": "Quirky" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/pokeball.ts b/src/locales/en/pokeball.ts index 2bd7f6030855..6d69911efeb4 100644 --- a/src/locales/en/pokeball.ts +++ b/src/locales/en/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Great Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Luxury Ball", -} as const; \ No newline at end of file + "pokeBall": "Poké Ball", + "greatBall": "Great Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Luxury Ball", +} as const; diff --git a/src/locales/en/pokemon-info.ts b/src/locales/en/pokemon-info.ts index 2c7ee78f07ae..3f96ba152ef2 100644 --- a/src/locales/en/pokemon-info.ts +++ b/src/locales/en/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "Max. HP", - "HPshortened": "MaxHP", - "ATK": "Attack", - "ATKshortened": "Atk", - "DEF": "Defense", - "DEFshortened": "Def", - "SPATK": "Sp. Atk", - "SPATKshortened": "SpAtk", - "SPDEF": "Sp. Def", - "SPDEFshortened": "SpDef", - "SPD": "Speed", - "SPDshortened": "Spd" - }, + Stat: { + "HP": "Max. HP", + "HPshortened": "MaxHP", + "ATK": "Attack", + "ATKshortened": "Atk", + "DEF": "Defense", + "DEFshortened": "Def", + "SPATK": "Sp. Atk", + "SPATKshortened": "SpAtk", + "SPDEF": "Sp. Def", + "SPDEFshortened": "SpDef", + "SPD": "Speed", + "SPDshortened": "Spd" + }, - Type: { - "UNKNOWN": "Unknown", - "NORMAL": "Normal", - "FIGHTING": "Fighting", - "FLYING": "Flying", - "POISON": "Poison", - "GROUND": "Ground", - "ROCK": "Rock", - "BUG": "Bug", - "GHOST": "Ghost", - "STEEL": "Steel", - "FIRE": "Fire", - "WATER": "Water", - "GRASS": "Grass", - "ELECTRIC": "Electric", - "PSYCHIC": "Psychic", - "ICE": "Ice", - "DRAGON": "Dragon", - "DARK": "Dark", - "FAIRY": "Fairy", - "STELLAR": "Stellar", - }, -} as const; \ No newline at end of file + Type: { + "UNKNOWN": "Unknown", + "NORMAL": "Normal", + "FIGHTING": "Fighting", + "FLYING": "Flying", + "POISON": "Poison", + "GROUND": "Ground", + "ROCK": "Rock", + "BUG": "Bug", + "GHOST": "Ghost", + "STEEL": "Steel", + "FIRE": "Fire", + "WATER": "Water", + "GRASS": "Grass", + "ELECTRIC": "Electric", + "PSYCHIC": "Psychic", + "ICE": "Ice", + "DRAGON": "Dragon", + "DARK": "Dark", + "FAIRY": "Fairy", + "STELLAR": "Stellar", + }, +} as const; diff --git a/src/locales/en/pokemon.ts b/src/locales/en/pokemon.ts index 09be8894eb4d..61c2d809082a 100644 --- a/src/locales/en/pokemon.ts +++ b/src/locales/en/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbasaur", - "ivysaur": "Ivysaur", - "venusaur": "Venusaur", - "charmander": "Charmander", - "charmeleon": "Charmeleon", - "charizard": "Charizard", - "squirtle": "Squirtle", - "wartortle": "Wartortle", - "blastoise": "Blastoise", - "caterpie": "Caterpie", - "metapod": "Metapod", - "butterfree": "Butterfree", - "weedle": "Weedle", - "kakuna": "Kakuna", - "beedrill": "Beedrill", - "pidgey": "Pidgey", - "pidgeotto": "Pidgeotto", - "pidgeot": "Pidgeot", - "rattata": "Rattata", - "raticate": "Raticate", - "spearow": "Spearow", - "fearow": "Fearow", - "ekans": "Ekans", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandshrew", - "sandslash": "Sandslash", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Clefairy", - "clefable": "Clefable", - "vulpix": "Vulpix", - "ninetales": "Ninetales", - "jigglypuff": "Jigglypuff", - "wigglytuff": "Wigglytuff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Oddish", - "gloom": "Gloom", - "vileplume": "Vileplume", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Venonat", - "venomoth": "Venomoth", - "diglett": "Diglett", - "dugtrio": "Dugtrio", - "meowth": "Meowth", - "persian": "Persian", - "psyduck": "Psyduck", - "golduck": "Golduck", - "mankey": "Mankey", - "primeape": "Primeape", - "growlithe": "Growlithe", - "arcanine": "Arcanine", - "poliwag": "Poliwag", - "poliwhirl": "Poliwhirl", - "poliwrath": "Poliwrath", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machop", - "machoke": "Machoke", - "machamp": "Machamp", - "bellsprout": "Bellsprout", - "weepinbell": "Weepinbell", - "victreebel": "Victreebel", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Geodude", - "graveler": "Graveler", - "golem": "Golem", - "ponyta": "Ponyta", - "rapidash": "Rapidash", - "slowpoke": "Slowpoke", - "slowbro": "Slowbro", - "magnemite": "Magnemite", - "magneton": "Magneton", - "farfetchd": "Farfetch'd", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Seel", - "dewgong": "Dewgong", - "grimer": "Grimer", - "muk": "Muk", - "shellder": "Shellder", - "cloyster": "Cloyster", - "gastly": "Gastly", - "haunter": "Haunter", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Drowzee", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltorb", - "electrode": "Electrode", - "exeggcute": "Exeggcute", - "exeggutor": "Exeggutor", - "cubone": "Cubone", - "marowak": "Marowak", - "hitmonlee": "Hitmonlee", - "hitmonchan": "Hitmonchan", - "lickitung": "Lickitung", - "koffing": "Koffing", - "weezing": "Weezing", - "rhyhorn": "Rhyhorn", - "rhydon": "Rhydon", - "chansey": "Chansey", - "tangela": "Tangela", - "kangaskhan": "Kangaskhan", - "horsea": "Horsea", - "seadra": "Seadra", - "goldeen": "Goldeen", - "seaking": "Seaking", - "staryu": "Staryu", - "starmie": "Starmie", - "mr_mime": "Mr. Mime", - "scyther": "Scyther", - "jynx": "Jynx", - "electabuzz": "Electabuzz", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Magikarp", - "gyarados": "Gyarados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Eevee", - "vaporeon": "Vaporeon", - "jolteon": "Jolteon", - "flareon": "Flareon", - "porygon": "Porygon", - "omanyte": "Omanyte", - "omastar": "Omastar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Snorlax", - "articuno": "Articuno", - "zapdos": "Zapdos", - "moltres": "Moltres", - "dratini": "Dratini", - "dragonair": "Dragonair", - "dragonite": "Dragonite", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Chikorita", - "bayleef": "Bayleef", - "meganium": "Meganium", - "cyndaquil": "Cyndaquil", - "quilava": "Quilava", - "typhlosion": "Typhlosion", - "totodile": "Totodile", - "croconaw": "Croconaw", - "feraligatr": "Feraligatr", - "sentret": "Sentret", - "furret": "Furret", - "hoothoot": "Hoothoot", - "noctowl": "Noctowl", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Spinarak", - "ariados": "Ariados", - "crobat": "Crobat", - "chinchou": "Chinchou", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Cleffa", - "igglybuff": "Igglybuff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Mareep", - "flaaffy": "Flaaffy", - "ampharos": "Ampharos", - "bellossom": "Bellossom", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Sudowoodo", - "politoed": "Politoed", - "hoppip": "Hoppip", - "skiploom": "Skiploom", - "jumpluff": "Jumpluff", - "aipom": "Aipom", - "sunkern": "Sunkern", - "sunflora": "Sunflora", - "yanma": "Yanma", - "wooper": "Wooper", - "quagsire": "Quagsire", - "espeon": "Espeon", - "umbreon": "Umbreon", - "murkrow": "Murkrow", - "slowking": "Slowking", - "misdreavus": "Misdreavus", - "unown": "Unown", - "wobbuffet": "Wobbuffet", - "girafarig": "Girafarig", - "pineco": "Pineco", - "forretress": "Forretress", - "dunsparce": "Dunsparce", - "gligar": "Gligar", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Scizor", - "shuckle": "Shuckle", - "heracross": "Heracross", - "sneasel": "Sneasel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Slugma", - "magcargo": "Magcargo", - "swinub": "Swinub", - "piloswine": "Piloswine", - "corsola": "Corsola", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Delibird", - "mantine": "Mantine", - "skarmory": "Skarmory", - "houndour": "Houndour", - "houndoom": "Houndoom", - "kingdra": "Kingdra", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Stantler", - "smeargle": "Smeargle", - "tyrogue": "Tyrogue", - "hitmontop": "Hitmontop", - "smoochum": "Smoochum", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Blissey", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Tyranitar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Treecko", - "grovyle": "Grovyle", - "sceptile": "Sceptile", - "torchic": "Torchic", - "combusken": "Combusken", - "blaziken": "Blaziken", - "mudkip": "Mudkip", - "marshtomp": "Marshtomp", - "swampert": "Swampert", - "poochyena": "Poochyena", - "mightyena": "Mightyena", - "zigzagoon": "Zigzagoon", - "linoone": "Linoone", - "wurmple": "Wurmple", - "silcoon": "Silcoon", - "beautifly": "Beautifly", - "cascoon": "Cascoon", - "dustox": "Dustox", - "lotad": "Lotad", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Seedot", - "nuzleaf": "Nuzleaf", - "shiftry": "Shiftry", - "taillow": "Taillow", - "swellow": "Swellow", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Ralts", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Surskit", - "masquerain": "Masquerain", - "shroomish": "Shroomish", - "breloom": "Breloom", - "slakoth": "Slakoth", - "vigoroth": "Vigoroth", - "slaking": "Slaking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Shedinja", - "whismur": "Whismur", - "loudred": "Loudred", - "exploud": "Exploud", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nosepass", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Sableye", - "mawile": "Mawile", - "aron": "Aron", - "lairon": "Lairon", - "aggron": "Aggron", - "meditite": "Meditite", - "medicham": "Medicham", - "electrike": "Electrike", - "manectric": "Manectric", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Gulpin", - "swalot": "Swalot", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Numel", - "camerupt": "Camerupt", - "torkoal": "Torkoal", - "spoink": "Spoink", - "grumpig": "Grumpig", - "spinda": "Spinda", - "trapinch": "Trapinch", - "vibrava": "Vibrava", - "flygon": "Flygon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Swablu", - "altaria": "Altaria", - "zangoose": "Zangoose", - "seviper": "Seviper", - "lunatone": "Lunatone", - "solrock": "Solrock", - "barboach": "Barboach", - "whiscash": "Whiscash", - "corphish": "Corphish", - "crawdaunt": "Crawdaunt", - "baltoy": "Baltoy", - "claydol": "Claydol", - "lileep": "Lileep", - "cradily": "Cradily", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Feebas", - "milotic": "Milotic", - "castform": "Castform", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Duskull", - "dusclops": "Dusclops", - "tropius": "Tropius", - "chimecho": "Chimecho", - "absol": "Absol", - "wynaut": "Wynaut", - "snorunt": "Snorunt", - "glalie": "Glalie", - "spheal": "Spheal", - "sealeo": "Sealeo", - "walrein": "Walrein", - "clamperl": "Clamperl", - "huntail": "Huntail", - "gorebyss": "Gorebyss", - "relicanth": "Relicanth", - "luvdisc": "Luvdisc", - "bagon": "Bagon", - "shelgon": "Shelgon", - "salamence": "Salamence", - "beldum": "Beldum", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Budew", - "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", - "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", - "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", - "skuntank": "Skuntank", - "bronzor": "Bronzor", - "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", - "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", - "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", - "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", - "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", - "elgyem": "Elgyem", - "beheeyem": "Beheeyem", - "litwick": "Litwick", - "lampent": "Lampent", - "chandelure": "Chandelure", - "axew": "Axew", - "fraxure": "Fraxure", - "haxorus": "Haxorus", - "cubchoo": "Cubchoo", - "beartic": "Beartic", - "cryogonal": "Cryogonal", - "shelmet": "Shelmet", - "accelgor": "Accelgor", - "stunfisk": "Stunfisk", - "mienfoo": "Mienfoo", - "mienshao": "Mienshao", - "druddigon": "Druddigon", - "golett": "Golett", - "golurk": "Golurk", - "pawniard": "Pawniard", - "bisharp": "Bisharp", - "bouffalant": "Bouffalant", - "rufflet": "Rufflet", - "braviary": "Braviary", - "vullaby": "Vullaby", - "mandibuzz": "Mandibuzz", - "heatmor": "Heatmor", - "durant": "Durant", - "deino": "Deino", - "zweilous": "Zweilous", - "hydreigon": "Hydreigon", - "larvesta": "Larvesta", - "volcarona": "Volcarona", - "cobalion": "Cobalion", - "terrakion": "Terrakion", - "virizion": "Virizion", - "tornadus": "Tornadus", - "thundurus": "Thundurus", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Landorus", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Chespin", - "quilladin": "Quilladin", - "chesnaught": "Chesnaught", - "fennekin": "Fennekin", - "braixen": "Braixen", - "delphox": "Delphox", - "froakie": "Froakie", - "frogadier": "Frogadier", - "greninja": "Greninja", - "bunnelby": "Bunnelby", - "diggersby": "Diggersby", - "fletchling": "Fletchling", - "fletchinder": "Fletchinder", - "talonflame": "Talonflame", - "scatterbug": "Scatterbug", - "spewpa": "Spewpa", - "vivillon": "Vivillon", - "litleo": "Litleo", - "pyroar": "Pyroar", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Skiddo", - "gogoat": "Gogoat", - "pancham": "Pancham", - "pangoro": "Pangoro", - "furfrou": "Furfrou", - "espurr": "Espurr", - "meowstic": "Meowstic", - "honedge": "Honedge", - "doublade": "Doublade", - "aegislash": "Aegislash", - "spritzee": "Spritzee", - "aromatisse": "Aromatisse", - "swirlix": "Swirlix", - "slurpuff": "Slurpuff", - "inkay": "Inkay", - "malamar": "Malamar", - "binacle": "Binacle", - "barbaracle": "Barbaracle", - "skrelp": "Skrelp", - "dragalge": "Dragalge", - "clauncher": "Clauncher", - "clawitzer": "Clawitzer", - "helioptile": "Helioptile", - "heliolisk": "Heliolisk", - "tyrunt": "Tyrunt", - "tyrantrum": "Tyrantrum", - "amaura": "Amaura", - "aurorus": "Aurorus", - "sylveon": "Sylveon", - "hawlucha": "Hawlucha", - "dedenne": "Dedenne", - "carbink": "Carbink", - "goomy": "Goomy", - "sliggoo": "Sliggoo", - "goodra": "Goodra", - "klefki": "Klefki", - "phantump": "Phantump", - "trevenant": "Trevenant", - "pumpkaboo": "Pumpkaboo", - "gourgeist": "Gourgeist", - "bergmite": "Bergmite", - "avalugg": "Avalugg", - "noibat": "Noibat", - "noivern": "Noivern", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Rowlet", - "dartrix": "Dartrix", - "decidueye": "Decidueye", - "litten": "Litten", - "torracat": "Torracat", - "incineroar": "Incineroar", - "popplio": "Popplio", - "brionne": "Brionne", - "primarina": "Primarina", - "pikipek": "Pikipek", - "trumbeak": "Trumbeak", - "toucannon": "Toucannon", - "yungoos": "Yungoos", - "gumshoos": "Gumshoos", - "grubbin": "Grubbin", - "charjabug": "Charjabug", - "vikavolt": "Vikavolt", - "crabrawler": "Crabrawler", - "crabominable": "Crabominable", - "oricorio": "Oricorio", - "cutiefly": "Cutiefly", - "ribombee": "Ribombee", - "rockruff": "Rockruff", - "lycanroc": "Lycanroc", - "wishiwashi": "Wishiwashi", - "mareanie": "Mareanie", - "toxapex": "Toxapex", - "mudbray": "Mudbray", - "mudsdale": "Mudsdale", - "dewpider": "Dewpider", - "araquanid": "Araquanid", - "fomantis": "Fomantis", - "lurantis": "Lurantis", - "morelull": "Morelull", - "shiinotic": "Shiinotic", - "salandit": "Salandit", - "salazzle": "Salazzle", - "stufful": "Stufful", - "bewear": "Bewear", - "bounsweet": "Bounsweet", - "steenee": "Steenee", - "tsareena": "Tsareena", - "comfey": "Comfey", - "oranguru": "Oranguru", - "passimian": "Passimian", - "wimpod": "Wimpod", - "golisopod": "Golisopod", - "sandygast": "Sandygast", - "palossand": "Palossand", - "pyukumuku": "Pyukumuku", - "type_null": "Type: Null", - "silvally": "Silvally", - "minior": "Minior", - "komala": "Komala", - "turtonator": "Turtonator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimikyu", - "bruxish": "Bruxish", - "drampa": "Drampa", - "dhelmise": "Dhelmise", - "jangmo_o": "Jangmo-o", - "hakamo_o": "Hakamo-o", - "kommo_o": "Kommo-o", - "tapu_koko": "Tapu Koko", - "tapu_lele": "Tapu Lele", - "tapu_bulu": "Tapu Bulu", - "tapu_fini": "Tapu Fini", - "cosmog": "Cosmog", - "cosmoem": "Cosmoem", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Nihilego", - "buzzwole": "Buzzwole", - "pheromosa": "Pheromosa", - "xurkitree": "Xurkitree", - "celesteela": "Celesteela", - "kartana": "Kartana", - "guzzlord": "Guzzlord", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Poipole", - "naganadel": "Naganadel", - "stakataka": "Stakataka", - "blacephalon": "Blacephalon", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Grookey", - "thwackey": "Thwackey", - "rillaboom": "Rillaboom", - "scorbunny": "Scorbunny", - "raboot": "Raboot", - "cinderace": "Cinderace", - "sobble": "Sobble", - "drizzile": "Drizzile", - "inteleon": "Inteleon", - "skwovet": "Skwovet", - "greedent": "Greedent", - "rookidee": "Rookidee", - "corvisquire": "Corvisquire", - "corviknight": "Corviknight", - "blipbug": "Blipbug", - "dottler": "Dottler", - "orbeetle": "Orbeetle", - "nickit": "Nickit", - "thievul": "Thievul", - "gossifleur": "Gossifleur", - "eldegoss": "Eldegoss", - "wooloo": "Wooloo", - "dubwool": "Dubwool", - "chewtle": "Chewtle", - "drednaw": "Drednaw", - "yamper": "Yamper", - "boltund": "Boltund", - "rolycoly": "Rolycoly", - "carkol": "Carkol", - "coalossal": "Coalossal", - "applin": "Applin", - "flapple": "Flapple", - "appletun": "Appletun", - "silicobra": "Silicobra", - "sandaconda": "Sandaconda", - "cramorant": "Cramorant", - "arrokuda": "Arrokuda", - "barraskewda": "Barraskewda", - "toxel": "Toxel", - "toxtricity": "Toxtricity", - "sizzlipede": "Sizzlipede", - "centiskorch": "Centiskorch", - "clobbopus": "Clobbopus", - "grapploct": "Grapploct", - "sinistea": "Sinistea", - "polteageist": "Polteageist", - "hatenna": "Hatenna", - "hattrem": "Hattrem", - "hatterene": "Hatterene", - "impidimp": "Impidimp", - "morgrem": "Morgrem", - "grimmsnarl": "Grimmsnarl", - "obstagoon": "Obstagoon", - "perrserker": "Perrserker", - "cursola": "Cursola", - "sirfetchd": "Sirfetch'd", - "mr_rime": "Mr. Rime", - "runerigus": "Runerigus", - "milcery": "Milcery", - "alcremie": "Alcremie", - "falinks": "Falinks", - "pincurchin": "Pincurchin", - "snom": "Snom", - "frosmoth": "Frosmoth", - "stonjourner": "Stonjourner", - "eiscue": "Eiscue", - "indeedee": "Indeedee", - "morpeko": "Morpeko", - "cufant": "Cufant", - "copperajah": "Copperajah", - "dracozolt": "Dracozolt", - "arctozolt": "Arctozolt", - "dracovish": "Dracovish", - "arctovish": "Arctovish", - "duraludon": "Duraludon", - "dreepy": "Dreepy", - "drakloak": "Drakloak", - "dragapult": "Dragapult", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Eternatus", - "kubfu": "Kubfu", - "urshifu": "Urshifu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Glastrier", - "spectrier": "Spectrier", - "calyrex": "Calyrex", - "wyrdeer": "Wyrdeer", - "kleavor": "Kleavor", - "ursaluna": "Ursaluna", - "basculegion": "Basculegion", - "sneasler": "Sneasler", - "overqwil": "Overqwil", - "enamorus": "Enamorus", - "sprigatito": "Sprigatito", - "floragato": "Floragato", - "meowscarada": "Meowscarada", - "fuecoco": "Fuecoco", - "crocalor": "Crocalor", - "skeledirge": "Skeledirge", - "quaxly": "Quaxly", - "quaxwell": "Quaxwell", - "quaquaval": "Quaquaval", - "lechonk": "Lechonk", - "oinkologne": "Oinkologne", - "tarountula": "Tarountula", - "spidops": "Spidops", - "nymble": "Nymble", - "lokix": "Lokix", - "pawmi": "Pawmi", - "pawmo": "Pawmo", - "pawmot": "Pawmot", - "tandemaus": "Tandemaus", - "maushold": "Maushold", - "fidough": "Fidough", - "dachsbun": "Dachsbun", - "smoliv": "Smoliv", - "dolliv": "Dolliv", - "arboliva": "Arboliva", - "squawkabilly": "Squawkabilly", - "nacli": "Nacli", - "naclstack": "Naclstack", - "garganacl": "Garganacl", - "charcadet": "Charcadet", - "armarouge": "Armarouge", - "ceruledge": "Ceruledge", - "tadbulb": "Tadbulb", - "bellibolt": "Bellibolt", - "wattrel": "Wattrel", - "kilowattrel": "Kilowattrel", - "maschiff": "Maschiff", - "mabosstiff": "Mabosstiff", - "shroodle": "Shroodle", - "grafaiai": "Grafaiai", - "bramblin": "Bramblin", - "brambleghast": "Brambleghast", - "toedscool": "Toedscool", - "toedscruel": "Toedscruel", - "klawf": "Klawf", - "capsakid": "Capsakid", - "scovillain": "Scovillain", - "rellor": "Rellor", - "rabsca": "Rabsca", - "flittle": "Flittle", - "espathra": "Espathra", - "tinkatink": "Tinkatink", - "tinkatuff": "Tinkatuff", - "tinkaton": "Tinkaton", - "wiglett": "Wiglett", - "wugtrio": "Wugtrio", - "bombirdier": "Bombirdier", - "finizen": "Finizen", - "palafin": "Palafin", - "varoom": "Varoom", - "revavroom": "Revavroom", - "cyclizar": "Cyclizar", - "orthworm": "Orthworm", - "glimmet": "Glimmet", - "glimmora": "Glimmora", - "greavard": "Greavard", - "houndstone": "Houndstone", - "flamigo": "Flamigo", - "cetoddle": "Cetoddle", - "cetitan": "Cetitan", - "veluza": "Veluza", - "dondozo": "Dondozo", - "tatsugiri": "Tatsugiri", - "annihilape": "Annihilape", - "clodsire": "Clodsire", - "farigiraf": "Farigiraf", - "dudunsparce": "Dudunsparce", - "kingambit": "Kingambit", - "great_tusk": "Great Tusk", - "scream_tail": "Scream Tail", - "brute_bonnet": "Brute Bonnet", - "flutter_mane": "Flutter Mane", - "slither_wing": "Slither Wing", - "sandy_shocks": "Sandy Shocks", - "iron_treads": "Iron Treads", - "iron_bundle": "Iron Bundle", - "iron_hands": "Iron Hands", - "iron_jugulis": "Iron Jugulis", - "iron_moth": "Iron Moth", - "iron_thorns": "Iron Thorns", - "frigibax": "Frigibax", - "arctibax": "Arctibax", - "baxcalibur": "Baxcalibur", - "gimmighoul": "Gimmighoul", - "gholdengo": "Gholdengo", - "wo_chien": "Wo-Chien", - "chien_pao": "Chien-Pao", - "ting_lu": "Ting-Lu", - "chi_yu": "Chi-Yu", - "roaring_moon": "Roaring Moon", - "iron_valiant": "Iron Valiant", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Walking Wake", - "iron_leaves": "Iron Leaves", - "dipplin": "Dipplin", - "poltchageist": "Poltchageist", - "sinistcha": "Sinistcha", - "okidogi": "Okidogi", - "munkidori": "Munkidori", - "fezandipiti": "Fezandipiti", - "ogerpon": "Ogerpon", - "archaludon": "Archaludon", - "hydrapple": "Hydrapple", - "gouging_fire": "Gouging Fire", - "raging_bolt": "Raging Bolt", - "iron_boulder": "Iron Boulder", - "iron_crown": "Iron Crown", - "terapagos": "Terapagos", - "pecharunt": "Pecharunt", - "alola_rattata": "Rattata", - "alola_raticate": "Raticate", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandshrew", - "alola_sandslash": "Sandslash", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Ninetales", - "alola_diglett": "Diglett", - "alola_dugtrio": "Dugtrio", - "alola_meowth": "Meowth", - "alola_persian": "Persian", - "alola_geodude": "Geodude", - "alola_graveler": "Graveler", - "alola_golem": "Golem", - "alola_grimer": "Grimer", - "alola_muk": "Muk", - "alola_exeggutor": "Exeggutor", - "alola_marowak": "Marowak", - "eternal_floette": "Floette", - "galar_meowth": "Meowth", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Rapidash", - "galar_slowpoke": "Slowpoke", - "galar_slowbro": "Slowbro", - "galar_farfetchd": "Farfetch'd", - "galar_weezing": "Weezing", - "galar_mr_mime": "Mr. Mime", - "galar_articuno": "Articuno", - "galar_zapdos": "Zapdos", - "galar_moltres": "Moltres", - "galar_slowking": "Slowking", - "galar_corsola": "Corsola", - "galar_zigzagoon": "Zigzagoon", - "galar_linoone": "Linoone", - "galar_darumaka": "Darumaka", - "galar_darmanitan": "Darmanitan", - "galar_yamask": "Yamask", - "galar_stunfisk": "Stunfisk", - "hisui_growlithe": "Growlithe", - "hisui_arcanine": "Arcanine", - "hisui_voltorb": "Voltorb", - "hisui_electrode": "Electrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Sneasel", - "hisui_samurott": "Samurott", - "hisui_lilligant": "Lilligant", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Braviary", - "hisui_sliggoo": "Sliggoo", - "hisui_goodra": "Goodra", - "hisui_avalugg": "Avalugg", - "hisui_decidueye": "Decidueye", - "paldea_tauros": "Tauros", - "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", -} as const; \ No newline at end of file + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Type: Null", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Great Tusk", + "scream_tail": "Scream Tail", + "brute_bonnet": "Brute Bonnet", + "flutter_mane": "Flutter Mane", + "slither_wing": "Slither Wing", + "sandy_shocks": "Sandy Shocks", + "iron_treads": "Iron Treads", + "iron_bundle": "Iron Bundle", + "iron_hands": "Iron Hands", + "iron_jugulis": "Iron Jugulis", + "iron_moth": "Iron Moth", + "iron_thorns": "Iron Thorns", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Roaring Moon", + "iron_valiant": "Iron Valiant", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Walking Wake", + "iron_leaves": "Iron Leaves", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Gouging Fire", + "raging_bolt": "Raging Bolt", + "iron_boulder": "Iron Boulder", + "iron_crown": "Iron Crown", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna", +} as const; diff --git a/src/locales/en/splash-messages.ts b/src/locales/en/splash-messages.ts index 6815d7f1824a..d84001110600 100644 --- a/src/locales/en/splash-messages.ts +++ b/src/locales/en/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Battles Won!", - "joinTheDiscord": "Join the Discord!", - "infiniteLevels": "Infinite Levels!", - "everythingStacks": "Everything Stacks!", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 Biomes!", - "openSource": "Open Source!", - "playWithSpeed": "Play with 5x Speed!", - "liveBugTesting": "Live Bug Testing!", - "heavyInfluence": "Heavy RoR2 Influence!", - "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", - "nowWithMoreSalt": "Now with 33% More Salt!", - "infiniteFusionAtHome": "Infinite Fusion at Home!", - "brokenEggMoves": "Broken Egg Moves!", - "magnificent": "Magnificent!", - "mubstitute": "Mubstitute!", - "thatsCrazy": "That\'s Crazy!", - "oranceJuice": "Orance Juice!", - "questionableBalancing": "Questionable Balancing!", - "coolShaders": "Cool Shaders!", - "aiFree": "AI-Free!", - "suddenDifficultySpikes": "Sudden Difficulty Spikes!", - "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", - "moreAddictiveThanIntended": "More Addictive than Intended!", - "mostlyConsistentSeeds": "Mostly Consistent Seeds!", - "achievementPointsDontDoAnything": "Achievement Points Don\'t Do Anything!", - "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", - "dontTalkAboutTheManaphyEggIncident": "Don\'t Talk About the Manaphy Egg Incident!", - "alsoTryPokengine": "Also Try Pokéngine!", - "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", - "alsoTryRadicalRed": "Also Try Radical Red!", - "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", -} as const; \ No newline at end of file + "battlesWon": "Battles Won!", + "joinTheDiscord": "Join the Discord!", + "infiniteLevels": "Infinite Levels!", + "everythingStacks": "Everything Stacks!", + "optionalSaveScumming": "Optional Save Scumming!", + "biomes": "35 Biomes!", + "openSource": "Open Source!", + "playWithSpeed": "Play with 5x Speed!", + "liveBugTesting": "Live Bug Testing!", + "heavyInfluence": "Heavy RoR2 Influence!", + "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", + "nowWithMoreSalt": "Now with 33% More Salt!", + "infiniteFusionAtHome": "Infinite Fusion at Home!", + "brokenEggMoves": "Broken Egg Moves!", + "magnificent": "Magnificent!", + "mubstitute": "Mubstitute!", + "thatsCrazy": "That's Crazy!", + "oranceJuice": "Orance Juice!", + "questionableBalancing": "Questionable Balancing!", + "coolShaders": "Cool Shaders!", + "aiFree": "AI-Free!", + "suddenDifficultySpikes": "Sudden Difficulty Spikes!", + "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", + "moreAddictiveThanIntended": "More Addictive than Intended!", + "mostlyConsistentSeeds": "Mostly Consistent Seeds!", + "achievementPointsDontDoAnything": "Achievement Points Don't Do Anything!", + "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", + "dontTalkAboutTheManaphyEggIncident": "Don't Talk About the Manaphy Egg Incident!", + "alsoTryPokengine": "Also Try Pokéngine!", + "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", + "alsoTryRadicalRed": "Also Try Radical Red!", + "eeveeExpo": "Eevee Expo!", + "ynoproject": "YNOproject!", +} as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index 19f8649dcc34..287059bae72a 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'Begin with these Pokémon?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "Growth Rate:", - "ability": "Ability:", - "passive": "Passive:", - "nature": "Nature:", - "eggMoves": 'Egg Moves', - "start": "Start", - "addToParty": "Add to Party", - "toggleIVs": 'Toggle IVs', - "manageMoves": 'Manage Moves', - "useCandies": 'Use Candies', - "selectMoveSwapOut": "Select a move to swap out.", - "selectMoveSwapWith": "Select a move to swap with", - "unlockPassive": "Unlock Passive", - "reduceCost": "Reduce Cost", - "cycleShiny": "R: Cycle Shiny", - "cycleForm": 'F: Cycle Form', - "cycleGender": 'G: Cycle Gender', - "cycleAbility": 'E: Cycle Ability', - "cycleNature": 'N: Cycle Nature', - "cycleVariant": 'V: Cycle Variant', - "enablePassive": "Enable Passive", - "disablePassive": "Disable Passive", - "locked": "Locked", - "disabled": "Disabled", - "uncaught": "Uncaught" -} + "confirmStartTeam":"Begin with these Pokémon?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "Growth Rate:", + "ability": "Ability:", + "passive": "Passive:", + "nature": "Nature:", + "eggMoves": "Egg Moves", + "start": "Start", + "addToParty": "Add to Party", + "toggleIVs": "Toggle IVs", + "manageMoves": "Manage Moves", + "useCandies": "Use Candies", + "selectMoveSwapOut": "Select a move to swap out.", + "selectMoveSwapWith": "Select a move to swap with", + "unlockPassive": "Unlock Passive", + "reduceCost": "Reduce Cost", + "cycleShiny": "R: Cycle Shiny", + "cycleForm": "F: Cycle Form", + "cycleGender": "G: Cycle Gender", + "cycleAbility": "E: Cycle Ability", + "cycleNature": "N: Cycle Nature", + "cycleVariant": "V: Cycle Variant", + "enablePassive": "Enable Passive", + "disablePassive": "Disable Passive", + "locked": "Locked", + "disabled": "Disabled", + "uncaught": "Uncaught" +}; diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 1eff742e23a2..68b31f2d301f 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -2,243 +2,243 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Elite Four", - "gym_leader": "Gym Leader", - "gym_leader_female": "Gym Leader", - "champion": "Champion", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Frontier Brain", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Elite Four", + "gym_leader": "Gym Leader", + "gym_leader_female": "Gym Leader", + "champion": "Champion", + "rival": "Rival", + "professor": "Professor", + "frontier_brain": "Frontier Brain", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ace Trainer", - "ace_trainer_female": "Ace Trainer", - "ace_duo": "Ace Duo", - "artist": "Artist", - "artist_female": "Artist", - "backers": "Backers", - "backpacker": "Backpacker", - "backpacker_female": "Backpacker", - "backpackers": "Backpackers", - "baker": "Baker", - "battle_girl": "Battle Girl", - "beauty": "Beauty", - "beginners": "Beginners", - "biker": "Biker", - "black_belt": "Black Belt", - "breeder": "Breeder", - "breeder_female": "Breeder", - "breeders": "Breeders", - "clerk": "Clerk", - "clerk_female": "Clerk", - "colleagues": "Colleagues", - "crush_kin": "Crush Kin", - "cyclist": "Cyclist", - "cyclist_female": "Cyclist", - "cyclists": "Cyclists", - "dancer": "Dancer", - "dancer_female": "Dancer", - "depot_agent": "Depot Agent", - "doctor": "Doctor", - "doctor_female": "Doctor", - "fisherman": "Fisherman", - "fisherman_female": "Fisherman", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", - "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", - "madame": "Madame", - "medical_team": "Medical Team", - "musician": "Musician", - "hex_maniac": "Hex Maniac", - "nurse": "Nurse", - "nursery_aide": "Nursery Aide", - "officer": "Officer", - "parasol_lady": "Parasol Lady", - "pilot": "Pilot", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Poké Fan Family", - "preschooler": "Preschooler", - "preschooler_female": "Preschooler", - "preschoolers": "Preschoolers", - "psychic": "Psychic", - "psychic_female": "Psychic", - "psychics": "Psychics", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Staff", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Rich Boy", - "rich_couple": "Rich Couple", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "Rich Kids", - "roughneck": "Roughneck", - "scientist": "Scientist", - "scientist_female": "Scientist", - "scientists": "Scientists", - "smasher": "Smasher", - "snow_worker": "Snow Worker", - "snow_worker_female": "Snow Worker", - "striker": "Striker", - "school_kid": "School Kid", - "school_kid_female": "School Kid", - "school_kids": "School Kids", - "swimmer": "Swimmer", - "swimmer_female": "Swimmer", - "swimmers": "Swimmers", - "twins": "Twins", - "veteran": "Veteran", - "veteran_female": "Veteran", - "veteran_duo": "Veteran Duo", - "waiter": "Waiter", - "waitress": "Waitress", - "worker": "Worker", - "worker_female": "Worker", - "workers": "Workers", - "youngster": "Youngster" + "ace_trainer": "Ace Trainer", + "ace_trainer_female": "Ace Trainer", + "ace_duo": "Ace Duo", + "artist": "Artist", + "artist_female": "Artist", + "backers": "Backers", + "backpacker": "Backpacker", + "backpacker_female": "Backpacker", + "backpackers": "Backpackers", + "baker": "Baker", + "battle_girl": "Battle Girl", + "beauty": "Beauty", + "beginners": "Beginners", + "biker": "Biker", + "black_belt": "Black Belt", + "breeder": "Breeder", + "breeder_female": "Breeder", + "breeders": "Breeders", + "clerk": "Clerk", + "clerk_female": "Clerk", + "colleagues": "Colleagues", + "crush_kin": "Crush Kin", + "cyclist": "Cyclist", + "cyclist_female": "Cyclist", + "cyclists": "Cyclists", + "dancer": "Dancer", + "dancer_female": "Dancer", + "depot_agent": "Depot Agent", + "doctor": "Doctor", + "doctor_female": "Doctor", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", + "gentleman": "Gentleman", + "guitarist": "Guitarist", + "guitarist_female": "Guitarist", + "harlequin": "Harlequin", + "hiker": "Hiker", + "hooligans": "Hooligans", + "hoopster": "Hoopster", + "infielder": "Infielder", + "janitor": "Janitor", + "lady": "Lady", + "lass": "Lass", + "linebacker": "Linebacker", + "maid": "Maid", + "madame": "Madame", + "medical_team": "Medical Team", + "musician": "Musician", + "hex_maniac": "Hex Maniac", + "nurse": "Nurse", + "nursery_aide": "Nursery Aide", + "officer": "Officer", + "parasol_lady": "Parasol Lady", + "pilot": "Pilot", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Poké Fan Family", + "preschooler": "Preschooler", + "preschooler_female": "Preschooler", + "preschoolers": "Preschoolers", + "psychic": "Psychic", + "psychic_female": "Psychic", + "psychics": "Psychics", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "Rich Boy", + "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "Rich Kids", + "roughneck": "Roughneck", + "scientist": "Scientist", + "scientist_female": "Scientist", + "scientists": "Scientists", + "smasher": "Smasher", + "snow_worker": "Snow Worker", + "snow_worker_female": "Snow Worker", + "striker": "Striker", + "school_kid": "School Kid", + "school_kid_female": "School Kid", + "school_kids": "School Kids", + "swimmer": "Swimmer", + "swimmer_female": "Swimmer", + "swimmers": "Swimmers", + "twins": "Twins", + "veteran": "Veteran", + "veteran_female": "Veteran", + "veteran_duo": "Veteran Duo", + "waiter": "Waiter", + "waitress": "Waitress", + "worker": "Worker", + "worker_female": "Worker", + "workers": "Workers", + "youngster": "Youngster" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Crasher Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Lt Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Crasher Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", } as const; diff --git a/src/locales/en/tutorial.ts b/src/locales/en/tutorial.ts index 2773b6710ba8..fbf104749028 100644 --- a/src/locales/en/tutorial.ts +++ b/src/locales/en/tutorial.ts @@ -1,30 +1,30 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. + "intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. $This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. $The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. $If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, - "accessMenu": `To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.`, + "accessMenu": "To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.", - "menu": `From this menu you can access the settings. + "menu": `From this menu you can access the settings. $From the settings you can change game speed, window style, and other options. $There are also various other features here, so be sure to check them all!`, - "starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. + "starterSelect": `From this screen, you can select your starters.\nThese are your initial party members. $Each starter has a value. Your party can have up to\n6 members as long as the total does not exceed 10. $You can also select gender, ability, and form depending on\nthe variants you've caught or hatched. $The IVs for a species are also the best of every one you've\ncaught or hatched, so try to get lots of the same species!`, - "pokerus": `A daily random 3 selectable starters have a purple border. + "pokerus": `A daily random 3 selectable starters have a purple border. $If you see a starter you own with one of these,\ntry adding it to your party. Be sure to check its summary!`, - "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. + "statChange": `Stat changes persist across battles as long as your Pokémon aren't recalled. $Your Pokémon are recalled before a trainer battle and before entering a new biome. $You can also view the stat changes for the Pokémon on the field by holding C or Shift.`, - "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. + "selectItem": `After every battle, you are given a choice of 3 random items.\nYou may only pick one. $These range from consumables, to Pokémon held items, to passive permanent items. $Most non-consumable item effects will stack in various ways. $Some items will only show up if they can be used, such as evolution items. @@ -33,10 +33,10 @@ export const tutorial: SimpleTranslationEntries = { $You may purchase consumable items with money, and a larger variety will be available the further you get. $Be sure to buy these before you pick your random item, as it will progress to the next battle once you do.`, - "eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. + "eggGacha": `From this screen, you can redeem your vouchers for\nPokémon eggs. $Eggs have to be hatched and get closer to hatching after\nevery battle. Rarer eggs take longer to hatch. $Hatched Pokémon also won't be added to your party, they will\nbe added to your starters. $Pokémon hatched from eggs generally have better IVs than\nwild Pokémon. $Some Pokémon can only even be obtained from eggs. $There are 3 different machines to pull from with different\nbonuses, so pick the one that suits you best!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/voucher.ts b/src/locales/en/voucher.ts index 7af569e88cb9..f2bcb8d723ce 100644 --- a/src/locales/en/voucher.ts +++ b/src/locales/en/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Egg Voucher Gold", "locked": "Locked", "defeatTrainer": "Defeat {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/en/weather.ts b/src/locales/en/weather.ts index 999613f15662..85ec1ff78d69 100644 --- a/src/locales/en/weather.ts +++ b/src/locales/en/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "The sunlight got bright!", - "sunnyLapseMessage": "The sunlight is strong.", - "sunnyClearMessage": "The sunlight faded.", - - "rainStartMessage": "A downpour started!", - "rainLapseMessage": "The downpour continues.", - "rainClearMessage": "The rain stopped.", - - "sandstormStartMessage": "A sandstorm brewed!", - "sandstormLapseMessage": "The sandstorm rages.", - "sandstormClearMessage": "The sandstorm subsided.", - "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!", - - "hailStartMessage": "It started to hail!", - "hailLapseMessage": "Hail continues to fall.", - "hailClearMessage": "The hail stopped.", - "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!", - - "snowStartMessage": "It started to snow!", - "snowLapseMessage": "The snow is falling down.", - "snowClearMessage": "The snow stopped.", - - "fogStartMessage": "A thick fog emerged!", - "fogLapseMessage": "The fog continues.", - "fogClearMessage": "The fog disappeared.", - - "heavyRainStartMessage": "A heavy downpour started!", - "heavyRainLapseMessage": "The heavy downpour continues.", - "heavyRainClearMessage": "The heavy rain stopped.", + "sunnyStartMessage": "The sunlight got bright!", + "sunnyLapseMessage": "The sunlight is strong.", + "sunnyClearMessage": "The sunlight faded.", + + "rainStartMessage": "A downpour started!", + "rainLapseMessage": "The downpour continues.", + "rainClearMessage": "The rain stopped.", + + "sandstormStartMessage": "A sandstorm brewed!", + "sandstormLapseMessage": "The sandstorm rages.", + "sandstormClearMessage": "The sandstorm subsided.", + "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!", + + "hailStartMessage": "It started to hail!", + "hailLapseMessage": "Hail continues to fall.", + "hailClearMessage": "The hail stopped.", + "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!", + + "snowStartMessage": "It started to snow!", + "snowLapseMessage": "The snow is falling down.", + "snowClearMessage": "The snow stopped.", + + "fogStartMessage": "A thick fog emerged!", + "fogLapseMessage": "The fog continues.", + "fogClearMessage": "The fog disappeared.", + + "heavyRainStartMessage": "A heavy downpour started!", + "heavyRainLapseMessage": "The heavy downpour continues.", + "heavyRainClearMessage": "The heavy rain stopped.", - "harshSunStartMessage": "The sunlight got hot!", - "harshSunLapseMessage": "The sun is scorching hot.", - "harshSunClearMessage": "The harsh sunlight faded.", - - "strongWindsStartMessage": "A heavy wind began!", - "strongWindsLapseMessage": "The wind blows intensely.", - "strongWindsClearMessage": "The heavy wind stopped." -} \ No newline at end of file + "harshSunStartMessage": "The sunlight got hot!", + "harshSunLapseMessage": "The sun is scorching hot.", + "harshSunClearMessage": "The harsh sunlight faded.", + + "strongWindsStartMessage": "A heavy wind began!", + "strongWindsLapseMessage": "The wind blows intensely.", + "strongWindsClearMessage": "The heavy wind stopped." +}; diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index cd6def4c6288..c41d36c2e8f5 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!`, - 'badDreams': `{{pokemonName}} Está atormentado!` + "blockRecoilDamage" : "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "badDreams": "{{pokemonName}} Está atormentado!" } as const; diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index 5715c58ece0b..fcf8354990a4 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "No afecta a {{pokemonName}}!", "hitResultOneHitKO": "!KO en 1 golpe!", "attackFailed": "¡Pero ha fallado!", - "attackHitsCount": `N.º de golpes: {{count}}.`, + "attackHitsCount": "N.º de golpes: {{count}}.", "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", "levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!", "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", @@ -53,4 +53,4 @@ export const battle: SimpleTranslationEntries = { "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "eggHatching": "¿Y esto?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/command-ui-handler.ts b/src/locales/es/command-ui-handler.ts index 66a892f8fd37..89dddb84a063 100644 --- a/src/locales/es/command-ui-handler.ts +++ b/src/locales/es/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Luchar", - "ball": "Balls", - "pokemon": "Pokémon", - "run": "Huir", - "actionMessage": "¿Qué debería\nhacer {{pokemonName}}?", -} as const; \ No newline at end of file + "fight": "Luchar", + "ball": "Balls", + "pokemon": "Pokémon", + "run": "Huir", + "actionMessage": "¿Qué debería\nhacer {{pokemonName}}?", +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 2d0a8a536b2c..0fcbd59ffeed 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const esConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.ts index 358c1b4a5034..b9ed9a71fd1d 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "You have too many eggs!", "pull": "Pull", "pulls": "Pulls" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/fight-ui-handler.ts b/src/locales/es/fight-ui-handler.ts index 951d043d3933..421e0fb993b6 100644 --- a/src/locales/es/fight-ui-handler.ts +++ b/src/locales/es/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Potencia", - "accuracy": "Precisión", + "pp": "PP", + "power": "Potencia", + "accuracy": "Precisión", } as const; diff --git a/src/locales/es/growth.ts b/src/locales/es/growth.ts index d89f5c16b2bc..a47a4f408bd6 100644 --- a/src/locales/es/growth.ts +++ b/src/locales/es/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Errático", - "Fast": "Rápido", - "Medium_Fast": "Medio Rápido", - "Medium_Slow": "Medio Lento", - "Slow": "Lento", - "Fluctuating": "Fluctuante" -} as const; \ No newline at end of file + "Erratic": "Errático", + "Fast": "Rápido", + "Medium_Fast": "Medio Rápido", + "Medium_Slow": "Medio Lento", + "Slow": "Lento", + "Fluctuating": "Fluctuante" +} as const; diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index 0cfe3fbd7c51..76972cef19c8 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": 'Ajustes', - "ACHIEVEMENTS": "Logros", - "STATS": "Estadísticas", - "VOUCHERS": "Vales", - "EGG_LIST": "Lista de Huevos", - "EGG_GACHA": "Gacha de Huevos", - "MANAGE_DATA": "Gestionar Datos", - "COMMUNITY": "Comunidad", - "SAVE_AND_QUIT": "Guardar y Salir", - "LOG_OUT": "Cerrar Sesión", - "slot": "Ranura {{slotNumber}}", - "importSession": "Importar Sesión", - "importSlotSelect": "Selecciona una ranura para importar.", - "exportSession": "Exportar Sesión", - "exportSlotSelect": "Selecciona una ranura para exportar.", - "importData": "Importar Datos", - "exportData": "Exportar Datos", - "cancel": "Cancelar", - "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" + "GAME_SETTINGS": "Ajustes", + "ACHIEVEMENTS": "Logros", + "STATS": "Estadísticas", + "VOUCHERS": "Vales", + "EGG_LIST": "Lista de Huevos", + "EGG_GACHA": "Gacha de Huevos", + "MANAGE_DATA": "Gestionar Datos", + "COMMUNITY": "Comunidad", + "SAVE_AND_QUIT": "Guardar y Salir", + "LOG_OUT": "Cerrar Sesión", + "slot": "Ranura {{slotNumber}}", + "importSession": "Importar Sesión", + "importSlotSelect": "Selecciona una ranura para importar.", + "exportSession": "Exportar Sesión", + "exportSlotSelect": "Selecciona una ranura para exportar.", + "importData": "Importar Datos", + "exportData": "Exportar Datos", + "cancel": "Cancelar", + "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" } as const; diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index 6a7f2587a0f7..54d4843aaf57 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "Cancelar", - "continue": "Continuar", - "dailyRun": "Reto diario (Beta)", - "loadGame": "Cargar partida", - "newGame": "Nueva partida", - "selectGameMode": "Elige un modo de juego.", - "logInOrCreateAccount": "Inicia sesión o crea una cuenta para empezar. ¡No se requiere correo electrónico!", - "username": "Usuario", - "password": "Contraseña", - "login": "Iniciar Sesión", - "register": "Registrarse", - "emptyUsername": "El usuario no puede estar vacío", - "invalidLoginUsername": "El usuario no es válido", - "invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos", - "invalidLoginPassword": "La contraseña no es válida", - "invalidRegisterPassword": "Contraseña debe tener 6 o más caracter.", - "usernameAlreadyUsed": "El usuario ya está en uso", - "accountNonExistent": "El usuario no existe", - "unmatchingPassword": "La contraseña no coincide", - "passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir", - "confirmPassword": "Confirmar Contra.", - "registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.", - "backToLogin": "Volver al Login", - "failedToLoadSaveData": "No se ha podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor contacta al administrador.", - "sessionSuccess": "Sesión cargada con éxito.", - "failedToLoadSession": "No se ha podido cargar los datos de tu sesión.\nPuede que estén corruptos.", - "boyOrGirl": "¿Eres un chico o una chica?", - "boy": "Chico", - "girl": "Chica", - "evolving": "What?\n{{pokemonName}} is evolving!", - "stoppedEvolving": "{{pokemonName}} stopped evolving.", - "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", - "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", - "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", - "dailyRankings": "Rankings Diarios", - "weeklyRankings": "Rankings Semanales", - "noRankings": "Sin Rankings", - "loading": "Cargando…", - "playersOnline": "Jugadores en Línea", - "empty":"Vacío", - "yes":"Sí", - "no":"No", -} as const; \ No newline at end of file + "cancel": "Cancelar", + "continue": "Continuar", + "dailyRun": "Reto diario (Beta)", + "loadGame": "Cargar partida", + "newGame": "Nueva partida", + "selectGameMode": "Elige un modo de juego.", + "logInOrCreateAccount": "Inicia sesión o crea una cuenta para empezar. ¡No se requiere correo electrónico!", + "username": "Usuario", + "password": "Contraseña", + "login": "Iniciar Sesión", + "register": "Registrarse", + "emptyUsername": "El usuario no puede estar vacío", + "invalidLoginUsername": "El usuario no es válido", + "invalidRegisterUsername": "El usuario solo puede contener letras, números y guiones bajos", + "invalidLoginPassword": "La contraseña no es válida", + "invalidRegisterPassword": "Contraseña debe tener 6 o más caracter.", + "usernameAlreadyUsed": "El usuario ya está en uso", + "accountNonExistent": "El usuario no existe", + "unmatchingPassword": "La contraseña no coincide", + "passwordNotMatchingConfirmPassword": "Las contraseñas deben coincidir", + "confirmPassword": "Confirmar Contra.", + "registrationAgeWarning": "Al registrarte, confirmas tener 13 o más años de edad.", + "backToLogin": "Volver al Login", + "failedToLoadSaveData": "No se ha podido cargar los datos guardados. Por favor, recarga la página.\nSi el fallo continúa, por favor contacta al administrador.", + "sessionSuccess": "Sesión cargada con éxito.", + "failedToLoadSession": "No se ha podido cargar los datos de tu sesión.\nPuede que estén corruptos.", + "boyOrGirl": "¿Eres un chico o una chica?", + "boy": "Chico", + "girl": "Chica", + "evolving": "What?\n{{pokemonName}} is evolving!", + "stoppedEvolving": "{{pokemonName}} stopped evolving.", + "pauseEvolutionsQuestion": "Would you like to pause evolutions for {{pokemonName}}?\nEvolutions can be re-enabled from the party screen.", + "evolutionsPaused": "Evolutions have been paused for {{pokemonName}}.", + "evolutionDone": "Congratulations!\nYour {{pokemonName}} evolved into {{evolvedPokemonName}}!", + "dailyRankings": "Rankings Diarios", + "weeklyRankings": "Rankings Semanales", + "noRankings": "Sin Rankings", + "loading": "Cargando…", + "playersOnline": "Jugadores en Línea", + "empty":"Vacío", + "yes":"Sí", + "no":"No", +} as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index cd137fe6f0e5..60c0f5c13920 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -384,4 +384,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "Chill Drive", "DOUSE_DRIVE": "Douse Drive", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/nature.ts b/src/locales/es/nature.ts index 74f9c017ac89..212ee403bd7a 100644 --- a/src/locales/es/nature.ts +++ b/src/locales/es/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Grosera", "Careful": "Cauta", "Quirky": "Rara" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/pokeball.ts b/src/locales/es/pokeball.ts index 03f4131b8f7e..a38b6d6a0475 100644 --- a/src/locales/es/pokeball.ts +++ b/src/locales/es/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Super Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Lujo Ball", -} as const; \ No newline at end of file + "pokeBall": "Poké Ball", + "greatBall": "Super Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Lujo Ball", +} as const; diff --git a/src/locales/es/pokemon-info.ts b/src/locales/es/pokemon-info.ts index bd370c40336c..887a08530706 100644 --- a/src/locales/es/pokemon-info.ts +++ b/src/locales/es/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "PS", - "HPshortened": "PS", - "ATK": "Ataque", - "ATKshortened": "Ata", - "DEF": "Defensa", - "DEFshortened": "Def", - "SPATK": "At. Esp.", - "SPATKshortened": "AtEsp", - "SPDEF": "Def. Esp.", - "SPDEFshortened": "DefEsp", - "SPD": "Velocidad", - "SPDshortened": "Veloc." - }, + Stat: { + "HP": "PS", + "HPshortened": "PS", + "ATK": "Ataque", + "ATKshortened": "Ata", + "DEF": "Defensa", + "DEFshortened": "Def", + "SPATK": "At. Esp.", + "SPATKshortened": "AtEsp", + "SPDEF": "Def. Esp.", + "SPDEFshortened": "DefEsp", + "SPD": "Velocidad", + "SPDshortened": "Veloc." + }, - Type: { - "UNKNOWN": "Desconocido", - "NORMAL": "Normal", - "FIGHTING": "Lucha", - "FLYING": "Volador", - "POISON": "Veneno", - "GROUND": "Tierra", - "ROCK": "Roca", - "BUG": "Bicho", - "GHOST": "Fantasma", - "STEEL": "Acero", - "FIRE": "Fuego", - "WATER": "Agua", - "GRASS": "Planta", - "ELECTRIC": "Eléctrico", - "PSYCHIC": "Psíquico", - "ICE": "Hielo", - "DRAGON": "Dragón", - "DARK": "Siniestro", - "FAIRY": "Hada", - "STELLAR": "Astral", - }, + Type: { + "UNKNOWN": "Desconocido", + "NORMAL": "Normal", + "FIGHTING": "Lucha", + "FLYING": "Volador", + "POISON": "Veneno", + "GROUND": "Tierra", + "ROCK": "Roca", + "BUG": "Bicho", + "GHOST": "Fantasma", + "STEEL": "Acero", + "FIRE": "Fuego", + "WATER": "Agua", + "GRASS": "Planta", + "ELECTRIC": "Eléctrico", + "PSYCHIC": "Psíquico", + "ICE": "Hielo", + "DRAGON": "Dragón", + "DARK": "Siniestro", + "FAIRY": "Hada", + "STELLAR": "Astral", + }, } as const; diff --git a/src/locales/es/pokemon.ts b/src/locales/es/pokemon.ts index 7826e15ba679..b230777e0331 100644 --- a/src/locales/es/pokemon.ts +++ b/src/locales/es/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbasaur", - "ivysaur": "Ivysaur", - "venusaur": "Venusaur", - "charmander": "Charmander", - "charmeleon": "Charmeleon", - "charizard": "Charizard", - "squirtle": "Squirtle", - "wartortle": "Wartortle", - "blastoise": "Blastoise", - "caterpie": "Caterpie", - "metapod": "Metapod", - "butterfree": "Butterfree", - "weedle": "Weedle", - "kakuna": "Kakuna", - "beedrill": "Beedrill", - "pidgey": "Pidgey", - "pidgeotto": "Pidgeotto", - "pidgeot": "Pidgeot", - "rattata": "Rattata", - "raticate": "Raticate", - "spearow": "Spearow", - "fearow": "Fearow", - "ekans": "Ekans", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandshrew", - "sandslash": "Sandslash", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Clefairy", - "clefable": "Clefable", - "vulpix": "Vulpix", - "ninetales": "Ninetales", - "jigglypuff": "Jigglypuff", - "wigglytuff": "Wigglytuff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Oddish", - "gloom": "Gloom", - "vileplume": "Vileplume", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Venonat", - "venomoth": "Venomoth", - "diglett": "Diglett", - "dugtrio": "Dugtrio", - "meowth": "Meowth", - "persian": "Persian", - "psyduck": "Psyduck", - "golduck": "Golduck", - "mankey": "Mankey", - "primeape": "Primeape", - "growlithe": "Growlithe", - "arcanine": "Arcanine", - "poliwag": "Poliwag", - "poliwhirl": "Poliwhirl", - "poliwrath": "Poliwrath", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machop", - "machoke": "Machoke", - "machamp": "Machamp", - "bellsprout": "Bellsprout", - "weepinbell": "Weepinbell", - "victreebel": "Victreebel", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Geodude", - "graveler": "Graveler", - "golem": "Golem", - "ponyta": "Ponyta", - "rapidash": "Rapidash", - "slowpoke": "Slowpoke", - "slowbro": "Slowbro", - "magnemite": "Magnemite", - "magneton": "Magneton", - "farfetchd": "Farfetch'd", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Seel", - "dewgong": "Dewgong", - "grimer": "Grimer", - "muk": "Muk", - "shellder": "Shellder", - "cloyster": "Cloyster", - "gastly": "Gastly", - "haunter": "Haunter", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Drowzee", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltorb", - "electrode": "Electrode", - "exeggcute": "Exeggcute", - "exeggutor": "Exeggutor", - "cubone": "Cubone", - "marowak": "Marowak", - "hitmonlee": "Hitmonlee", - "hitmonchan": "Hitmonchan", - "lickitung": "Lickitung", - "koffing": "Koffing", - "weezing": "Weezing", - "rhyhorn": "Rhyhorn", - "rhydon": "Rhydon", - "chansey": "Chansey", - "tangela": "Tangela", - "kangaskhan": "Kangaskhan", - "horsea": "Horsea", - "seadra": "Seadra", - "goldeen": "Goldeen", - "seaking": "Seaking", - "staryu": "Staryu", - "starmie": "Starmie", - "mr_mime": "Mr. Mime", - "scyther": "Scyther", - "jynx": "Jynx", - "electabuzz": "Electabuzz", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Magikarp", - "gyarados": "Gyarados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Eevee", - "vaporeon": "Vaporeon", - "jolteon": "Jolteon", - "flareon": "Flareon", - "porygon": "Porygon", - "omanyte": "Omanyte", - "omastar": "Omastar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Snorlax", - "articuno": "Articuno", - "zapdos": "Zapdos", - "moltres": "Moltres", - "dratini": "Dratini", - "dragonair": "Dragonair", - "dragonite": "Dragonite", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Chikorita", - "bayleef": "Bayleef", - "meganium": "Meganium", - "cyndaquil": "Cyndaquil", - "quilava": "Quilava", - "typhlosion": "Typhlosion", - "totodile": "Totodile", - "croconaw": "Croconaw", - "feraligatr": "Feraligatr", - "sentret": "Sentret", - "furret": "Furret", - "hoothoot": "Hoothoot", - "noctowl": "Noctowl", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Spinarak", - "ariados": "Ariados", - "crobat": "Crobat", - "chinchou": "Chinchou", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Cleffa", - "igglybuff": "Igglybuff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Mareep", - "flaaffy": "Flaaffy", - "ampharos": "Ampharos", - "bellossom": "Bellossom", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Sudowoodo", - "politoed": "Politoed", - "hoppip": "Hoppip", - "skiploom": "Skiploom", - "jumpluff": "Jumpluff", - "aipom": "Aipom", - "sunkern": "Sunkern", - "sunflora": "Sunflora", - "yanma": "Yanma", - "wooper": "Wooper", - "quagsire": "Quagsire", - "espeon": "Espeon", - "umbreon": "Umbreon", - "murkrow": "Murkrow", - "slowking": "Slowking", - "misdreavus": "Misdreavus", - "unown": "Unown", - "wobbuffet": "Wobbuffet", - "girafarig": "Girafarig", - "pineco": "Pineco", - "forretress": "Forretress", - "dunsparce": "Dunsparce", - "gligar": "Gligar", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Scizor", - "shuckle": "Shuckle", - "heracross": "Heracross", - "sneasel": "Sneasel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Slugma", - "magcargo": "Magcargo", - "swinub": "Swinub", - "piloswine": "Piloswine", - "corsola": "Corsola", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Delibird", - "mantine": "Mantine", - "skarmory": "Skarmory", - "houndour": "Houndour", - "houndoom": "Houndoom", - "kingdra": "Kingdra", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Stantler", - "smeargle": "Smeargle", - "tyrogue": "Tyrogue", - "hitmontop": "Hitmontop", - "smoochum": "Smoochum", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Blissey", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Tyranitar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Treecko", - "grovyle": "Grovyle", - "sceptile": "Sceptile", - "torchic": "Torchic", - "combusken": "Combusken", - "blaziken": "Blaziken", - "mudkip": "Mudkip", - "marshtomp": "Marshtomp", - "swampert": "Swampert", - "poochyena": "Poochyena", - "mightyena": "Mightyena", - "zigzagoon": "Zigzagoon", - "linoone": "Linoone", - "wurmple": "Wurmple", - "silcoon": "Silcoon", - "beautifly": "Beautifly", - "cascoon": "Cascoon", - "dustox": "Dustox", - "lotad": "Lotad", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Seedot", - "nuzleaf": "Nuzleaf", - "shiftry": "Shiftry", - "taillow": "Taillow", - "swellow": "Swellow", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Ralts", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Surskit", - "masquerain": "Masquerain", - "shroomish": "Shroomish", - "breloom": "Breloom", - "slakoth": "Slakoth", - "vigoroth": "Vigoroth", - "slaking": "Slaking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Shedinja", - "whismur": "Whismur", - "loudred": "Loudred", - "exploud": "Exploud", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nosepass", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Sableye", - "mawile": "Mawile", - "aron": "Aron", - "lairon": "Lairon", - "aggron": "Aggron", - "meditite": "Meditite", - "medicham": "Medicham", - "electrike": "Electrike", - "manectric": "Manectric", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Gulpin", - "swalot": "Swalot", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Numel", - "camerupt": "Camerupt", - "torkoal": "Torkoal", - "spoink": "Spoink", - "grumpig": "Grumpig", - "spinda": "Spinda", - "trapinch": "Trapinch", - "vibrava": "Vibrava", - "flygon": "Flygon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Swablu", - "altaria": "Altaria", - "zangoose": "Zangoose", - "seviper": "Seviper", - "lunatone": "Lunatone", - "solrock": "Solrock", - "barboach": "Barboach", - "whiscash": "Whiscash", - "corphish": "Corphish", - "crawdaunt": "Crawdaunt", - "baltoy": "Baltoy", - "claydol": "Claydol", - "lileep": "Lileep", - "cradily": "Cradily", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Feebas", - "milotic": "Milotic", - "castform": "Castform", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Duskull", - "dusclops": "Dusclops", - "tropius": "Tropius", - "chimecho": "Chimecho", - "absol": "Absol", - "wynaut": "Wynaut", - "snorunt": "Snorunt", - "glalie": "Glalie", - "spheal": "Spheal", - "sealeo": "Sealeo", - "walrein": "Walrein", - "clamperl": "Clamperl", - "huntail": "Huntail", - "gorebyss": "Gorebyss", - "relicanth": "Relicanth", - "luvdisc": "Luvdisc", - "bagon": "Bagon", - "shelgon": "Shelgon", - "salamence": "Salamence", - "beldum": "Beldum", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Budew", - "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", - "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", - "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", - "skuntank": "Skuntank", - "bronzor": "Bronzor", - "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", - "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", - "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", - "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", - "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", - "elgyem": "Elgyem", - "beheeyem": "Beheeyem", - "litwick": "Litwick", - "lampent": "Lampent", - "chandelure": "Chandelure", - "axew": "Axew", - "fraxure": "Fraxure", - "haxorus": "Haxorus", - "cubchoo": "Cubchoo", - "beartic": "Beartic", - "cryogonal": "Cryogonal", - "shelmet": "Shelmet", - "accelgor": "Accelgor", - "stunfisk": "Stunfisk", - "mienfoo": "Mienfoo", - "mienshao": "Mienshao", - "druddigon": "Druddigon", - "golett": "Golett", - "golurk": "Golurk", - "pawniard": "Pawniard", - "bisharp": "Bisharp", - "bouffalant": "Bouffalant", - "rufflet": "Rufflet", - "braviary": "Braviary", - "vullaby": "Vullaby", - "mandibuzz": "Mandibuzz", - "heatmor": "Heatmor", - "durant": "Durant", - "deino": "Deino", - "zweilous": "Zweilous", - "hydreigon": "Hydreigon", - "larvesta": "Larvesta", - "volcarona": "Volcarona", - "cobalion": "Cobalion", - "terrakion": "Terrakion", - "virizion": "Virizion", - "tornadus": "Tornadus", - "thundurus": "Thundurus", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Landorus", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Chespin", - "quilladin": "Quilladin", - "chesnaught": "Chesnaught", - "fennekin": "Fennekin", - "braixen": "Braixen", - "delphox": "Delphox", - "froakie": "Froakie", - "frogadier": "Frogadier", - "greninja": "Greninja", - "bunnelby": "Bunnelby", - "diggersby": "Diggersby", - "fletchling": "Fletchling", - "fletchinder": "Fletchinder", - "talonflame": "Talonflame", - "scatterbug": "Scatterbug", - "spewpa": "Spewpa", - "vivillon": "Vivillon", - "litleo": "Litleo", - "pyroar": "Pyroar", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Skiddo", - "gogoat": "Gogoat", - "pancham": "Pancham", - "pangoro": "Pangoro", - "furfrou": "Furfrou", - "espurr": "Espurr", - "meowstic": "Meowstic", - "honedge": "Honedge", - "doublade": "Doublade", - "aegislash": "Aegislash", - "spritzee": "Spritzee", - "aromatisse": "Aromatisse", - "swirlix": "Swirlix", - "slurpuff": "Slurpuff", - "inkay": "Inkay", - "malamar": "Malamar", - "binacle": "Binacle", - "barbaracle": "Barbaracle", - "skrelp": "Skrelp", - "dragalge": "Dragalge", - "clauncher": "Clauncher", - "clawitzer": "Clawitzer", - "helioptile": "Helioptile", - "heliolisk": "Heliolisk", - "tyrunt": "Tyrunt", - "tyrantrum": "Tyrantrum", - "amaura": "Amaura", - "aurorus": "Aurorus", - "sylveon": "Sylveon", - "hawlucha": "Hawlucha", - "dedenne": "Dedenne", - "carbink": "Carbink", - "goomy": "Goomy", - "sliggoo": "Sliggoo", - "goodra": "Goodra", - "klefki": "Klefki", - "phantump": "Phantump", - "trevenant": "Trevenant", - "pumpkaboo": "Pumpkaboo", - "gourgeist": "Gourgeist", - "bergmite": "Bergmite", - "avalugg": "Avalugg", - "noibat": "Noibat", - "noivern": "Noivern", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Rowlet", - "dartrix": "Dartrix", - "decidueye": "Decidueye", - "litten": "Litten", - "torracat": "Torracat", - "incineroar": "Incineroar", - "popplio": "Popplio", - "brionne": "Brionne", - "primarina": "Primarina", - "pikipek": "Pikipek", - "trumbeak": "Trumbeak", - "toucannon": "Toucannon", - "yungoos": "Yungoos", - "gumshoos": "Gumshoos", - "grubbin": "Grubbin", - "charjabug": "Charjabug", - "vikavolt": "Vikavolt", - "crabrawler": "Crabrawler", - "crabominable": "Crabominable", - "oricorio": "Oricorio", - "cutiefly": "Cutiefly", - "ribombee": "Ribombee", - "rockruff": "Rockruff", - "lycanroc": "Lycanroc", - "wishiwashi": "Wishiwashi", - "mareanie": "Mareanie", - "toxapex": "Toxapex", - "mudbray": "Mudbray", - "mudsdale": "Mudsdale", - "dewpider": "Dewpider", - "araquanid": "Araquanid", - "fomantis": "Fomantis", - "lurantis": "Lurantis", - "morelull": "Morelull", - "shiinotic": "Shiinotic", - "salandit": "Salandit", - "salazzle": "Salazzle", - "stufful": "Stufful", - "bewear": "Bewear", - "bounsweet": "Bounsweet", - "steenee": "Steenee", - "tsareena": "Tsareena", - "comfey": "Comfey", - "oranguru": "Oranguru", - "passimian": "Passimian", - "wimpod": "Wimpod", - "golisopod": "Golisopod", - "sandygast": "Sandygast", - "palossand": "Palossand", - "pyukumuku": "Pyukumuku", - "type_null": "Código Cero", - "silvally": "Silvally", - "minior": "Minior", - "komala": "Komala", - "turtonator": "Turtonator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimikyu", - "bruxish": "Bruxish", - "drampa": "Drampa", - "dhelmise": "Dhelmise", - "jangmo_o": "Jangmo-o", - "hakamo_o": "Hakamo-o", - "kommo_o": "Kommo-o", - "tapu_koko": "Tapu Koko", - "tapu_lele": "Tapu Lele", - "tapu_bulu": "Tapu Bulu", - "tapu_fini": "Tapu Fini", - "cosmog": "Cosmog", - "cosmoem": "Cosmoem", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Nihilego", - "buzzwole": "Buzzwole", - "pheromosa": "Pheromosa", - "xurkitree": "Xurkitree", - "celesteela": "Celesteela", - "kartana": "Kartana", - "guzzlord": "Guzzlord", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Poipole", - "naganadel": "Naganadel", - "stakataka": "Stakataka", - "blacephalon": "Blacephalon", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Grookey", - "thwackey": "Thwackey", - "rillaboom": "Rillaboom", - "scorbunny": "Scorbunny", - "raboot": "Raboot", - "cinderace": "Cinderace", - "sobble": "Sobble", - "drizzile": "Drizzile", - "inteleon": "Inteleon", - "skwovet": "Skwovet", - "greedent": "Greedent", - "rookidee": "Rookidee", - "corvisquire": "Corvisquire", - "corviknight": "Corviknight", - "blipbug": "Blipbug", - "dottler": "Dottler", - "orbeetle": "Orbeetle", - "nickit": "Nickit", - "thievul": "Thievul", - "gossifleur": "Gossifleur", - "eldegoss": "Eldegoss", - "wooloo": "Wooloo", - "dubwool": "Dubwool", - "chewtle": "Chewtle", - "drednaw": "Drednaw", - "yamper": "Yamper", - "boltund": "Boltund", - "rolycoly": "Rolycoly", - "carkol": "Carkol", - "coalossal": "Coalossal", - "applin": "Applin", - "flapple": "Flapple", - "appletun": "Appletun", - "silicobra": "Silicobra", - "sandaconda": "Sandaconda", - "cramorant": "Cramorant", - "arrokuda": "Arrokuda", - "barraskewda": "Barraskewda", - "toxel": "Toxel", - "toxtricity": "Toxtricity", - "sizzlipede": "Sizzlipede", - "centiskorch": "Centiskorch", - "clobbopus": "Clobbopus", - "grapploct": "Grapploct", - "sinistea": "Sinistea", - "polteageist": "Polteageist", - "hatenna": "Hatenna", - "hattrem": "Hattrem", - "hatterene": "Hatterene", - "impidimp": "Impidimp", - "morgrem": "Morgrem", - "grimmsnarl": "Grimmsnarl", - "obstagoon": "Obstagoon", - "perrserker": "Perrserker", - "cursola": "Cursola", - "sirfetchd": "Sirfetch'd", - "mr_rime": "Mr. Rime", - "runerigus": "Runerigus", - "milcery": "Milcery", - "alcremie": "Alcremie", - "falinks": "Falinks", - "pincurchin": "Pincurchin", - "snom": "Snom", - "frosmoth": "Frosmoth", - "stonjourner": "Stonjourner", - "eiscue": "Eiscue", - "indeedee": "Indeedee", - "morpeko": "Morpeko", - "cufant": "Cufant", - "copperajah": "Copperajah", - "dracozolt": "Dracozolt", - "arctozolt": "Arctozolt", - "dracovish": "Dracovish", - "arctovish": "Arctovish", - "duraludon": "Duraludon", - "dreepy": "Dreepy", - "drakloak": "Drakloak", - "dragapult": "Dragapult", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Eternatus", - "kubfu": "Kubfu", - "urshifu": "Urshifu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Glastrier", - "spectrier": "Spectrier", - "calyrex": "Calyrex", - "wyrdeer": "Wyrdeer", - "kleavor": "Kleavor", - "ursaluna": "Ursaluna", - "basculegion": "Basculegion", - "sneasler": "Sneasler", - "overqwil": "Overqwil", - "enamorus": "Enamorus", - "sprigatito": "Sprigatito", - "floragato": "Floragato", - "meowscarada": "Meowscarada", - "fuecoco": "Fuecoco", - "crocalor": "Crocalor", - "skeledirge": "Skeledirge", - "quaxly": "Quaxly", - "quaxwell": "Quaxwell", - "quaquaval": "Quaquaval", - "lechonk": "Lechonk", - "oinkologne": "Oinkologne", - "tarountula": "Tarountula", - "spidops": "Spidops", - "nymble": "Nymble", - "lokix": "Lokix", - "pawmi": "Pawmi", - "pawmo": "Pawmo", - "pawmot": "Pawmot", - "tandemaus": "Tandemaus", - "maushold": "Maushold", - "fidough": "Fidough", - "dachsbun": "Dachsbun", - "smoliv": "Smoliv", - "dolliv": "Dolliv", - "arboliva": "Arboliva", - "squawkabilly": "Squawkabilly", - "nacli": "Nacli", - "naclstack": "Naclstack", - "garganacl": "Garganacl", - "charcadet": "Charcadet", - "armarouge": "Armarouge", - "ceruledge": "Ceruledge", - "tadbulb": "Tadbulb", - "bellibolt": "Bellibolt", - "wattrel": "Wattrel", - "kilowattrel": "Kilowattrel", - "maschiff": "Maschiff", - "mabosstiff": "Mabosstiff", - "shroodle": "Shroodle", - "grafaiai": "Grafaiai", - "bramblin": "Bramblin", - "brambleghast": "Brambleghast", - "toedscool": "Toedscool", - "toedscruel": "Toedscruel", - "klawf": "Klawf", - "capsakid": "Capsakid", - "scovillain": "Scovillain", - "rellor": "Rellor", - "rabsca": "Rabsca", - "flittle": "Flittle", - "espathra": "Espathra", - "tinkatink": "Tinkatink", - "tinkatuff": "Tinkatuff", - "tinkaton": "Tinkaton", - "wiglett": "Wiglett", - "wugtrio": "Wugtrio", - "bombirdier": "Bombirdier", - "finizen": "Finizen", - "palafin": "Palafin", - "varoom": "Varoom", - "revavroom": "Revavroom", - "cyclizar": "Cyclizar", - "orthworm": "Orthworm", - "glimmet": "Glimmet", - "glimmora": "Glimmora", - "greavard": "Greavard", - "houndstone": "Houndstone", - "flamigo": "Flamigo", - "cetoddle": "Cetoddle", - "cetitan": "Cetitan", - "veluza": "Veluza", - "dondozo": "Dondozo", - "tatsugiri": "Tatsugiri", - "annihilape": "Annihilape", - "clodsire": "Clodsire", - "farigiraf": "Farigiraf", - "dudunsparce": "Dudunsparce", - "kingambit": "Kingambit", - "great_tusk": "Colmilargo", - "scream_tail": "Colagrito", - "brute_bonnet": "Furioseta", - "flutter_mane": "Melenaleteo", - "slither_wing": "Reptalada", - "sandy_shocks": "Pelarena", - "iron_treads": "Ferrodada", - "iron_bundle": "Ferrosaco", - "iron_hands": "Ferropalmas", - "iron_jugulis": "Ferrocuello", - "iron_moth": "Ferropolilla", - "iron_thorns": "Ferropúas", - "frigibax": "Frigibax", - "arctibax": "Arctibax", - "baxcalibur": "Baxcalibur", - "gimmighoul": "Gimmighoul", - "gholdengo": "Gholdengo", - "wo_chien": "Wo-Chien", - "chien_pao": "Chien-Pao", - "ting_lu": "Ting-Lu", - "chi_yu": "Chi-Yu", - "roaring_moon": "Bramaluna", - "iron_valiant": "Ferropaladín", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Ondulagua", - "iron_leaves": "Ferroverdor", - "dipplin": "Dipplin", - "poltchageist": "Poltchageist", - "sinistcha": "Sinistcha", - "okidogi": "Okidogi", - "munkidori": "Munkidori", - "fezandipiti": "Fezandipiti", - "ogerpon": "Ogerpon", - "archaludon": "Archaludon", - "hydrapple": "Hydrapple", - "gouging_fire": "Flamariete", - "raging_bolt": "Electrofuria", - "iron_boulder": "Ferromole", - "iron_crown": "Ferrotesta", - "terapagos": "Terapagos", - "pecharunt": "Pecharunt", - "alola_rattata": "Rattata", - "alola_raticate": "Raticate", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandshrew", - "alola_sandslash": "Sandslash", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Ninetales", - "alola_diglett": "Diglett", - "alola_dugtrio": "Dugtrio", - "alola_meowth": "Meowth", - "alola_persian": "Persian", - "alola_geodude": "Geodude", - "alola_graveler": "Graveler", - "alola_golem": "Golem", - "alola_grimer": "Grimer", - "alola_muk": "Muk", - "alola_exeggutor": "Exeggutor", - "alola_marowak": "Marowak", - "eternal_floette": "Floette", - "galar_meowth": "Meowth", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Rapidash", - "galar_slowpoke": "Slowpoke", - "galar_slowbro": "Slowbro", - "galar_farfetchd": "Farfetch'd", - "galar_weezing": "Weezing", - "galar_mr_mime": "Mr. Mime", - "galar_articuno": "Articuno", - "galar_zapdos": "Zapdos", - "galar_moltres": "Moltres", - "galar_slowking": "Slowking", - "galar_corsola": "Corsola", - "galar_zigzagoon": "Zigzagoon", - "galar_linoone": "Linoone", - "galar_darumaka": "Darumaka", - "galar_darmanitan": "Darmanitan", - "galar_yamask": "Yamask", - "galar_stunfisk": "Stunfisk", - "hisui_growlithe": "Growlithe", - "hisui_arcanine": "Arcanine", - "hisui_voltorb": "Voltorb", - "hisui_electrode": "Electrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Sneasel", - "hisui_samurott": "Samurott", - "hisui_lilligant": "Lilligant", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Braviary", - "hisui_sliggoo": "Sliggoo", - "hisui_goodra": "Goodra", - "hisui_avalugg": "Avalugg", - "hisui_decidueye": "Decidueye", - "paldea_tauros": "Tauros", - "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Código Cero", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Colmilargo", + "scream_tail": "Colagrito", + "brute_bonnet": "Furioseta", + "flutter_mane": "Melenaleteo", + "slither_wing": "Reptalada", + "sandy_shocks": "Pelarena", + "iron_treads": "Ferrodada", + "iron_bundle": "Ferrosaco", + "iron_hands": "Ferropalmas", + "iron_jugulis": "Ferrocuello", + "iron_moth": "Ferropolilla", + "iron_thorns": "Ferropúas", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Bramaluna", + "iron_valiant": "Ferropaladín", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Ondulagua", + "iron_leaves": "Ferroverdor", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Flamariete", + "raging_bolt": "Electrofuria", + "iron_boulder": "Ferromole", + "iron_crown": "Ferrotesta", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna", } as const; diff --git a/src/locales/es/splash-messages.ts b/src/locales/es/splash-messages.ts index 6815d7f1824a..d84001110600 100644 --- a/src/locales/es/splash-messages.ts +++ b/src/locales/es/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Battles Won!", - "joinTheDiscord": "Join the Discord!", - "infiniteLevels": "Infinite Levels!", - "everythingStacks": "Everything Stacks!", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 Biomes!", - "openSource": "Open Source!", - "playWithSpeed": "Play with 5x Speed!", - "liveBugTesting": "Live Bug Testing!", - "heavyInfluence": "Heavy RoR2 Influence!", - "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", - "nowWithMoreSalt": "Now with 33% More Salt!", - "infiniteFusionAtHome": "Infinite Fusion at Home!", - "brokenEggMoves": "Broken Egg Moves!", - "magnificent": "Magnificent!", - "mubstitute": "Mubstitute!", - "thatsCrazy": "That\'s Crazy!", - "oranceJuice": "Orance Juice!", - "questionableBalancing": "Questionable Balancing!", - "coolShaders": "Cool Shaders!", - "aiFree": "AI-Free!", - "suddenDifficultySpikes": "Sudden Difficulty Spikes!", - "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", - "moreAddictiveThanIntended": "More Addictive than Intended!", - "mostlyConsistentSeeds": "Mostly Consistent Seeds!", - "achievementPointsDontDoAnything": "Achievement Points Don\'t Do Anything!", - "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", - "dontTalkAboutTheManaphyEggIncident": "Don\'t Talk About the Manaphy Egg Incident!", - "alsoTryPokengine": "Also Try Pokéngine!", - "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", - "alsoTryRadicalRed": "Also Try Radical Red!", - "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", -} as const; \ No newline at end of file + "battlesWon": "Battles Won!", + "joinTheDiscord": "Join the Discord!", + "infiniteLevels": "Infinite Levels!", + "everythingStacks": "Everything Stacks!", + "optionalSaveScumming": "Optional Save Scumming!", + "biomes": "35 Biomes!", + "openSource": "Open Source!", + "playWithSpeed": "Play with 5x Speed!", + "liveBugTesting": "Live Bug Testing!", + "heavyInfluence": "Heavy RoR2 Influence!", + "pokemonRiskAndPokemonRain": "Pokémon Risk and Pokémon Rain!", + "nowWithMoreSalt": "Now with 33% More Salt!", + "infiniteFusionAtHome": "Infinite Fusion at Home!", + "brokenEggMoves": "Broken Egg Moves!", + "magnificent": "Magnificent!", + "mubstitute": "Mubstitute!", + "thatsCrazy": "That's Crazy!", + "oranceJuice": "Orance Juice!", + "questionableBalancing": "Questionable Balancing!", + "coolShaders": "Cool Shaders!", + "aiFree": "AI-Free!", + "suddenDifficultySpikes": "Sudden Difficulty Spikes!", + "basedOnAnUnfinishedFlashGame": "Based on an Unfinished Flash Game!", + "moreAddictiveThanIntended": "More Addictive than Intended!", + "mostlyConsistentSeeds": "Mostly Consistent Seeds!", + "achievementPointsDontDoAnything": "Achievement Points Don't Do Anything!", + "youDoNotStartAtLevel": "You Do Not Start at Level 2000!", + "dontTalkAboutTheManaphyEggIncident": "Don't Talk About the Manaphy Egg Incident!", + "alsoTryPokengine": "Also Try Pokéngine!", + "alsoTryEmeraldRogue": "Also Try Emerald Rogue!", + "alsoTryRadicalRed": "Also Try Radical Red!", + "eeveeExpo": "Eevee Expo!", + "ynoproject": "YNOproject!", +} as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 79bf6f9476ec..a4d440646e1f 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'¿Comenzar con estos Pokémon?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "Crecimiento:", - "ability": "Habilid:", - "passive": "Pasiva:", - "nature": "Natur:", - "eggMoves": "Mov. Huevo", - "start": "Iniciar", - "addToParty": "Añadir a Equipo", - "toggleIVs": "Mostrar IVs", - "manageMoves": "Gestionar Movs.", - "useCandies": "Usar Caramelos", - "selectMoveSwapOut": "Elige el movimiento que sustituir.", - "selectMoveSwapWith": "Elige el movimiento que sustituirá a", - "unlockPassive": "Añadir Pasiva", - "reduceCost": "Reducir Coste", - "cycleShiny": "R: Cambiar Shiny", - "cycleForm": 'F: Cambiar Forma', - "cycleGender": 'G: Cambiar Género', - "cycleAbility": 'E: Cambiar Habilidad', - "cycleNature": 'N: Cambiar Naturaleza', - "cycleVariant": 'V: Cambiar Variante', - "enablePassive": "Activar Pasiva", - "disablePassive": "Desactivar Pasiva", - "locked": "Locked", - "disabled": "Disabled", - "uncaught": "Uncaught" -} + "confirmStartTeam":"¿Comenzar con estos Pokémon?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "Crecimiento:", + "ability": "Habilid:", + "passive": "Pasiva:", + "nature": "Natur:", + "eggMoves": "Mov. Huevo", + "start": "Iniciar", + "addToParty": "Añadir a Equipo", + "toggleIVs": "Mostrar IVs", + "manageMoves": "Gestionar Movs.", + "useCandies": "Usar Caramelos", + "selectMoveSwapOut": "Elige el movimiento que sustituir.", + "selectMoveSwapWith": "Elige el movimiento que sustituirá a", + "unlockPassive": "Añadir Pasiva", + "reduceCost": "Reducir Coste", + "cycleShiny": "R: Cambiar Shiny", + "cycleForm": "F: Cambiar Forma", + "cycleGender": "G: Cambiar Género", + "cycleAbility": "E: Cambiar Habilidad", + "cycleNature": "N: Cambiar Naturaleza", + "cycleVariant": "V: Cambiar Variante", + "enablePassive": "Activar Pasiva", + "disablePassive": "Desactivar Pasiva", + "locked": "Locked", + "disabled": "Disabled", + "uncaught": "Uncaught" +}; diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index e0af5aac1c4a..cf8585686651 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -2,242 +2,242 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Elite Four", - "gym_leader": "Gym Leader", - "gym_leader_female": "Gym Leader", - "champion": "Champion", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Frontier Brain", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Elite Four", + "gym_leader": "Gym Leader", + "gym_leader_female": "Gym Leader", + "champion": "Champion", + "rival": "Rival", + "professor": "Professor", + "frontier_brain": "Frontier Brain", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ace Trainer", - "ace_trainer_female": "Ace Trainer", - "ace_duo": "Ace Duo", - "artist": "Artist", - "artist_female": "Artist", - "backers": "Backers", - "backpacker": "Backpacker", - "backpacker_female": "Backpacker", - "backpackers": "Backpackers", - "baker": "Baker", - "battle_girl": "Battle Girl", - "beauty": "Beauty", - "beginners": "Beginners", - "biker": "Biker", - "black_belt": "Black Belt", - "breeder": "Breeder", - "breeder_female": "Breeder", - "breeders": "Breeders", - "clerk": "Clerk", - "clerk_female": "Clerk", - "colleagues": "Colleagues", - "crush_kin": "Crush Kin", - "cyclist": "Cyclist", - "cyclist_female": "Cyclist", - "cyclists": "Cyclists", - "dancer": "Dancer", - "dancer_female": "Dancer", - "depot_agent": "Depot Agent", - "doctor": "Doctor", - "doctor_female": "Doctor", - "fisherman": "Fisherman", - "fisherman_female": "Fisherman", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", - "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", - "madame": "Madame", - "medical_team": "Medical Team", - "musician": "Musician", - "hex_maniac": "Hex Maniac", - "nurse": "Nurse", - "nursery_aide": "Nursery Aide", - "officer": "Officer", - "parasol_lady": "Parasol Lady", - "pilot": "Pilot", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Poké Fan Family", - "preschooler": "Preschooler", - "preschooler_female": "Preschooler", - "preschoolers": "Preschoolers", - "psychic": "Psychic", - "psychic_female": "Psychic", - "psychics": "Psychics", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Staff", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Rich Boy", - "rich_couple": "Rich Couple", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "Rich Kids", - "roughneck": "Roughneck", - "scientist": "Scientist", - "scientist_female": "Scientist", - "scientists": "Scientists", - "smasher": "Smasher", - "snow_worker": "Snow Worker", - "snow_worker_female": "Snow Worker", - "striker": "Striker", - "school_kid": "School Kid", - "school_kid_female": "School Kid", - "school_kids": "School Kids", - "swimmer": "Swimmer", - "swimmer_female": "Swimmer", - "swimmers": "Swimmers", - "twins": "Twins", - "veteran": "Veteran", - "veteran_female": "Veteran", - "veteran_duo": "Veteran Duo", - "waiter": "Waiter", - "waitress": "Waitress", - "worker": "Worker", - "worker_female": "Worker", - "workers": "Workers", - "youngster": "Youngster" + "ace_trainer": "Ace Trainer", + "ace_trainer_female": "Ace Trainer", + "ace_duo": "Ace Duo", + "artist": "Artist", + "artist_female": "Artist", + "backers": "Backers", + "backpacker": "Backpacker", + "backpacker_female": "Backpacker", + "backpackers": "Backpackers", + "baker": "Baker", + "battle_girl": "Battle Girl", + "beauty": "Beauty", + "beginners": "Beginners", + "biker": "Biker", + "black_belt": "Black Belt", + "breeder": "Breeder", + "breeder_female": "Breeder", + "breeders": "Breeders", + "clerk": "Clerk", + "clerk_female": "Clerk", + "colleagues": "Colleagues", + "crush_kin": "Crush Kin", + "cyclist": "Cyclist", + "cyclist_female": "Cyclist", + "cyclists": "Cyclists", + "dancer": "Dancer", + "dancer_female": "Dancer", + "depot_agent": "Depot Agent", + "doctor": "Doctor", + "doctor_female": "Doctor", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", + "gentleman": "Gentleman", + "guitarist": "Guitarist", + "guitarist_female": "Guitarist", + "harlequin": "Harlequin", + "hiker": "Hiker", + "hooligans": "Hooligans", + "hoopster": "Hoopster", + "infielder": "Infielder", + "janitor": "Janitor", + "lady": "Lady", + "lass": "Lass", + "linebacker": "Linebacker", + "maid": "Maid", + "madame": "Madame", + "medical_team": "Medical Team", + "musician": "Musician", + "hex_maniac": "Hex Maniac", + "nurse": "Nurse", + "nursery_aide": "Nursery Aide", + "officer": "Officer", + "parasol_lady": "Parasol Lady", + "pilot": "Pilot", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Poké Fan Family", + "preschooler": "Preschooler", + "preschooler_female": "Preschooler", + "preschoolers": "Preschoolers", + "psychic": "Psychic", + "psychic_female": "Psychic", + "psychics": "Psychics", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "Rich Boy", + "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "Rich Kids", + "roughneck": "Roughneck", + "scientist": "Scientist", + "scientist_female": "Scientist", + "scientists": "Scientists", + "smasher": "Smasher", + "snow_worker": "Snow Worker", + "snow_worker_female": "Snow Worker", + "striker": "Striker", + "school_kid": "School Kid", + "school_kid_female": "School Kid", + "school_kids": "School Kids", + "swimmer": "Swimmer", + "swimmer_female": "Swimmer", + "swimmers": "Swimmers", + "twins": "Twins", + "veteran": "Veteran", + "veteran_female": "Veteran", + "veteran_duo": "Veteran Duo", + "waiter": "Waiter", + "waitress": "Waitress", + "worker": "Worker", + "worker_female": "Worker", + "workers": "Workers", + "youngster": "Youngster" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Crasher Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Lt Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Crasher Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", } as const; diff --git a/src/locales/es/tutorial.ts b/src/locales/es/tutorial.ts index 6e131f9b0c9f..bca488c30586 100644 --- a/src/locales/es/tutorial.ts +++ b/src/locales/es/tutorial.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite. + "intro": `¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite. $Este juego no está monetizado y no reclamamos ningún derecho de propiedad sobre Pokémon ni sobre ninguno de $los recursos con copyright utilizados. $El juego está en proceso, pero es completamente jugable.\nPara reportar bugs, por favor, hazlo en nuestra @@ -9,27 +9,27 @@ export const tutorial: SimpleTranslationEntries = { $Si el juego va lento, por favor, asegúrate de que tengas activada la opción 'Aceleración de gráficos' en los $ajustes de tu navegador.`, - "accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control. + "accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control. $El menú contiene los ajustes y otras funciones.`, - "menu": `Desde este menú podrás acceder a los ajustes. + "menu": `Desde este menú podrás acceder a los ajustes. $Podrás cambiar la velocidad del juego, el estilo de la ventana y demás. $Hay más opciones, ¡así que pruébalas todas!`, - "starterSelect": `En esta pantalla podrás elegir tus iniciales. Estos serán tus\nmiembros de equipo al comenzar la partida. + "starterSelect": `En esta pantalla podrás elegir tus iniciales. Estos serán tus\nmiembros de equipo al comenzar la partida. $Cada inicial tiene un valor. Tu equipo puede contener hasta 6\nmiembros mientras el valor total no pase de 10. $También puedes elegir su género, habilidad y forma\ndependiendo de las variantes que hayas conseguido. $Los IVs de los iniciales corresponderán al valor más alto de\nlos Pokémon de la misma especie que hayas obtenido. $¡Así que intenta conseguir muchos Pokémon de la misma\nespecie!`, - "pokerus": `Cada día, 3 iniciales aleatorios tendrán un borde morado. + "pokerus": `Cada día, 3 iniciales aleatorios tendrán un borde morado. $Si ves un inicial que tengas con este borde, prueba a\nañadirlo a tu equipo. ¡No olvides revisar sus datos!`, - "statChange": `Los cambios de estadísticas se mantienen entre combates\nmientras que el Pokémon no vuelva a la Poké Ball. + "statChange": `Los cambios de estadísticas se mantienen entre combates\nmientras que el Pokémon no vuelva a la Poké Ball. $Tus Pokémon vuelven a sus Poké Balls antes de combates contra entrenadores y de entrar a un nuevo bioma. $También puedes ver los cambios de estadísticas del Pokémon en campo manteniendo pulsado C o Shift.`, - "selectItem": `Tras cada combate, tendrás la opción de elegir entre tres objetos aleatorios. Solo podrás escoger uno. + "selectItem": `Tras cada combate, tendrás la opción de elegir entre tres objetos aleatorios. Solo podrás escoger uno. $Estos objetos pueden ser consumibles, objetos equipables u objetos pasivos permanentes (hasta acabar la partida). $La mayoría de los efectos de objetos no consumibles se acumularán de varias maneras. $Algunos objetos solo aparecerán si pueden ser utilizados, como las piedras evolutivas. @@ -38,7 +38,7 @@ export const tutorial: SimpleTranslationEntries = { $También puedes comprar objetos consumibles con dinero y su variedad irá aumentando según tu avance. $Asegúrate de comprar antes de escoger un objeto aleatorio, ya que se avanzará al siguiente combate.`, - "eggGacha": `En esta pantalla podrás canjear tus vales por huevos\nde Pokémon. + "eggGacha": `En esta pantalla podrás canjear tus vales por huevos\nde Pokémon. $Los huevos deben eclosionar y estarán más cerca de\nhacerlo tras cada combate. $Los huevos más raros tardarán más en eclosionar. $Los Pokémon que hayan salido del huevo no se\nañadirán a tu equipo, pero sí a tus iniciales. @@ -46,4 +46,4 @@ export const tutorial: SimpleTranslationEntries = { $Algunos Pokémon solo pueden ser obtenidos de huevos. $Hay 3 máquinas diferentes entre las que elegir, cada\nuna con zdiferentes bonificaciones. $¡Así que escoge la que más te interese!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/voucher.ts b/src/locales/es/voucher.ts index 7af569e88cb9..f2bcb8d723ce 100644 --- a/src/locales/es/voucher.ts +++ b/src/locales/es/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Egg Voucher Gold", "locked": "Locked", "defeatTrainer": "Defeat {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/es/weather.ts b/src/locales/es/weather.ts index 999613f15662..85ec1ff78d69 100644 --- a/src/locales/es/weather.ts +++ b/src/locales/es/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "The sunlight got bright!", - "sunnyLapseMessage": "The sunlight is strong.", - "sunnyClearMessage": "The sunlight faded.", - - "rainStartMessage": "A downpour started!", - "rainLapseMessage": "The downpour continues.", - "rainClearMessage": "The rain stopped.", - - "sandstormStartMessage": "A sandstorm brewed!", - "sandstormLapseMessage": "The sandstorm rages.", - "sandstormClearMessage": "The sandstorm subsided.", - "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!", - - "hailStartMessage": "It started to hail!", - "hailLapseMessage": "Hail continues to fall.", - "hailClearMessage": "The hail stopped.", - "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!", - - "snowStartMessage": "It started to snow!", - "snowLapseMessage": "The snow is falling down.", - "snowClearMessage": "The snow stopped.", - - "fogStartMessage": "A thick fog emerged!", - "fogLapseMessage": "The fog continues.", - "fogClearMessage": "The fog disappeared.", - - "heavyRainStartMessage": "A heavy downpour started!", - "heavyRainLapseMessage": "The heavy downpour continues.", - "heavyRainClearMessage": "The heavy rain stopped.", + "sunnyStartMessage": "The sunlight got bright!", + "sunnyLapseMessage": "The sunlight is strong.", + "sunnyClearMessage": "The sunlight faded.", + + "rainStartMessage": "A downpour started!", + "rainLapseMessage": "The downpour continues.", + "rainClearMessage": "The rain stopped.", + + "sandstormStartMessage": "A sandstorm brewed!", + "sandstormLapseMessage": "The sandstorm rages.", + "sandstormClearMessage": "The sandstorm subsided.", + "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is buffeted\nby the sandstorm!", + + "hailStartMessage": "It started to hail!", + "hailLapseMessage": "Hail continues to fall.", + "hailClearMessage": "The hail stopped.", + "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} is pelted\nby the hail!", + + "snowStartMessage": "It started to snow!", + "snowLapseMessage": "The snow is falling down.", + "snowClearMessage": "The snow stopped.", + + "fogStartMessage": "A thick fog emerged!", + "fogLapseMessage": "The fog continues.", + "fogClearMessage": "The fog disappeared.", + + "heavyRainStartMessage": "A heavy downpour started!", + "heavyRainLapseMessage": "The heavy downpour continues.", + "heavyRainClearMessage": "The heavy rain stopped.", - "harshSunStartMessage": "The sunlight got hot!", - "harshSunLapseMessage": "The sun is scorching hot.", - "harshSunClearMessage": "The harsh sunlight faded.", - - "strongWindsStartMessage": "A heavy wind began!", - "strongWindsLapseMessage": "The wind blows intensely.", - "strongWindsClearMessage": "The heavy wind stopped." -} \ No newline at end of file + "harshSunStartMessage": "The sunlight got hot!", + "harshSunLapseMessage": "The sun is scorching hot.", + "harshSunClearMessage": "The harsh sunlight faded.", + + "strongWindsStartMessage": "A heavy wind began!", + "strongWindsLapseMessage": "The wind blows intensely.", + "strongWindsClearMessage": "The heavy wind stopped." +}; diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index b1bbaa5e3539..c350a127fa92 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !`, - 'badDreams': `{{pokemonName}} a le sommeil agité !` + "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", + "badDreams": "{{pokemonName}} a le sommeil agité !" } as const; diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index 827cea6b2d75..a2ddc87993b1 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "{{pokemonName}} ! Go !", "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?", - "trainerDefeated": `Vous avez battu\n{{trainerName}} !`, + "trainerDefeated": "Vous avez battu\n{{trainerName}} !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}} ! Go !", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Ça n’affecte pas {{pokemonName}}…", "hitResultOneHitKO": "K.O. en un coup !", "attackFailed": "Mais cela échoue !", - "attackHitsCount": `Touché {{count}} fois !`, + "attackHitsCount": "Touché {{count}} fois !", "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", diff --git a/src/locales/fr/command-ui-handler.ts b/src/locales/fr/command-ui-handler.ts index 1b3d01d2c4fd..37d910c8844b 100644 --- a/src/locales/fr/command-ui-handler.ts +++ b/src/locales/fr/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Attaque", - "ball": "Ball", - "pokemon": "Pokémon", - "run": "Fuite", - "actionMessage": "Que doit faire\n{{pokemonName}} ?", -} as const; \ No newline at end of file + "fight": "Attaque", + "ball": "Ball", + "pokemon": "Pokémon", + "run": "Fuite", + "actionMessage": "Que doit faire\n{{pokemonName}} ?", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index a6bdfe5cd597..1afc206e0908 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const frConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/fr/egg.ts b/src/locales/fr/egg.ts index 566e423b69f4..beffb1a98a73 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", "pulls": "Tirages" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/fr/fight-ui-handler.ts b/src/locales/fr/fight-ui-handler.ts index a96e84c11f8e..bccfdd5cfb89 100644 --- a/src/locales/fr/fight-ui-handler.ts +++ b/src/locales/fr/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Puissance", - "accuracy": "Précision", -} as const; \ No newline at end of file + "pp": "PP", + "power": "Puissance", + "accuracy": "Précision", +} as const; diff --git a/src/locales/fr/growth.ts b/src/locales/fr/growth.ts index 71623987b278..a4e9e8ed0ce3 100644 --- a/src/locales/fr/growth.ts +++ b/src/locales/fr/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Erratique", - "Fast": "Rapide", - "Medium_Fast": "Moyenne-Rapide", - "Medium_Slow": "Moyenne-Lente", - "Slow": "Lente", - "Fluctuating": "Fluctuante" + "Erratic": "Erratique", + "Fast": "Rapide", + "Medium_Fast": "Moyenne-Rapide", + "Medium_Slow": "Moyenne-Lente", + "Slow": "Lente", + "Fluctuating": "Fluctuante" } as const; diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 20e667546674..9494a64ab3f4 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": 'Paramètres', - "ACHIEVEMENTS": "Succès", - "STATS": "Statistiques", - "VOUCHERS": "Coupons", - "EGG_LIST": "Liste des Œufs", - "EGG_GACHA": "Gacha-Œufs", - "MANAGE_DATA": "Mes données", - "COMMUNITY": "Communauté", - "SAVE_AND_QUIT": "Sauver & quitter", - "LOG_OUT": "Déconnexion", - "slot": "Emplacement {{slotNumber}}", - "importSession": "Importer session", - "importSlotSelect": "Sélectionnez l’emplacement vers lequel importer les données.", - "exportSession": "Exporter session", - "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", - "importData": "Importer données", - "exportData": "Exporter données", - "cancel": "Retour", - "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?" + "GAME_SETTINGS": "Paramètres", + "ACHIEVEMENTS": "Succès", + "STATS": "Statistiques", + "VOUCHERS": "Coupons", + "EGG_LIST": "Liste des Œufs", + "EGG_GACHA": "Gacha-Œufs", + "MANAGE_DATA": "Mes données", + "COMMUNITY": "Communauté", + "SAVE_AND_QUIT": "Sauver & quitter", + "LOG_OUT": "Déconnexion", + "slot": "Emplacement {{slotNumber}}", + "importSession": "Importer session", + "importSlotSelect": "Sélectionnez l’emplacement vers lequel importer les données.", + "exportSession": "Exporter session", + "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", + "importData": "Importer données", + "exportData": "Exporter données", + "cancel": "Retour", + "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?" } as const; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index ba0f5f5b1fe1..e62eac80e3e4 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -214,7 +214,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SHINY_CHARM": { name: "Charme Chroma", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage chromatique" }, "ABILITY_CHARM": { name: "Charme Talent", description: "Augmente énormément les chances de rencontrer un Pokémon sauvage avec un Talent Caché" }, - "IV_SCANNER": { name: "Scanner d’IV", description: "Révèle la qualité de deux IV d’un Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, + "IV_SCANNER": { name: "Scanner d’IV", description: "Révèle la qualité de deux IV d’un Pokémon sauvage par scanner possédé. Les meilleurs IV sont révélés en priorité." }, "DNA_SPLICERS": { name: "Pointeau ADN" }, diff --git a/src/locales/fr/pokeball.ts b/src/locales/fr/pokeball.ts index 82dfea3e2d7a..0f878eea528d 100644 --- a/src/locales/fr/pokeball.ts +++ b/src/locales/fr/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Super Ball", - "ultraBall": "Hyper Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Luxe Ball", -} as const; \ No newline at end of file + "pokeBall": "Poké Ball", + "greatBall": "Super Ball", + "ultraBall": "Hyper Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Luxe Ball", +} as const; diff --git a/src/locales/fr/pokemon-info.ts b/src/locales/fr/pokemon-info.ts index 0c246bd96a4d..9341e5d77ca4 100644 --- a/src/locales/fr/pokemon-info.ts +++ b/src/locales/fr/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "PV", - "HPshortened": "PV", - "ATK": "Attaque", - "ATKshortened": "Atq", - "DEF": "Défense", - "DEFshortened": "Déf", - "SPATK": "Atq. Spé.", - "SPATKshortened": "AtqSp", - "SPDEF": "Déf. Spé.", - "SPDEFshortened": "DéfSp", - "SPD": "Vitesse", - "SPDshortened": "Vit" - }, + Stat: { + "HP": "PV", + "HPshortened": "PV", + "ATK": "Attaque", + "ATKshortened": "Atq", + "DEF": "Défense", + "DEFshortened": "Déf", + "SPATK": "Atq. Spé.", + "SPATKshortened": "AtqSp", + "SPDEF": "Déf. Spé.", + "SPDEFshortened": "DéfSp", + "SPD": "Vitesse", + "SPDshortened": "Vit" + }, - Type: { - "UNKNOWN": "Inconnu", - "NORMAL": "Normal", - "FIGHTING": "Combat", - "FLYING": "Vol", - "POISON": "Poison", - "GROUND": "Sol", - "ROCK": "Roche", - "BUG": "Insecte", - "GHOST": "Spectre", - "STEEL": "Acier", - "FIRE": "Feu", - "WATER": "Eau", - "GRASS": "Plante", - "ELECTRIC": "Électrik", - "PSYCHIC": "Psy", - "ICE": "Glace", - "DRAGON": "Dragon", - "DARK": "Ténèbres", - "FAIRY": "Fée", - "STELLAR": "Stellaire", - }, + Type: { + "UNKNOWN": "Inconnu", + "NORMAL": "Normal", + "FIGHTING": "Combat", + "FLYING": "Vol", + "POISON": "Poison", + "GROUND": "Sol", + "ROCK": "Roche", + "BUG": "Insecte", + "GHOST": "Spectre", + "STEEL": "Acier", + "FIRE": "Feu", + "WATER": "Eau", + "GRASS": "Plante", + "ELECTRIC": "Électrik", + "PSYCHIC": "Psy", + "ICE": "Glace", + "DRAGON": "Dragon", + "DARK": "Ténèbres", + "FAIRY": "Fée", + "STELLAR": "Stellaire", + }, } as const; diff --git a/src/locales/fr/pokemon.ts b/src/locales/fr/pokemon.ts index fc0ed5e10742..d685f91ab4d0 100644 --- a/src/locales/fr/pokemon.ts +++ b/src/locales/fr/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbizarre", - "ivysaur": "Herbizarre", - "venusaur": "Florizarre", - "charmander": "Salamèche", - "charmeleon": "Reptincel", - "charizard": "Dracaufeu", - "squirtle": "Carapuce", - "wartortle": "Carabaffe", - "blastoise": "Tortank", - "caterpie": "Chenipan", - "metapod": "Chrysacier", - "butterfree": "Papilusion", - "weedle": "Aspicot", - "kakuna": "Coconfort", - "beedrill": "Dardargnan", - "pidgey": "Roucool", - "pidgeotto": "Roucoups", - "pidgeot": "Roucarnage", - "rattata": "Rattata", - "raticate": "Rattatac", - "spearow": "Piafabec", - "fearow": "Rapasdepic", - "ekans": "Abo", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sabelette", - "sandslash": "Sablaireau", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Mélofée", - "clefable": "Mélodelfe", - "vulpix": "Goupix", - "ninetales": "Feunard", - "jigglypuff": "Rondoudou", - "wigglytuff": "Grodoudou", - "zubat": "Nosferapti", - "golbat": "Nosferalto", - "oddish": "Mystherbe", - "gloom": "Ortide", - "vileplume": "Rafflesia", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Mimitoss", - "venomoth": "Aéromite", - "diglett": "Taupiqueur", - "dugtrio": "Triopikeur", - "meowth": "Miaouss", - "persian": "Persian", - "psyduck": "Psykokwak", - "golduck": "Akwakwak", - "mankey": "Férosinge", - "primeape": "Colossinge", - "growlithe": "Caninos", - "arcanine": "Arcanin", - "poliwag": "Ptitard", - "poliwhirl": "Têtarte", - "poliwrath": "Tartard", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machoc", - "machoke": "Machopeur", - "machamp": "Mackogneur", - "bellsprout": "Chétiflor", - "weepinbell": "Boustiflor", - "victreebel": "Empiflor", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Racaillou", - "graveler": "Gravalanch", - "golem": "Grolem", - "ponyta": "Ponyta", - "rapidash": "Galopa", - "slowpoke": "Ramoloss", - "slowbro": "Flagadoss", - "magnemite": "Magnéti", - "magneton": "Magnéton", - "farfetchd": "Canarticho", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Otaria", - "dewgong": "Lamantine", - "grimer": "Tadmorv", - "muk": "Grotadmorv", - "shellder": "Kokiyas", - "cloyster": "Crustabri", - "gastly": "Fantominus", - "haunter": "Spectrum", - "gengar": "Ectoplasma", - "onix": "Onix", - "drowzee": "Soporifik", - "hypno": "Hypnomade", - "krabby": "Krabby", - "kingler": "Krabboss", - "voltorb": "Voltorbe", - "electrode": "Électrode", - "exeggcute": "Noeunoeuf", - "exeggutor": "Noadkoko", - "cubone": "Osselait", - "marowak": "Ossatueur", - "hitmonlee": "Kicklee", - "hitmonchan": "Tygnon", - "lickitung": "Excelangue", - "koffing": "Smogo", - "weezing": "Smogogo", - "rhyhorn": "Rhinocorne", - "rhydon": "Rhinoféros", - "chansey": "Leveinard", - "tangela": "Saquedeneu", - "kangaskhan": "Kangourex", - "horsea": "Hypotrempe", - "seadra": "Hypocéan", - "goldeen": "Poissirène", - "seaking": "Poissoroy", - "staryu": "Stari", - "starmie": "Staross", - "mr_mime": "M. Mime", - "scyther": "Insécateur", - "jynx": "Lippoutou", - "electabuzz": "Élektek", - "magmar": "Magmar", - "pinsir": "Scarabrute", - "tauros": "Tauros", - "magikarp": "Magicarpe", - "gyarados": "Léviator", - "lapras": "Lokhlass", - "ditto": "Métamorph", - "eevee": "Évoli", - "vaporeon": "Aquali", - "jolteon": "Voltali", - "flareon": "Pyroli", - "porygon": "Porygon", - "omanyte": "Amonita", - "omastar": "Amonistar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Ptéra", - "snorlax": "Ronflex", - "articuno": "Artikodin", - "zapdos": "Électhor", - "moltres": "Sulfura", - "dratini": "Minidraco", - "dragonair": "Draco", - "dragonite": "Dracolosse", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Germignon", - "bayleef": "Macronium", - "meganium": "Méganium", - "cyndaquil": "Héricendre", - "quilava": "Feurisson", - "typhlosion": "Typhlosion", - "totodile": "Kaiminus", - "croconaw": "Crocrodil", - "feraligatr": "Aligatueur", - "sentret": "Fouinette", - "furret": "Fouinar", - "hoothoot": "Hoothoot", - "noctowl": "Noarfang", - "ledyba": "Coxy", - "ledian": "Coxyclaque", - "spinarak": "Mimigal", - "ariados": "Migalos", - "crobat": "Nostenfer", - "chinchou": "Loupio", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Mélo", - "igglybuff": "Toudoudou", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Wattouat", - "flaaffy": "Lainergie", - "ampharos": "Pharamp", - "bellossom": "Joliflor", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Simularbre", - "politoed": "Tarpaud", - "hoppip": "Granivol", - "skiploom": "Floravol", - "jumpluff": "Cotovol", - "aipom": "Capumain", - "sunkern": "Tournegrin", - "sunflora": "Héliatronc", - "yanma": "Yanma", - "wooper": "Axoloto", - "quagsire": "Maraiste", - "espeon": "Mentali", - "umbreon": "Noctali", - "murkrow": "Cornèbre", - "slowking": "Roigada", - "misdreavus": "Feuforêve", - "unown": "Zarbi", - "wobbuffet": "Qulbutoké", - "girafarig": "Girafarig", - "pineco": "Pomdepik", - "forretress": "Foretress", - "dunsparce": "Insolourdo", - "gligar": "Scorplane", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Cizayox", - "shuckle": "Caratroc", - "heracross": "Scarhino", - "sneasel": "Farfuret", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Limagma", - "magcargo": "Volcaropod", - "swinub": "Marcacrin", - "piloswine": "Cochignon", - "corsola": "Corayon", - "remoraid": "Rémoraid", - "octillery": "Octillery", - "delibird": "Cadoizo", - "mantine": "Démanta", - "skarmory": "Airmure", - "houndour": "Malosse", - "houndoom": "Démolosse", - "kingdra": "Hyporoi", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Cerfrousse", - "smeargle": "Queulorior", - "tyrogue": "Debugant", - "hitmontop": "Kapoera", - "smoochum": "Lippouti", - "elekid": "Élekid", - "magby": "Magby", - "miltank": "Écrémeuh", - "blissey": "Leuphorie", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Embrylex", - "pupitar": "Ymphect", - "tyranitar": "Tyranocif", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Arcko", - "grovyle": "Massko", - "sceptile": "Jungko", - "torchic": "Poussifeu", - "combusken": "Galifeu", - "blaziken": "Braségali", - "mudkip": "Gobou", - "marshtomp": "Flobio", - "swampert": "Laggron", - "poochyena": "Medhyèna", - "mightyena": "Grahyèna", - "zigzagoon": "Zigzaton", - "linoone": "Linéon", - "wurmple": "Chenipotte", - "silcoon": "Armulys", - "beautifly": "Charmillon", - "cascoon": "Blindalys", - "dustox": "Papinox", - "lotad": "Nénupiot", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Grainipiot", - "nuzleaf": "Pifeuil", - "shiftry": "Tengalice", - "taillow": "Nirondelle", - "swellow": "Hélédelle", - "wingull": "Goélise", - "pelipper": "Bekipan", - "ralts": "Tarsal", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Arakdo", - "masquerain": "Maskadra", - "shroomish": "Balignon", - "breloom": "Chapignon", - "slakoth": "Parecool", - "vigoroth": "Vigoroth", - "slaking": "Monaflèmit", - "nincada": "Ningale", - "ninjask": "Ninjask", - "shedinja": "Munja", - "whismur": "Chuchmur", - "loudred": "Ramboum", - "exploud": "Brouhabam", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Tarinor", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Ténéfix", - "mawile": "Mysdibule", - "aron": "Galekid", - "lairon": "Galegon", - "aggron": "Galeking", - "meditite": "Méditikka", - "medicham": "Charmina", - "electrike": "Dynavolt", - "manectric": "Élecsprint", - "plusle": "Posipi", - "minun": "Négapi", - "volbeat": "Muciole", - "illumise": "Lumivole", - "roselia": "Rosélia", - "gulpin": "Gloupti", - "swalot": "Avaltout", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Chamallot", - "camerupt": "Camérupt", - "torkoal": "Chartor", - "spoink": "Spoink", - "grumpig": "Groret", - "spinda": "Spinda", - "trapinch": "Kraknoix", - "vibrava": "Vibraninf", - "flygon": "Libégon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Tylton", - "altaria": "Altaria", - "zangoose": "Mangriff", - "seviper": "Séviper", - "lunatone": "Séléroc", - "solrock": "Solaroc", - "barboach": "Barloche", - "whiscash": "Barbicha", - "corphish": "Écrapince", - "crawdaunt": "Colhomard", - "baltoy": "Balbuto", - "claydol": "Kaorine", - "lileep": "Lilia", - "cradily": "Vacilys", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Barpau", - "milotic": "Milobellus", - "castform": "Morphéo", - "kecleon": "Kecleon", - "shuppet": "Polichombr", - "banette": "Branette", - "duskull": "Skelénox", - "dusclops": "Téraclope", - "tropius": "Tropius", - "chimecho": "Éoko", - "absol": "Absol", - "wynaut": "Okéoké", - "snorunt": "Stalgamin", - "glalie": "Oniglali", - "spheal": "Obalie", - "sealeo": "Phogleur", - "walrein": "Kaimorse", - "clamperl": "Coquiperl", - "huntail": "Serpang", - "gorebyss": "Rosabyss", - "relicanth": "Relicanth", - "luvdisc": "Lovdisc", - "bagon": "Draby", - "shelgon": "Drackhaus", - "salamence": "Drattak", - "beldum": "Terhal", - "metang": "Métang", - "metagross": "Métalosse", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Tortipouss", - "grotle": "Boskara", - "torterra": "Torterra", - "chimchar": "Ouisticram", - "monferno": "Chimpenfeu", - "infernape": "Simiabraz", - "piplup": "Tiplouf", - "prinplup": "Prinplouf", - "empoleon": "Pingoléon", - "starly": "Étourmi", - "staravia": "Étourvol", - "staraptor": "Étouraptor", - "bidoof": "Keunotor", - "bibarel": "Castorno", - "kricketot": "Crikzik", - "kricketune": "Mélokrik", - "shinx": "Lixy", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Rozbouton", - "roserade": "Roserade", - "cranidos": "Kranidos", - "rampardos": "Charkos", - "shieldon": "Dinoclier", - "bastiodon": "Bastiodon", - "burmy": "Cheniti", - "wormadam": "Cheniselle", - "mothim": "Papilord", - "combee": "Apitrini", - "vespiquen": "Apireine", - "pachirisu": "Pachirisu", - "buizel": "Mustébouée", - "floatzel": "Mustéflott", - "cherubi": "Ceribou", - "cherrim": "Ceriflor", - "shellos": "Sancoki", - "gastrodon": "Tritosor", - "ambipom": "Capidextre", - "drifloon": "Baudrive", - "drifblim": "Grodrive", - "buneary": "Laporeille", - "lopunny": "Lockpin", - "mismagius": "Magirêve", - "honchkrow": "Corboss", - "glameow": "Chaglam", - "purugly": "Chaffreux", - "chingling": "Korillon", - "stunky": "Moufouette", - "skuntank": "Moufflair", - "bronzor": "Archéomire", - "bronzong": "Archéodong", - "bonsly": "Manzaï", - "mime_jr": "Mime Jr.", - "happiny": "Ptiravi", - "chatot": "Pijako", - "spiritomb": "Spiritomb", - "gible": "Griknot", - "gabite": "Carmache", - "garchomp": "Carchacrok", - "munchlax": "Goinfrex", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippodocus", - "skorupi": "Rapion", - "drapion": "Drascore", - "croagunk": "Cradopaud", - "toxicroak": "Coatox", - "carnivine": "Vortente", - "finneon": "Écayon", - "lumineon": "Luminéon", - "mantyke": "Babimanta", - "snover": "Blizzi", - "abomasnow": "Blizzaroi", - "weavile": "Dimoret", - "magnezone": "Magnézone", - "lickilicky": "Coudlangue", - "rhyperior": "Rhinastoc", - "tangrowth": "Bouldeneu", - "electivire": "Élekable", - "magmortar": "Maganon", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Phyllali", - "glaceon": "Givrali", - "gliscor": "Scorvol", - "mamoswine": "Mammochon", - "porygon_z": "Porygon-Z", - "gallade": "Gallame", - "probopass": "Tarinorme", - "dusknoir": "Noctunoir", - "froslass": "Momartik", - "rotom": "Motisma", - "uxie": "Créhelf", - "mesprit": "Créfollet", - "azelf": "Créfadet", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Vipélierre", - "servine": "Lianaja", - "serperior": "Majaspic", - "tepig": "Gruikui", - "pignite": "Grotichon", - "emboar": "Roitiflam", - "oshawott": "Moustillon", - "dewott": "Mateloutre", - "samurott": "Clamiral", - "patrat": "Ratentif", - "watchog": "Miradar", - "lillipup": "Ponchiot", - "herdier": "Ponchien", - "stoutland": "Mastouffe", - "purrloin": "Chacripan", - "liepard": "Léopardus", - "pansage": "Feuillajou", - "simisage": "Feuiloutan", - "pansear": "Flamajou", - "simisear": "Flamoutan", - "panpour": "Flotajou", - "simipour": "Flotoutan", - "munna": "Munna", - "musharna": "Mushana", - "pidove": "Poichigeon", - "tranquill": "Colombeau", - "unfezant": "Déflaisan", - "blitzle": "Zébibron", - "zebstrika": "Zéblitz", - "roggenrola": "Nodulithe", - "boldore": "Géolithe", - "gigalith": "Gigalithe", - "woobat": "Chovsourir", - "swoobat": "Rhinolove", - "drilbur": "Rototaupe", - "excadrill": "Minotaupe", - "audino": "Nanméouïe", - "timburr": "Charpenti", - "gurdurr": "Ouvrifier", - "conkeldurr": "Bétochef", - "tympole": "Tritonde", - "palpitoad": "Batracné", - "seismitoad": "Crapustule", - "throh": "Judokrak", - "sawk": "Karaclée", - "sewaddle": "Larveyette", - "swadloon": "Couverdure", - "leavanny": "Manternel", - "venipede": "Venipatte", - "whirlipede": "Scobolide", - "scolipede": "Brutapode", - "cottonee": "Doudouvet", - "whimsicott": "Farfaduvet", - "petilil": "Chlorobule", - "lilligant": "Fragilady", - "basculin": "Bargantua", - "sandile": "Mascaïman", - "krokorok": "Escroco", - "krookodile": "Crocorible", - "darumaka": "Darumarond", - "darmanitan": "Darumacho", - "maractus": "Maracachi", - "dwebble": "Crabicoque", - "crustle": "Crabaraque", - "scraggy": "Baggiguane", - "scrafty": "Baggaïd", - "sigilyph": "Cryptéro", - "yamask": "Tutafeh", - "cofagrigus": "Tutankafer", - "tirtouga": "Carapagos", - "carracosta": "Mégapagos", - "archen": "Arkéapti", - "archeops": "Aéroptéryx", - "trubbish": "Miamiasme", - "garbodor": "Miasmax", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Chinchidou", - "cinccino": "Pashmilla", - "gothita": "Scrutella", - "gothorita": "Mesmérella", - "gothitelle": "Sidérella", - "solosis": "Nucléos", - "duosion": "Méios", - "reuniclus": "Symbios", - "ducklett": "Couaneton", - "swanna": "Lakmécygne", - "vanillite": "Sorbébé", - "vanillish": "Sorboul", - "vanilluxe": "Sorbouboul", - "deerling": "Vivaldaim", - "sawsbuck": "Haydaim", - "emolga": "Emolga", - "karrablast": "Carabing", - "escavalier": "Lançargot", - "foongus": "Trompignon", - "amoonguss": "Gaulet", - "frillish": "Viskuse", - "jellicent": "Moyade", - "alomomola": "Mamanbo", - "joltik": "Statitik", - "galvantula": "Mygavolt", - "ferroseed": "Grindur", - "ferrothorn": "Noacier", - "klink": "Tic", - "klang": "Clic", - "klinklang": "Cliticlic", - "tynamo": "Anchwatt", - "eelektrik": "Lampéroie", - "eelektross": "Ohmassacre", - "elgyem": "Lewsor", - "beheeyem": "Neitram", - "litwick": "Funécire", - "lampent": "Mélancolux", - "chandelure": "Lugulabre", - "axew": "Coupenotte", - "fraxure": "Incisache", - "haxorus": "Tranchodon", - "cubchoo": "Polarhume", - "beartic": "Polagriffe", - "cryogonal": "Hexagel", - "shelmet": "Escargaume", - "accelgor": "Limaspeed", - "stunfisk": "Limonde", - "mienfoo": "Kungfouine", - "mienshao": "Shaofouine", - "druddigon": "Drakkarmin", - "golett": "Gringolem", - "golurk": "Golemastoc", - "pawniard": "Scalpion", - "bisharp": "Scalproie", - "bouffalant": "Frison", - "rufflet": "Furaiglon", - "braviary": "Gueriaigle", - "vullaby": "Vostourno", - "mandibuzz": "Vaututrice", - "heatmor": "Aflamanoir", - "durant": "Fermite", - "deino": "Solochi", - "zweilous": "Diamat", - "hydreigon": "Trioxhydre", - "larvesta": "Pyronille", - "volcarona": "Pyrax", - "cobalion": "Cobaltium", - "terrakion": "Terrakium", - "virizion": "Viridium", - "tornadus": "Boréas", - "thundurus": "Fulguris", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Démétéros", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Marisson", - "quilladin": "Boguérisse", - "chesnaught": "Blindépique", - "fennekin": "Feunnec", - "braixen": "Roussil", - "delphox": "Goupelin", - "froakie": "Grenousse", - "frogadier": "Croâporal", - "greninja": "Amphinobi", - "bunnelby": "Sapereau", - "diggersby": "Excavarenne", - "fletchling": "Passerouge", - "fletchinder": "Braisillon", - "talonflame": "Flambusard", - "scatterbug": "Lépidonille", - "spewpa": "Pérégrain", - "vivillon": "Prismillon", - "litleo": "Hélionceau", - "pyroar": "Némélios", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Cabriolaine", - "gogoat": "Chevroum", - "pancham": "Pandespiègle", - "pangoro": "Pandarbare", - "furfrou": "Couafarel", - "espurr": "Psystigri", - "meowstic": "Mistigrix", - "honedge": "Monorpale", - "doublade": "Dimoclès", - "aegislash": "Exagide", - "spritzee": "Fluvetin", - "aromatisse": "Cocotine", - "swirlix": "Sucroquin", - "slurpuff": "Cupcanaille", - "inkay": "Sepiatop", - "malamar": "Sepiatroce", - "binacle": "Opermine", - "barbaracle": "Golgopathe", - "skrelp": "Venalgue", - "dragalge": "Kravarech", - "clauncher": "Flingouste", - "clawitzer": "Gamblast", - "helioptile": "Galvaran", - "heliolisk": "Iguolta", - "tyrunt": "Ptyranidur", - "tyrantrum": "Rexillius", - "amaura": "Amagara", - "aurorus": "Dragmara", - "sylveon": "Nymphali", - "hawlucha": "Brutalibré", - "dedenne": "Dedenne", - "carbink": "Strassie", - "goomy": "Mucuscule", - "sliggoo": "Colimucus", - "goodra": "Muplodocus", - "klefki": "Trousselin", - "phantump": "Brocélôme", - "trevenant": "Desséliande", - "pumpkaboo": "Pitrouille", - "gourgeist": "Banshitrouye", - "bergmite": "Grelaçon", - "avalugg": "Séracrawl", - "noibat": "Sonistrelle", - "noivern": "Bruyverne", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Brindibou", - "dartrix": "Efflèche", - "decidueye": "Archéduc", - "litten": "Flamiaou", - "torracat": "Matoufeu", - "incineroar": "Félinferno", - "popplio": "Otaquin", - "brionne": "Otarlette", - "primarina": "Oratoria", - "pikipek": "Picassaut", - "trumbeak": "Piclairon", - "toucannon": "Bazoucan", - "yungoos": "Manglouton", - "gumshoos": "Argouste", - "grubbin": "Larvibule", - "charjabug": "Chrysapile", - "vikavolt": "Lucanon", - "crabrawler": "Crabagarre", - "crabominable": "Crabominable", - "oricorio": "Plumeline", - "cutiefly": "Bombydou", - "ribombee": "Rubombelle", - "rockruff": "Rocabot", - "lycanroc": "Lougaroc", - "wishiwashi": "Froussardine", - "mareanie": "Vorastérie", - "toxapex": "Prédastérie", - "mudbray": "Tiboudet", - "mudsdale": "Bourrinos", - "dewpider": "Araqua", - "araquanid": "Tarenbulle", - "fomantis": "Mimantis", - "lurantis": "Floramantis", - "morelull": "Spododo", - "shiinotic": "Lampignon", - "salandit": "Tritox", - "salazzle": "Malamandre", - "stufful": "Nounourson", - "bewear": "Chelours", - "bounsweet": "Croquine", - "steenee": "Candine", - "tsareena": "Sucreine", - "comfey": "Guérilande", - "oranguru": "Gouroutan", - "passimian": "Quartermac", - "wimpod": "Sovkipou", - "golisopod": "Sarmuraï", - "sandygast": "Bacabouh", - "palossand": "Trépassable", - "pyukumuku": "Concombaffe", - "type_null": "Type:0", - "silvally": "Silvallié", - "minior": "Météno", - "komala": "Dodoala", - "turtonator": "Boumata", - "togedemaru": "Togedemaru", - "mimikyu": "Mimiqui", - "bruxish": "Denticrisse", - "drampa": "Draïeul", - "dhelmise": "Sinistrail", - "jangmo_o": "Bébécaille", - "hakamo_o": "Écaïd", - "kommo_o": "Ékaïser", - "tapu_koko": "Tokorico", - "tapu_lele": "Tokopiyon", - "tapu_bulu": "Tokotoro", - "tapu_fini": "Tokopisco", - "cosmog": "Cosmog", - "cosmoem": "Cosmovum", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Zéroïd", - "buzzwole": "Mouscoto", - "pheromosa": "Cancrelove", - "xurkitree": "Câblifère", - "celesteela": "Bamboiselle", - "kartana": "Katagami", - "guzzlord": "Engloutyran", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Vémini", - "naganadel": "Mandrillon", - "stakataka": "Ama-Ama", - "blacephalon": "Pierroteknik", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Ouistempo", - "thwackey": "Badabouin", - "rillaboom": "Gorythmic", - "scorbunny": "Flambino", - "raboot": "Lapyro", - "cinderace": "Pyrobut", - "sobble": "Larméléon", - "drizzile": "Arrozard", - "inteleon": "Lézargus", - "skwovet": "Rongourmand", - "greedent": "Rongrigou", - "rookidee": "Minisange", - "corvisquire": "Bleuseille", - "corviknight": "Corvaillus", - "blipbug": "Larvadar", - "dottler": "Coléodôme", - "orbeetle": "Astronelle", - "nickit": "Goupilou", - "thievul": "Roublenard", - "gossifleur": "Tournicoton", - "eldegoss": "Blancoton", - "wooloo": "Moumouton", - "dubwool": "Moumouflon", - "chewtle": "Khélocrok", - "drednaw": "Torgamord", - "yamper": "Voltoutou", - "boltund": "Fulgudog", - "rolycoly": "Charbi", - "carkol": "Wagomine", - "coalossal": "Monthracite", - "applin": "Verpom", - "flapple": "Pomdrapi", - "appletun": "Dratatin", - "silicobra": "Dunaja", - "sandaconda": "Dunaconda", - "cramorant": "Nigosier", - "arrokuda": "Embrochet", - "barraskewda": "Hastacuda", - "toxel": "Toxizap", - "toxtricity": "Salarsen", - "sizzlipede": "Grillepattes", - "centiskorch": "Scolocendre", - "clobbopus": "Poulpaf", - "grapploct": "Krakos", - "sinistea": "Théffroi", - "polteageist": "Polthégeist", - "hatenna": "Bibichut", - "hattrem": "Chapotus", - "hatterene": "Sorcilence", - "impidimp": "Grimalin", - "morgrem": "Fourbelin", - "grimmsnarl": "Angoliath", - "obstagoon": "Ixon", - "perrserker": "Berserkatt", - "cursola": "Corayôme", - "sirfetchd": "Palarticho", - "mr_rime": "M. Glaquette", - "runerigus": "Tutétékri", - "milcery": "Crèmy", - "alcremie": "Charmilly", - "falinks": "Hexadron", - "pincurchin": "Wattapik", - "snom": "Frissonille", - "frosmoth": "Beldeneige", - "stonjourner": "Dolman", - "eiscue": "Bekaglaçon", - "indeedee": "Wimessir", - "morpeko": "Morpeko", - "cufant": "Charibari", - "copperajah": "Pachyradjah", - "dracozolt": "Galvagon", - "arctozolt": "Galvagla", - "dracovish": "Hydragon", - "arctovish": "Hydragla", - "duraludon": "Duralugon", - "dreepy": "Fantyrm", - "drakloak": "Dispareptil", - "dragapult": "Lanssorien", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Éthernatos", - "kubfu": "Wushours", - "urshifu": "Shifours", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Blizzeval", - "spectrier": "Spectreval", - "calyrex": "Sylveroy", - "wyrdeer": "Cerbyllin", - "kleavor": "Hachécateur", - "ursaluna": "Ursaking", - "basculegion": "Paragruel", - "sneasler": "Farfurex", - "overqwil": "Qwilpik", - "enamorus": "Amovénus", - "sprigatito": "Poussacha", - "floragato": "Matourgeon", - "meowscarada": "Miascarade", - "fuecoco": "Chochodile", - "crocalor": "Crocogril", - "skeledirge": "Flâmigator", - "quaxly": "Coiffeton", - "quaxwell": "Canarbello", - "quaquaval": "Palmaval", - "lechonk": "Gourmelet", - "oinkologne": "Fragroin", - "tarountula": "Tissenboule", - "spidops": "Filentrappe", - "nymble": "Lilliterelle", - "lokix": "Gambex", - "pawmi": "Pohm", - "pawmo": "Pohmotte", - "pawmot": "Pohmarmotte", - "tandemaus": "Compagnol", - "maushold": "Famignol", - "fidough": "Pâtachiot", - "dachsbun": "Briochien", - "smoliv": "Olivini", - "dolliv": "Olivado", - "arboliva": "Arboliva", - "squawkabilly": "Tapatoès", - "nacli": "Selutin", - "naclstack": "Amassel", - "garganacl": "Gigansel", - "charcadet": "Charbambin", - "armarouge": "Carmadura", - "ceruledge": "Malvalame", - "tadbulb": "Têtampoule", - "bellibolt": "Ampibidou", - "wattrel": "Zapétrel", - "kilowattrel": "Fulgulairo", - "maschiff": "Grondogue", - "mabosstiff": "Dogrino", - "shroodle": "Gribouraigne", - "grafaiai": "Tag-Tag", - "bramblin": "Virovent", - "brambleghast": "Virevorreur", - "toedscool": "Terracool", - "toedscruel": "Terracruel", - "klawf": "Craparoi", - "capsakid": "Pimito", - "scovillain": "Scovilain", - "rellor": "Léboulérou", - "rabsca": "Bérasca", - "flittle": "Flotillon", - "espathra": "Cléopsytra", - "tinkatink": "Forgerette", - "tinkatuff": "Forgella", - "tinkaton": "Forgelina", - "wiglett": "Taupikeau", - "wugtrio": "Triopikeau", - "bombirdier": "Lestombaile", - "finizen": "Dofin", - "palafin": "Superdofin", - "varoom": "Vrombi", - "revavroom": "Vrombotor", - "cyclizar": "Motorizard", - "orthworm": "Ferdeter", - "glimmet": "Germéclat", - "glimmora": "Floréclat", - "greavard": "Toutombe", - "houndstone": "Tomberro", - "flamigo": "Flamenroule", - "cetoddle": "Piétacé", - "cetitan": "Balbalèze", - "veluza": "Délestin", - "dondozo": "Oyacata", - "tatsugiri": "Nigirigon", - "annihilape": "Courrousinge", - "clodsire": "Terraiste", - "farigiraf": "Farigiraf", - "dudunsparce": "Deusolourdo", - "kingambit": "Scalpereur", - "great_tusk": "Fort-Ivoire", - "scream_tail": "Hurle-Queue", - "brute_bonnet": "Fongus-Furie", - "flutter_mane": "Flotte-Mèche", - "slither_wing": "Rampe-Ailes", - "sandy_shocks": "Pelage-Sablé", - "iron_treads": "Roue-de-Fer", - "iron_bundle": "Hotte-de-Fer", - "iron_hands": "Paume-de-Fer", - "iron_jugulis": "Têtes-de-Fer", - "iron_moth": "Mite-de-Fer", - "iron_thorns": "Épine-de-Fer", - "frigibax": "Frigodo", - "arctibax": "Cryodo", - "baxcalibur": "Glaivodo", - "gimmighoul": "Mordudor", - "gholdengo": "Gromago", - "wo_chien": "Chongjian", - "chien_pao": "Baojian", - "ting_lu": "Dinglu", - "chi_yu": "Yuyu", - "roaring_moon": "Rugit-Lune", - "iron_valiant": "Garde-de-Fer", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Serpente-Eau", - "iron_leaves": "Vert-de-Fer", - "dipplin": "Pomdramour", - "poltchageist": "Poltchageist", - "sinistcha": "Théffroyable", - "okidogi": "Félicanis", - "munkidori": "Fortusimia", - "fezandipiti": "Favianos", - "ogerpon": "Ogerpon", - "archaludon": "Pondralugon", - "hydrapple": "Pomdorochi", - "gouging_fire": "Feu-Perçant", - "raging_bolt": "Ire-Foudre", - "iron_boulder": "Roc-de-Fer", - "iron_crown": "Chef-de-Fer", - "terapagos": "Terapagos", - "pecharunt": "Pêchaminus", - "alola_rattata": "Rattata", - "alola_raticate": "Rattatac", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sabelette", - "alola_sandslash": "Sablaireau", - "alola_vulpix": "Goupix", - "alola_ninetales": "Feunard", - "alola_diglett": "Taupiqueur", - "alola_dugtrio": "Triopikeur", - "alola_meowth": "Miaouss", - "alola_persian": "Persian", - "alola_geodude": "Racaillou", - "alola_graveler": "Gravalanch", - "alola_golem": "Grolem", - "alola_grimer": "Tadmorv", - "alola_muk": "Grotadmorv", - "alola_exeggutor": "Noadkoko", - "alola_marowak": "Ossatueur", - "eternal_floette": "Floette", - "galar_meowth": "Miaouss", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Galopa", - "galar_slowpoke": "Ramoloss", - "galar_slowbro": "Flagadoss", - "galar_farfetchd": "Canarticho", - "galar_weezing": "Smogogo", - "galar_mr_mime": "M. Mime", - "galar_articuno": "Artikodin", - "galar_zapdos": "Électhor", - "galar_moltres": "Sulfura", - "galar_slowking": "Roigada", - "galar_corsola": "Corayon", - "galar_zigzagoon": "Zigzaton", - "galar_linoone": "Linéon", - "galar_darumaka": "Darumarond", - "galar_darmanitan": "Darumacho", - "galar_yamask": "Tutafeh", - "galar_stunfisk": "Limonde", - "hisui_growlithe": "Caninos", - "hisui_arcanine": "Arcanin", - "hisui_voltorb": "Voltorbe", - "hisui_electrode": "Électrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Farfuret", - "hisui_samurott": "Clamiral", - "hisui_lilligant": "Fragilady", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Gueriaigle", - "hisui_sliggoo": "Colimucus", - "hisui_goodra": "Muplodocus", - "hisui_avalugg": "Séracrawl", - "hisui_decidueye": "Archéduc", - "paldea_tauros": "Tauros", - "paldea_wooper": "Axoloto", - "bloodmoon_ursaluna": "Ursaking", -} as const; \ No newline at end of file + "bulbasaur": "Bulbizarre", + "ivysaur": "Herbizarre", + "venusaur": "Florizarre", + "charmander": "Salamèche", + "charmeleon": "Reptincel", + "charizard": "Dracaufeu", + "squirtle": "Carapuce", + "wartortle": "Carabaffe", + "blastoise": "Tortank", + "caterpie": "Chenipan", + "metapod": "Chrysacier", + "butterfree": "Papilusion", + "weedle": "Aspicot", + "kakuna": "Coconfort", + "beedrill": "Dardargnan", + "pidgey": "Roucool", + "pidgeotto": "Roucoups", + "pidgeot": "Roucarnage", + "rattata": "Rattata", + "raticate": "Rattatac", + "spearow": "Piafabec", + "fearow": "Rapasdepic", + "ekans": "Abo", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sabelette", + "sandslash": "Sablaireau", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Mélofée", + "clefable": "Mélodelfe", + "vulpix": "Goupix", + "ninetales": "Feunard", + "jigglypuff": "Rondoudou", + "wigglytuff": "Grodoudou", + "zubat": "Nosferapti", + "golbat": "Nosferalto", + "oddish": "Mystherbe", + "gloom": "Ortide", + "vileplume": "Rafflesia", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Mimitoss", + "venomoth": "Aéromite", + "diglett": "Taupiqueur", + "dugtrio": "Triopikeur", + "meowth": "Miaouss", + "persian": "Persian", + "psyduck": "Psykokwak", + "golduck": "Akwakwak", + "mankey": "Férosinge", + "primeape": "Colossinge", + "growlithe": "Caninos", + "arcanine": "Arcanin", + "poliwag": "Ptitard", + "poliwhirl": "Têtarte", + "poliwrath": "Tartard", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machoc", + "machoke": "Machopeur", + "machamp": "Mackogneur", + "bellsprout": "Chétiflor", + "weepinbell": "Boustiflor", + "victreebel": "Empiflor", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Racaillou", + "graveler": "Gravalanch", + "golem": "Grolem", + "ponyta": "Ponyta", + "rapidash": "Galopa", + "slowpoke": "Ramoloss", + "slowbro": "Flagadoss", + "magnemite": "Magnéti", + "magneton": "Magnéton", + "farfetchd": "Canarticho", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Otaria", + "dewgong": "Lamantine", + "grimer": "Tadmorv", + "muk": "Grotadmorv", + "shellder": "Kokiyas", + "cloyster": "Crustabri", + "gastly": "Fantominus", + "haunter": "Spectrum", + "gengar": "Ectoplasma", + "onix": "Onix", + "drowzee": "Soporifik", + "hypno": "Hypnomade", + "krabby": "Krabby", + "kingler": "Krabboss", + "voltorb": "Voltorbe", + "electrode": "Électrode", + "exeggcute": "Noeunoeuf", + "exeggutor": "Noadkoko", + "cubone": "Osselait", + "marowak": "Ossatueur", + "hitmonlee": "Kicklee", + "hitmonchan": "Tygnon", + "lickitung": "Excelangue", + "koffing": "Smogo", + "weezing": "Smogogo", + "rhyhorn": "Rhinocorne", + "rhydon": "Rhinoféros", + "chansey": "Leveinard", + "tangela": "Saquedeneu", + "kangaskhan": "Kangourex", + "horsea": "Hypotrempe", + "seadra": "Hypocéan", + "goldeen": "Poissirène", + "seaking": "Poissoroy", + "staryu": "Stari", + "starmie": "Staross", + "mr_mime": "M. Mime", + "scyther": "Insécateur", + "jynx": "Lippoutou", + "electabuzz": "Élektek", + "magmar": "Magmar", + "pinsir": "Scarabrute", + "tauros": "Tauros", + "magikarp": "Magicarpe", + "gyarados": "Léviator", + "lapras": "Lokhlass", + "ditto": "Métamorph", + "eevee": "Évoli", + "vaporeon": "Aquali", + "jolteon": "Voltali", + "flareon": "Pyroli", + "porygon": "Porygon", + "omanyte": "Amonita", + "omastar": "Amonistar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Ptéra", + "snorlax": "Ronflex", + "articuno": "Artikodin", + "zapdos": "Électhor", + "moltres": "Sulfura", + "dratini": "Minidraco", + "dragonair": "Draco", + "dragonite": "Dracolosse", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Germignon", + "bayleef": "Macronium", + "meganium": "Méganium", + "cyndaquil": "Héricendre", + "quilava": "Feurisson", + "typhlosion": "Typhlosion", + "totodile": "Kaiminus", + "croconaw": "Crocrodil", + "feraligatr": "Aligatueur", + "sentret": "Fouinette", + "furret": "Fouinar", + "hoothoot": "Hoothoot", + "noctowl": "Noarfang", + "ledyba": "Coxy", + "ledian": "Coxyclaque", + "spinarak": "Mimigal", + "ariados": "Migalos", + "crobat": "Nostenfer", + "chinchou": "Loupio", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Mélo", + "igglybuff": "Toudoudou", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Wattouat", + "flaaffy": "Lainergie", + "ampharos": "Pharamp", + "bellossom": "Joliflor", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Simularbre", + "politoed": "Tarpaud", + "hoppip": "Granivol", + "skiploom": "Floravol", + "jumpluff": "Cotovol", + "aipom": "Capumain", + "sunkern": "Tournegrin", + "sunflora": "Héliatronc", + "yanma": "Yanma", + "wooper": "Axoloto", + "quagsire": "Maraiste", + "espeon": "Mentali", + "umbreon": "Noctali", + "murkrow": "Cornèbre", + "slowking": "Roigada", + "misdreavus": "Feuforêve", + "unown": "Zarbi", + "wobbuffet": "Qulbutoké", + "girafarig": "Girafarig", + "pineco": "Pomdepik", + "forretress": "Foretress", + "dunsparce": "Insolourdo", + "gligar": "Scorplane", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Cizayox", + "shuckle": "Caratroc", + "heracross": "Scarhino", + "sneasel": "Farfuret", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Limagma", + "magcargo": "Volcaropod", + "swinub": "Marcacrin", + "piloswine": "Cochignon", + "corsola": "Corayon", + "remoraid": "Rémoraid", + "octillery": "Octillery", + "delibird": "Cadoizo", + "mantine": "Démanta", + "skarmory": "Airmure", + "houndour": "Malosse", + "houndoom": "Démolosse", + "kingdra": "Hyporoi", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Cerfrousse", + "smeargle": "Queulorior", + "tyrogue": "Debugant", + "hitmontop": "Kapoera", + "smoochum": "Lippouti", + "elekid": "Élekid", + "magby": "Magby", + "miltank": "Écrémeuh", + "blissey": "Leuphorie", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Embrylex", + "pupitar": "Ymphect", + "tyranitar": "Tyranocif", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Arcko", + "grovyle": "Massko", + "sceptile": "Jungko", + "torchic": "Poussifeu", + "combusken": "Galifeu", + "blaziken": "Braségali", + "mudkip": "Gobou", + "marshtomp": "Flobio", + "swampert": "Laggron", + "poochyena": "Medhyèna", + "mightyena": "Grahyèna", + "zigzagoon": "Zigzaton", + "linoone": "Linéon", + "wurmple": "Chenipotte", + "silcoon": "Armulys", + "beautifly": "Charmillon", + "cascoon": "Blindalys", + "dustox": "Papinox", + "lotad": "Nénupiot", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Grainipiot", + "nuzleaf": "Pifeuil", + "shiftry": "Tengalice", + "taillow": "Nirondelle", + "swellow": "Hélédelle", + "wingull": "Goélise", + "pelipper": "Bekipan", + "ralts": "Tarsal", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Arakdo", + "masquerain": "Maskadra", + "shroomish": "Balignon", + "breloom": "Chapignon", + "slakoth": "Parecool", + "vigoroth": "Vigoroth", + "slaking": "Monaflèmit", + "nincada": "Ningale", + "ninjask": "Ninjask", + "shedinja": "Munja", + "whismur": "Chuchmur", + "loudred": "Ramboum", + "exploud": "Brouhabam", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Tarinor", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Ténéfix", + "mawile": "Mysdibule", + "aron": "Galekid", + "lairon": "Galegon", + "aggron": "Galeking", + "meditite": "Méditikka", + "medicham": "Charmina", + "electrike": "Dynavolt", + "manectric": "Élecsprint", + "plusle": "Posipi", + "minun": "Négapi", + "volbeat": "Muciole", + "illumise": "Lumivole", + "roselia": "Rosélia", + "gulpin": "Gloupti", + "swalot": "Avaltout", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Chamallot", + "camerupt": "Camérupt", + "torkoal": "Chartor", + "spoink": "Spoink", + "grumpig": "Groret", + "spinda": "Spinda", + "trapinch": "Kraknoix", + "vibrava": "Vibraninf", + "flygon": "Libégon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Tylton", + "altaria": "Altaria", + "zangoose": "Mangriff", + "seviper": "Séviper", + "lunatone": "Séléroc", + "solrock": "Solaroc", + "barboach": "Barloche", + "whiscash": "Barbicha", + "corphish": "Écrapince", + "crawdaunt": "Colhomard", + "baltoy": "Balbuto", + "claydol": "Kaorine", + "lileep": "Lilia", + "cradily": "Vacilys", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Barpau", + "milotic": "Milobellus", + "castform": "Morphéo", + "kecleon": "Kecleon", + "shuppet": "Polichombr", + "banette": "Branette", + "duskull": "Skelénox", + "dusclops": "Téraclope", + "tropius": "Tropius", + "chimecho": "Éoko", + "absol": "Absol", + "wynaut": "Okéoké", + "snorunt": "Stalgamin", + "glalie": "Oniglali", + "spheal": "Obalie", + "sealeo": "Phogleur", + "walrein": "Kaimorse", + "clamperl": "Coquiperl", + "huntail": "Serpang", + "gorebyss": "Rosabyss", + "relicanth": "Relicanth", + "luvdisc": "Lovdisc", + "bagon": "Draby", + "shelgon": "Drackhaus", + "salamence": "Drattak", + "beldum": "Terhal", + "metang": "Métang", + "metagross": "Métalosse", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Tortipouss", + "grotle": "Boskara", + "torterra": "Torterra", + "chimchar": "Ouisticram", + "monferno": "Chimpenfeu", + "infernape": "Simiabraz", + "piplup": "Tiplouf", + "prinplup": "Prinplouf", + "empoleon": "Pingoléon", + "starly": "Étourmi", + "staravia": "Étourvol", + "staraptor": "Étouraptor", + "bidoof": "Keunotor", + "bibarel": "Castorno", + "kricketot": "Crikzik", + "kricketune": "Mélokrik", + "shinx": "Lixy", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Rozbouton", + "roserade": "Roserade", + "cranidos": "Kranidos", + "rampardos": "Charkos", + "shieldon": "Dinoclier", + "bastiodon": "Bastiodon", + "burmy": "Cheniti", + "wormadam": "Cheniselle", + "mothim": "Papilord", + "combee": "Apitrini", + "vespiquen": "Apireine", + "pachirisu": "Pachirisu", + "buizel": "Mustébouée", + "floatzel": "Mustéflott", + "cherubi": "Ceribou", + "cherrim": "Ceriflor", + "shellos": "Sancoki", + "gastrodon": "Tritosor", + "ambipom": "Capidextre", + "drifloon": "Baudrive", + "drifblim": "Grodrive", + "buneary": "Laporeille", + "lopunny": "Lockpin", + "mismagius": "Magirêve", + "honchkrow": "Corboss", + "glameow": "Chaglam", + "purugly": "Chaffreux", + "chingling": "Korillon", + "stunky": "Moufouette", + "skuntank": "Moufflair", + "bronzor": "Archéomire", + "bronzong": "Archéodong", + "bonsly": "Manzaï", + "mime_jr": "Mime Jr.", + "happiny": "Ptiravi", + "chatot": "Pijako", + "spiritomb": "Spiritomb", + "gible": "Griknot", + "gabite": "Carmache", + "garchomp": "Carchacrok", + "munchlax": "Goinfrex", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippodocus", + "skorupi": "Rapion", + "drapion": "Drascore", + "croagunk": "Cradopaud", + "toxicroak": "Coatox", + "carnivine": "Vortente", + "finneon": "Écayon", + "lumineon": "Luminéon", + "mantyke": "Babimanta", + "snover": "Blizzi", + "abomasnow": "Blizzaroi", + "weavile": "Dimoret", + "magnezone": "Magnézone", + "lickilicky": "Coudlangue", + "rhyperior": "Rhinastoc", + "tangrowth": "Bouldeneu", + "electivire": "Élekable", + "magmortar": "Maganon", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Phyllali", + "glaceon": "Givrali", + "gliscor": "Scorvol", + "mamoswine": "Mammochon", + "porygon_z": "Porygon-Z", + "gallade": "Gallame", + "probopass": "Tarinorme", + "dusknoir": "Noctunoir", + "froslass": "Momartik", + "rotom": "Motisma", + "uxie": "Créhelf", + "mesprit": "Créfollet", + "azelf": "Créfadet", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Vipélierre", + "servine": "Lianaja", + "serperior": "Majaspic", + "tepig": "Gruikui", + "pignite": "Grotichon", + "emboar": "Roitiflam", + "oshawott": "Moustillon", + "dewott": "Mateloutre", + "samurott": "Clamiral", + "patrat": "Ratentif", + "watchog": "Miradar", + "lillipup": "Ponchiot", + "herdier": "Ponchien", + "stoutland": "Mastouffe", + "purrloin": "Chacripan", + "liepard": "Léopardus", + "pansage": "Feuillajou", + "simisage": "Feuiloutan", + "pansear": "Flamajou", + "simisear": "Flamoutan", + "panpour": "Flotajou", + "simipour": "Flotoutan", + "munna": "Munna", + "musharna": "Mushana", + "pidove": "Poichigeon", + "tranquill": "Colombeau", + "unfezant": "Déflaisan", + "blitzle": "Zébibron", + "zebstrika": "Zéblitz", + "roggenrola": "Nodulithe", + "boldore": "Géolithe", + "gigalith": "Gigalithe", + "woobat": "Chovsourir", + "swoobat": "Rhinolove", + "drilbur": "Rototaupe", + "excadrill": "Minotaupe", + "audino": "Nanméouïe", + "timburr": "Charpenti", + "gurdurr": "Ouvrifier", + "conkeldurr": "Bétochef", + "tympole": "Tritonde", + "palpitoad": "Batracné", + "seismitoad": "Crapustule", + "throh": "Judokrak", + "sawk": "Karaclée", + "sewaddle": "Larveyette", + "swadloon": "Couverdure", + "leavanny": "Manternel", + "venipede": "Venipatte", + "whirlipede": "Scobolide", + "scolipede": "Brutapode", + "cottonee": "Doudouvet", + "whimsicott": "Farfaduvet", + "petilil": "Chlorobule", + "lilligant": "Fragilady", + "basculin": "Bargantua", + "sandile": "Mascaïman", + "krokorok": "Escroco", + "krookodile": "Crocorible", + "darumaka": "Darumarond", + "darmanitan": "Darumacho", + "maractus": "Maracachi", + "dwebble": "Crabicoque", + "crustle": "Crabaraque", + "scraggy": "Baggiguane", + "scrafty": "Baggaïd", + "sigilyph": "Cryptéro", + "yamask": "Tutafeh", + "cofagrigus": "Tutankafer", + "tirtouga": "Carapagos", + "carracosta": "Mégapagos", + "archen": "Arkéapti", + "archeops": "Aéroptéryx", + "trubbish": "Miamiasme", + "garbodor": "Miasmax", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Chinchidou", + "cinccino": "Pashmilla", + "gothita": "Scrutella", + "gothorita": "Mesmérella", + "gothitelle": "Sidérella", + "solosis": "Nucléos", + "duosion": "Méios", + "reuniclus": "Symbios", + "ducklett": "Couaneton", + "swanna": "Lakmécygne", + "vanillite": "Sorbébé", + "vanillish": "Sorboul", + "vanilluxe": "Sorbouboul", + "deerling": "Vivaldaim", + "sawsbuck": "Haydaim", + "emolga": "Emolga", + "karrablast": "Carabing", + "escavalier": "Lançargot", + "foongus": "Trompignon", + "amoonguss": "Gaulet", + "frillish": "Viskuse", + "jellicent": "Moyade", + "alomomola": "Mamanbo", + "joltik": "Statitik", + "galvantula": "Mygavolt", + "ferroseed": "Grindur", + "ferrothorn": "Noacier", + "klink": "Tic", + "klang": "Clic", + "klinklang": "Cliticlic", + "tynamo": "Anchwatt", + "eelektrik": "Lampéroie", + "eelektross": "Ohmassacre", + "elgyem": "Lewsor", + "beheeyem": "Neitram", + "litwick": "Funécire", + "lampent": "Mélancolux", + "chandelure": "Lugulabre", + "axew": "Coupenotte", + "fraxure": "Incisache", + "haxorus": "Tranchodon", + "cubchoo": "Polarhume", + "beartic": "Polagriffe", + "cryogonal": "Hexagel", + "shelmet": "Escargaume", + "accelgor": "Limaspeed", + "stunfisk": "Limonde", + "mienfoo": "Kungfouine", + "mienshao": "Shaofouine", + "druddigon": "Drakkarmin", + "golett": "Gringolem", + "golurk": "Golemastoc", + "pawniard": "Scalpion", + "bisharp": "Scalproie", + "bouffalant": "Frison", + "rufflet": "Furaiglon", + "braviary": "Gueriaigle", + "vullaby": "Vostourno", + "mandibuzz": "Vaututrice", + "heatmor": "Aflamanoir", + "durant": "Fermite", + "deino": "Solochi", + "zweilous": "Diamat", + "hydreigon": "Trioxhydre", + "larvesta": "Pyronille", + "volcarona": "Pyrax", + "cobalion": "Cobaltium", + "terrakion": "Terrakium", + "virizion": "Viridium", + "tornadus": "Boréas", + "thundurus": "Fulguris", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Démétéros", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Marisson", + "quilladin": "Boguérisse", + "chesnaught": "Blindépique", + "fennekin": "Feunnec", + "braixen": "Roussil", + "delphox": "Goupelin", + "froakie": "Grenousse", + "frogadier": "Croâporal", + "greninja": "Amphinobi", + "bunnelby": "Sapereau", + "diggersby": "Excavarenne", + "fletchling": "Passerouge", + "fletchinder": "Braisillon", + "talonflame": "Flambusard", + "scatterbug": "Lépidonille", + "spewpa": "Pérégrain", + "vivillon": "Prismillon", + "litleo": "Hélionceau", + "pyroar": "Némélios", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Cabriolaine", + "gogoat": "Chevroum", + "pancham": "Pandespiègle", + "pangoro": "Pandarbare", + "furfrou": "Couafarel", + "espurr": "Psystigri", + "meowstic": "Mistigrix", + "honedge": "Monorpale", + "doublade": "Dimoclès", + "aegislash": "Exagide", + "spritzee": "Fluvetin", + "aromatisse": "Cocotine", + "swirlix": "Sucroquin", + "slurpuff": "Cupcanaille", + "inkay": "Sepiatop", + "malamar": "Sepiatroce", + "binacle": "Opermine", + "barbaracle": "Golgopathe", + "skrelp": "Venalgue", + "dragalge": "Kravarech", + "clauncher": "Flingouste", + "clawitzer": "Gamblast", + "helioptile": "Galvaran", + "heliolisk": "Iguolta", + "tyrunt": "Ptyranidur", + "tyrantrum": "Rexillius", + "amaura": "Amagara", + "aurorus": "Dragmara", + "sylveon": "Nymphali", + "hawlucha": "Brutalibré", + "dedenne": "Dedenne", + "carbink": "Strassie", + "goomy": "Mucuscule", + "sliggoo": "Colimucus", + "goodra": "Muplodocus", + "klefki": "Trousselin", + "phantump": "Brocélôme", + "trevenant": "Desséliande", + "pumpkaboo": "Pitrouille", + "gourgeist": "Banshitrouye", + "bergmite": "Grelaçon", + "avalugg": "Séracrawl", + "noibat": "Sonistrelle", + "noivern": "Bruyverne", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Brindibou", + "dartrix": "Efflèche", + "decidueye": "Archéduc", + "litten": "Flamiaou", + "torracat": "Matoufeu", + "incineroar": "Félinferno", + "popplio": "Otaquin", + "brionne": "Otarlette", + "primarina": "Oratoria", + "pikipek": "Picassaut", + "trumbeak": "Piclairon", + "toucannon": "Bazoucan", + "yungoos": "Manglouton", + "gumshoos": "Argouste", + "grubbin": "Larvibule", + "charjabug": "Chrysapile", + "vikavolt": "Lucanon", + "crabrawler": "Crabagarre", + "crabominable": "Crabominable", + "oricorio": "Plumeline", + "cutiefly": "Bombydou", + "ribombee": "Rubombelle", + "rockruff": "Rocabot", + "lycanroc": "Lougaroc", + "wishiwashi": "Froussardine", + "mareanie": "Vorastérie", + "toxapex": "Prédastérie", + "mudbray": "Tiboudet", + "mudsdale": "Bourrinos", + "dewpider": "Araqua", + "araquanid": "Tarenbulle", + "fomantis": "Mimantis", + "lurantis": "Floramantis", + "morelull": "Spododo", + "shiinotic": "Lampignon", + "salandit": "Tritox", + "salazzle": "Malamandre", + "stufful": "Nounourson", + "bewear": "Chelours", + "bounsweet": "Croquine", + "steenee": "Candine", + "tsareena": "Sucreine", + "comfey": "Guérilande", + "oranguru": "Gouroutan", + "passimian": "Quartermac", + "wimpod": "Sovkipou", + "golisopod": "Sarmuraï", + "sandygast": "Bacabouh", + "palossand": "Trépassable", + "pyukumuku": "Concombaffe", + "type_null": "Type:0", + "silvally": "Silvallié", + "minior": "Météno", + "komala": "Dodoala", + "turtonator": "Boumata", + "togedemaru": "Togedemaru", + "mimikyu": "Mimiqui", + "bruxish": "Denticrisse", + "drampa": "Draïeul", + "dhelmise": "Sinistrail", + "jangmo_o": "Bébécaille", + "hakamo_o": "Écaïd", + "kommo_o": "Ékaïser", + "tapu_koko": "Tokorico", + "tapu_lele": "Tokopiyon", + "tapu_bulu": "Tokotoro", + "tapu_fini": "Tokopisco", + "cosmog": "Cosmog", + "cosmoem": "Cosmovum", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Zéroïd", + "buzzwole": "Mouscoto", + "pheromosa": "Cancrelove", + "xurkitree": "Câblifère", + "celesteela": "Bamboiselle", + "kartana": "Katagami", + "guzzlord": "Engloutyran", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Vémini", + "naganadel": "Mandrillon", + "stakataka": "Ama-Ama", + "blacephalon": "Pierroteknik", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Ouistempo", + "thwackey": "Badabouin", + "rillaboom": "Gorythmic", + "scorbunny": "Flambino", + "raboot": "Lapyro", + "cinderace": "Pyrobut", + "sobble": "Larméléon", + "drizzile": "Arrozard", + "inteleon": "Lézargus", + "skwovet": "Rongourmand", + "greedent": "Rongrigou", + "rookidee": "Minisange", + "corvisquire": "Bleuseille", + "corviknight": "Corvaillus", + "blipbug": "Larvadar", + "dottler": "Coléodôme", + "orbeetle": "Astronelle", + "nickit": "Goupilou", + "thievul": "Roublenard", + "gossifleur": "Tournicoton", + "eldegoss": "Blancoton", + "wooloo": "Moumouton", + "dubwool": "Moumouflon", + "chewtle": "Khélocrok", + "drednaw": "Torgamord", + "yamper": "Voltoutou", + "boltund": "Fulgudog", + "rolycoly": "Charbi", + "carkol": "Wagomine", + "coalossal": "Monthracite", + "applin": "Verpom", + "flapple": "Pomdrapi", + "appletun": "Dratatin", + "silicobra": "Dunaja", + "sandaconda": "Dunaconda", + "cramorant": "Nigosier", + "arrokuda": "Embrochet", + "barraskewda": "Hastacuda", + "toxel": "Toxizap", + "toxtricity": "Salarsen", + "sizzlipede": "Grillepattes", + "centiskorch": "Scolocendre", + "clobbopus": "Poulpaf", + "grapploct": "Krakos", + "sinistea": "Théffroi", + "polteageist": "Polthégeist", + "hatenna": "Bibichut", + "hattrem": "Chapotus", + "hatterene": "Sorcilence", + "impidimp": "Grimalin", + "morgrem": "Fourbelin", + "grimmsnarl": "Angoliath", + "obstagoon": "Ixon", + "perrserker": "Berserkatt", + "cursola": "Corayôme", + "sirfetchd": "Palarticho", + "mr_rime": "M. Glaquette", + "runerigus": "Tutétékri", + "milcery": "Crèmy", + "alcremie": "Charmilly", + "falinks": "Hexadron", + "pincurchin": "Wattapik", + "snom": "Frissonille", + "frosmoth": "Beldeneige", + "stonjourner": "Dolman", + "eiscue": "Bekaglaçon", + "indeedee": "Wimessir", + "morpeko": "Morpeko", + "cufant": "Charibari", + "copperajah": "Pachyradjah", + "dracozolt": "Galvagon", + "arctozolt": "Galvagla", + "dracovish": "Hydragon", + "arctovish": "Hydragla", + "duraludon": "Duralugon", + "dreepy": "Fantyrm", + "drakloak": "Dispareptil", + "dragapult": "Lanssorien", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Éthernatos", + "kubfu": "Wushours", + "urshifu": "Shifours", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Blizzeval", + "spectrier": "Spectreval", + "calyrex": "Sylveroy", + "wyrdeer": "Cerbyllin", + "kleavor": "Hachécateur", + "ursaluna": "Ursaking", + "basculegion": "Paragruel", + "sneasler": "Farfurex", + "overqwil": "Qwilpik", + "enamorus": "Amovénus", + "sprigatito": "Poussacha", + "floragato": "Matourgeon", + "meowscarada": "Miascarade", + "fuecoco": "Chochodile", + "crocalor": "Crocogril", + "skeledirge": "Flâmigator", + "quaxly": "Coiffeton", + "quaxwell": "Canarbello", + "quaquaval": "Palmaval", + "lechonk": "Gourmelet", + "oinkologne": "Fragroin", + "tarountula": "Tissenboule", + "spidops": "Filentrappe", + "nymble": "Lilliterelle", + "lokix": "Gambex", + "pawmi": "Pohm", + "pawmo": "Pohmotte", + "pawmot": "Pohmarmotte", + "tandemaus": "Compagnol", + "maushold": "Famignol", + "fidough": "Pâtachiot", + "dachsbun": "Briochien", + "smoliv": "Olivini", + "dolliv": "Olivado", + "arboliva": "Arboliva", + "squawkabilly": "Tapatoès", + "nacli": "Selutin", + "naclstack": "Amassel", + "garganacl": "Gigansel", + "charcadet": "Charbambin", + "armarouge": "Carmadura", + "ceruledge": "Malvalame", + "tadbulb": "Têtampoule", + "bellibolt": "Ampibidou", + "wattrel": "Zapétrel", + "kilowattrel": "Fulgulairo", + "maschiff": "Grondogue", + "mabosstiff": "Dogrino", + "shroodle": "Gribouraigne", + "grafaiai": "Tag-Tag", + "bramblin": "Virovent", + "brambleghast": "Virevorreur", + "toedscool": "Terracool", + "toedscruel": "Terracruel", + "klawf": "Craparoi", + "capsakid": "Pimito", + "scovillain": "Scovilain", + "rellor": "Léboulérou", + "rabsca": "Bérasca", + "flittle": "Flotillon", + "espathra": "Cléopsytra", + "tinkatink": "Forgerette", + "tinkatuff": "Forgella", + "tinkaton": "Forgelina", + "wiglett": "Taupikeau", + "wugtrio": "Triopikeau", + "bombirdier": "Lestombaile", + "finizen": "Dofin", + "palafin": "Superdofin", + "varoom": "Vrombi", + "revavroom": "Vrombotor", + "cyclizar": "Motorizard", + "orthworm": "Ferdeter", + "glimmet": "Germéclat", + "glimmora": "Floréclat", + "greavard": "Toutombe", + "houndstone": "Tomberro", + "flamigo": "Flamenroule", + "cetoddle": "Piétacé", + "cetitan": "Balbalèze", + "veluza": "Délestin", + "dondozo": "Oyacata", + "tatsugiri": "Nigirigon", + "annihilape": "Courrousinge", + "clodsire": "Terraiste", + "farigiraf": "Farigiraf", + "dudunsparce": "Deusolourdo", + "kingambit": "Scalpereur", + "great_tusk": "Fort-Ivoire", + "scream_tail": "Hurle-Queue", + "brute_bonnet": "Fongus-Furie", + "flutter_mane": "Flotte-Mèche", + "slither_wing": "Rampe-Ailes", + "sandy_shocks": "Pelage-Sablé", + "iron_treads": "Roue-de-Fer", + "iron_bundle": "Hotte-de-Fer", + "iron_hands": "Paume-de-Fer", + "iron_jugulis": "Têtes-de-Fer", + "iron_moth": "Mite-de-Fer", + "iron_thorns": "Épine-de-Fer", + "frigibax": "Frigodo", + "arctibax": "Cryodo", + "baxcalibur": "Glaivodo", + "gimmighoul": "Mordudor", + "gholdengo": "Gromago", + "wo_chien": "Chongjian", + "chien_pao": "Baojian", + "ting_lu": "Dinglu", + "chi_yu": "Yuyu", + "roaring_moon": "Rugit-Lune", + "iron_valiant": "Garde-de-Fer", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Serpente-Eau", + "iron_leaves": "Vert-de-Fer", + "dipplin": "Pomdramour", + "poltchageist": "Poltchageist", + "sinistcha": "Théffroyable", + "okidogi": "Félicanis", + "munkidori": "Fortusimia", + "fezandipiti": "Favianos", + "ogerpon": "Ogerpon", + "archaludon": "Pondralugon", + "hydrapple": "Pomdorochi", + "gouging_fire": "Feu-Perçant", + "raging_bolt": "Ire-Foudre", + "iron_boulder": "Roc-de-Fer", + "iron_crown": "Chef-de-Fer", + "terapagos": "Terapagos", + "pecharunt": "Pêchaminus", + "alola_rattata": "Rattata", + "alola_raticate": "Rattatac", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sabelette", + "alola_sandslash": "Sablaireau", + "alola_vulpix": "Goupix", + "alola_ninetales": "Feunard", + "alola_diglett": "Taupiqueur", + "alola_dugtrio": "Triopikeur", + "alola_meowth": "Miaouss", + "alola_persian": "Persian", + "alola_geodude": "Racaillou", + "alola_graveler": "Gravalanch", + "alola_golem": "Grolem", + "alola_grimer": "Tadmorv", + "alola_muk": "Grotadmorv", + "alola_exeggutor": "Noadkoko", + "alola_marowak": "Ossatueur", + "eternal_floette": "Floette", + "galar_meowth": "Miaouss", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Galopa", + "galar_slowpoke": "Ramoloss", + "galar_slowbro": "Flagadoss", + "galar_farfetchd": "Canarticho", + "galar_weezing": "Smogogo", + "galar_mr_mime": "M. Mime", + "galar_articuno": "Artikodin", + "galar_zapdos": "Électhor", + "galar_moltres": "Sulfura", + "galar_slowking": "Roigada", + "galar_corsola": "Corayon", + "galar_zigzagoon": "Zigzaton", + "galar_linoone": "Linéon", + "galar_darumaka": "Darumarond", + "galar_darmanitan": "Darumacho", + "galar_yamask": "Tutafeh", + "galar_stunfisk": "Limonde", + "hisui_growlithe": "Caninos", + "hisui_arcanine": "Arcanin", + "hisui_voltorb": "Voltorbe", + "hisui_electrode": "Électrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Farfuret", + "hisui_samurott": "Clamiral", + "hisui_lilligant": "Fragilady", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Gueriaigle", + "hisui_sliggoo": "Colimucus", + "hisui_goodra": "Muplodocus", + "hisui_avalugg": "Séracrawl", + "hisui_decidueye": "Archéduc", + "paldea_tauros": "Tauros", + "paldea_wooper": "Axoloto", + "bloodmoon_ursaluna": "Ursaking", +} as const; diff --git a/src/locales/fr/splash-messages.ts b/src/locales/fr/splash-messages.ts index ef7a8c3335a3..534cefaeff64 100644 --- a/src/locales/fr/splash-messages.ts +++ b/src/locales/fr/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "combats gagnés !", - "joinTheDiscord": "Rejoins le Discord !", - "infiniteLevels": "Niveaux infinis !", - "everythingStacks": "Tout se cumule !", - "optionalSaveScumming": "Optional Save Scumming!", - "biomes": "35 biomes !", - "openSource": "Open Source !", - "playWithSpeed": "Joue en vitesse x5 !", - "liveBugTesting": "Tests de bugs en direct !", - "heavyInfluence": "Grosse influence de RoR2 !", - "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", - "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", - "infiniteFusionAtHome": "Infinite Fusion, chez vous !", - "brokenEggMoves": "Des Capacités Œuf craquées !", - "magnificent": "Magnifique !", - "mubstitute": "Mubstitute !", - "thatsCrazy": "C’est une dinguerie !", - "oranceJuice": "Jus d’orange !", - "questionableBalancing": "Équilibrage douteux !", - "coolShaders": "Cool shaders !", - "aiFree": "Garanti sans IA !", - "suddenDifficultySpikes": "De soudains pics de difficultés !", - "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", - "moreAddictiveThanIntended": "Plus addictif que prévu !", - "mostlyConsistentSeeds": "Des seeds à peu près stables !", - "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", - "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", - "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l'incident de l’Œuf de Manaphy !", - "alsoTryPokengine": "Essaye aussi Pokéngine !", - "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", - "alsoTryRadicalRed": "Essaye aussi Radical Red !", - "eeveeExpo": "Eevee Expo !", - "ynoproject": "YNOproject !", + "battlesWon": "combats gagnés !", + "joinTheDiscord": "Rejoins le Discord !", + "infiniteLevels": "Niveaux infinis !", + "everythingStacks": "Tout se cumule !", + "optionalSaveScumming": "Optional Save Scumming!", + "biomes": "35 biomes !", + "openSource": "Open Source !", + "playWithSpeed": "Joue en vitesse x5 !", + "liveBugTesting": "Tests de bugs en direct !", + "heavyInfluence": "Grosse influence de RoR2 !", + "pokemonRiskAndPokemonRain": "Pokémon Risk et Pokémon Rain !", + "nowWithMoreSalt": "Désormais avec 33% de sel en plus !", + "infiniteFusionAtHome": "Infinite Fusion, chez vous !", + "brokenEggMoves": "Des Capacités Œuf craquées !", + "magnificent": "Magnifique !", + "mubstitute": "Mubstitute !", + "thatsCrazy": "C’est une dinguerie !", + "oranceJuice": "Jus d’orange !", + "questionableBalancing": "Équilibrage douteux !", + "coolShaders": "Cool shaders !", + "aiFree": "Garanti sans IA !", + "suddenDifficultySpikes": "De soudains pics de difficultés !", + "basedOnAnUnfinishedFlashGame": "Basé sur un jeu Flash abandonné !", + "moreAddictiveThanIntended": "Plus addictif que prévu !", + "mostlyConsistentSeeds": "Des seeds à peu près stables !", + "achievementPointsDontDoAnything": "Les Points de Succès servent à rien !", + "youDoNotStartAtLevel": "Ne commence pas au Niveau 2000 !", + "dontTalkAboutTheManaphyEggIncident": "Ne parle pas de l'incident de l’Œuf de Manaphy !", + "alsoTryPokengine": "Essaye aussi Pokéngine !", + "alsoTryEmeraldRogue": "Essaye aussi Emerald Rogue!", + "alsoTryRadicalRed": "Essaye aussi Radical Red !", + "eeveeExpo": "Eevee Expo !", + "ynoproject": "YNOproject !", } as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index 380f4e9fd560..4aa6185b4397 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'Commencer avec ces Pokémon ?', - "gen1": "1G", - "gen2": "2G", - "gen3": "3G", - "gen4": "4G", - "gen5": "5G", - "gen6": "6G", - "gen7": "7G", - "gen8": "8G", - "gen9": "9G", - "growthRate": "Croissance :", - "ability": "Talent :", - "passive": "Passif :", - "nature": "Nature :", - "eggMoves": "Capacités Œuf", - "start": "Lancer", - "addToParty": "Ajouter à l’équipe", - "toggleIVs": "Voir IVs", - "manageMoves": "Gérer Capacités", - "useCandies": "Utiliser Bonbons", - "selectMoveSwapOut": "Sélectionnez la capacité à échanger.", - "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", - "unlockPassive": "Débloquer Passif", - "reduceCost": "Diminuer le cout", - "cycleShiny": "R: » Chromatiques", - "cycleForm": "F: » Formes", - "cycleGender": "G: » Sexes", - "cycleAbility": "E: » Talents", - "cycleNature": "N: » Natures", - "cycleVariant": "V: » Variants", - "enablePassive": "Activer Passif", - "disablePassive": "Désactiver Passif", - "locked": "Verrouillé", - "disabled": "Désactivé", - "uncaught": "Non-capturé" -} + "confirmStartTeam":"Commencer avec ces Pokémon ?", + "gen1": "1G", + "gen2": "2G", + "gen3": "3G", + "gen4": "4G", + "gen5": "5G", + "gen6": "6G", + "gen7": "7G", + "gen8": "8G", + "gen9": "9G", + "growthRate": "Croissance :", + "ability": "Talent :", + "passive": "Passif :", + "nature": "Nature :", + "eggMoves": "Capacités Œuf", + "start": "Lancer", + "addToParty": "Ajouter à l’équipe", + "toggleIVs": "Voir IVs", + "manageMoves": "Gérer Capacités", + "useCandies": "Utiliser Bonbons", + "selectMoveSwapOut": "Sélectionnez la capacité à échanger.", + "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", + "unlockPassive": "Débloquer Passif", + "reduceCost": "Diminuer le cout", + "cycleShiny": "R: » Chromatiques", + "cycleForm": "F: » Formes", + "cycleGender": "G: » Sexes", + "cycleAbility": "E: » Talents", + "cycleNature": "N: » Natures", + "cycleVariant": "V: » Variants", + "enablePassive": "Activer Passif", + "disablePassive": "Désactiver Passif", + "locked": "Verrouillé", + "disabled": "Désactivé", + "uncaught": "Non-capturé" +}; diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index bfc77b5a8cfc..9fb7a38f675e 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -2,243 +2,243 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Conseil 4", - "gym_leader": "Champion d’Arène", - "gym_leader_female": "Championne d’Arène", - "champion": "Maitre·esse", //Written in gender-inclusive language in wait of a potential split of the entry - "rival": "Rival·e", //Written in gender-inclusive language in wait of a potential split of the entry - "professor": "Professeur·e", //Written in gender-inclusive language in wait of a potential split of the entry - "frontier_brain": "Meneur·euse de Zone", //Written in gender-inclusive language in wait of a potential split of the entry - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Conseil 4", + "gym_leader": "Champion d’Arène", + "gym_leader_female": "Championne d’Arène", + "champion": "Maitre·esse", //Written in gender-inclusive language in wait of a potential split of the entry + "rival": "Rival·e", //Written in gender-inclusive language in wait of a potential split of the entry + "professor": "Professeur·e", //Written in gender-inclusive language in wait of a potential split of the entry + "frontier_brain": "Meneur·euse de Zone", //Written in gender-inclusive language in wait of a potential split of the entry + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Topdresseur", - "ace_trainer_female": "Topdresseuse", - "ace_duo": "Topdresseurs", - "artist": "Artiste", - "artist_female": "Artiste", - "backers": "Pompom Girls", - "backpacker": "Randonneur", - "backpacker_female": "Randonneuse", - "backpackers": "Randonneurs", - "baker": "Boulangère", - "battle_girl": "Combattante", - "beauty": "Canon", - "beginners": "Beginners", - "biker": "Motard", - "black_belt": "Karatéka", - "breeder": "Éleveur", - "breeder_female": "Éleveuse", - "breeders": "Éleveurs", - "clerk": "Employé", - "clerk_female": "Employée", - "colleagues": "Collègues de Bureau", - "crush_kin": "Duo Baston", - "cyclist": "Cycliste", - "cyclist_female": "Cycliste", - "cyclists": "Cyclistes", - "dancer": "Danseur", - "dancer_female": "Danseuse", - "depot_agent": "Cheminot", - "doctor": "Docteur", - "doctor_female": "Docteure", - "fisherman": "Pêcheur", - "fisherman_female": "Pêcheuse", - "gentleman": "Gentleman", - "guitarist": "Guitariste", - "guitarist_female": "Guitariste", - "harlequin": "Clown", - "hiker": "Montagnard", - "hooligans": "Loubards", - "hoopster": "Basketteur", - "infielder": "Baseballeur", - "janitor": "Nettoyeur", - "lady": "Mademoiselle", - "lass": "Fillette", - "linebacker": "Quaterback", - "maid": "Gouvernante", - "madame": "Mondaine", - "medical_team": "Médecins", - "musician": "Musicien", - "hex_maniac": "Mystimaniac", - "nurse": "Infirmière", - "nursery_aide": "Institutrice", - "officer": "Policier", - "parasol_lady": "Sœur Parasol", - "pilot": "Pilote", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Couple de Pokéfans", - "preschooler": "Petit", - "preschooler_female": "Petite", - "preschoolers": "Petits", - "psychic": "Kinésiste", - "psychic_female": "Kinésiste", - "psychics": "Kinésistes", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Rangers", - "ranger": "Ranger", - "restaurant_staff": "Serveurs", - "rich": "Rich", - "rich_female": "Mondaine", - "rich_boy": "Gentleman", - "rich_couple": "Couple de Bourgeois", - "rich_kid": "Richard", - "rich_kid_female": "Mademoiselle", - "rich_kids": "Richards", - "roughneck": "Loubard", - "scientist": "Scientifique", - "scientist_female": "Scientifique", - "scientists": "Scientifiques", - "smasher": "Tenniswoman", - "snow_worker": "Ouvrier Alpin", - "snow_worker_female": "Ouvrière Alpine", - "striker": "Footballeur", - "school_kid": "Élève", - "school_kid_female": "Élève", - "school_kids": "Élèves", - "swimmer": "Nageur", - "swimmer_female": "Nageuse", - "swimmers": "Nageurs", - "twins": "Jumelles", - "veteran": "Vénérable", - "veteran_female": "Vénérable", - "veteran_duo": "Vénérables", - "waiter": "Serveur", - "waitress": "Serveuse", - "worker": "Ouvrier", - "worker_female": "Ouvrière", - "workers": "Ouvriers", - "youngster": "Gamin" + "ace_trainer": "Topdresseur", + "ace_trainer_female": "Topdresseuse", + "ace_duo": "Topdresseurs", + "artist": "Artiste", + "artist_female": "Artiste", + "backers": "Pompom Girls", + "backpacker": "Randonneur", + "backpacker_female": "Randonneuse", + "backpackers": "Randonneurs", + "baker": "Boulangère", + "battle_girl": "Combattante", + "beauty": "Canon", + "beginners": "Beginners", + "biker": "Motard", + "black_belt": "Karatéka", + "breeder": "Éleveur", + "breeder_female": "Éleveuse", + "breeders": "Éleveurs", + "clerk": "Employé", + "clerk_female": "Employée", + "colleagues": "Collègues de Bureau", + "crush_kin": "Duo Baston", + "cyclist": "Cycliste", + "cyclist_female": "Cycliste", + "cyclists": "Cyclistes", + "dancer": "Danseur", + "dancer_female": "Danseuse", + "depot_agent": "Cheminot", + "doctor": "Docteur", + "doctor_female": "Docteure", + "fisherman": "Pêcheur", + "fisherman_female": "Pêcheuse", + "gentleman": "Gentleman", + "guitarist": "Guitariste", + "guitarist_female": "Guitariste", + "harlequin": "Clown", + "hiker": "Montagnard", + "hooligans": "Loubards", + "hoopster": "Basketteur", + "infielder": "Baseballeur", + "janitor": "Nettoyeur", + "lady": "Mademoiselle", + "lass": "Fillette", + "linebacker": "Quaterback", + "maid": "Gouvernante", + "madame": "Mondaine", + "medical_team": "Médecins", + "musician": "Musicien", + "hex_maniac": "Mystimaniac", + "nurse": "Infirmière", + "nursery_aide": "Institutrice", + "officer": "Policier", + "parasol_lady": "Sœur Parasol", + "pilot": "Pilote", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Couple de Pokéfans", + "preschooler": "Petit", + "preschooler_female": "Petite", + "preschoolers": "Petits", + "psychic": "Kinésiste", + "psychic_female": "Kinésiste", + "psychics": "Kinésistes", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Rangers", + "ranger": "Ranger", + "restaurant_staff": "Serveurs", + "rich": "Rich", + "rich_female": "Mondaine", + "rich_boy": "Gentleman", + "rich_couple": "Couple de Bourgeois", + "rich_kid": "Richard", + "rich_kid_female": "Mademoiselle", + "rich_kids": "Richards", + "roughneck": "Loubard", + "scientist": "Scientifique", + "scientist_female": "Scientifique", + "scientists": "Scientifiques", + "smasher": "Tenniswoman", + "snow_worker": "Ouvrier Alpin", + "snow_worker_female": "Ouvrière Alpine", + "striker": "Footballeur", + "school_kid": "Élève", + "school_kid_female": "Élève", + "school_kids": "Élèves", + "swimmer": "Nageur", + "swimmer_female": "Nageuse", + "swimmers": "Nageurs", + "twins": "Jumelles", + "veteran": "Vénérable", + "veteran_female": "Vénérable", + "veteran_duo": "Vénérables", + "waiter": "Serveur", + "waitress": "Serveuse", + "worker": "Ouvrier", + "worker_female": "Ouvrière", + "workers": "Ouvriers", + "youngster": "Gamin" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Pierre", - "misty": "Ondine", - "lt_surge": "Major Bob", - "erika": "Erika", - "janine": "Jeannine", - "sabrina": "Morgane", - "blaine": "Auguste", - "giovanni": "Giovanni", - "falkner": "Albert", - "bugsy": "Hector", - "whitney": "Blanche", - "morty": "Mortimer", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Frédo", - "clair": "Sandra", - "roxanne": "Roxanne", - "brawly": "Bastien", - "wattson": "Voltère", - "flannery": "Adriane", - "norman": "Norman", - "winona": "Alizée", - "tate": "Lévy", - "liza": "Tatia", - "juan": "Juan", - "roark": "Pierrick", - "gardenia": "Flo", - "maylene": "Mélina", - "crasher_wake": "Lovis", - "fantina": "Kiméra", - "byron": "Charles", - "candice": "Gladys", - "volkner": "Tanguy", - "cilan": "Rachid", - "chili": "Armando", - "cress": "Noa", - "cheren": "Tcheren", - "lenora": "Aloé", - "roxie": "Strykna", - "burgh": "Artie", - "elesa": "Inezia", - "clay": "Bardane", - "skyla": "Carolina", - "brycen": "Zhu", - "drayden": "Watson", - "marlon": "Amana", - "viola": "Violette", - "grant": "Lino", - "korrina": "Cornélia", - "ramos": "Amaro", - "clemont": "Lem", - "valerie": "Valériane", - "olympia": "Astera", - "wulfric": "Urup", - "milo": "Percy", - "nessa": "Donna", - "kabu": "Kabu", - "bea": "Faïza", - "allister": "Alistair", - "opal": "Sally", - "bede": "Travis", - "gordie": "Chaz", - "melony": "Lona", - "piers": "Peterson", - "marnie": "Rosemary", - "raihan": "Roy", - "katy": "Éra", - "brassius": "Colza", - "iono": "Mashynn", - "kofu": "Kombu", - "larry": "Okuba", - "ryme": "Laïm", - "tulip": "Tully", - "grusha": "Grusha", - "lorelei": "Olga", - "bruno": "Aldo", - "agatha": "Agatha", - "lance": "Peter", - "will": "Clément", - "koga": "Koga", - "karen": "Marion", - "sidney": "Damien", - "phoebe": "Spectra", - "glacia": "Glacia", - "drake": "Aragon", - "aaron": "Aaron", - "bertha": "Terry", - "flint": "Adrien", - "lucian": "Lucio", - "shauntal": "Anis", - "marshal": "Kunz", - "grimsley": "Pieris", - "caitlin": "Percila", - "malva": "Malva", - "siebold": "Narcisse", - "wikstrom": "Tileo", - "drasna": "Dracéna", - "hala": "Pectorius", - "molayne": "Molène", - "olivia": "Alyxia", - "acerola": "Margie", - "kahili": "Kahili", - "rika": "Cayenn", - "poppy": "Popi", - "hassel": "Hassa", - "crispin": "Rubépin", - "amarys": "Nérine", - "lacey": "Taro", - "drayton": "Irido", - "blue": "Blue", - "red": "Red", - "steven": "Pierre Rochard", - "wallace": "Marc", - "cynthia": "Cynthia", - "alder": "Goyah", - "iris": "Iris", - "diantha": "Dianthéa", - "hau": "Tili", - "geeta": "Alisma", - "nemona": "Menzi", - "kieran": "Kass", - "leon": "Tarak", - "rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages. - "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language + "brock": "Pierre", + "misty": "Ondine", + "lt_surge": "Major Bob", + "erika": "Erika", + "janine": "Jeannine", + "sabrina": "Morgane", + "blaine": "Auguste", + "giovanni": "Giovanni", + "falkner": "Albert", + "bugsy": "Hector", + "whitney": "Blanche", + "morty": "Mortimer", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Frédo", + "clair": "Sandra", + "roxanne": "Roxanne", + "brawly": "Bastien", + "wattson": "Voltère", + "flannery": "Adriane", + "norman": "Norman", + "winona": "Alizée", + "tate": "Lévy", + "liza": "Tatia", + "juan": "Juan", + "roark": "Pierrick", + "gardenia": "Flo", + "maylene": "Mélina", + "crasher_wake": "Lovis", + "fantina": "Kiméra", + "byron": "Charles", + "candice": "Gladys", + "volkner": "Tanguy", + "cilan": "Rachid", + "chili": "Armando", + "cress": "Noa", + "cheren": "Tcheren", + "lenora": "Aloé", + "roxie": "Strykna", + "burgh": "Artie", + "elesa": "Inezia", + "clay": "Bardane", + "skyla": "Carolina", + "brycen": "Zhu", + "drayden": "Watson", + "marlon": "Amana", + "viola": "Violette", + "grant": "Lino", + "korrina": "Cornélia", + "ramos": "Amaro", + "clemont": "Lem", + "valerie": "Valériane", + "olympia": "Astera", + "wulfric": "Urup", + "milo": "Percy", + "nessa": "Donna", + "kabu": "Kabu", + "bea": "Faïza", + "allister": "Alistair", + "opal": "Sally", + "bede": "Travis", + "gordie": "Chaz", + "melony": "Lona", + "piers": "Peterson", + "marnie": "Rosemary", + "raihan": "Roy", + "katy": "Éra", + "brassius": "Colza", + "iono": "Mashynn", + "kofu": "Kombu", + "larry": "Okuba", + "ryme": "Laïm", + "tulip": "Tully", + "grusha": "Grusha", + "lorelei": "Olga", + "bruno": "Aldo", + "agatha": "Agatha", + "lance": "Peter", + "will": "Clément", + "koga": "Koga", + "karen": "Marion", + "sidney": "Damien", + "phoebe": "Spectra", + "glacia": "Glacia", + "drake": "Aragon", + "aaron": "Aaron", + "bertha": "Terry", + "flint": "Adrien", + "lucian": "Lucio", + "shauntal": "Anis", + "marshal": "Kunz", + "grimsley": "Pieris", + "caitlin": "Percila", + "malva": "Malva", + "siebold": "Narcisse", + "wikstrom": "Tileo", + "drasna": "Dracéna", + "hala": "Pectorius", + "molayne": "Molène", + "olivia": "Alyxia", + "acerola": "Margie", + "kahili": "Kahili", + "rika": "Cayenn", + "poppy": "Popi", + "hassel": "Hassa", + "crispin": "Rubépin", + "amarys": "Nérine", + "lacey": "Taro", + "drayton": "Irido", + "blue": "Blue", + "red": "Red", + "steven": "Pierre Rochard", + "wallace": "Marc", + "cynthia": "Cynthia", + "alder": "Goyah", + "iris": "Iris", + "diantha": "Dianthéa", + "hau": "Tili", + "geeta": "Alisma", + "nemona": "Menzi", + "kieran": "Kass", + "leon": "Tarak", + "rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages. + "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language } as const; diff --git a/src/locales/fr/tutorial.ts b/src/locales/fr/tutorial.ts index bcd76d61da22..519f457fd9b7 100644 --- a/src/locales/fr/tutorial.ts +++ b/src/locales/fr/tutorial.ts @@ -1,35 +1,35 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite ! + "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite ! $Ce jeu n’est pas monétisé et nous ne prétendons pas à la propriété de Pokémon, ni des éléments sous copyright $utilisés. $Ce jeu est toujours en développement, mais entièrement jouable. $Tout signalement de bugs passe par le serveur Discord. $Si le jeu est lent, vérifiez que l’Accélération Matérielle est activée dans les paramètres du navigateur.`, - "accessMenu": `Accédez au menu avec M ou Échap lors de l’attente d’une\naction. + "accessMenu": `Accédez au menu avec M ou Échap lors de l’attente d’une\naction. $Il contient les paramètres et diverses fonctionnalités`, - "menu": `Vous pouvez accéder aux paramètres depuis ce menu. + "menu": `Vous pouvez accéder aux paramètres depuis ce menu. $Vous pouvez entre autres y changer la vitesse du jeu ou le style de fenêtre. $Il y a également toute une variété d’autres fonctionnalités, $jetez-y un œil !`, - "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ. + "starterSelect": `Choisissez vos starters depuis cet écran.\nIls formeront votre équipe de départ. $Chacun possède une valeur. Votre équipe peut avoir jusqu’à\n6 membres, tant que vous ne dépassez pas un cout de 10. $Vous pouvez aussi choisir le sexe, le talent et la forme en\nfonction des variants déjà capturés ou éclos. $Les IVs d’un starter sont les meilleurs de tous ceux de son\nespèce déjà obtenus. Essayez donc d’en obtenir plusieurs !`, - "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour + "pokerus": `Chaque jour, 3 starters tirés aléatoirement ont un contour $violet. Si un starter que vous possédez l’a, essayez de $l’ajouter à votre équipe. Vérifiez bien son résumé !`, - "statChange": `Les changements de stats restent à travers les combats tant que le Pokémon n’est pas rappelé. + "statChange": `Les changements de stats restent à travers les combats tant que le Pokémon n’est pas rappelé. $Vos Pokémon sont rappelés avant un combat de Dresseur et avant d’entrer dans un nouveau biome. $Vous pouvez également voir en combat les changements de stats d’un Pokémon en maintenant C ou Maj.`, - "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un. + "selectItem": `Après chaque combat, vous avez le choix entre 3 objets\ntirés au sort. Vous ne pouvez en prendre qu’un. $Cela peut être des objets consommables, des objets à\nfaire tenir, ou des objets passifs aux effets permanents. $La plupart des effets des objets non-consommables se cumuleront de diverses manières. $Certains objets apparaîtront s’ils peuvent être utilisés, comme les objets d’évolution. @@ -38,7 +38,7 @@ export const tutorial: SimpleTranslationEntries = { $Vous pouvez acheter des consommables avec de l’argent.\nPlus vous progressez, plus le choix sera varié. $Choisir un des objets gratuits déclenchera le prochain combat, donc faites bien tous vos achats avant.`, - "eggGacha": `Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon. + "eggGacha": `Depuis cet écran, vous pouvez échanger vos coupons\ncontre des Œufs de Pokémon. $Les Œufs éclosent après avoir remporté un certain nombre\nde combats. Les plus rares mettent plus de temps. $Les Pokémon éclos ne rejoindront pas votre équipe,\nmais seront ajoutés à vos starters. $Les Pokémon issus d’Œufs ont généralement de\nmeilleurs IVs que les Pokémon sauvages. diff --git a/src/locales/fr/voucher.ts b/src/locales/fr/voucher.ts index a432cfed53f2..ba787ec05a7b 100644 --- a/src/locales/fr/voucher.ts +++ b/src/locales/fr/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Coupon Œuf Or", "locked": "Verrouillé", "defeatTrainer": "Vaincre {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/fr/weather.ts b/src/locales/fr/weather.ts index f00e7e08a038..0f7072210dc8 100644 --- a/src/locales/fr/weather.ts +++ b/src/locales/fr/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "Les rayons du soleil brillent !", - "sunnyLapseMessage": "Les rayons du soleil brillent fort !", - "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", - - "rainStartMessage": "Il commence à pleuvoir !", - "rainLapseMessage": "La pluie continue de tomber !", - "rainClearMessage": "La pluie s’est arrêtée !", - - "sandstormStartMessage": "Une tempête de sable se prépare !", - "sandstormLapseMessage": "La tempête de sable fait rage !", - "sandstormClearMessage": "La tempête de sable se calme !", - "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !", - - "hailStartMessage": "Il commence à grêler !", - "hailLapseMessage": "La grêle continue de tomber !", - "hailClearMessage": "La grêle s’est arrêtée !", - "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !", - - "snowStartMessage": "Il commence à neiger !", - "snowLapseMessage": "Il y a une tempête de neige !", - "snowClearMessage": "La neige s’est arrêtée !", - - "fogStartMessage": "Le brouillard devient épais…", - "fogLapseMessage": "Le brouillard continue !", - "fogClearMessage": "Le brouillard s’est dissipé !", - - "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", - "heavyRainLapseMessage": "La pluie battante continue.", - "heavyRainClearMessage": "La pluie battante s’est arrêtée…", + "sunnyStartMessage": "Les rayons du soleil brillent !", + "sunnyLapseMessage": "Les rayons du soleil brillent fort !", + "sunnyClearMessage": "Les rayons du soleil s’affaiblissent !", + + "rainStartMessage": "Il commence à pleuvoir !", + "rainLapseMessage": "La pluie continue de tomber !", + "rainClearMessage": "La pluie s’est arrêtée !", + + "sandstormStartMessage": "Une tempête de sable se prépare !", + "sandstormLapseMessage": "La tempête de sable fait rage !", + "sandstormClearMessage": "La tempête de sable se calme !", + "sandstormDamageMessage": "La tempête de sable inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !", + + "hailStartMessage": "Il commence à grêler !", + "hailLapseMessage": "La grêle continue de tomber !", + "hailClearMessage": "La grêle s’est arrêtée !", + "hailDamageMessage": "La grêle inflige des dégâts\nà {{pokemonPrefix}}{{pokemonName}} !", + + "snowStartMessage": "Il commence à neiger !", + "snowLapseMessage": "Il y a une tempête de neige !", + "snowClearMessage": "La neige s’est arrêtée !", + + "fogStartMessage": "Le brouillard devient épais…", + "fogLapseMessage": "Le brouillard continue !", + "fogClearMessage": "Le brouillard s’est dissipé !", + + "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", + "heavyRainLapseMessage": "La pluie battante continue.", + "heavyRainClearMessage": "La pluie battante s’est arrêtée…", - "harshSunStartMessage": "Les rayons du soleil s’intensifient !", - "harshSunLapseMessage": "Les rayons du soleil sont brulants !", - "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", - - "strongWindsStartMessage": "Un vent mystérieux se lève !", - "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", - "strongWindsClearMessage": "Le vent mystérieux s’est dissipé…" -} + "harshSunStartMessage": "Les rayons du soleil s’intensifient !", + "harshSunLapseMessage": "Les rayons du soleil sont brulants !", + "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", + + "strongWindsStartMessage": "Un vent mystérieux se lève !", + "strongWindsLapseMessage": "Le vent mystérieux souffle violemment !", + "strongWindsClearMessage": "Le vent mystérieux s’est dissipé…" +}; diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 3f7d09c92213..599235e61952 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!`, - 'badDreams': `{{pokemonName}} è tormentato!`, -} as const; \ No newline at end of file + "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", + "badDreams": "{{pokemonName}} è tormentato!", +} as const; diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts index 0272a568b461..e0e827ff27c2 100644 --- a/src/locales/it/ability.ts +++ b/src/locales/it/ability.ts @@ -711,7 +711,7 @@ export const ability: AbilityTranslationEntries = { }, megaLauncher: { name: "Megalancio", - description: 'Potenzia le mosse "pulsar", Forzasfera e Ondasana.', + description: "Potenzia le mosse \"pulsar\", Forzasfera e Ondasana.", }, grassPelt: { name: "Peloderba", diff --git a/src/locales/it/battle-message-ui-handler.ts b/src/locales/it/battle-message-ui-handler.ts index 917de48fd5eb..33aabb61fb16 100644 --- a/src/locales/it/battle-message-ui-handler.ts +++ b/src/locales/it/battle-message-ui-handler.ts @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "Normale", "ivDecent": "Sufficiente", "ivNoGood": "Mediocre", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index c9cf46554c02..4cd640132c48 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "Vai! {{pokemonName}}!", "trainerGo": "{{trainerName}} manda in campo {{pokemonName}}!", "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", - "trainerDefeated": `Hai sconfitto\n{{trainerName}}!`, + "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Non ha effetto su {{pokemonName}}!", "hitResultOneHitKO": "KO con un colpo!", "attackFailed": "Ma ha fallito!", - "attackHitsCount": `Colpito {{count}} volta/e!`, + "attackHitsCount": "Colpito {{count}} volta/e!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", @@ -46,11 +46,11 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "Non puoi sottrarti\nalla lotta con un'allenatore!", "noEscapePokemon": "{{moveName}} di {{pokemonName}}\npreviene la {{escapeVerb}}!", "runAwaySuccess": "Scampato pericolo!", - "runAwayCannotEscape": 'Non puoi fuggire!', + "runAwayCannotEscape": "Non puoi fuggire!", "escapeVerbSwitch": "cambiando", "escapeVerbFlee": "fuggendo", "notDisabled": "{{pokemonName}}'s {{moveName}} non è più\ndisabilitata!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", "eggHatching": "Oh!", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/berry.ts b/src/locales/it/berry.ts index 27a30438a597..4c36e209f648 100644 --- a/src/locales/it/berry.ts +++ b/src/locales/it/berry.ts @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "Baccamela", effect: "Ripristina 10 PP a una mossa se i suoi PP raggiungono lo 0", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/command-ui-handler.ts b/src/locales/it/command-ui-handler.ts index 54af8f766946..7c30532d46c0 100644 --- a/src/locales/it/command-ui-handler.ts +++ b/src/locales/it/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Lotta", - "ball": "Borsa", - "pokemon": "Pokémon", - "run": "Fuga", - "actionMessage": "Cosa deve fare {{pokemonName}}?", -} as const; \ No newline at end of file + "fight": "Lotta", + "ball": "Borsa", + "pokemon": "Pokémon", + "run": "Fuga", + "actionMessage": "Cosa deve fare {{pokemonName}}?", +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 807d136040cd..de5bfe32b8a6 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const itConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index 5634a2ae15b5..e486122280b8 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "Hai troppe Uova!", "pull": "Tiro", "pulls": "Tiri" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/fight-ui-handler.ts b/src/locales/it/fight-ui-handler.ts index e6dacf48f681..ee7712639974 100644 --- a/src/locales/it/fight-ui-handler.ts +++ b/src/locales/it/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Potenza", - "accuracy": "Precisione", -} as const; \ No newline at end of file + "pp": "PP", + "power": "Potenza", + "accuracy": "Precisione", +} as const; diff --git a/src/locales/it/growth.ts b/src/locales/it/growth.ts index f761b25a2297..96edcac4d93d 100644 --- a/src/locales/it/growth.ts +++ b/src/locales/it/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Irregolare", - "Fast": "Veloce", - "Medium_Fast": "Medio-Veloce", - "Medium_Slow": "Medio-Lenta", - "Slow": "Lenta", - "Fluctuating": "Fluttuante" -} as const; \ No newline at end of file + "Erratic": "Irregolare", + "Fast": "Veloce", + "Medium_Fast": "Medio-Veloce", + "Medium_Slow": "Medio-Lenta", + "Slow": "Lenta", + "Fluctuating": "Fluttuante" +} as const; diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index e0328fccdc1a..8fc1721c734b 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": 'Impostazioni', - "ACHIEVEMENTS": "Risultati", - "STATS": "Statistiche", - "VOUCHERS": "Biglietti", - "EGG_LIST": "Lista Uova", - "EGG_GACHA": "Gacha Uova", - "MANAGE_DATA": "Gestisci Dati", - "COMMUNITY": "Community", - "SAVE_AND_QUIT": "Salva ed Esci", - "LOG_OUT": "Disconnettiti", - "slot": "Slot {{slotNumber}}", - "importSession": "Importa Sessione", - "importSlotSelect": "Seleziona uno slot in cui importare.", - "exportSession": "Esporta Sessione", - "exportSlotSelect": "Seleziona uno slot da cui esportare.", - "importData": "Importa Dati", - "exportData": "Esporta Dati", - "cancel": "Annulla", - "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?" -} as const; \ No newline at end of file + "GAME_SETTINGS": "Impostazioni", + "ACHIEVEMENTS": "Risultati", + "STATS": "Statistiche", + "VOUCHERS": "Biglietti", + "EGG_LIST": "Lista Uova", + "EGG_GACHA": "Gacha Uova", + "MANAGE_DATA": "Gestisci Dati", + "COMMUNITY": "Community", + "SAVE_AND_QUIT": "Salva ed Esci", + "LOG_OUT": "Disconnettiti", + "slot": "Slot {{slotNumber}}", + "importSession": "Importa Sessione", + "importSlotSelect": "Seleziona uno slot in cui importare.", + "exportSession": "Esporta Sessione", + "exportSlotSelect": "Seleziona uno slot da cui esportare.", + "importData": "Importa Dati", + "exportData": "Esporta Dati", + "cancel": "Annulla", + "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?" +} as const; diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index e86a6be25edc..cfe2a41cf231 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "Annulla", - "continue": "Continua", - "newGame": "Nuova Partita", - "loadGame": "Carica Partita", - "dailyRun": "Corsa Giornaliera (Beta)", - "selectGameMode": "Seleziona una modalità di gioco.", - "logInOrCreateAccount": "Accedi o crea un nuovo account per iniziare. Non è richiesta un'email!", - "username": "Nome Utente", - "password": "Password", - "login": "Accedi", - "register": "Registrati", - "emptyUsername": "Nome utente mancante!", - "invalidLoginUsername": "Nome utente non valido!", - "invalidRegisterUsername": "Il nome utente può contenere solo lettere, numeri o trattini bassi", - "invalidLoginPassword": "Password non valida!", - "invalidRegisterPassword": "La password deve contenere almeno 6 caratteri", - "usernameAlreadyUsed": "Il nome utente inserito è stato già utilizzato!", - "accountNonExistent": "Account inesistente!", - "unmatchingPassword": "La password inserita non è corretta!", - "passwordNotMatchingConfirmPassword": "La password deve essere uguale alla conferma password!", - "confirmPassword": "Conferma Password", - "registrationAgeWarning": "Registrandoti confermi di avere 13 anni o più.", - "backToLogin": "Torna all'accesso", - "failedToLoadSaveData": "Impossibile caricare i dati di salvataggio. Ricarica la pagina.\nSe il problema persiste, contatta l'amministratore.", - "sessionSuccess": "Sessione caricata correttamente.", - "failedToLoadSession": "Impossibile caricare i dati della sessione.\nPotrebbero essere danneggiati.", - "boyOrGirl": "Sei un ragazzo o una ragazza?", - "boy": "Ragazzo", - "girl": "Ragazza", - "dailyRankings": "Classifica Giornaliera", - "weeklyRankings": "Classifica Settimanale", - "noRankings": "Nessuna Classifica", - "loading": "Caricamento…", - "playersOnline": "Giocatori Online", - "evolving": "Cosa?\n{{pokemonName}} si evolvendo!", - "stoppedEvolving": "{{pokemonName}} ha smesso di evolversi.", - "pauseEvolutionsQuestion": "Vuoi sospendere le evoluzioni per {{pokemonName}}?\nLe evoluzioni possono essere riattivate dalla schermata del party.", - "evolutionsPaused": "Le evoluzioni sono state sospese per {{pokemonName}}.", - "evolutionDone": "Congratulazioni!\n{{pokemonName}} si è evoluto in {{evolvedPokemonName}}!", - "empty":"Vuoto", - "yes":"Si", - "no":"No", -} as const; \ No newline at end of file + "cancel": "Annulla", + "continue": "Continua", + "newGame": "Nuova Partita", + "loadGame": "Carica Partita", + "dailyRun": "Corsa Giornaliera (Beta)", + "selectGameMode": "Seleziona una modalità di gioco.", + "logInOrCreateAccount": "Accedi o crea un nuovo account per iniziare. Non è richiesta un'email!", + "username": "Nome Utente", + "password": "Password", + "login": "Accedi", + "register": "Registrati", + "emptyUsername": "Nome utente mancante!", + "invalidLoginUsername": "Nome utente non valido!", + "invalidRegisterUsername": "Il nome utente può contenere solo lettere, numeri o trattini bassi", + "invalidLoginPassword": "Password non valida!", + "invalidRegisterPassword": "La password deve contenere almeno 6 caratteri", + "usernameAlreadyUsed": "Il nome utente inserito è stato già utilizzato!", + "accountNonExistent": "Account inesistente!", + "unmatchingPassword": "La password inserita non è corretta!", + "passwordNotMatchingConfirmPassword": "La password deve essere uguale alla conferma password!", + "confirmPassword": "Conferma Password", + "registrationAgeWarning": "Registrandoti confermi di avere 13 anni o più.", + "backToLogin": "Torna all'accesso", + "failedToLoadSaveData": "Impossibile caricare i dati di salvataggio. Ricarica la pagina.\nSe il problema persiste, contatta l'amministratore.", + "sessionSuccess": "Sessione caricata correttamente.", + "failedToLoadSession": "Impossibile caricare i dati della sessione.\nPotrebbero essere danneggiati.", + "boyOrGirl": "Sei un ragazzo o una ragazza?", + "boy": "Ragazzo", + "girl": "Ragazza", + "dailyRankings": "Classifica Giornaliera", + "weeklyRankings": "Classifica Settimanale", + "noRankings": "Nessuna Classifica", + "loading": "Caricamento…", + "playersOnline": "Giocatori Online", + "evolving": "Cosa?\n{{pokemonName}} si evolvendo!", + "stoppedEvolving": "{{pokemonName}} ha smesso di evolversi.", + "pauseEvolutionsQuestion": "Vuoi sospendere le evoluzioni per {{pokemonName}}?\nLe evoluzioni possono essere riattivate dalla schermata del party.", + "evolutionsPaused": "Le evoluzioni sono state sospese per {{pokemonName}}.", + "evolutionDone": "Congratulazioni!\n{{pokemonName}} si è evoluto in {{evolvedPokemonName}}!", + "empty":"Vuoto", + "yes":"Si", + "no":"No", +} as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 93543e633d46..5f61582259f6 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -384,4 +384,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "Gelomodulo", "DOUSE_DRIVE": "Idromodulo", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/move.ts b/src/locales/it/move.ts index 85babbfd36bb..f13e8fded5c8 100644 --- a/src/locales/it/move.ts +++ b/src/locales/it/move.ts @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "Intossicatena", effect: "Il Pokémon logora il bersaglio avvolgendolo con le sue catene fatte di veleno e iniettandogli delle tossine che possono anche iperavvelenarlo.", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/nature.ts b/src/locales/it/nature.ts index 2ca86745112d..cf620e1a105f 100644 --- a/src/locales/it/nature.ts +++ b/src/locales/it/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Vivace", "Careful": "Cauta", "Quirky": "Furba" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/pokeball.ts b/src/locales/it/pokeball.ts index 4b4c2be4d2d1..a07e4c2ca7d3 100644 --- a/src/locales/it/pokeball.ts +++ b/src/locales/it/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Ball", - "greatBall": "Mega Ball", - "ultraBall": "Ultra Ball", - "rogueBall": "Rogue Ball", - "masterBall": "Master Ball", - "luxuryBall": "Chich Ball", -} as const; \ No newline at end of file + "pokeBall": "Poké Ball", + "greatBall": "Mega Ball", + "ultraBall": "Ultra Ball", + "rogueBall": "Rogue Ball", + "masterBall": "Master Ball", + "luxuryBall": "Chich Ball", +} as const; diff --git a/src/locales/it/pokemon-info.ts b/src/locales/it/pokemon-info.ts index 617b2157da2d..6da12e30720e 100644 --- a/src/locales/it/pokemon-info.ts +++ b/src/locales/it/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "PS Max", - "HPshortened": "PS", - "ATK": "Attacco", - "ATKshortened": "Att", - "DEF": "Difesa", - "DEFshortened": "Dif", - "SPATK": "Att. Sp.", - "SPATKshortened": "AttSp", - "SPDEF": "Dif. Sp.", - "SPDEFshortened": "DifSp", - "SPD": "Velocità", - "SPDshortened": "Vel" - }, + Stat: { + "HP": "PS Max", + "HPshortened": "PS", + "ATK": "Attacco", + "ATKshortened": "Att", + "DEF": "Difesa", + "DEFshortened": "Dif", + "SPATK": "Att. Sp.", + "SPATKshortened": "AttSp", + "SPDEF": "Dif. Sp.", + "SPDEFshortened": "DifSp", + "SPD": "Velocità", + "SPDshortened": "Vel" + }, - Type: { - "UNKNOWN": "Sconosciuto", - "NORMAL": "Normale", - "FIGHTING": "Lotta", - "FLYING": "Volante", - "POISON": "Veleno", - "GROUND": "Terra", - "ROCK": "Roccia", - "BUG": "Coleottero", - "GHOST": "Spettro", - "STEEL": "Acciaio", - "FIRE": "Fuoco", - "WATER": "Acqua", - "GRASS": "Erba", - "ELECTRIC": "Elettro", - "PSYCHIC": "Psico", - "ICE": "Ghiaccio", - "DRAGON": "Drago", - "DARK": "Buio", - "FAIRY": "Folletto", - "STELLAR": "Astrale", - }, + Type: { + "UNKNOWN": "Sconosciuto", + "NORMAL": "Normale", + "FIGHTING": "Lotta", + "FLYING": "Volante", + "POISON": "Veleno", + "GROUND": "Terra", + "ROCK": "Roccia", + "BUG": "Coleottero", + "GHOST": "Spettro", + "STEEL": "Acciaio", + "FIRE": "Fuoco", + "WATER": "Acqua", + "GRASS": "Erba", + "ELECTRIC": "Elettro", + "PSYCHIC": "Psico", + "ICE": "Ghiaccio", + "DRAGON": "Drago", + "DARK": "Buio", + "FAIRY": "Folletto", + "STELLAR": "Astrale", + }, } as const; diff --git a/src/locales/it/pokemon.ts b/src/locales/it/pokemon.ts index ddc2b2c91373..400a34e6e8b9 100644 --- a/src/locales/it/pokemon.ts +++ b/src/locales/it/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbasaur", - "ivysaur": "Ivysaur", - "venusaur": "Venusaur", - "charmander": "Charmander", - "charmeleon": "Charmeleon", - "charizard": "Charizard", - "squirtle": "Squirtle", - "wartortle": "Wartortle", - "blastoise": "Blastoise", - "caterpie": "Caterpie", - "metapod": "Metapod", - "butterfree": "Butterfree", - "weedle": "Weedle", - "kakuna": "Kakuna", - "beedrill": "Beedrill", - "pidgey": "Pidgey", - "pidgeotto": "Pidgeotto", - "pidgeot": "Pidgeot", - "rattata": "Rattata", - "raticate": "Raticate", - "spearow": "Spearow", - "fearow": "Fearow", - "ekans": "Ekans", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandshrew", - "sandslash": "Sandslash", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Clefairy", - "clefable": "Clefable", - "vulpix": "Vulpix", - "ninetales": "Ninetales", - "jigglypuff": "Jigglypuff", - "wigglytuff": "Wigglytuff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Oddish", - "gloom": "Gloom", - "vileplume": "Vileplume", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Venonat", - "venomoth": "Venomoth", - "diglett": "Diglett", - "dugtrio": "Dugtrio", - "meowth": "Meowth", - "persian": "Persian", - "psyduck": "Psyduck", - "golduck": "Golduck", - "mankey": "Mankey", - "primeape": "Primeape", - "growlithe": "Growlithe", - "arcanine": "Arcanine", - "poliwag": "Poliwag", - "poliwhirl": "Poliwhirl", - "poliwrath": "Poliwrath", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machop", - "machoke": "Machoke", - "machamp": "Machamp", - "bellsprout": "Bellsprout", - "weepinbell": "Weepinbell", - "victreebel": "Victreebel", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Geodude", - "graveler": "Graveler", - "golem": "Golem", - "ponyta": "Ponyta", - "rapidash": "Rapidash", - "slowpoke": "Slowpoke", - "slowbro": "Slowbro", - "magnemite": "Magnemite", - "magneton": "Magneton", - "farfetchd": "Farfetch'd", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Seel", - "dewgong": "Dewgong", - "grimer": "Grimer", - "muk": "Muk", - "shellder": "Shellder", - "cloyster": "Cloyster", - "gastly": "Gastly", - "haunter": "Haunter", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Drowzee", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltorb", - "electrode": "Electrode", - "exeggcute": "Exeggcute", - "exeggutor": "Exeggutor", - "cubone": "Cubone", - "marowak": "Marowak", - "hitmonlee": "Hitmonlee", - "hitmonchan": "Hitmonchan", - "lickitung": "Lickitung", - "koffing": "Koffing", - "weezing": "Weezing", - "rhyhorn": "Rhyhorn", - "rhydon": "Rhydon", - "chansey": "Chansey", - "tangela": "Tangela", - "kangaskhan": "Kangaskhan", - "horsea": "Horsea", - "seadra": "Seadra", - "goldeen": "Goldeen", - "seaking": "Seaking", - "staryu": "Staryu", - "starmie": "Starmie", - "mr_mime": "Mr. Mime", - "scyther": "Scyther", - "jynx": "Jynx", - "electabuzz": "Electabuzz", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Magikarp", - "gyarados": "Gyarados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Eevee", - "vaporeon": "Vaporeon", - "jolteon": "Jolteon", - "flareon": "Flareon", - "porygon": "Porygon", - "omanyte": "Omanyte", - "omastar": "Omastar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Snorlax", - "articuno": "Articuno", - "zapdos": "Zapdos", - "moltres": "Moltres", - "dratini": "Dratini", - "dragonair": "Dragonair", - "dragonite": "Dragonite", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Chikorita", - "bayleef": "Bayleef", - "meganium": "Meganium", - "cyndaquil": "Cyndaquil", - "quilava": "Quilava", - "typhlosion": "Typhlosion", - "totodile": "Totodile", - "croconaw": "Croconaw", - "feraligatr": "Feraligatr", - "sentret": "Sentret", - "furret": "Furret", - "hoothoot": "Hoothoot", - "noctowl": "Noctowl", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Spinarak", - "ariados": "Ariados", - "crobat": "Crobat", - "chinchou": "Chinchou", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Cleffa", - "igglybuff": "Igglybuff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Mareep", - "flaaffy": "Flaaffy", - "ampharos": "Ampharos", - "bellossom": "Bellossom", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Sudowoodo", - "politoed": "Politoed", - "hoppip": "Hoppip", - "skiploom": "Skiploom", - "jumpluff": "Jumpluff", - "aipom": "Aipom", - "sunkern": "Sunkern", - "sunflora": "Sunflora", - "yanma": "Yanma", - "wooper": "Wooper", - "quagsire": "Quagsire", - "espeon": "Espeon", - "umbreon": "Umbreon", - "murkrow": "Murkrow", - "slowking": "Slowking", - "misdreavus": "Misdreavus", - "unown": "Unown", - "wobbuffet": "Wobbuffet", - "girafarig": "Girafarig", - "pineco": "Pineco", - "forretress": "Forretress", - "dunsparce": "Dunsparce", - "gligar": "Gligar", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Scizor", - "shuckle": "Shuckle", - "heracross": "Heracross", - "sneasel": "Sneasel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Slugma", - "magcargo": "Magcargo", - "swinub": "Swinub", - "piloswine": "Piloswine", - "corsola": "Corsola", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Delibird", - "mantine": "Mantine", - "skarmory": "Skarmory", - "houndour": "Houndour", - "houndoom": "Houndoom", - "kingdra": "Kingdra", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Stantler", - "smeargle": "Smeargle", - "tyrogue": "Tyrogue", - "hitmontop": "Hitmontop", - "smoochum": "Smoochum", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Blissey", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Tyranitar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Treecko", - "grovyle": "Grovyle", - "sceptile": "Sceptile", - "torchic": "Torchic", - "combusken": "Combusken", - "blaziken": "Blaziken", - "mudkip": "Mudkip", - "marshtomp": "Marshtomp", - "swampert": "Swampert", - "poochyena": "Poochyena", - "mightyena": "Mightyena", - "zigzagoon": "Zigzagoon", - "linoone": "Linoone", - "wurmple": "Wurmple", - "silcoon": "Silcoon", - "beautifly": "Beautifly", - "cascoon": "Cascoon", - "dustox": "Dustox", - "lotad": "Lotad", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Seedot", - "nuzleaf": "Nuzleaf", - "shiftry": "Shiftry", - "taillow": "Taillow", - "swellow": "Swellow", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Ralts", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Surskit", - "masquerain": "Masquerain", - "shroomish": "Shroomish", - "breloom": "Breloom", - "slakoth": "Slakoth", - "vigoroth": "Vigoroth", - "slaking": "Slaking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Shedinja", - "whismur": "Whismur", - "loudred": "Loudred", - "exploud": "Exploud", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nosepass", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Sableye", - "mawile": "Mawile", - "aron": "Aron", - "lairon": "Lairon", - "aggron": "Aggron", - "meditite": "Meditite", - "medicham": "Medicham", - "electrike": "Electrike", - "manectric": "Manectric", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Gulpin", - "swalot": "Swalot", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Numel", - "camerupt": "Camerupt", - "torkoal": "Torkoal", - "spoink": "Spoink", - "grumpig": "Grumpig", - "spinda": "Spinda", - "trapinch": "Trapinch", - "vibrava": "Vibrava", - "flygon": "Flygon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Swablu", - "altaria": "Altaria", - "zangoose": "Zangoose", - "seviper": "Seviper", - "lunatone": "Lunatone", - "solrock": "Solrock", - "barboach": "Barboach", - "whiscash": "Whiscash", - "corphish": "Corphish", - "crawdaunt": "Crawdaunt", - "baltoy": "Baltoy", - "claydol": "Claydol", - "lileep": "Lileep", - "cradily": "Cradily", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Feebas", - "milotic": "Milotic", - "castform": "Castform", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Duskull", - "dusclops": "Dusclops", - "tropius": "Tropius", - "chimecho": "Chimecho", - "absol": "Absol", - "wynaut": "Wynaut", - "snorunt": "Snorunt", - "glalie": "Glalie", - "spheal": "Spheal", - "sealeo": "Sealeo", - "walrein": "Walrein", - "clamperl": "Clamperl", - "huntail": "Huntail", - "gorebyss": "Gorebyss", - "relicanth": "Relicanth", - "luvdisc": "Luvdisc", - "bagon": "Bagon", - "shelgon": "Shelgon", - "salamence": "Salamence", - "beldum": "Beldum", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Budew", - "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", - "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", - "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", - "skuntank": "Skuntank", - "bronzor": "Bronzor", - "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", - "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", - "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", - "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", - "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", - "elgyem": "Elgyem", - "beheeyem": "Beheeyem", - "litwick": "Litwick", - "lampent": "Lampent", - "chandelure": "Chandelure", - "axew": "Axew", - "fraxure": "Fraxure", - "haxorus": "Haxorus", - "cubchoo": "Cubchoo", - "beartic": "Beartic", - "cryogonal": "Cryogonal", - "shelmet": "Shelmet", - "accelgor": "Accelgor", - "stunfisk": "Stunfisk", - "mienfoo": "Mienfoo", - "mienshao": "Mienshao", - "druddigon": "Druddigon", - "golett": "Golett", - "golurk": "Golurk", - "pawniard": "Pawniard", - "bisharp": "Bisharp", - "bouffalant": "Bouffalant", - "rufflet": "Rufflet", - "braviary": "Braviary", - "vullaby": "Vullaby", - "mandibuzz": "Mandibuzz", - "heatmor": "Heatmor", - "durant": "Durant", - "deino": "Deino", - "zweilous": "Zweilous", - "hydreigon": "Hydreigon", - "larvesta": "Larvesta", - "volcarona": "Volcarona", - "cobalion": "Cobalion", - "terrakion": "Terrakion", - "virizion": "Virizion", - "tornadus": "Tornadus", - "thundurus": "Thundurus", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Landorus", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Chespin", - "quilladin": "Quilladin", - "chesnaught": "Chesnaught", - "fennekin": "Fennekin", - "braixen": "Braixen", - "delphox": "Delphox", - "froakie": "Froakie", - "frogadier": "Frogadier", - "greninja": "Greninja", - "bunnelby": "Bunnelby", - "diggersby": "Diggersby", - "fletchling": "Fletchling", - "fletchinder": "Fletchinder", - "talonflame": "Talonflame", - "scatterbug": "Scatterbug", - "spewpa": "Spewpa", - "vivillon": "Vivillon", - "litleo": "Litleo", - "pyroar": "Pyroar", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Skiddo", - "gogoat": "Gogoat", - "pancham": "Pancham", - "pangoro": "Pangoro", - "furfrou": "Furfrou", - "espurr": "Espurr", - "meowstic": "Meowstic", - "honedge": "Honedge", - "doublade": "Doublade", - "aegislash": "Aegislash", - "spritzee": "Spritzee", - "aromatisse": "Aromatisse", - "swirlix": "Swirlix", - "slurpuff": "Slurpuff", - "inkay": "Inkay", - "malamar": "Malamar", - "binacle": "Binacle", - "barbaracle": "Barbaracle", - "skrelp": "Skrelp", - "dragalge": "Dragalge", - "clauncher": "Clauncher", - "clawitzer": "Clawitzer", - "helioptile": "Helioptile", - "heliolisk": "Heliolisk", - "tyrunt": "Tyrunt", - "tyrantrum": "Tyrantrum", - "amaura": "Amaura", - "aurorus": "Aurorus", - "sylveon": "Sylveon", - "hawlucha": "Hawlucha", - "dedenne": "Dedenne", - "carbink": "Carbink", - "goomy": "Goomy", - "sliggoo": "Sliggoo", - "goodra": "Goodra", - "klefki": "Klefki", - "phantump": "Phantump", - "trevenant": "Trevenant", - "pumpkaboo": "Pumpkaboo", - "gourgeist": "Gourgeist", - "bergmite": "Bergmite", - "avalugg": "Avalugg", - "noibat": "Noibat", - "noivern": "Noivern", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Rowlet", - "dartrix": "Dartrix", - "decidueye": "Decidueye", - "litten": "Litten", - "torracat": "Torracat", - "incineroar": "Incineroar", - "popplio": "Popplio", - "brionne": "Brionne", - "primarina": "Primarina", - "pikipek": "Pikipek", - "trumbeak": "Trumbeak", - "toucannon": "Toucannon", - "yungoos": "Yungoos", - "gumshoos": "Gumshoos", - "grubbin": "Grubbin", - "charjabug": "Charjabug", - "vikavolt": "Vikavolt", - "crabrawler": "Crabrawler", - "crabominable": "Crabominable", - "oricorio": "Oricorio", - "cutiefly": "Cutiefly", - "ribombee": "Ribombee", - "rockruff": "Rockruff", - "lycanroc": "Lycanroc", - "wishiwashi": "Wishiwashi", - "mareanie": "Mareanie", - "toxapex": "Toxapex", - "mudbray": "Mudbray", - "mudsdale": "Mudsdale", - "dewpider": "Dewpider", - "araquanid": "Araquanid", - "fomantis": "Fomantis", - "lurantis": "Lurantis", - "morelull": "Morelull", - "shiinotic": "Shiinotic", - "salandit": "Salandit", - "salazzle": "Salazzle", - "stufful": "Stufful", - "bewear": "Bewear", - "bounsweet": "Bounsweet", - "steenee": "Steenee", - "tsareena": "Tsareena", - "comfey": "Comfey", - "oranguru": "Oranguru", - "passimian": "Passimian", - "wimpod": "Wimpod", - "golisopod": "Golisopod", - "sandygast": "Sandygast", - "palossand": "Palossand", - "pyukumuku": "Pyukumuku", - "type_null": "Tipo Zero", - "silvally": "Silvally", - "minior": "Minior", - "komala": "Komala", - "turtonator": "Turtonator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimikyu", - "bruxish": "Bruxish", - "drampa": "Drampa", - "dhelmise": "Dhelmise", - "jangmo_o": "Jangmo-o", - "hakamo_o": "Hakamo-o", - "kommo_o": "Kommo-o", - "tapu_koko": "Tapu Koko", - "tapu_lele": "Tapu Lele", - "tapu_bulu": "Tapu Bulu", - "tapu_fini": "Tapu Fini", - "cosmog": "Cosmog", - "cosmoem": "Cosmoem", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Nihilego", - "buzzwole": "Buzzwole", - "pheromosa": "Pheromosa", - "xurkitree": "Xurkitree", - "celesteela": "Celesteela", - "kartana": "Kartana", - "guzzlord": "Guzzlord", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Poipole", - "naganadel": "Naganadel", - "stakataka": "Stakataka", - "blacephalon": "Blacephalon", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Grookey", - "thwackey": "Thwackey", - "rillaboom": "Rillaboom", - "scorbunny": "Scorbunny", - "raboot": "Raboot", - "cinderace": "Cinderace", - "sobble": "Sobble", - "drizzile": "Drizzile", - "inteleon": "Inteleon", - "skwovet": "Skwovet", - "greedent": "Greedent", - "rookidee": "Rookidee", - "corvisquire": "Corvisquire", - "corviknight": "Corviknight", - "blipbug": "Blipbug", - "dottler": "Dottler", - "orbeetle": "Orbeetle", - "nickit": "Nickit", - "thievul": "Thievul", - "gossifleur": "Gossifleur", - "eldegoss": "Eldegoss", - "wooloo": "Wooloo", - "dubwool": "Dubwool", - "chewtle": "Chewtle", - "drednaw": "Drednaw", - "yamper": "Yamper", - "boltund": "Boltund", - "rolycoly": "Rolycoly", - "carkol": "Carkol", - "coalossal": "Coalossal", - "applin": "Applin", - "flapple": "Flapple", - "appletun": "Appletun", - "silicobra": "Silicobra", - "sandaconda": "Sandaconda", - "cramorant": "Cramorant", - "arrokuda": "Arrokuda", - "barraskewda": "Barraskewda", - "toxel": "Toxel", - "toxtricity": "Toxtricity", - "sizzlipede": "Sizzlipede", - "centiskorch": "Centiskorch", - "clobbopus": "Clobbopus", - "grapploct": "Grapploct", - "sinistea": "Sinistea", - "polteageist": "Polteageist", - "hatenna": "Hatenna", - "hattrem": "Hattrem", - "hatterene": "Hatterene", - "impidimp": "Impidimp", - "morgrem": "Morgrem", - "grimmsnarl": "Grimmsnarl", - "obstagoon": "Obstagoon", - "perrserker": "Perrserker", - "cursola": "Cursola", - "sirfetchd": "Sirfetch'd", - "mr_rime": "Mr. Rime", - "runerigus": "Runerigus", - "milcery": "Milcery", - "alcremie": "Alcremie", - "falinks": "Falinks", - "pincurchin": "Pincurchin", - "snom": "Snom", - "frosmoth": "Frosmoth", - "stonjourner": "Stonjourner", - "eiscue": "Eiscue", - "indeedee": "Indeedee", - "morpeko": "Morpeko", - "cufant": "Cufant", - "copperajah": "Copperajah", - "dracozolt": "Dracozolt", - "arctozolt": "Arctozolt", - "dracovish": "Dracovish", - "arctovish": "Arctovish", - "duraludon": "Duraludon", - "dreepy": "Dreepy", - "drakloak": "Drakloak", - "dragapult": "Dragapult", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Eternatus", - "kubfu": "Kubfu", - "urshifu": "Urshifu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Glastrier", - "spectrier": "Spectrier", - "calyrex": "Calyrex", - "wyrdeer": "Wyrdeer", - "kleavor": "Kleavor", - "ursaluna": "Ursaluna", - "basculegion": "Basculegion", - "sneasler": "Sneasler", - "overqwil": "Overqwil", - "enamorus": "Enamorus", - "sprigatito": "Sprigatito", - "floragato": "Floragato", - "meowscarada": "Meowscarada", - "fuecoco": "Fuecoco", - "crocalor": "Crocalor", - "skeledirge": "Skeledirge", - "quaxly": "Quaxly", - "quaxwell": "Quaxwell", - "quaquaval": "Quaquaval", - "lechonk": "Lechonk", - "oinkologne": "Oinkologne", - "tarountula": "Tarountula", - "spidops": "Spidops", - "nymble": "Nymble", - "lokix": "Lokix", - "pawmi": "Pawmi", - "pawmo": "Pawmo", - "pawmot": "Pawmot", - "tandemaus": "Tandemaus", - "maushold": "Maushold", - "fidough": "Fidough", - "dachsbun": "Dachsbun", - "smoliv": "Smoliv", - "dolliv": "Dolliv", - "arboliva": "Arboliva", - "squawkabilly": "Squawkabilly", - "nacli": "Nacli", - "naclstack": "Naclstack", - "garganacl": "Garganacl", - "charcadet": "Charcadet", - "armarouge": "Armarouge", - "ceruledge": "Ceruledge", - "tadbulb": "Tadbulb", - "bellibolt": "Bellibolt", - "wattrel": "Wattrel", - "kilowattrel": "Kilowattrel", - "maschiff": "Maschiff", - "mabosstiff": "Mabosstiff", - "shroodle": "Shroodle", - "grafaiai": "Grafaiai", - "bramblin": "Bramblin", - "brambleghast": "Brambleghast", - "toedscool": "Toedscool", - "toedscruel": "Toedscruel", - "klawf": "Klawf", - "capsakid": "Capsakid", - "scovillain": "Scovillain", - "rellor": "Rellor", - "rabsca": "Rabsca", - "flittle": "Flittle", - "espathra": "Espathra", - "tinkatink": "Tinkatink", - "tinkatuff": "Tinkatuff", - "tinkaton": "Tinkaton", - "wiglett": "Wiglett", - "wugtrio": "Wugtrio", - "bombirdier": "Bombirdier", - "finizen": "Finizen", - "palafin": "Palafin", - "varoom": "Varoom", - "revavroom": "Revavroom", - "cyclizar": "Cyclizar", - "orthworm": "Orthworm", - "glimmet": "Glimmet", - "glimmora": "Glimmora", - "greavard": "Greavard", - "houndstone": "Houndstone", - "flamigo": "Flamigo", - "cetoddle": "Cetoddle", - "cetitan": "Cetitan", - "veluza": "Veluza", - "dondozo": "Dondozo", - "tatsugiri": "Tatsugiri", - "annihilape": "Annihilape", - "clodsire": "Clodsire", - "farigiraf": "Farigiraf", - "dudunsparce": "Dudunsparce", - "kingambit": "Kingambit", - "great_tusk": "Grandizanne", - "scream_tail": "Codaurlante", - "brute_bonnet": "Fungofurioso", - "flutter_mane": "Crinealato", - "slither_wing": "Alirasenti", - "sandy_shocks": "Peldisabbia", - "iron_treads": "Solcoferreo", - "iron_bundle": "Saccoferreo", - "iron_hands": "Manoferrea", - "iron_jugulis": "Colloferreo", - "iron_moth": "Falenaferrea", - "iron_thorns": "Spineferree", - "frigibax": "Frigibax", - "arctibax": "Arctibax", - "baxcalibur": "Baxcalibur", - "gimmighoul": "Gimmighoul", - "gholdengo": "Gholdengo", - "wo_chien": "Wo-Chien", - "chien_pao": "Chien-Pao", - "ting_lu": "Ting-Lu", - "chi_yu": "Chi-Yu", - "roaring_moon": "Lunaruggente", - "iron_valiant": "Eroeferreo", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Acquecrespe", - "iron_leaves": "Fogliaferrea", - "dipplin": "Dipplin", - "poltchageist": "Poltchageist", - "sinistcha": "Sinistcha", - "okidogi": "Okidogi", - "munkidori": "Munkidori", - "fezandipiti": "Fezandipiti", - "ogerpon": "Ogerpon", - "archaludon": "Archaludon", - "hydrapple": "Hydrapple", - "gouging_fire": "Vampeaguzze", - "raging_bolt": "Furiatonante", - "iron_boulder": "Massoferreo", - "iron_crown": "Capoferreo", - "terapagos": "Terapagos", - "pecharunt": "Pecharunt", - "alola_rattata": "Rattata", - "alola_raticate": "Raticate", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandshrew", - "alola_sandslash": "Sandslash", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Ninetales", - "alola_diglett": "Diglett", - "alola_dugtrio": "Dugtrio", - "alola_meowth": "Meowth", - "alola_persian": "Persian", - "alola_geodude": "Geodude", - "alola_graveler": "Graveler", - "alola_golem": "Golem", - "alola_grimer": "Grimer", - "alola_muk": "Muk", - "alola_exeggutor": "Exeggutor", - "alola_marowak": "Marowak", - "eternal_floette": "Floette", - "galar_meowth": "Meowth", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Rapidash", - "galar_slowpoke": "Slowpoke", - "galar_slowbro": "Slowbro", - "galar_farfetchd": "Farfetch'd", - "galar_weezing": "Weezing", - "galar_mr_mime": "Mr. Mime", - "galar_articuno": "Articuno", - "galar_zapdos": "Zapdos", - "galar_moltres": "Moltres", - "galar_slowking": "Slowking", - "galar_corsola": "Corsola", - "galar_zigzagoon": "Zigzagoon", - "galar_linoone": "Linoone", - "galar_darumaka": "Darumaka", - "galar_darmanitan": "Darmanitan", - "galar_yamask": "Yamask", - "galar_stunfisk": "Stunfisk", - "hisui_growlithe": "Growlithe", - "hisui_arcanine": "Arcanine", - "hisui_voltorb": "Voltorb", - "hisui_electrode": "Electrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Sneasel", - "hisui_samurott": "Samurott", - "hisui_lilligant": "Lilligant", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Braviary", - "hisui_sliggoo": "Sliggoo", - "hisui_goodra": "Goodra", - "hisui_avalugg": "Avalugg", - "hisui_decidueye": "Decidueye", - "paldea_tauros": "Tauros", - "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Tipo Zero", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Grandizanne", + "scream_tail": "Codaurlante", + "brute_bonnet": "Fungofurioso", + "flutter_mane": "Crinealato", + "slither_wing": "Alirasenti", + "sandy_shocks": "Peldisabbia", + "iron_treads": "Solcoferreo", + "iron_bundle": "Saccoferreo", + "iron_hands": "Manoferrea", + "iron_jugulis": "Colloferreo", + "iron_moth": "Falenaferrea", + "iron_thorns": "Spineferree", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Lunaruggente", + "iron_valiant": "Eroeferreo", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Acquecrespe", + "iron_leaves": "Fogliaferrea", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Vampeaguzze", + "raging_bolt": "Furiatonante", + "iron_boulder": "Massoferreo", + "iron_crown": "Capoferreo", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna", } as const; diff --git a/src/locales/it/splash-messages.ts b/src/locales/it/splash-messages.ts index 3bddc68f0b59..5fc1f7ed7b99 100644 --- a/src/locales/it/splash-messages.ts +++ b/src/locales/it/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Battaglie Vinte!", - "joinTheDiscord": "Entra nel Discord!", - "infiniteLevels": "Livelli Infiniti!", - "everythingStacks": "Tutto si impila!", - "optionalSaveScumming": "Salvataggio Facoltativo!", - "biomes": "35 Biomi!", - "openSource": "Open Source!", - "playWithSpeed": "Gioca con il 5x di Velocità!", - "liveBugTesting": "Test dei Bug in Tempo Reale!", - "heavyInfluence": "Influenzato da RoR2!", - "pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!", - "nowWithMoreSalt": "Adesso con il 33% di sale in più!", - "infiniteFusionAtHome": "Fusioni Infinite a Casa!", - "brokenEggMoves": "Mosse delle Uova Rotte!", - "magnificent": "Magnifico!", - "mubstitute": "Mubstitute!", - "thatsCrazy": "È Pazzesco!", - "oranceJuice": "Succo d\'Arancia!", - "questionableBalancing": "Bilanciamento Discutibile!", - "coolShaders": "Shader fantastici!", - "aiFree": "Senza Intelligenza Artificiale!", - "suddenDifficultySpikes": "Picchi di Difficoltà Improvvisi!", - "basedOnAnUnfinishedFlashGame": "Basato su un Gioco Flash Incompiuto!", - "moreAddictiveThanIntended": "Crea Dipendeza più del Dovuto!", - "mostlyConsistentSeeds": "Seeds Consistenti!", - "achievementPointsDontDoAnything": "I Punti Obiettivo non Fanno Nulla!", - "youDoNotStartAtLevel": "Non Cominci dal Livello 2000!", - "dontTalkAboutTheManaphyEggIncident": "Non Parlare dell'Incidente dell'Uovo di Manaphy!", - "alsoTryPokengine": "Prova anche Pokéngine!", - "alsoTryEmeraldRogue": "Prova anche Emerald Rogue!", - "alsoTryRadicalRed": "Prova anche Radical Red!", - "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", -} as const; \ No newline at end of file + "battlesWon": "Battaglie Vinte!", + "joinTheDiscord": "Entra nel Discord!", + "infiniteLevels": "Livelli Infiniti!", + "everythingStacks": "Tutto si impila!", + "optionalSaveScumming": "Salvataggio Facoltativo!", + "biomes": "35 Biomi!", + "openSource": "Open Source!", + "playWithSpeed": "Gioca con il 5x di Velocità!", + "liveBugTesting": "Test dei Bug in Tempo Reale!", + "heavyInfluence": "Influenzato da RoR2!", + "pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!", + "nowWithMoreSalt": "Adesso con il 33% di sale in più!", + "infiniteFusionAtHome": "Fusioni Infinite a Casa!", + "brokenEggMoves": "Mosse delle Uova Rotte!", + "magnificent": "Magnifico!", + "mubstitute": "Mubstitute!", + "thatsCrazy": "È Pazzesco!", + "oranceJuice": "Succo d'Arancia!", + "questionableBalancing": "Bilanciamento Discutibile!", + "coolShaders": "Shader fantastici!", + "aiFree": "Senza Intelligenza Artificiale!", + "suddenDifficultySpikes": "Picchi di Difficoltà Improvvisi!", + "basedOnAnUnfinishedFlashGame": "Basato su un Gioco Flash Incompiuto!", + "moreAddictiveThanIntended": "Crea Dipendeza più del Dovuto!", + "mostlyConsistentSeeds": "Seeds Consistenti!", + "achievementPointsDontDoAnything": "I Punti Obiettivo non Fanno Nulla!", + "youDoNotStartAtLevel": "Non Cominci dal Livello 2000!", + "dontTalkAboutTheManaphyEggIncident": "Non Parlare dell'Incidente dell'Uovo di Manaphy!", + "alsoTryPokengine": "Prova anche Pokéngine!", + "alsoTryEmeraldRogue": "Prova anche Emerald Rogue!", + "alsoTryRadicalRed": "Prova anche Radical Red!", + "eeveeExpo": "Eevee Expo!", + "ynoproject": "YNOproject!", +} as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index f2b44c372976..c8e172b89f65 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'Vuoi iniziare con questi Pokémon?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "Vel. Crescita:", - "ability": "Abilità:", - "passive": "Passiva:", - "nature": "Natura:", - "eggMoves": 'Mosse delle uova', - "start": "Inizia", - "addToParty": "Aggiungi al Gruppo", - "toggleIVs": 'Vedi/Nascondi IV', - "manageMoves": 'Gestisci Mosse', - "useCandies": 'Usa Caramelle', - "selectMoveSwapOut": "Seleziona una mossa da scambiare.", - "selectMoveSwapWith": "Seleziona una mossa da scambiare con", - "unlockPassive": "Sblocca Passiva", - "reduceCost": "Riduci Costo", - "cycleShiny": "R: Alterna Shiny", - "cycleForm": 'F: Alterna Forma', - "cycleGender": 'G: Alterna Sesso', - "cycleAbility": 'E: Alterna Abilità', - "cycleNature": 'N: Alterna Natura', - "cycleVariant": 'V: Alterna Variante', - "enablePassive": "Attiva Passiva", - "disablePassive": "Disattiva Passiva", - "locked": "Bloccato", - "disabled": "Disabilitato", - "uncaught": "Non Catturato" -} \ No newline at end of file + "confirmStartTeam":"Vuoi iniziare con questi Pokémon?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "Vel. Crescita:", + "ability": "Abilità:", + "passive": "Passiva:", + "nature": "Natura:", + "eggMoves": "Mosse delle uova", + "start": "Inizia", + "addToParty": "Aggiungi al Gruppo", + "toggleIVs": "Vedi/Nascondi IV", + "manageMoves": "Gestisci Mosse", + "useCandies": "Usa Caramelle", + "selectMoveSwapOut": "Seleziona una mossa da scambiare.", + "selectMoveSwapWith": "Seleziona una mossa da scambiare con", + "unlockPassive": "Sblocca Passiva", + "reduceCost": "Riduci Costo", + "cycleShiny": "R: Alterna Shiny", + "cycleForm": "F: Alterna Forma", + "cycleGender": "G: Alterna Sesso", + "cycleAbility": "E: Alterna Abilità", + "cycleNature": "N: Alterna Natura", + "cycleVariant": "V: Alterna Variante", + "enablePassive": "Attiva Passiva", + "disablePassive": "Disattiva Passiva", + "locked": "Bloccato", + "disabled": "Disabilitato", + "uncaught": "Non Catturato" +}; diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 6fcd157a0f1e..46199b8aa139 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -2,243 +2,243 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Superquattro", - "gym_leader": "Capopalestra", - "gym_leader_female": "Capopalestra", - "champion": "Campione", - "rival": "Rivale", - "professor": "Professore", - "frontier_brain": "Asso Lotta", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Superquattro", + "gym_leader": "Capopalestra", + "gym_leader_female": "Capopalestra", + "champion": "Campione", + "rival": "Rivale", + "professor": "Professore", + "frontier_brain": "Asso Lotta", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Ace Trainer", - "ace_trainer_female": "Ace Trainer", - "ace_duo": "Ace Duo", - "artist": "Artist", - "artist_female": "Artist", - "backers": "Backers", - "backpacker": "Backpacker", - "backpacker_female": "Backpacker", - "backpackers": "Backpackers", - "baker": "Baker", - "battle_girl": "Battle Girl", - "beauty": "Beauty", - "beginners": "Beginners", - "biker": "Biker", - "black_belt": "Black Belt", - "breeder": "Breeder", - "breeder_female": "Breeder", - "breeders": "Breeders", - "clerk": "Clerk", - "clerk_female": "Clerk", - "colleagues": "Colleagues", - "crush_kin": "Crush Kin", - "cyclist": "Cyclist", - "cyclist_female": "Cyclist", - "cyclists": "Cyclists", - "dancer": "Dancer", - "dancer_female": "Dancer", - "depot_agent": "Depot Agent", - "doctor": "Doctor", - "doctor_female": "Doctor", - "fisherman": "Fisherman", - "fisherman_female": "Fisherman", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", - "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", - "madame": "Madame", - "medical_team": "Medical Team", - "musician": "Musician", - "hex_maniac": "Hex Maniac", - "nurse": "Nurse", - "nursery_aide": "Nursery Aide", - "officer": "Officer", - "parasol_lady": "Parasol Lady", - "pilot": "Pilot", - "pokéfan": "Poké Fan", - "pokéfan_female": "Poké Fan", - "pokéfan_family": "Poké Fan Family", - "preschooler": "Preschooler", - "preschooler_female": "Preschooler", - "preschoolers": "Preschoolers", - "psychic": "Psychic", - "psychic_female": "Psychic", - "psychics": "Psychics", - "pokémon_ranger": "Pokémon Ranger", - "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", - "ranger": "Ranger", - "restaurant_staff": "Restaurant Staff", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "Rich Boy", - "rich_couple": "Rich Couple", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "Rich Kids", - "roughneck": "Roughneck", - "scientist": "Scientist", - "scientist_female": "Scientist", - "scientists": "Scientists", - "smasher": "Smasher", - "snow_worker": "Snow Worker", - "snow_worker_female": "Snow Worker", - "striker": "Striker", - "school_kid": "School Kid", - "school_kid_female": "School Kid", - "school_kids": "School Kids", - "swimmer": "Swimmer", - "swimmer_female": "Swimmer", - "swimmers": "Swimmers", - "twins": "Twins", - "veteran": "Veteran", - "veteran_female": "Veteran", - "veteran_duo": "Veteran Duo", - "waiter": "Waiter", - "waitress": "Waitress", - "worker": "Worker", - "worker_female": "Worker", - "workers": "Workers", - "youngster": "Youngster" + "ace_trainer": "Ace Trainer", + "ace_trainer_female": "Ace Trainer", + "ace_duo": "Ace Duo", + "artist": "Artist", + "artist_female": "Artist", + "backers": "Backers", + "backpacker": "Backpacker", + "backpacker_female": "Backpacker", + "backpackers": "Backpackers", + "baker": "Baker", + "battle_girl": "Battle Girl", + "beauty": "Beauty", + "beginners": "Beginners", + "biker": "Biker", + "black_belt": "Black Belt", + "breeder": "Breeder", + "breeder_female": "Breeder", + "breeders": "Breeders", + "clerk": "Clerk", + "clerk_female": "Clerk", + "colleagues": "Colleagues", + "crush_kin": "Crush Kin", + "cyclist": "Cyclist", + "cyclist_female": "Cyclist", + "cyclists": "Cyclists", + "dancer": "Dancer", + "dancer_female": "Dancer", + "depot_agent": "Depot Agent", + "doctor": "Doctor", + "doctor_female": "Doctor", + "fisherman": "Fisherman", + "fisherman_female": "Fisherman", + "gentleman": "Gentleman", + "guitarist": "Guitarist", + "guitarist_female": "Guitarist", + "harlequin": "Harlequin", + "hiker": "Hiker", + "hooligans": "Hooligans", + "hoopster": "Hoopster", + "infielder": "Infielder", + "janitor": "Janitor", + "lady": "Lady", + "lass": "Lass", + "linebacker": "Linebacker", + "maid": "Maid", + "madame": "Madame", + "medical_team": "Medical Team", + "musician": "Musician", + "hex_maniac": "Hex Maniac", + "nurse": "Nurse", + "nursery_aide": "Nursery Aide", + "officer": "Officer", + "parasol_lady": "Parasol Lady", + "pilot": "Pilot", + "pokéfan": "Poké Fan", + "pokéfan_female": "Poké Fan", + "pokéfan_family": "Poké Fan Family", + "preschooler": "Preschooler", + "preschooler_female": "Preschooler", + "preschoolers": "Preschoolers", + "psychic": "Psychic", + "psychic_female": "Psychic", + "psychics": "Psychics", + "pokémon_ranger": "Pokémon Ranger", + "pokémon_ranger_female": "Pokémon Ranger", + "pokémon_rangers": "Pokémon Ranger", + "ranger": "Ranger", + "restaurant_staff": "Restaurant Staff", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "Rich Boy", + "rich_couple": "Rich Couple", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "Rich Kids", + "roughneck": "Roughneck", + "scientist": "Scientist", + "scientist_female": "Scientist", + "scientists": "Scientists", + "smasher": "Smasher", + "snow_worker": "Snow Worker", + "snow_worker_female": "Snow Worker", + "striker": "Striker", + "school_kid": "School Kid", + "school_kid_female": "School Kid", + "school_kids": "School Kids", + "swimmer": "Swimmer", + "swimmer_female": "Swimmer", + "swimmers": "Swimmers", + "twins": "Twins", + "veteran": "Veteran", + "veteran_female": "Veteran", + "veteran_duo": "Veteran Duo", + "waiter": "Waiter", + "waitress": "Waitress", + "worker": "Worker", + "worker_female": "Worker", + "workers": "Workers", + "youngster": "Youngster" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Lt Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Crasher Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Lt Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Crasher Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", } as const; diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts index 898dcead8a44..c4215b68e436 100644 --- a/src/locales/it/tutorial.ts +++ b/src/locales/it/tutorial.ts @@ -1,30 +1,30 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Benvenuto in PokéRogue! Questo gioco si concentra sulle battaglie, con elementi roguelite. + "intro": `Benvenuto in PokéRogue! Questo gioco si concentra sulle battaglie, con elementi roguelite. $Questo gioco non è monetizzato e non siamo proprietari di Pokemon e Assets presenti nel gioco. $Il gioco è work-in-progress ma giocabile al 100%.\nPer reportare eventuali bugs è possibile discuterne sul nostro Discord. $Se il game risulta 'lento', assicurati di aver abilitato l'Accelerazione Hardware nelle impostazioni del tuo Browser`, - "accessMenu": `Per accedere al menù, press M o Esc.\nDal menù puoi cambiare impostazioni, controllare la wiki e accedere a varie features.`, + "accessMenu": "Per accedere al menù, press M o Esc.\nDal menù puoi cambiare impostazioni, controllare la wiki e accedere a varie features.", - "menu": `Da questo menù puoi accedere alle impostazioni. + "menu": `Da questo menù puoi accedere alle impostazioni. $Dalle impostazioni puoi cambiare velocità di gioco, stile di finestra e altre opzioni. $Ci sono varie funzionalità, controlla bene e non perderti nulla!`, - "starterSelect": `Da questa schermata puoi selezionare il tuo starter.\nQuesti sono i membri iniziali del tuo parti. + "starterSelect": `Da questa schermata puoi selezionare il tuo starter.\nQuesti sono i membri iniziali del tuo parti. $Ogni starter ha un valore. Puoi avere fino a \n6 Pokèmon, avendo a disposizione un massimo di 10 punti. $Puoi anche selezionare Sesso, Abilità, e Forma a seconda delle\nvarianti che hai catturato o schiuso. $Le IVs di una specie sono le migliori rispetto a tutte quelle che hai\ncatturato o schiuso, quindi prova a catturarne il piu possibile!`, - "pokerus": `Giornalmente 3 Starter casuali disponibili avranno il bordo viola. + "pokerus": `Giornalmente 3 Starter casuali disponibili avranno il bordo viola. $Se possiedi uno di questi starter,\nprova ad aggiungerlo al party. Ricorda di controllare le info!`, - "statChange": `I cambiamenti alle statistiche persistono fintanto che i tuoi pokèmon resteranno in campo. + "statChange": `I cambiamenti alle statistiche persistono fintanto che i tuoi pokèmon resteranno in campo. $I tuoi pokemon verranno richiamati quando incontrerai un allenatore o al cambiamento di bioma. $Puoi anche vedere i cambiamenti alle statistiche in corso tenendo premuto C o Shift`, - "selectItem": `Dopo ogni battaglia avrai disponibili tre item.\nPotrai prenderne solo uno. + "selectItem": `Dopo ogni battaglia avrai disponibili tre item.\nPotrai prenderne solo uno. $Questi spaziano tra consumabili, item tenuti da Pokèmon o con un effetto passivo permanente. $La maggior parte degli Item non Consumabili possono stackare in diversi modi. $Alcuni Item risulteranno disponibili solo se possono essere usati, come Item Evolutivi. @@ -33,10 +33,10 @@ export const tutorial: SimpleTranslationEntries = { $Puoi acquistare consumabili con le monete, progredendo saranno poi disponibili ulteriori oggetti. $Assicurati di fare un acquisto prima di selezionare un item casuale, poichè passerai subito alla lotta successiva.`, - "eggGacha": `Da questa schermata, puoi riscattare i tuoi vouchers in cambio di\nuova Pokèmon. + "eggGacha": `Da questa schermata, puoi riscattare i tuoi vouchers in cambio di\nuova Pokèmon. $Le uova vanno schiuse e saranno sempre più vicine alla schiusura dopo\nogni battaglia. Le uova più rare impiegheranno più battaglie per la schiusura. $I Pokémon schiusi non verranno aggiunti alla tua squadra, saranno\naggiunti ai tuoi starters. $I Pokémon schiusi generalmente hanno IVs migliori rispetto ai\n Pokémon selvatici. $Alcuni Pokémon possono essere ottenuti solo tramite uova. $Ci sono 3 diversi macchinari con differenti\nbonus, scegli quello che preferisci!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/voucher.ts b/src/locales/it/voucher.ts index 7af569e88cb9..f2bcb8d723ce 100644 --- a/src/locales/it/voucher.ts +++ b/src/locales/it/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Egg Voucher Gold", "locked": "Locked", "defeatTrainer": "Defeat {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/it/weather.ts b/src/locales/it/weather.ts index d5f0f440e1e1..ae07570aeb94 100644 --- a/src/locales/it/weather.ts +++ b/src/locales/it/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "La luce solare è intensa!", - "sunnyLapseMessage": "La luce solare è forte.", - "sunnyClearMessage": "La luce solare si sta attenuando.", - - "rainStartMessage": "Ha iniziato a piovere!", - "rainLapseMessage": "La pioggia continua.", - "rainClearMessage": "Ha smesso di piovere.", - - "sandstormStartMessage": "Si è scatenata una tempesta di sabbia!", - "sandstormLapseMessage": "La tempesta di sabbia infuria.", - "sandstormClearMessage": "La tempesta di sabbia si è placata.", - "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla tempesta di sabbia!", - - "hailStartMessage": "Ha iniziato a grandinare!", - "hailLapseMessage": "La grandine continua a cadere.", - "hailClearMessage": "Ha smesso di grandinare.", - "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla grandine!", - - "snowStartMessage": "Ha iniziato a nevicare!", - "snowLapseMessage": "La neve sta continuando a cadere.", - "snowClearMessage": "Ha smesso di nevicare!.", - - "fogStartMessage": "È emersa una fitta nebbia!", - "fogLapseMessage": "La nebbia continua.", - "fogClearMessage": "La nebbia è scomparsa.", - - "heavyRainStartMessage": "Ha iniziato a piovere forte!", - "heavyRainLapseMessage": "La pioggia battente continua.", - "heavyRainClearMessage": "La pioggia battente è cessata.", + "sunnyStartMessage": "La luce solare è intensa!", + "sunnyLapseMessage": "La luce solare è forte.", + "sunnyClearMessage": "La luce solare si sta attenuando.", + + "rainStartMessage": "Ha iniziato a piovere!", + "rainLapseMessage": "La pioggia continua.", + "rainClearMessage": "Ha smesso di piovere.", + + "sandstormStartMessage": "Si è scatenata una tempesta di sabbia!", + "sandstormLapseMessage": "La tempesta di sabbia infuria.", + "sandstormClearMessage": "La tempesta di sabbia si è placata.", + "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla tempesta di sabbia!", + + "hailStartMessage": "Ha iniziato a grandinare!", + "hailLapseMessage": "La grandine continua a cadere.", + "hailClearMessage": "Ha smesso di grandinare.", + "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} è stato colpito\ndalla grandine!", + + "snowStartMessage": "Ha iniziato a nevicare!", + "snowLapseMessage": "La neve sta continuando a cadere.", + "snowClearMessage": "Ha smesso di nevicare!.", + + "fogStartMessage": "È emersa una fitta nebbia!", + "fogLapseMessage": "La nebbia continua.", + "fogClearMessage": "La nebbia è scomparsa.", + + "heavyRainStartMessage": "Ha iniziato a piovere forte!", + "heavyRainLapseMessage": "La pioggia battente continua.", + "heavyRainClearMessage": "La pioggia battente è cessata.", - "harshSunStartMessage": "La luce solare è molto intensa!", - "harshSunLapseMessage": "La luce solare è estremamente calda.", - "harshSunClearMessage": "La luce solare si sta attenuando.", - - "strongWindsStartMessage": "È apparsa una corrente d'aria misteriosa!", - "strongWindsLapseMessage": "La corrente d'aria soffia intensamente.", - "strongWindsClearMessage": "La corrente d'aria è cessata." -} \ No newline at end of file + "harshSunStartMessage": "La luce solare è molto intensa!", + "harshSunLapseMessage": "La luce solare è estremamente calda.", + "harshSunClearMessage": "La luce solare si sta attenuando.", + + "strongWindsStartMessage": "È apparsa una corrente d'aria misteriosa!", + "strongWindsLapseMessage": "La corrente d'aria soffia intensamente.", + "strongWindsClearMessage": "La corrente d'aria è cessata." +}; diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index f539af8373ae..7237d4f4d5c6 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -1,5 +1,5 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!`, -} as const; \ No newline at end of file + "blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!", +} as const; diff --git a/src/locales/pt_BR/battle-message-ui-handler.ts b/src/locales/pt_BR/battle-message-ui-handler.ts index 03a5b464ecbe..3b7c009035f0 100644 --- a/src/locales/pt_BR/battle-message-ui-handler.ts +++ b/src/locales/pt_BR/battle-message-ui-handler.ts @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "Bom", "ivDecent": "Regular", "ivNoGood": "Ruim", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index cc49abc7a7ca..327b0cb51e9c 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", "hitResultOneHitKO": "Foi um nocaute de um golpe!", "attackFailed": "Mas falhou!", - "attackHitsCount": `Acertou {{count}} vezes.`, + "attackHitsCount": "Acertou {{count}} vezes.", "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", @@ -53,4 +53,4 @@ export const battle: SimpleTranslationEntries = { "skipItemQuestion": "Tem certeza de que não quer escolher um item?", "eggHatching": "Opa?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/berry.ts b/src/locales/pt_BR/berry.ts index c5a9d8825303..e36d0b0f180b 100644 --- a/src/locales/pt_BR/berry.ts +++ b/src/locales/pt_BR/berry.ts @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "Fruta Leppa", effect: "Restaura 10 PP de um movimento se seus PP acabarem", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/command-ui-handler.ts b/src/locales/pt_BR/command-ui-handler.ts index 1df44c49e5b9..2ad14e4ae944 100644 --- a/src/locales/pt_BR/command-ui-handler.ts +++ b/src/locales/pt_BR/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "Lutar", - "ball": "Bolas", - "pokemon": "Pokémon", - "run": "Fugir", - "actionMessage": "O que {{pokemonName}}\ndeve fazer?", -} as const; \ No newline at end of file + "fight": "Lutar", + "ball": "Bolas", + "pokemon": "Pokémon", + "run": "Fugir", + "actionMessage": "O que {{pokemonName}}\ndeve fazer?", +} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index a9244f5e9db0..587a5e62fb96 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -23,28 +23,28 @@ import { voucher } from "./voucher"; export const ptBrConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - menuUiHandler: menuUiHandler, - menu: menu, - move: move, - pokeball: pokeball, - pokemonInfo: pokemonInfo, - pokemon: pokemon, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - splashMessages: splashMessages, - nature: nature, - growth: growth, - weather: weather, - modifierType: modifierType, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + menuUiHandler: menuUiHandler, + menu: menu, + move: move, + pokeball: pokeball, + pokemonInfo: pokemonInfo, + pokemon: pokemon, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + splashMessages: splashMessages, + nature: nature, + growth: growth, + weather: weather, + modifierType: modifierType, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.ts index 1d38fd5c694e..996ab85d8c59 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "Você já tem muitos ovos!", "pull": "Prêmio", "pulls": "Prêmios" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/fight-ui-handler.ts b/src/locales/pt_BR/fight-ui-handler.ts index 7b8c5aab8928..f223f72a9f1e 100644 --- a/src/locales/pt_BR/fight-ui-handler.ts +++ b/src/locales/pt_BR/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "Poder", - "accuracy": "Precisão", + "pp": "PP", + "power": "Poder", + "accuracy": "Precisão", } as const; diff --git a/src/locales/pt_BR/growth.ts b/src/locales/pt_BR/growth.ts index 70848b606687..50762e5ad94c 100644 --- a/src/locales/pt_BR/growth.ts +++ b/src/locales/pt_BR/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "Instável", - "Fast": "Rápido", - "Medium_Fast": "Meio Rápido", - "Medium_Slow": "Meio Lento", - "Slow": "Lento", - "Fluctuating": "Flutuante" -} as const; \ No newline at end of file + "Erratic": "Instável", + "Fast": "Rápido", + "Medium_Fast": "Meio Rápido", + "Medium_Slow": "Meio Lento", + "Slow": "Lento", + "Fluctuating": "Flutuante" +} as const; diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index 5a60b614338b..8e6fc83eb368 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": "Configurações", - "ACHIEVEMENTS": "Conquistas", - "STATS": "Estatísticas", - "VOUCHERS": "Vouchers", - "EGG_LIST": "Incubadora", - "EGG_GACHA": "Gacha de ovos", - "MANAGE_DATA": "Gerenciar dados", - "COMMUNITY": "Comunidade", - "SAVE_AND_QUIT": "Salvar e sair", - "LOG_OUT": "Logout", - "slot": "Slot {{slotNumber}}", - "importSession": "Importar sessão", - "importSlotSelect": "Selecione um slot para importar.", - "exportSession": "Exportar sessão", - "exportSlotSelect": "Selecione um slot para exportar.", - "importData": "Importar dados", - "exportData": "Exportar dados", - "cancel": "Cancelar", - "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?" -} as const; \ No newline at end of file + "GAME_SETTINGS": "Configurações", + "ACHIEVEMENTS": "Conquistas", + "STATS": "Estatísticas", + "VOUCHERS": "Vouchers", + "EGG_LIST": "Incubadora", + "EGG_GACHA": "Gacha de ovos", + "MANAGE_DATA": "Gerenciar dados", + "COMMUNITY": "Comunidade", + "SAVE_AND_QUIT": "Salvar e sair", + "LOG_OUT": "Logout", + "slot": "Slot {{slotNumber}}", + "importSession": "Importar sessão", + "importSlotSelect": "Selecione um slot para importar.", + "exportSession": "Exportar sessão", + "exportSlotSelect": "Selecione um slot para exportar.", + "importData": "Importar dados", + "exportData": "Exportar dados", + "cancel": "Cancelar", + "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?" +} as const; diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index 10f3fa4dff88..7563ac8ef5c5 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "Cancelar", - "continue": "Continuar", - "dailyRun": "Desafio Diário (Beta)", - "loadGame": "Carregar Jogo", - "newGame": "Novo Jogo", - "selectGameMode": "Escolha um modo de jogo.", - "logInOrCreateAccount": "Inicie uma sessão ou crie uma conta para começar. Não é necessário email!", - "username": "Nome de Usuário", - "password": "Senha", - "login": "Iniciar sessão", - "register": "Registrar-se", - "emptyUsername": "Nome de usuário vazio", - "invalidLoginUsername": "Nome de usuário inválido", - "invalidRegisterUsername": "O nome de usuário só pode conter letras, números e sublinhados", - "invalidLoginPassword": "Senha inválida", - "invalidRegisterPassword": "A senha deve ter pelo menos 6 caracteres", - "usernameAlreadyUsed": "Esse nome de usuário já está em uso", - "accountNonExistent": "Esse nome de usuário não existe", - "unmatchingPassword": "Senha incorreta", - "passwordNotMatchingConfirmPassword": "As senhas não coincidem", - "confirmPassword": "Confirmar senha", - "registrationAgeWarning": "Se registrando, você confirma que tem pelo menos 13 anos de idade.", - "backToLogin": "Voltar ao Login", - "failedToLoadSaveData": "Não foi possível carregar os dados de salvamento. Por favor, recarregue a página.\nSe a falha persistir, contate o administrador.", - "sessionSuccess": "Sessão carregada com sucesso.", - "failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.", - "boyOrGirl": "Você é um menino ou uma menina?", - "boy": "Menino", - "girl": "Menina", - "evolving": "Que?\n{{pokemonName}} tá evoluindo!", - "stoppedEvolving": "{{pokemonName}} parou de evoluir.", - "pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.", - "evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.", - "evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!", - "dailyRankings": "Classificação Diária", - "weeklyRankings": "Classificação Semanal", - "noRankings": "Sem Classificação", - "loading": "Carregando…", - "playersOnline": "Jogadores Ativos", - "empty": "Vazio", - "yes": "Sim", - "no": "Não", -} as const; \ No newline at end of file + "cancel": "Cancelar", + "continue": "Continuar", + "dailyRun": "Desafio Diário (Beta)", + "loadGame": "Carregar Jogo", + "newGame": "Novo Jogo", + "selectGameMode": "Escolha um modo de jogo.", + "logInOrCreateAccount": "Inicie uma sessão ou crie uma conta para começar. Não é necessário email!", + "username": "Nome de Usuário", + "password": "Senha", + "login": "Iniciar sessão", + "register": "Registrar-se", + "emptyUsername": "Nome de usuário vazio", + "invalidLoginUsername": "Nome de usuário inválido", + "invalidRegisterUsername": "O nome de usuário só pode conter letras, números e sublinhados", + "invalidLoginPassword": "Senha inválida", + "invalidRegisterPassword": "A senha deve ter pelo menos 6 caracteres", + "usernameAlreadyUsed": "Esse nome de usuário já está em uso", + "accountNonExistent": "Esse nome de usuário não existe", + "unmatchingPassword": "Senha incorreta", + "passwordNotMatchingConfirmPassword": "As senhas não coincidem", + "confirmPassword": "Confirmar senha", + "registrationAgeWarning": "Se registrando, você confirma que tem pelo menos 13 anos de idade.", + "backToLogin": "Voltar ao Login", + "failedToLoadSaveData": "Não foi possível carregar os dados de salvamento. Por favor, recarregue a página.\nSe a falha persistir, contate o administrador.", + "sessionSuccess": "Sessão carregada com sucesso.", + "failedToLoadSession": "Não foi possível carregar os dados da sua sessão.\nEles podem estar corrompidos.", + "boyOrGirl": "Você é um menino ou uma menina?", + "boy": "Menino", + "girl": "Menina", + "evolving": "Que?\n{{pokemonName}} tá evoluindo!", + "stoppedEvolving": "{{pokemonName}} parou de evoluir.", + "pauseEvolutionsQuestion": "Gostaria de pausar evoluções para {{pokemonName}}?\nEvoluções podem ser religadas na tela de equipe.", + "evolutionsPaused": "Evoluções foram paradas para {{pokemonName}}.", + "evolutionDone": "Parabéns!\nSeu {{pokemonName}} evolui para {{evolvedPokemonName}}!", + "dailyRankings": "Classificação Diária", + "weeklyRankings": "Classificação Semanal", + "noRankings": "Sem Classificação", + "loading": "Carregando…", + "playersOnline": "Jogadores Ativos", + "empty": "Vazio", + "yes": "Sim", + "no": "Não", +} as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index ea9c4e95168d..156047079e37 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -384,4 +384,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "CrioDisco", "DOUSE_DRIVE": "HidroDisco", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index ce55b5264ec2..c50f95035602 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "Malignant Chain", effect: "O usuário derrama toxinas no alvo envolvendo-o em uma corrente tóxica e corrosiva. Isso também pode deixar o alvo seriamente envenenado." } -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/nature.ts b/src/locales/pt_BR/nature.ts index 3cb33340e2c0..0c3ffde12f9d 100644 --- a/src/locales/pt_BR/nature.ts +++ b/src/locales/pt_BR/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "Atrevida", "Careful": "Cuidadosa", "Quirky": "Peculiar", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/pokeball.ts b/src/locales/pt_BR/pokeball.ts index 75d81ebde031..d7c5656fe5cc 100644 --- a/src/locales/pt_BR/pokeball.ts +++ b/src/locales/pt_BR/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "Poké Bola", - "greatBall": "Grande Bola", - "ultraBall": "Ultra Bola", - "rogueBall": "Bola Rogue", - "masterBall": "Bola Mestra", - "luxuryBall": "Bola Luxo", -} as const; \ No newline at end of file + "pokeBall": "Poké Bola", + "greatBall": "Grande Bola", + "ultraBall": "Ultra Bola", + "rogueBall": "Bola Rogue", + "masterBall": "Bola Mestra", + "luxuryBall": "Bola Luxo", +} as const; diff --git a/src/locales/pt_BR/pokemon-info.ts b/src/locales/pt_BR/pokemon-info.ts index 99cef266c6ff..70b0664f30bb 100644 --- a/src/locales/pt_BR/pokemon-info.ts +++ b/src/locales/pt_BR/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "PS", - "HPshortened": "PS", - "ATK": "Ataque", - "ATKshortened": "Ata", - "DEF": "Defesa", - "DEFshortened": "Def", - "SPATK": "At. Esp.", - "SPATKshortened": "AtEsp", - "SPDEF": "Def. Esp.", - "SPDEFshortened": "DefEsp", - "SPD": "Veloc.", - "SPDshortened": "Veloc." - }, + Stat: { + "HP": "PS", + "HPshortened": "PS", + "ATK": "Ataque", + "ATKshortened": "Ata", + "DEF": "Defesa", + "DEFshortened": "Def", + "SPATK": "At. Esp.", + "SPATKshortened": "AtEsp", + "SPDEF": "Def. Esp.", + "SPDEFshortened": "DefEsp", + "SPD": "Veloc.", + "SPDshortened": "Veloc." + }, - Type: { - "UNKNOWN": "Desconhecido", - "NORMAL": "Normal", - "FIGHTING": "Lutador", - "FLYING": "Voador", - "POISON": "Veneno", - "GROUND": "Terra", - "ROCK": "Pedra", - "BUG": "Inseto", - "GHOST": "Fantasma", - "STEEL": "Aço", - "FIRE": "Fogo", - "WATER": "Água", - "GRASS": "Grama", - "ELECTRIC": "Elétrico", - "PSYCHIC": "Psíquico", - "ICE": "Gelo", - "DRAGON": "Dragão", - "DARK": "Sombrio", - "FAIRY": "Fada", - "STELLAR": "Estelar" - }, -} as const; \ No newline at end of file + Type: { + "UNKNOWN": "Desconhecido", + "NORMAL": "Normal", + "FIGHTING": "Lutador", + "FLYING": "Voador", + "POISON": "Veneno", + "GROUND": "Terra", + "ROCK": "Pedra", + "BUG": "Inseto", + "GHOST": "Fantasma", + "STEEL": "Aço", + "FIRE": "Fogo", + "WATER": "Água", + "GRASS": "Grama", + "ELECTRIC": "Elétrico", + "PSYCHIC": "Psíquico", + "ICE": "Gelo", + "DRAGON": "Dragão", + "DARK": "Sombrio", + "FAIRY": "Fada", + "STELLAR": "Estelar" + }, +} as const; diff --git a/src/locales/pt_BR/pokemon.ts b/src/locales/pt_BR/pokemon.ts index e94d37aef29c..663c0f2163dc 100644 --- a/src/locales/pt_BR/pokemon.ts +++ b/src/locales/pt_BR/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "Bulbasaur", - "ivysaur": "Ivysaur", - "venusaur": "Venusaur", - "charmander": "Charmander", - "charmeleon": "Charmeleon", - "charizard": "Charizard", - "squirtle": "Squirtle", - "wartortle": "Wartortle", - "blastoise": "Blastoise", - "caterpie": "Caterpie", - "metapod": "Metapod", - "butterfree": "Butterfree", - "weedle": "Weedle", - "kakuna": "Kakuna", - "beedrill": "Beedrill", - "pidgey": "Pidgey", - "pidgeotto": "Pidgeotto", - "pidgeot": "Pidgeot", - "rattata": "Rattata", - "raticate": "Raticate", - "spearow": "Spearow", - "fearow": "Fearow", - "ekans": "Ekans", - "arbok": "Arbok", - "pikachu": "Pikachu", - "raichu": "Raichu", - "sandshrew": "Sandshrew", - "sandslash": "Sandslash", - "nidoran_f": "Nidoran♀", - "nidorina": "Nidorina", - "nidoqueen": "Nidoqueen", - "nidoran_m": "Nidoran♂", - "nidorino": "Nidorino", - "nidoking": "Nidoking", - "clefairy": "Clefairy", - "clefable": "Clefable", - "vulpix": "Vulpix", - "ninetales": "Ninetales", - "jigglypuff": "Jigglypuff", - "wigglytuff": "Wigglytuff", - "zubat": "Zubat", - "golbat": "Golbat", - "oddish": "Oddish", - "gloom": "Gloom", - "vileplume": "Vileplume", - "paras": "Paras", - "parasect": "Parasect", - "venonat": "Venonat", - "venomoth": "Venomoth", - "diglett": "Diglett", - "dugtrio": "Dugtrio", - "meowth": "Meowth", - "persian": "Persian", - "psyduck": "Psyduck", - "golduck": "Golduck", - "mankey": "Mankey", - "primeape": "Primeape", - "growlithe": "Growlithe", - "arcanine": "Arcanine", - "poliwag": "Poliwag", - "poliwhirl": "Poliwhirl", - "poliwrath": "Poliwrath", - "abra": "Abra", - "kadabra": "Kadabra", - "alakazam": "Alakazam", - "machop": "Machop", - "machoke": "Machoke", - "machamp": "Machamp", - "bellsprout": "Bellsprout", - "weepinbell": "Weepinbell", - "victreebel": "Victreebel", - "tentacool": "Tentacool", - "tentacruel": "Tentacruel", - "geodude": "Geodude", - "graveler": "Graveler", - "golem": "Golem", - "ponyta": "Ponyta", - "rapidash": "Rapidash", - "slowpoke": "Slowpoke", - "slowbro": "Slowbro", - "magnemite": "Magnemite", - "magneton": "Magneton", - "farfetchd": "Farfetch'd", - "doduo": "Doduo", - "dodrio": "Dodrio", - "seel": "Seel", - "dewgong": "Dewgong", - "grimer": "Grimer", - "muk": "Muk", - "shellder": "Shellder", - "cloyster": "Cloyster", - "gastly": "Gastly", - "haunter": "Haunter", - "gengar": "Gengar", - "onix": "Onix", - "drowzee": "Drowzee", - "hypno": "Hypno", - "krabby": "Krabby", - "kingler": "Kingler", - "voltorb": "Voltorb", - "electrode": "Electrode", - "exeggcute": "Exeggcute", - "exeggutor": "Exeggutor", - "cubone": "Cubone", - "marowak": "Marowak", - "hitmonlee": "Hitmonlee", - "hitmonchan": "Hitmonchan", - "lickitung": "Lickitung", - "koffing": "Koffing", - "weezing": "Weezing", - "rhyhorn": "Rhyhorn", - "rhydon": "Rhydon", - "chansey": "Chansey", - "tangela": "Tangela", - "kangaskhan": "Kangaskhan", - "horsea": "Horsea", - "seadra": "Seadra", - "goldeen": "Goldeen", - "seaking": "Seaking", - "staryu": "Staryu", - "starmie": "Starmie", - "mr_mime": "Mr. Mime", - "scyther": "Scyther", - "jynx": "Jynx", - "electabuzz": "Electabuzz", - "magmar": "Magmar", - "pinsir": "Pinsir", - "tauros": "Tauros", - "magikarp": "Magikarp", - "gyarados": "Gyarados", - "lapras": "Lapras", - "ditto": "Ditto", - "eevee": "Eevee", - "vaporeon": "Vaporeon", - "jolteon": "Jolteon", - "flareon": "Flareon", - "porygon": "Porygon", - "omanyte": "Omanyte", - "omastar": "Omastar", - "kabuto": "Kabuto", - "kabutops": "Kabutops", - "aerodactyl": "Aerodactyl", - "snorlax": "Snorlax", - "articuno": "Articuno", - "zapdos": "Zapdos", - "moltres": "Moltres", - "dratini": "Dratini", - "dragonair": "Dragonair", - "dragonite": "Dragonite", - "mewtwo": "Mewtwo", - "mew": "Mew", - "chikorita": "Chikorita", - "bayleef": "Bayleef", - "meganium": "Meganium", - "cyndaquil": "Cyndaquil", - "quilava": "Quilava", - "typhlosion": "Typhlosion", - "totodile": "Totodile", - "croconaw": "Croconaw", - "feraligatr": "Feraligatr", - "sentret": "Sentret", - "furret": "Furret", - "hoothoot": "Hoothoot", - "noctowl": "Noctowl", - "ledyba": "Ledyba", - "ledian": "Ledian", - "spinarak": "Spinarak", - "ariados": "Ariados", - "crobat": "Crobat", - "chinchou": "Chinchou", - "lanturn": "Lanturn", - "pichu": "Pichu", - "cleffa": "Cleffa", - "igglybuff": "Igglybuff", - "togepi": "Togepi", - "togetic": "Togetic", - "natu": "Natu", - "xatu": "Xatu", - "mareep": "Mareep", - "flaaffy": "Flaaffy", - "ampharos": "Ampharos", - "bellossom": "Bellossom", - "marill": "Marill", - "azumarill": "Azumarill", - "sudowoodo": "Sudowoodo", - "politoed": "Politoed", - "hoppip": "Hoppip", - "skiploom": "Skiploom", - "jumpluff": "Jumpluff", - "aipom": "Aipom", - "sunkern": "Sunkern", - "sunflora": "Sunflora", - "yanma": "Yanma", - "wooper": "Wooper", - "quagsire": "Quagsire", - "espeon": "Espeon", - "umbreon": "Umbreon", - "murkrow": "Murkrow", - "slowking": "Slowking", - "misdreavus": "Misdreavus", - "unown": "Unown", - "wobbuffet": "Wobbuffet", - "girafarig": "Girafarig", - "pineco": "Pineco", - "forretress": "Forretress", - "dunsparce": "Dunsparce", - "gligar": "Gligar", - "steelix": "Steelix", - "snubbull": "Snubbull", - "granbull": "Granbull", - "qwilfish": "Qwilfish", - "scizor": "Scizor", - "shuckle": "Shuckle", - "heracross": "Heracross", - "sneasel": "Sneasel", - "teddiursa": "Teddiursa", - "ursaring": "Ursaring", - "slugma": "Slugma", - "magcargo": "Magcargo", - "swinub": "Swinub", - "piloswine": "Piloswine", - "corsola": "Corsola", - "remoraid": "Remoraid", - "octillery": "Octillery", - "delibird": "Delibird", - "mantine": "Mantine", - "skarmory": "Skarmory", - "houndour": "Houndour", - "houndoom": "Houndoom", - "kingdra": "Kingdra", - "phanpy": "Phanpy", - "donphan": "Donphan", - "porygon2": "Porygon2", - "stantler": "Stantler", - "smeargle": "Smeargle", - "tyrogue": "Tyrogue", - "hitmontop": "Hitmontop", - "smoochum": "Smoochum", - "elekid": "Elekid", - "magby": "Magby", - "miltank": "Miltank", - "blissey": "Blissey", - "raikou": "Raikou", - "entei": "Entei", - "suicune": "Suicune", - "larvitar": "Larvitar", - "pupitar": "Pupitar", - "tyranitar": "Tyranitar", - "lugia": "Lugia", - "ho_oh": "Ho-Oh", - "celebi": "Celebi", - "treecko": "Treecko", - "grovyle": "Grovyle", - "sceptile": "Sceptile", - "torchic": "Torchic", - "combusken": "Combusken", - "blaziken": "Blaziken", - "mudkip": "Mudkip", - "marshtomp": "Marshtomp", - "swampert": "Swampert", - "poochyena": "Poochyena", - "mightyena": "Mightyena", - "zigzagoon": "Zigzagoon", - "linoone": "Linoone", - "wurmple": "Wurmple", - "silcoon": "Silcoon", - "beautifly": "Beautifly", - "cascoon": "Cascoon", - "dustox": "Dustox", - "lotad": "Lotad", - "lombre": "Lombre", - "ludicolo": "Ludicolo", - "seedot": "Seedot", - "nuzleaf": "Nuzleaf", - "shiftry": "Shiftry", - "taillow": "Taillow", - "swellow": "Swellow", - "wingull": "Wingull", - "pelipper": "Pelipper", - "ralts": "Ralts", - "kirlia": "Kirlia", - "gardevoir": "Gardevoir", - "surskit": "Surskit", - "masquerain": "Masquerain", - "shroomish": "Shroomish", - "breloom": "Breloom", - "slakoth": "Slakoth", - "vigoroth": "Vigoroth", - "slaking": "Slaking", - "nincada": "Nincada", - "ninjask": "Ninjask", - "shedinja": "Shedinja", - "whismur": "Whismur", - "loudred": "Loudred", - "exploud": "Exploud", - "makuhita": "Makuhita", - "hariyama": "Hariyama", - "azurill": "Azurill", - "nosepass": "Nosepass", - "skitty": "Skitty", - "delcatty": "Delcatty", - "sableye": "Sableye", - "mawile": "Mawile", - "aron": "Aron", - "lairon": "Lairon", - "aggron": "Aggron", - "meditite": "Meditite", - "medicham": "Medicham", - "electrike": "Electrike", - "manectric": "Manectric", - "plusle": "Plusle", - "minun": "Minun", - "volbeat": "Volbeat", - "illumise": "Illumise", - "roselia": "Roselia", - "gulpin": "Gulpin", - "swalot": "Swalot", - "carvanha": "Carvanha", - "sharpedo": "Sharpedo", - "wailmer": "Wailmer", - "wailord": "Wailord", - "numel": "Numel", - "camerupt": "Camerupt", - "torkoal": "Torkoal", - "spoink": "Spoink", - "grumpig": "Grumpig", - "spinda": "Spinda", - "trapinch": "Trapinch", - "vibrava": "Vibrava", - "flygon": "Flygon", - "cacnea": "Cacnea", - "cacturne": "Cacturne", - "swablu": "Swablu", - "altaria": "Altaria", - "zangoose": "Zangoose", - "seviper": "Seviper", - "lunatone": "Lunatone", - "solrock": "Solrock", - "barboach": "Barboach", - "whiscash": "Whiscash", - "corphish": "Corphish", - "crawdaunt": "Crawdaunt", - "baltoy": "Baltoy", - "claydol": "Claydol", - "lileep": "Lileep", - "cradily": "Cradily", - "anorith": "Anorith", - "armaldo": "Armaldo", - "feebas": "Feebas", - "milotic": "Milotic", - "castform": "Castform", - "kecleon": "Kecleon", - "shuppet": "Shuppet", - "banette": "Banette", - "duskull": "Duskull", - "dusclops": "Dusclops", - "tropius": "Tropius", - "chimecho": "Chimecho", - "absol": "Absol", - "wynaut": "Wynaut", - "snorunt": "Snorunt", - "glalie": "Glalie", - "spheal": "Spheal", - "sealeo": "Sealeo", - "walrein": "Walrein", - "clamperl": "Clamperl", - "huntail": "Huntail", - "gorebyss": "Gorebyss", - "relicanth": "Relicanth", - "luvdisc": "Luvdisc", - "bagon": "Bagon", - "shelgon": "Shelgon", - "salamence": "Salamence", - "beldum": "Beldum", - "metang": "Metang", - "metagross": "Metagross", - "regirock": "Regirock", - "regice": "Regice", - "registeel": "Registeel", - "latias": "Latias", - "latios": "Latios", - "kyogre": "Kyogre", - "groudon": "Groudon", - "rayquaza": "Rayquaza", - "jirachi": "Jirachi", - "deoxys": "Deoxys", - "turtwig": "Turtwig", - "grotle": "Grotle", - "torterra": "Torterra", - "chimchar": "Chimchar", - "monferno": "Monferno", - "infernape": "Infernape", - "piplup": "Piplup", - "prinplup": "Prinplup", - "empoleon": "Empoleon", - "starly": "Starly", - "staravia": "Staravia", - "staraptor": "Staraptor", - "bidoof": "Bidoof", - "bibarel": "Bibarel", - "kricketot": "Kricketot", - "kricketune": "Kricketune", - "shinx": "Shinx", - "luxio": "Luxio", - "luxray": "Luxray", - "budew": "Budew", - "roserade": "Roserade", - "cranidos": "Cranidos", - "rampardos": "Rampardos", - "shieldon": "Shieldon", - "bastiodon": "Bastiodon", - "burmy": "Burmy", - "wormadam": "Wormadam", - "mothim": "Mothim", - "combee": "Combee", - "vespiquen": "Vespiquen", - "pachirisu": "Pachirisu", - "buizel": "Buizel", - "floatzel": "Floatzel", - "cherubi": "Cherubi", - "cherrim": "Cherrim", - "shellos": "Shellos", - "gastrodon": "Gastrodon", - "ambipom": "Ambipom", - "drifloon": "Drifloon", - "drifblim": "Drifblim", - "buneary": "Buneary", - "lopunny": "Lopunny", - "mismagius": "Mismagius", - "honchkrow": "Honchkrow", - "glameow": "Glameow", - "purugly": "Purugly", - "chingling": "Chingling", - "stunky": "Stunky", - "skuntank": "Skuntank", - "bronzor": "Bronzor", - "bronzong": "Bronzong", - "bonsly": "Bonsly", - "mime_jr": "Mime Jr.", - "happiny": "Happiny", - "chatot": "Chatot", - "spiritomb": "Spiritomb", - "gible": "Gible", - "gabite": "Gabite", - "garchomp": "Garchomp", - "munchlax": "Munchlax", - "riolu": "Riolu", - "lucario": "Lucario", - "hippopotas": "Hippopotas", - "hippowdon": "Hippowdon", - "skorupi": "Skorupi", - "drapion": "Drapion", - "croagunk": "Croagunk", - "toxicroak": "Toxicroak", - "carnivine": "Carnivine", - "finneon": "Finneon", - "lumineon": "Lumineon", - "mantyke": "Mantyke", - "snover": "Snover", - "abomasnow": "Abomasnow", - "weavile": "Weavile", - "magnezone": "Magnezone", - "lickilicky": "Lickilicky", - "rhyperior": "Rhyperior", - "tangrowth": "Tangrowth", - "electivire": "Electivire", - "magmortar": "Magmortar", - "togekiss": "Togekiss", - "yanmega": "Yanmega", - "leafeon": "Leafeon", - "glaceon": "Glaceon", - "gliscor": "Gliscor", - "mamoswine": "Mamoswine", - "porygon_z": "Porygon-Z", - "gallade": "Gallade", - "probopass": "Probopass", - "dusknoir": "Dusknoir", - "froslass": "Froslass", - "rotom": "Rotom", - "uxie": "Uxie", - "mesprit": "Mesprit", - "azelf": "Azelf", - "dialga": "Dialga", - "palkia": "Palkia", - "heatran": "Heatran", - "regigigas": "Regigigas", - "giratina": "Giratina", - "cresselia": "Cresselia", - "phione": "Phione", - "manaphy": "Manaphy", - "darkrai": "Darkrai", - "shaymin": "Shaymin", - "arceus": "Arceus", - "victini": "Victini", - "snivy": "Snivy", - "servine": "Servine", - "serperior": "Serperior", - "tepig": "Tepig", - "pignite": "Pignite", - "emboar": "Emboar", - "oshawott": "Oshawott", - "dewott": "Dewott", - "samurott": "Samurott", - "patrat": "Patrat", - "watchog": "Watchog", - "lillipup": "Lillipup", - "herdier": "Herdier", - "stoutland": "Stoutland", - "purrloin": "Purrloin", - "liepard": "Liepard", - "pansage": "Pansage", - "simisage": "Simisage", - "pansear": "Pansear", - "simisear": "Simisear", - "panpour": "Panpour", - "simipour": "Simipour", - "munna": "Munna", - "musharna": "Musharna", - "pidove": "Pidove", - "tranquill": "Tranquill", - "unfezant": "Unfezant", - "blitzle": "Blitzle", - "zebstrika": "Zebstrika", - "roggenrola": "Roggenrola", - "boldore": "Boldore", - "gigalith": "Gigalith", - "woobat": "Woobat", - "swoobat": "Swoobat", - "drilbur": "Drilbur", - "excadrill": "Excadrill", - "audino": "Audino", - "timburr": "Timburr", - "gurdurr": "Gurdurr", - "conkeldurr": "Conkeldurr", - "tympole": "Tympole", - "palpitoad": "Palpitoad", - "seismitoad": "Seismitoad", - "throh": "Throh", - "sawk": "Sawk", - "sewaddle": "Sewaddle", - "swadloon": "Swadloon", - "leavanny": "Leavanny", - "venipede": "Venipede", - "whirlipede": "Whirlipede", - "scolipede": "Scolipede", - "cottonee": "Cottonee", - "whimsicott": "Whimsicott", - "petilil": "Petilil", - "lilligant": "Lilligant", - "basculin": "Basculin", - "sandile": "Sandile", - "krokorok": "Krokorok", - "krookodile": "Krookodile", - "darumaka": "Darumaka", - "darmanitan": "Darmanitan", - "maractus": "Maractus", - "dwebble": "Dwebble", - "crustle": "Crustle", - "scraggy": "Scraggy", - "scrafty": "Scrafty", - "sigilyph": "Sigilyph", - "yamask": "Yamask", - "cofagrigus": "Cofagrigus", - "tirtouga": "Tirtouga", - "carracosta": "Carracosta", - "archen": "Archen", - "archeops": "Archeops", - "trubbish": "Trubbish", - "garbodor": "Garbodor", - "zorua": "Zorua", - "zoroark": "Zoroark", - "minccino": "Minccino", - "cinccino": "Cinccino", - "gothita": "Gothita", - "gothorita": "Gothorita", - "gothitelle": "Gothitelle", - "solosis": "Solosis", - "duosion": "Duosion", - "reuniclus": "Reuniclus", - "ducklett": "Ducklett", - "swanna": "Swanna", - "vanillite": "Vanillite", - "vanillish": "Vanillish", - "vanilluxe": "Vanilluxe", - "deerling": "Deerling", - "sawsbuck": "Sawsbuck", - "emolga": "Emolga", - "karrablast": "Karrablast", - "escavalier": "Escavalier", - "foongus": "Foongus", - "amoonguss": "Amoonguss", - "frillish": "Frillish", - "jellicent": "Jellicent", - "alomomola": "Alomomola", - "joltik": "Joltik", - "galvantula": "Galvantula", - "ferroseed": "Ferroseed", - "ferrothorn": "Ferrothorn", - "klink": "Klink", - "klang": "Klang", - "klinklang": "Klinklang", - "tynamo": "Tynamo", - "eelektrik": "Eelektrik", - "eelektross": "Eelektross", - "elgyem": "Elgyem", - "beheeyem": "Beheeyem", - "litwick": "Litwick", - "lampent": "Lampent", - "chandelure": "Chandelure", - "axew": "Axew", - "fraxure": "Fraxure", - "haxorus": "Haxorus", - "cubchoo": "Cubchoo", - "beartic": "Beartic", - "cryogonal": "Cryogonal", - "shelmet": "Shelmet", - "accelgor": "Accelgor", - "stunfisk": "Stunfisk", - "mienfoo": "Mienfoo", - "mienshao": "Mienshao", - "druddigon": "Druddigon", - "golett": "Golett", - "golurk": "Golurk", - "pawniard": "Pawniard", - "bisharp": "Bisharp", - "bouffalant": "Bouffalant", - "rufflet": "Rufflet", - "braviary": "Braviary", - "vullaby": "Vullaby", - "mandibuzz": "Mandibuzz", - "heatmor": "Heatmor", - "durant": "Durant", - "deino": "Deino", - "zweilous": "Zweilous", - "hydreigon": "Hydreigon", - "larvesta": "Larvesta", - "volcarona": "Volcarona", - "cobalion": "Cobalion", - "terrakion": "Terrakion", - "virizion": "Virizion", - "tornadus": "Tornadus", - "thundurus": "Thundurus", - "reshiram": "Reshiram", - "zekrom": "Zekrom", - "landorus": "Landorus", - "kyurem": "Kyurem", - "keldeo": "Keldeo", - "meloetta": "Meloetta", - "genesect": "Genesect", - "chespin": "Chespin", - "quilladin": "Quilladin", - "chesnaught": "Chesnaught", - "fennekin": "Fennekin", - "braixen": "Braixen", - "delphox": "Delphox", - "froakie": "Froakie", - "frogadier": "Frogadier", - "greninja": "Greninja", - "bunnelby": "Bunnelby", - "diggersby": "Diggersby", - "fletchling": "Fletchling", - "fletchinder": "Fletchinder", - "talonflame": "Talonflame", - "scatterbug": "Scatterbug", - "spewpa": "Spewpa", - "vivillon": "Vivillon", - "litleo": "Litleo", - "pyroar": "Pyroar", - "flabebe": "Flabébé", - "floette": "Floette", - "florges": "Florges", - "skiddo": "Skiddo", - "gogoat": "Gogoat", - "pancham": "Pancham", - "pangoro": "Pangoro", - "furfrou": "Furfrou", - "espurr": "Espurr", - "meowstic": "Meowstic", - "honedge": "Honedge", - "doublade": "Doublade", - "aegislash": "Aegislash", - "spritzee": "Spritzee", - "aromatisse": "Aromatisse", - "swirlix": "Swirlix", - "slurpuff": "Slurpuff", - "inkay": "Inkay", - "malamar": "Malamar", - "binacle": "Binacle", - "barbaracle": "Barbaracle", - "skrelp": "Skrelp", - "dragalge": "Dragalge", - "clauncher": "Clauncher", - "clawitzer": "Clawitzer", - "helioptile": "Helioptile", - "heliolisk": "Heliolisk", - "tyrunt": "Tyrunt", - "tyrantrum": "Tyrantrum", - "amaura": "Amaura", - "aurorus": "Aurorus", - "sylveon": "Sylveon", - "hawlucha": "Hawlucha", - "dedenne": "Dedenne", - "carbink": "Carbink", - "goomy": "Goomy", - "sliggoo": "Sliggoo", - "goodra": "Goodra", - "klefki": "Klefki", - "phantump": "Phantump", - "trevenant": "Trevenant", - "pumpkaboo": "Pumpkaboo", - "gourgeist": "Gourgeist", - "bergmite": "Bergmite", - "avalugg": "Avalugg", - "noibat": "Noibat", - "noivern": "Noivern", - "xerneas": "Xerneas", - "yveltal": "Yveltal", - "zygarde": "Zygarde", - "diancie": "Diancie", - "hoopa": "Hoopa", - "volcanion": "Volcanion", - "rowlet": "Rowlet", - "dartrix": "Dartrix", - "decidueye": "Decidueye", - "litten": "Litten", - "torracat": "Torracat", - "incineroar": "Incineroar", - "popplio": "Popplio", - "brionne": "Brionne", - "primarina": "Primarina", - "pikipek": "Pikipek", - "trumbeak": "Trumbeak", - "toucannon": "Toucannon", - "yungoos": "Yungoos", - "gumshoos": "Gumshoos", - "grubbin": "Grubbin", - "charjabug": "Charjabug", - "vikavolt": "Vikavolt", - "crabrawler": "Crabrawler", - "crabominable": "Crabominable", - "oricorio": "Oricorio", - "cutiefly": "Cutiefly", - "ribombee": "Ribombee", - "rockruff": "Rockruff", - "lycanroc": "Lycanroc", - "wishiwashi": "Wishiwashi", - "mareanie": "Mareanie", - "toxapex": "Toxapex", - "mudbray": "Mudbray", - "mudsdale": "Mudsdale", - "dewpider": "Dewpider", - "araquanid": "Araquanid", - "fomantis": "Fomantis", - "lurantis": "Lurantis", - "morelull": "Morelull", - "shiinotic": "Shiinotic", - "salandit": "Salandit", - "salazzle": "Salazzle", - "stufful": "Stufful", - "bewear": "Bewear", - "bounsweet": "Bounsweet", - "steenee": "Steenee", - "tsareena": "Tsareena", - "comfey": "Comfey", - "oranguru": "Oranguru", - "passimian": "Passimian", - "wimpod": "Wimpod", - "golisopod": "Golisopod", - "sandygast": "Sandygast", - "palossand": "Palossand", - "pyukumuku": "Pyukumuku", - "type_null": "Tipo Nulo", - "silvally": "Silvally", - "minior": "Minior", - "komala": "Komala", - "turtonator": "Turtonator", - "togedemaru": "Togedemaru", - "mimikyu": "Mimikyu", - "bruxish": "Bruxish", - "drampa": "Drampa", - "dhelmise": "Dhelmise", - "jangmo_o": "Jangmo-o", - "hakamo_o": "Hakamo-o", - "kommo_o": "Kommo-o", - "tapu_koko": "Tapu Koko", - "tapu_lele": "Tapu Lele", - "tapu_bulu": "Tapu Bulu", - "tapu_fini": "Tapu Fini", - "cosmog": "Cosmog", - "cosmoem": "Cosmoem", - "solgaleo": "Solgaleo", - "lunala": "Lunala", - "nihilego": "Nihilego", - "buzzwole": "Buzzwole", - "pheromosa": "Pheromosa", - "xurkitree": "Xurkitree", - "celesteela": "Celesteela", - "kartana": "Kartana", - "guzzlord": "Guzzlord", - "necrozma": "Necrozma", - "magearna": "Magearna", - "marshadow": "Marshadow", - "poipole": "Poipole", - "naganadel": "Naganadel", - "stakataka": "Stakataka", - "blacephalon": "Blacephalon", - "zeraora": "Zeraora", - "meltan": "Meltan", - "melmetal": "Melmetal", - "grookey": "Grookey", - "thwackey": "Thwackey", - "rillaboom": "Rillaboom", - "scorbunny": "Scorbunny", - "raboot": "Raboot", - "cinderace": "Cinderace", - "sobble": "Sobble", - "drizzile": "Drizzile", - "inteleon": "Inteleon", - "skwovet": "Skwovet", - "greedent": "Greedent", - "rookidee": "Rookidee", - "corvisquire": "Corvisquire", - "corviknight": "Corviknight", - "blipbug": "Blipbug", - "dottler": "Dottler", - "orbeetle": "Orbeetle", - "nickit": "Nickit", - "thievul": "Thievul", - "gossifleur": "Gossifleur", - "eldegoss": "Eldegoss", - "wooloo": "Wooloo", - "dubwool": "Dubwool", - "chewtle": "Chewtle", - "drednaw": "Drednaw", - "yamper": "Yamper", - "boltund": "Boltund", - "rolycoly": "Rolycoly", - "carkol": "Carkol", - "coalossal": "Coalossal", - "applin": "Applin", - "flapple": "Flapple", - "appletun": "Appletun", - "silicobra": "Silicobra", - "sandaconda": "Sandaconda", - "cramorant": "Cramorant", - "arrokuda": "Arrokuda", - "barraskewda": "Barraskewda", - "toxel": "Toxel", - "toxtricity": "Toxtricity", - "sizzlipede": "Sizzlipede", - "centiskorch": "Centiskorch", - "clobbopus": "Clobbopus", - "grapploct": "Grapploct", - "sinistea": "Sinistea", - "polteageist": "Polteageist", - "hatenna": "Hatenna", - "hattrem": "Hattrem", - "hatterene": "Hatterene", - "impidimp": "Impidimp", - "morgrem": "Morgrem", - "grimmsnarl": "Grimmsnarl", - "obstagoon": "Obstagoon", - "perrserker": "Perrserker", - "cursola": "Cursola", - "sirfetchd": "Sirfetch'd", - "mr_rime": "Mr. Rime", - "runerigus": "Runerigus", - "milcery": "Milcery", - "alcremie": "Alcremie", - "falinks": "Falinks", - "pincurchin": "Pincurchin", - "snom": "Snom", - "frosmoth": "Frosmoth", - "stonjourner": "Stonjourner", - "eiscue": "Eiscue", - "indeedee": "Indeedee", - "morpeko": "Morpeko", - "cufant": "Cufant", - "copperajah": "Copperajah", - "dracozolt": "Dracozolt", - "arctozolt": "Arctozolt", - "dracovish": "Dracovish", - "arctovish": "Arctovish", - "duraludon": "Duraludon", - "dreepy": "Dreepy", - "drakloak": "Drakloak", - "dragapult": "Dragapult", - "zacian": "Zacian", - "zamazenta": "Zamazenta", - "eternatus": "Eternatus", - "kubfu": "Kubfu", - "urshifu": "Urshifu", - "zarude": "Zarude", - "regieleki": "Regieleki", - "regidrago": "Regidrago", - "glastrier": "Glastrier", - "spectrier": "Spectrier", - "calyrex": "Calyrex", - "wyrdeer": "Wyrdeer", - "kleavor": "Kleavor", - "ursaluna": "Ursaluna", - "basculegion": "Basculegion", - "sneasler": "Sneasler", - "overqwil": "Overqwil", - "enamorus": "Enamorus", - "sprigatito": "Sprigatito", - "floragato": "Floragato", - "meowscarada": "Meowscarada", - "fuecoco": "Fuecoco", - "crocalor": "Crocalor", - "skeledirge": "Skeledirge", - "quaxly": "Quaxly", - "quaxwell": "Quaxwell", - "quaquaval": "Quaquaval", - "lechonk": "Lechonk", - "oinkologne": "Oinkologne", - "tarountula": "Tarountula", - "spidops": "Spidops", - "nymble": "Nymble", - "lokix": "Lokix", - "pawmi": "Pawmi", - "pawmo": "Pawmo", - "pawmot": "Pawmot", - "tandemaus": "Tandemaus", - "maushold": "Maushold", - "fidough": "Fidough", - "dachsbun": "Dachsbun", - "smoliv": "Smoliv", - "dolliv": "Dolliv", - "arboliva": "Arboliva", - "squawkabilly": "Squawkabilly", - "nacli": "Nacli", - "naclstack": "Naclstack", - "garganacl": "Garganacl", - "charcadet": "Charcadet", - "armarouge": "Armarouge", - "ceruledge": "Ceruledge", - "tadbulb": "Tadbulb", - "bellibolt": "Bellibolt", - "wattrel": "Wattrel", - "kilowattrel": "Kilowattrel", - "maschiff": "Maschiff", - "mabosstiff": "Mabosstiff", - "shroodle": "Shroodle", - "grafaiai": "Grafaiai", - "bramblin": "Bramblin", - "brambleghast": "Brambleghast", - "toedscool": "Toedscool", - "toedscruel": "Toedscruel", - "klawf": "Klawf", - "capsakid": "Capsakid", - "scovillain": "Scovillain", - "rellor": "Rellor", - "rabsca": "Rabsca", - "flittle": "Flittle", - "espathra": "Espathra", - "tinkatink": "Tinkatink", - "tinkatuff": "Tinkatuff", - "tinkaton": "Tinkaton", - "wiglett": "Wiglett", - "wugtrio": "Wugtrio", - "bombirdier": "Bombirdier", - "finizen": "Finizen", - "palafin": "Palafin", - "varoom": "Varoom", - "revavroom": "Revavroom", - "cyclizar": "Cyclizar", - "orthworm": "Orthworm", - "glimmet": "Glimmet", - "glimmora": "Glimmora", - "greavard": "Greavard", - "houndstone": "Houndstone", - "flamigo": "Flamigo", - "cetoddle": "Cetoddle", - "cetitan": "Cetitan", - "veluza": "Veluza", - "dondozo": "Dondozo", - "tatsugiri": "Tatsugiri", - "annihilape": "Annihilape", - "clodsire": "Clodsire", - "farigiraf": "Farigiraf", - "dudunsparce": "Dudunsparce", - "kingambit": "Kingambit", - "great_tusk": "Presa Grande", - "scream_tail": "Cauda Brado", - "brute_bonnet": "Capuz Bruto", - "flutter_mane": "Juba Sopro", - "slither_wing": "Asa Rasteira", - "sandy_shocks": "Choque Areia", - "iron_treads": "Trilho Férreo", - "iron_bundle": "Pacote Férreo", - "iron_hands": "Mãos Férreas", - "iron_jugulis": "Jugulares Férreas", - "iron_moth": "Mariposa Férrea", - "iron_thorns": "Espinhos Férreos", - "frigibax": "Frigibax", - "arctibax": "Arctibax", - "baxcalibur": "Baxcalibur", - "gimmighoul": "Gimmighoul", - "gholdengo": "Gholdengo", - "wo_chien": "Wo-Chien", - "chien_pao": "Chien-Pao", - "ting_lu": "Ting-Lu", - "chi_yu": "Chi-Yu", - "roaring_moon": "Lua Estrondo", - "iron_valiant": "Valentia Férrea", - "koraidon": "Koraidon", - "miraidon": "Miraidon", - "walking_wake": "Onda Ando", - "iron_leaves": "Folhas Férreas", - "dipplin": "Dipplin", - "poltchageist": "Poltchageist", - "sinistcha": "Sinistcha", - "okidogi": "Okidogi", - "munkidori": "Munkidori", - "fezandipiti": "Fezandipiti", - "ogerpon": "Ogerpon", - "archaludon": "Archaludon", - "hydrapple": "Hydrapple", - "gouging_fire": "Fogo Corrosão", - "raging_bolt": "Raio Fúria", - "iron_boulder": "Rocha Férrea", - "iron_crown": "Chifres Férreos", - "terapagos": "Terapagos", - "pecharunt": "Pecharunt", - "alola_rattata": "Rattata", - "alola_raticate": "Raticate", - "alola_raichu": "Raichu", - "alola_sandshrew": "Sandshrew", - "alola_sandslash": "Sandslash", - "alola_vulpix": "Vulpix", - "alola_ninetales": "Ninetales", - "alola_diglett": "Diglett", - "alola_dugtrio": "Dugtrio", - "alola_meowth": "Meowth", - "alola_persian": "Persian", - "alola_geodude": "Geodude", - "alola_graveler": "Graveler", - "alola_golem": "Golem", - "alola_grimer": "Grimer", - "alola_muk": "Muk", - "alola_exeggutor": "Exeggutor", - "alola_marowak": "Marowak", - "eternal_floette": "Floette", - "galar_meowth": "Meowth", - "galar_ponyta": "Ponyta", - "galar_rapidash": "Rapidash", - "galar_slowpoke": "Slowpoke", - "galar_slowbro": "Slowbro", - "galar_farfetchd": "Farfetch'd", - "galar_weezing": "Weezing", - "galar_mr_mime": "Mr. Mime", - "galar_articuno": "Articuno", - "galar_zapdos": "Zapdos", - "galar_moltres": "Moltres", - "galar_slowking": "Slowking", - "galar_corsola": "Corsola", - "galar_zigzagoon": "Zigzagoon", - "galar_linoone": "Linoone", - "galar_darumaka": "Darumaka", - "galar_darmanitan": "Darmanitan", - "galar_yamask": "Yamask", - "galar_stunfisk": "Stunfisk", - "hisui_growlithe": "Growlithe", - "hisui_arcanine": "Arcanine", - "hisui_voltorb": "Voltorb", - "hisui_electrode": "Electrode", - "hisui_typhlosion": "Typhlosion", - "hisui_qwilfish": "Qwilfish", - "hisui_sneasel": "Sneasel", - "hisui_samurott": "Samurott", - "hisui_lilligant": "Lilligant", - "hisui_zorua": "Zorua", - "hisui_zoroark": "Zoroark", - "hisui_braviary": "Braviary", - "hisui_sliggoo": "Sliggoo", - "hisui_goodra": "Goodra", - "hisui_avalugg": "Avalugg", - "hisui_decidueye": "Decidueye", - "paldea_tauros": "Tauros", - "paldea_wooper": "Wooper", - "bloodmoon_ursaluna": "Ursaluna", + "bulbasaur": "Bulbasaur", + "ivysaur": "Ivysaur", + "venusaur": "Venusaur", + "charmander": "Charmander", + "charmeleon": "Charmeleon", + "charizard": "Charizard", + "squirtle": "Squirtle", + "wartortle": "Wartortle", + "blastoise": "Blastoise", + "caterpie": "Caterpie", + "metapod": "Metapod", + "butterfree": "Butterfree", + "weedle": "Weedle", + "kakuna": "Kakuna", + "beedrill": "Beedrill", + "pidgey": "Pidgey", + "pidgeotto": "Pidgeotto", + "pidgeot": "Pidgeot", + "rattata": "Rattata", + "raticate": "Raticate", + "spearow": "Spearow", + "fearow": "Fearow", + "ekans": "Ekans", + "arbok": "Arbok", + "pikachu": "Pikachu", + "raichu": "Raichu", + "sandshrew": "Sandshrew", + "sandslash": "Sandslash", + "nidoran_f": "Nidoran♀", + "nidorina": "Nidorina", + "nidoqueen": "Nidoqueen", + "nidoran_m": "Nidoran♂", + "nidorino": "Nidorino", + "nidoking": "Nidoking", + "clefairy": "Clefairy", + "clefable": "Clefable", + "vulpix": "Vulpix", + "ninetales": "Ninetales", + "jigglypuff": "Jigglypuff", + "wigglytuff": "Wigglytuff", + "zubat": "Zubat", + "golbat": "Golbat", + "oddish": "Oddish", + "gloom": "Gloom", + "vileplume": "Vileplume", + "paras": "Paras", + "parasect": "Parasect", + "venonat": "Venonat", + "venomoth": "Venomoth", + "diglett": "Diglett", + "dugtrio": "Dugtrio", + "meowth": "Meowth", + "persian": "Persian", + "psyduck": "Psyduck", + "golduck": "Golduck", + "mankey": "Mankey", + "primeape": "Primeape", + "growlithe": "Growlithe", + "arcanine": "Arcanine", + "poliwag": "Poliwag", + "poliwhirl": "Poliwhirl", + "poliwrath": "Poliwrath", + "abra": "Abra", + "kadabra": "Kadabra", + "alakazam": "Alakazam", + "machop": "Machop", + "machoke": "Machoke", + "machamp": "Machamp", + "bellsprout": "Bellsprout", + "weepinbell": "Weepinbell", + "victreebel": "Victreebel", + "tentacool": "Tentacool", + "tentacruel": "Tentacruel", + "geodude": "Geodude", + "graveler": "Graveler", + "golem": "Golem", + "ponyta": "Ponyta", + "rapidash": "Rapidash", + "slowpoke": "Slowpoke", + "slowbro": "Slowbro", + "magnemite": "Magnemite", + "magneton": "Magneton", + "farfetchd": "Farfetch'd", + "doduo": "Doduo", + "dodrio": "Dodrio", + "seel": "Seel", + "dewgong": "Dewgong", + "grimer": "Grimer", + "muk": "Muk", + "shellder": "Shellder", + "cloyster": "Cloyster", + "gastly": "Gastly", + "haunter": "Haunter", + "gengar": "Gengar", + "onix": "Onix", + "drowzee": "Drowzee", + "hypno": "Hypno", + "krabby": "Krabby", + "kingler": "Kingler", + "voltorb": "Voltorb", + "electrode": "Electrode", + "exeggcute": "Exeggcute", + "exeggutor": "Exeggutor", + "cubone": "Cubone", + "marowak": "Marowak", + "hitmonlee": "Hitmonlee", + "hitmonchan": "Hitmonchan", + "lickitung": "Lickitung", + "koffing": "Koffing", + "weezing": "Weezing", + "rhyhorn": "Rhyhorn", + "rhydon": "Rhydon", + "chansey": "Chansey", + "tangela": "Tangela", + "kangaskhan": "Kangaskhan", + "horsea": "Horsea", + "seadra": "Seadra", + "goldeen": "Goldeen", + "seaking": "Seaking", + "staryu": "Staryu", + "starmie": "Starmie", + "mr_mime": "Mr. Mime", + "scyther": "Scyther", + "jynx": "Jynx", + "electabuzz": "Electabuzz", + "magmar": "Magmar", + "pinsir": "Pinsir", + "tauros": "Tauros", + "magikarp": "Magikarp", + "gyarados": "Gyarados", + "lapras": "Lapras", + "ditto": "Ditto", + "eevee": "Eevee", + "vaporeon": "Vaporeon", + "jolteon": "Jolteon", + "flareon": "Flareon", + "porygon": "Porygon", + "omanyte": "Omanyte", + "omastar": "Omastar", + "kabuto": "Kabuto", + "kabutops": "Kabutops", + "aerodactyl": "Aerodactyl", + "snorlax": "Snorlax", + "articuno": "Articuno", + "zapdos": "Zapdos", + "moltres": "Moltres", + "dratini": "Dratini", + "dragonair": "Dragonair", + "dragonite": "Dragonite", + "mewtwo": "Mewtwo", + "mew": "Mew", + "chikorita": "Chikorita", + "bayleef": "Bayleef", + "meganium": "Meganium", + "cyndaquil": "Cyndaquil", + "quilava": "Quilava", + "typhlosion": "Typhlosion", + "totodile": "Totodile", + "croconaw": "Croconaw", + "feraligatr": "Feraligatr", + "sentret": "Sentret", + "furret": "Furret", + "hoothoot": "Hoothoot", + "noctowl": "Noctowl", + "ledyba": "Ledyba", + "ledian": "Ledian", + "spinarak": "Spinarak", + "ariados": "Ariados", + "crobat": "Crobat", + "chinchou": "Chinchou", + "lanturn": "Lanturn", + "pichu": "Pichu", + "cleffa": "Cleffa", + "igglybuff": "Igglybuff", + "togepi": "Togepi", + "togetic": "Togetic", + "natu": "Natu", + "xatu": "Xatu", + "mareep": "Mareep", + "flaaffy": "Flaaffy", + "ampharos": "Ampharos", + "bellossom": "Bellossom", + "marill": "Marill", + "azumarill": "Azumarill", + "sudowoodo": "Sudowoodo", + "politoed": "Politoed", + "hoppip": "Hoppip", + "skiploom": "Skiploom", + "jumpluff": "Jumpluff", + "aipom": "Aipom", + "sunkern": "Sunkern", + "sunflora": "Sunflora", + "yanma": "Yanma", + "wooper": "Wooper", + "quagsire": "Quagsire", + "espeon": "Espeon", + "umbreon": "Umbreon", + "murkrow": "Murkrow", + "slowking": "Slowking", + "misdreavus": "Misdreavus", + "unown": "Unown", + "wobbuffet": "Wobbuffet", + "girafarig": "Girafarig", + "pineco": "Pineco", + "forretress": "Forretress", + "dunsparce": "Dunsparce", + "gligar": "Gligar", + "steelix": "Steelix", + "snubbull": "Snubbull", + "granbull": "Granbull", + "qwilfish": "Qwilfish", + "scizor": "Scizor", + "shuckle": "Shuckle", + "heracross": "Heracross", + "sneasel": "Sneasel", + "teddiursa": "Teddiursa", + "ursaring": "Ursaring", + "slugma": "Slugma", + "magcargo": "Magcargo", + "swinub": "Swinub", + "piloswine": "Piloswine", + "corsola": "Corsola", + "remoraid": "Remoraid", + "octillery": "Octillery", + "delibird": "Delibird", + "mantine": "Mantine", + "skarmory": "Skarmory", + "houndour": "Houndour", + "houndoom": "Houndoom", + "kingdra": "Kingdra", + "phanpy": "Phanpy", + "donphan": "Donphan", + "porygon2": "Porygon2", + "stantler": "Stantler", + "smeargle": "Smeargle", + "tyrogue": "Tyrogue", + "hitmontop": "Hitmontop", + "smoochum": "Smoochum", + "elekid": "Elekid", + "magby": "Magby", + "miltank": "Miltank", + "blissey": "Blissey", + "raikou": "Raikou", + "entei": "Entei", + "suicune": "Suicune", + "larvitar": "Larvitar", + "pupitar": "Pupitar", + "tyranitar": "Tyranitar", + "lugia": "Lugia", + "ho_oh": "Ho-Oh", + "celebi": "Celebi", + "treecko": "Treecko", + "grovyle": "Grovyle", + "sceptile": "Sceptile", + "torchic": "Torchic", + "combusken": "Combusken", + "blaziken": "Blaziken", + "mudkip": "Mudkip", + "marshtomp": "Marshtomp", + "swampert": "Swampert", + "poochyena": "Poochyena", + "mightyena": "Mightyena", + "zigzagoon": "Zigzagoon", + "linoone": "Linoone", + "wurmple": "Wurmple", + "silcoon": "Silcoon", + "beautifly": "Beautifly", + "cascoon": "Cascoon", + "dustox": "Dustox", + "lotad": "Lotad", + "lombre": "Lombre", + "ludicolo": "Ludicolo", + "seedot": "Seedot", + "nuzleaf": "Nuzleaf", + "shiftry": "Shiftry", + "taillow": "Taillow", + "swellow": "Swellow", + "wingull": "Wingull", + "pelipper": "Pelipper", + "ralts": "Ralts", + "kirlia": "Kirlia", + "gardevoir": "Gardevoir", + "surskit": "Surskit", + "masquerain": "Masquerain", + "shroomish": "Shroomish", + "breloom": "Breloom", + "slakoth": "Slakoth", + "vigoroth": "Vigoroth", + "slaking": "Slaking", + "nincada": "Nincada", + "ninjask": "Ninjask", + "shedinja": "Shedinja", + "whismur": "Whismur", + "loudred": "Loudred", + "exploud": "Exploud", + "makuhita": "Makuhita", + "hariyama": "Hariyama", + "azurill": "Azurill", + "nosepass": "Nosepass", + "skitty": "Skitty", + "delcatty": "Delcatty", + "sableye": "Sableye", + "mawile": "Mawile", + "aron": "Aron", + "lairon": "Lairon", + "aggron": "Aggron", + "meditite": "Meditite", + "medicham": "Medicham", + "electrike": "Electrike", + "manectric": "Manectric", + "plusle": "Plusle", + "minun": "Minun", + "volbeat": "Volbeat", + "illumise": "Illumise", + "roselia": "Roselia", + "gulpin": "Gulpin", + "swalot": "Swalot", + "carvanha": "Carvanha", + "sharpedo": "Sharpedo", + "wailmer": "Wailmer", + "wailord": "Wailord", + "numel": "Numel", + "camerupt": "Camerupt", + "torkoal": "Torkoal", + "spoink": "Spoink", + "grumpig": "Grumpig", + "spinda": "Spinda", + "trapinch": "Trapinch", + "vibrava": "Vibrava", + "flygon": "Flygon", + "cacnea": "Cacnea", + "cacturne": "Cacturne", + "swablu": "Swablu", + "altaria": "Altaria", + "zangoose": "Zangoose", + "seviper": "Seviper", + "lunatone": "Lunatone", + "solrock": "Solrock", + "barboach": "Barboach", + "whiscash": "Whiscash", + "corphish": "Corphish", + "crawdaunt": "Crawdaunt", + "baltoy": "Baltoy", + "claydol": "Claydol", + "lileep": "Lileep", + "cradily": "Cradily", + "anorith": "Anorith", + "armaldo": "Armaldo", + "feebas": "Feebas", + "milotic": "Milotic", + "castform": "Castform", + "kecleon": "Kecleon", + "shuppet": "Shuppet", + "banette": "Banette", + "duskull": "Duskull", + "dusclops": "Dusclops", + "tropius": "Tropius", + "chimecho": "Chimecho", + "absol": "Absol", + "wynaut": "Wynaut", + "snorunt": "Snorunt", + "glalie": "Glalie", + "spheal": "Spheal", + "sealeo": "Sealeo", + "walrein": "Walrein", + "clamperl": "Clamperl", + "huntail": "Huntail", + "gorebyss": "Gorebyss", + "relicanth": "Relicanth", + "luvdisc": "Luvdisc", + "bagon": "Bagon", + "shelgon": "Shelgon", + "salamence": "Salamence", + "beldum": "Beldum", + "metang": "Metang", + "metagross": "Metagross", + "regirock": "Regirock", + "regice": "Regice", + "registeel": "Registeel", + "latias": "Latias", + "latios": "Latios", + "kyogre": "Kyogre", + "groudon": "Groudon", + "rayquaza": "Rayquaza", + "jirachi": "Jirachi", + "deoxys": "Deoxys", + "turtwig": "Turtwig", + "grotle": "Grotle", + "torterra": "Torterra", + "chimchar": "Chimchar", + "monferno": "Monferno", + "infernape": "Infernape", + "piplup": "Piplup", + "prinplup": "Prinplup", + "empoleon": "Empoleon", + "starly": "Starly", + "staravia": "Staravia", + "staraptor": "Staraptor", + "bidoof": "Bidoof", + "bibarel": "Bibarel", + "kricketot": "Kricketot", + "kricketune": "Kricketune", + "shinx": "Shinx", + "luxio": "Luxio", + "luxray": "Luxray", + "budew": "Budew", + "roserade": "Roserade", + "cranidos": "Cranidos", + "rampardos": "Rampardos", + "shieldon": "Shieldon", + "bastiodon": "Bastiodon", + "burmy": "Burmy", + "wormadam": "Wormadam", + "mothim": "Mothim", + "combee": "Combee", + "vespiquen": "Vespiquen", + "pachirisu": "Pachirisu", + "buizel": "Buizel", + "floatzel": "Floatzel", + "cherubi": "Cherubi", + "cherrim": "Cherrim", + "shellos": "Shellos", + "gastrodon": "Gastrodon", + "ambipom": "Ambipom", + "drifloon": "Drifloon", + "drifblim": "Drifblim", + "buneary": "Buneary", + "lopunny": "Lopunny", + "mismagius": "Mismagius", + "honchkrow": "Honchkrow", + "glameow": "Glameow", + "purugly": "Purugly", + "chingling": "Chingling", + "stunky": "Stunky", + "skuntank": "Skuntank", + "bronzor": "Bronzor", + "bronzong": "Bronzong", + "bonsly": "Bonsly", + "mime_jr": "Mime Jr.", + "happiny": "Happiny", + "chatot": "Chatot", + "spiritomb": "Spiritomb", + "gible": "Gible", + "gabite": "Gabite", + "garchomp": "Garchomp", + "munchlax": "Munchlax", + "riolu": "Riolu", + "lucario": "Lucario", + "hippopotas": "Hippopotas", + "hippowdon": "Hippowdon", + "skorupi": "Skorupi", + "drapion": "Drapion", + "croagunk": "Croagunk", + "toxicroak": "Toxicroak", + "carnivine": "Carnivine", + "finneon": "Finneon", + "lumineon": "Lumineon", + "mantyke": "Mantyke", + "snover": "Snover", + "abomasnow": "Abomasnow", + "weavile": "Weavile", + "magnezone": "Magnezone", + "lickilicky": "Lickilicky", + "rhyperior": "Rhyperior", + "tangrowth": "Tangrowth", + "electivire": "Electivire", + "magmortar": "Magmortar", + "togekiss": "Togekiss", + "yanmega": "Yanmega", + "leafeon": "Leafeon", + "glaceon": "Glaceon", + "gliscor": "Gliscor", + "mamoswine": "Mamoswine", + "porygon_z": "Porygon-Z", + "gallade": "Gallade", + "probopass": "Probopass", + "dusknoir": "Dusknoir", + "froslass": "Froslass", + "rotom": "Rotom", + "uxie": "Uxie", + "mesprit": "Mesprit", + "azelf": "Azelf", + "dialga": "Dialga", + "palkia": "Palkia", + "heatran": "Heatran", + "regigigas": "Regigigas", + "giratina": "Giratina", + "cresselia": "Cresselia", + "phione": "Phione", + "manaphy": "Manaphy", + "darkrai": "Darkrai", + "shaymin": "Shaymin", + "arceus": "Arceus", + "victini": "Victini", + "snivy": "Snivy", + "servine": "Servine", + "serperior": "Serperior", + "tepig": "Tepig", + "pignite": "Pignite", + "emboar": "Emboar", + "oshawott": "Oshawott", + "dewott": "Dewott", + "samurott": "Samurott", + "patrat": "Patrat", + "watchog": "Watchog", + "lillipup": "Lillipup", + "herdier": "Herdier", + "stoutland": "Stoutland", + "purrloin": "Purrloin", + "liepard": "Liepard", + "pansage": "Pansage", + "simisage": "Simisage", + "pansear": "Pansear", + "simisear": "Simisear", + "panpour": "Panpour", + "simipour": "Simipour", + "munna": "Munna", + "musharna": "Musharna", + "pidove": "Pidove", + "tranquill": "Tranquill", + "unfezant": "Unfezant", + "blitzle": "Blitzle", + "zebstrika": "Zebstrika", + "roggenrola": "Roggenrola", + "boldore": "Boldore", + "gigalith": "Gigalith", + "woobat": "Woobat", + "swoobat": "Swoobat", + "drilbur": "Drilbur", + "excadrill": "Excadrill", + "audino": "Audino", + "timburr": "Timburr", + "gurdurr": "Gurdurr", + "conkeldurr": "Conkeldurr", + "tympole": "Tympole", + "palpitoad": "Palpitoad", + "seismitoad": "Seismitoad", + "throh": "Throh", + "sawk": "Sawk", + "sewaddle": "Sewaddle", + "swadloon": "Swadloon", + "leavanny": "Leavanny", + "venipede": "Venipede", + "whirlipede": "Whirlipede", + "scolipede": "Scolipede", + "cottonee": "Cottonee", + "whimsicott": "Whimsicott", + "petilil": "Petilil", + "lilligant": "Lilligant", + "basculin": "Basculin", + "sandile": "Sandile", + "krokorok": "Krokorok", + "krookodile": "Krookodile", + "darumaka": "Darumaka", + "darmanitan": "Darmanitan", + "maractus": "Maractus", + "dwebble": "Dwebble", + "crustle": "Crustle", + "scraggy": "Scraggy", + "scrafty": "Scrafty", + "sigilyph": "Sigilyph", + "yamask": "Yamask", + "cofagrigus": "Cofagrigus", + "tirtouga": "Tirtouga", + "carracosta": "Carracosta", + "archen": "Archen", + "archeops": "Archeops", + "trubbish": "Trubbish", + "garbodor": "Garbodor", + "zorua": "Zorua", + "zoroark": "Zoroark", + "minccino": "Minccino", + "cinccino": "Cinccino", + "gothita": "Gothita", + "gothorita": "Gothorita", + "gothitelle": "Gothitelle", + "solosis": "Solosis", + "duosion": "Duosion", + "reuniclus": "Reuniclus", + "ducklett": "Ducklett", + "swanna": "Swanna", + "vanillite": "Vanillite", + "vanillish": "Vanillish", + "vanilluxe": "Vanilluxe", + "deerling": "Deerling", + "sawsbuck": "Sawsbuck", + "emolga": "Emolga", + "karrablast": "Karrablast", + "escavalier": "Escavalier", + "foongus": "Foongus", + "amoonguss": "Amoonguss", + "frillish": "Frillish", + "jellicent": "Jellicent", + "alomomola": "Alomomola", + "joltik": "Joltik", + "galvantula": "Galvantula", + "ferroseed": "Ferroseed", + "ferrothorn": "Ferrothorn", + "klink": "Klink", + "klang": "Klang", + "klinklang": "Klinklang", + "tynamo": "Tynamo", + "eelektrik": "Eelektrik", + "eelektross": "Eelektross", + "elgyem": "Elgyem", + "beheeyem": "Beheeyem", + "litwick": "Litwick", + "lampent": "Lampent", + "chandelure": "Chandelure", + "axew": "Axew", + "fraxure": "Fraxure", + "haxorus": "Haxorus", + "cubchoo": "Cubchoo", + "beartic": "Beartic", + "cryogonal": "Cryogonal", + "shelmet": "Shelmet", + "accelgor": "Accelgor", + "stunfisk": "Stunfisk", + "mienfoo": "Mienfoo", + "mienshao": "Mienshao", + "druddigon": "Druddigon", + "golett": "Golett", + "golurk": "Golurk", + "pawniard": "Pawniard", + "bisharp": "Bisharp", + "bouffalant": "Bouffalant", + "rufflet": "Rufflet", + "braviary": "Braviary", + "vullaby": "Vullaby", + "mandibuzz": "Mandibuzz", + "heatmor": "Heatmor", + "durant": "Durant", + "deino": "Deino", + "zweilous": "Zweilous", + "hydreigon": "Hydreigon", + "larvesta": "Larvesta", + "volcarona": "Volcarona", + "cobalion": "Cobalion", + "terrakion": "Terrakion", + "virizion": "Virizion", + "tornadus": "Tornadus", + "thundurus": "Thundurus", + "reshiram": "Reshiram", + "zekrom": "Zekrom", + "landorus": "Landorus", + "kyurem": "Kyurem", + "keldeo": "Keldeo", + "meloetta": "Meloetta", + "genesect": "Genesect", + "chespin": "Chespin", + "quilladin": "Quilladin", + "chesnaught": "Chesnaught", + "fennekin": "Fennekin", + "braixen": "Braixen", + "delphox": "Delphox", + "froakie": "Froakie", + "frogadier": "Frogadier", + "greninja": "Greninja", + "bunnelby": "Bunnelby", + "diggersby": "Diggersby", + "fletchling": "Fletchling", + "fletchinder": "Fletchinder", + "talonflame": "Talonflame", + "scatterbug": "Scatterbug", + "spewpa": "Spewpa", + "vivillon": "Vivillon", + "litleo": "Litleo", + "pyroar": "Pyroar", + "flabebe": "Flabébé", + "floette": "Floette", + "florges": "Florges", + "skiddo": "Skiddo", + "gogoat": "Gogoat", + "pancham": "Pancham", + "pangoro": "Pangoro", + "furfrou": "Furfrou", + "espurr": "Espurr", + "meowstic": "Meowstic", + "honedge": "Honedge", + "doublade": "Doublade", + "aegislash": "Aegislash", + "spritzee": "Spritzee", + "aromatisse": "Aromatisse", + "swirlix": "Swirlix", + "slurpuff": "Slurpuff", + "inkay": "Inkay", + "malamar": "Malamar", + "binacle": "Binacle", + "barbaracle": "Barbaracle", + "skrelp": "Skrelp", + "dragalge": "Dragalge", + "clauncher": "Clauncher", + "clawitzer": "Clawitzer", + "helioptile": "Helioptile", + "heliolisk": "Heliolisk", + "tyrunt": "Tyrunt", + "tyrantrum": "Tyrantrum", + "amaura": "Amaura", + "aurorus": "Aurorus", + "sylveon": "Sylveon", + "hawlucha": "Hawlucha", + "dedenne": "Dedenne", + "carbink": "Carbink", + "goomy": "Goomy", + "sliggoo": "Sliggoo", + "goodra": "Goodra", + "klefki": "Klefki", + "phantump": "Phantump", + "trevenant": "Trevenant", + "pumpkaboo": "Pumpkaboo", + "gourgeist": "Gourgeist", + "bergmite": "Bergmite", + "avalugg": "Avalugg", + "noibat": "Noibat", + "noivern": "Noivern", + "xerneas": "Xerneas", + "yveltal": "Yveltal", + "zygarde": "Zygarde", + "diancie": "Diancie", + "hoopa": "Hoopa", + "volcanion": "Volcanion", + "rowlet": "Rowlet", + "dartrix": "Dartrix", + "decidueye": "Decidueye", + "litten": "Litten", + "torracat": "Torracat", + "incineroar": "Incineroar", + "popplio": "Popplio", + "brionne": "Brionne", + "primarina": "Primarina", + "pikipek": "Pikipek", + "trumbeak": "Trumbeak", + "toucannon": "Toucannon", + "yungoos": "Yungoos", + "gumshoos": "Gumshoos", + "grubbin": "Grubbin", + "charjabug": "Charjabug", + "vikavolt": "Vikavolt", + "crabrawler": "Crabrawler", + "crabominable": "Crabominable", + "oricorio": "Oricorio", + "cutiefly": "Cutiefly", + "ribombee": "Ribombee", + "rockruff": "Rockruff", + "lycanroc": "Lycanroc", + "wishiwashi": "Wishiwashi", + "mareanie": "Mareanie", + "toxapex": "Toxapex", + "mudbray": "Mudbray", + "mudsdale": "Mudsdale", + "dewpider": "Dewpider", + "araquanid": "Araquanid", + "fomantis": "Fomantis", + "lurantis": "Lurantis", + "morelull": "Morelull", + "shiinotic": "Shiinotic", + "salandit": "Salandit", + "salazzle": "Salazzle", + "stufful": "Stufful", + "bewear": "Bewear", + "bounsweet": "Bounsweet", + "steenee": "Steenee", + "tsareena": "Tsareena", + "comfey": "Comfey", + "oranguru": "Oranguru", + "passimian": "Passimian", + "wimpod": "Wimpod", + "golisopod": "Golisopod", + "sandygast": "Sandygast", + "palossand": "Palossand", + "pyukumuku": "Pyukumuku", + "type_null": "Tipo Nulo", + "silvally": "Silvally", + "minior": "Minior", + "komala": "Komala", + "turtonator": "Turtonator", + "togedemaru": "Togedemaru", + "mimikyu": "Mimikyu", + "bruxish": "Bruxish", + "drampa": "Drampa", + "dhelmise": "Dhelmise", + "jangmo_o": "Jangmo-o", + "hakamo_o": "Hakamo-o", + "kommo_o": "Kommo-o", + "tapu_koko": "Tapu Koko", + "tapu_lele": "Tapu Lele", + "tapu_bulu": "Tapu Bulu", + "tapu_fini": "Tapu Fini", + "cosmog": "Cosmog", + "cosmoem": "Cosmoem", + "solgaleo": "Solgaleo", + "lunala": "Lunala", + "nihilego": "Nihilego", + "buzzwole": "Buzzwole", + "pheromosa": "Pheromosa", + "xurkitree": "Xurkitree", + "celesteela": "Celesteela", + "kartana": "Kartana", + "guzzlord": "Guzzlord", + "necrozma": "Necrozma", + "magearna": "Magearna", + "marshadow": "Marshadow", + "poipole": "Poipole", + "naganadel": "Naganadel", + "stakataka": "Stakataka", + "blacephalon": "Blacephalon", + "zeraora": "Zeraora", + "meltan": "Meltan", + "melmetal": "Melmetal", + "grookey": "Grookey", + "thwackey": "Thwackey", + "rillaboom": "Rillaboom", + "scorbunny": "Scorbunny", + "raboot": "Raboot", + "cinderace": "Cinderace", + "sobble": "Sobble", + "drizzile": "Drizzile", + "inteleon": "Inteleon", + "skwovet": "Skwovet", + "greedent": "Greedent", + "rookidee": "Rookidee", + "corvisquire": "Corvisquire", + "corviknight": "Corviknight", + "blipbug": "Blipbug", + "dottler": "Dottler", + "orbeetle": "Orbeetle", + "nickit": "Nickit", + "thievul": "Thievul", + "gossifleur": "Gossifleur", + "eldegoss": "Eldegoss", + "wooloo": "Wooloo", + "dubwool": "Dubwool", + "chewtle": "Chewtle", + "drednaw": "Drednaw", + "yamper": "Yamper", + "boltund": "Boltund", + "rolycoly": "Rolycoly", + "carkol": "Carkol", + "coalossal": "Coalossal", + "applin": "Applin", + "flapple": "Flapple", + "appletun": "Appletun", + "silicobra": "Silicobra", + "sandaconda": "Sandaconda", + "cramorant": "Cramorant", + "arrokuda": "Arrokuda", + "barraskewda": "Barraskewda", + "toxel": "Toxel", + "toxtricity": "Toxtricity", + "sizzlipede": "Sizzlipede", + "centiskorch": "Centiskorch", + "clobbopus": "Clobbopus", + "grapploct": "Grapploct", + "sinistea": "Sinistea", + "polteageist": "Polteageist", + "hatenna": "Hatenna", + "hattrem": "Hattrem", + "hatterene": "Hatterene", + "impidimp": "Impidimp", + "morgrem": "Morgrem", + "grimmsnarl": "Grimmsnarl", + "obstagoon": "Obstagoon", + "perrserker": "Perrserker", + "cursola": "Cursola", + "sirfetchd": "Sirfetch'd", + "mr_rime": "Mr. Rime", + "runerigus": "Runerigus", + "milcery": "Milcery", + "alcremie": "Alcremie", + "falinks": "Falinks", + "pincurchin": "Pincurchin", + "snom": "Snom", + "frosmoth": "Frosmoth", + "stonjourner": "Stonjourner", + "eiscue": "Eiscue", + "indeedee": "Indeedee", + "morpeko": "Morpeko", + "cufant": "Cufant", + "copperajah": "Copperajah", + "dracozolt": "Dracozolt", + "arctozolt": "Arctozolt", + "dracovish": "Dracovish", + "arctovish": "Arctovish", + "duraludon": "Duraludon", + "dreepy": "Dreepy", + "drakloak": "Drakloak", + "dragapult": "Dragapult", + "zacian": "Zacian", + "zamazenta": "Zamazenta", + "eternatus": "Eternatus", + "kubfu": "Kubfu", + "urshifu": "Urshifu", + "zarude": "Zarude", + "regieleki": "Regieleki", + "regidrago": "Regidrago", + "glastrier": "Glastrier", + "spectrier": "Spectrier", + "calyrex": "Calyrex", + "wyrdeer": "Wyrdeer", + "kleavor": "Kleavor", + "ursaluna": "Ursaluna", + "basculegion": "Basculegion", + "sneasler": "Sneasler", + "overqwil": "Overqwil", + "enamorus": "Enamorus", + "sprigatito": "Sprigatito", + "floragato": "Floragato", + "meowscarada": "Meowscarada", + "fuecoco": "Fuecoco", + "crocalor": "Crocalor", + "skeledirge": "Skeledirge", + "quaxly": "Quaxly", + "quaxwell": "Quaxwell", + "quaquaval": "Quaquaval", + "lechonk": "Lechonk", + "oinkologne": "Oinkologne", + "tarountula": "Tarountula", + "spidops": "Spidops", + "nymble": "Nymble", + "lokix": "Lokix", + "pawmi": "Pawmi", + "pawmo": "Pawmo", + "pawmot": "Pawmot", + "tandemaus": "Tandemaus", + "maushold": "Maushold", + "fidough": "Fidough", + "dachsbun": "Dachsbun", + "smoliv": "Smoliv", + "dolliv": "Dolliv", + "arboliva": "Arboliva", + "squawkabilly": "Squawkabilly", + "nacli": "Nacli", + "naclstack": "Naclstack", + "garganacl": "Garganacl", + "charcadet": "Charcadet", + "armarouge": "Armarouge", + "ceruledge": "Ceruledge", + "tadbulb": "Tadbulb", + "bellibolt": "Bellibolt", + "wattrel": "Wattrel", + "kilowattrel": "Kilowattrel", + "maschiff": "Maschiff", + "mabosstiff": "Mabosstiff", + "shroodle": "Shroodle", + "grafaiai": "Grafaiai", + "bramblin": "Bramblin", + "brambleghast": "Brambleghast", + "toedscool": "Toedscool", + "toedscruel": "Toedscruel", + "klawf": "Klawf", + "capsakid": "Capsakid", + "scovillain": "Scovillain", + "rellor": "Rellor", + "rabsca": "Rabsca", + "flittle": "Flittle", + "espathra": "Espathra", + "tinkatink": "Tinkatink", + "tinkatuff": "Tinkatuff", + "tinkaton": "Tinkaton", + "wiglett": "Wiglett", + "wugtrio": "Wugtrio", + "bombirdier": "Bombirdier", + "finizen": "Finizen", + "palafin": "Palafin", + "varoom": "Varoom", + "revavroom": "Revavroom", + "cyclizar": "Cyclizar", + "orthworm": "Orthworm", + "glimmet": "Glimmet", + "glimmora": "Glimmora", + "greavard": "Greavard", + "houndstone": "Houndstone", + "flamigo": "Flamigo", + "cetoddle": "Cetoddle", + "cetitan": "Cetitan", + "veluza": "Veluza", + "dondozo": "Dondozo", + "tatsugiri": "Tatsugiri", + "annihilape": "Annihilape", + "clodsire": "Clodsire", + "farigiraf": "Farigiraf", + "dudunsparce": "Dudunsparce", + "kingambit": "Kingambit", + "great_tusk": "Presa Grande", + "scream_tail": "Cauda Brado", + "brute_bonnet": "Capuz Bruto", + "flutter_mane": "Juba Sopro", + "slither_wing": "Asa Rasteira", + "sandy_shocks": "Choque Areia", + "iron_treads": "Trilho Férreo", + "iron_bundle": "Pacote Férreo", + "iron_hands": "Mãos Férreas", + "iron_jugulis": "Jugulares Férreas", + "iron_moth": "Mariposa Férrea", + "iron_thorns": "Espinhos Férreos", + "frigibax": "Frigibax", + "arctibax": "Arctibax", + "baxcalibur": "Baxcalibur", + "gimmighoul": "Gimmighoul", + "gholdengo": "Gholdengo", + "wo_chien": "Wo-Chien", + "chien_pao": "Chien-Pao", + "ting_lu": "Ting-Lu", + "chi_yu": "Chi-Yu", + "roaring_moon": "Lua Estrondo", + "iron_valiant": "Valentia Férrea", + "koraidon": "Koraidon", + "miraidon": "Miraidon", + "walking_wake": "Onda Ando", + "iron_leaves": "Folhas Férreas", + "dipplin": "Dipplin", + "poltchageist": "Poltchageist", + "sinistcha": "Sinistcha", + "okidogi": "Okidogi", + "munkidori": "Munkidori", + "fezandipiti": "Fezandipiti", + "ogerpon": "Ogerpon", + "archaludon": "Archaludon", + "hydrapple": "Hydrapple", + "gouging_fire": "Fogo Corrosão", + "raging_bolt": "Raio Fúria", + "iron_boulder": "Rocha Férrea", + "iron_crown": "Chifres Férreos", + "terapagos": "Terapagos", + "pecharunt": "Pecharunt", + "alola_rattata": "Rattata", + "alola_raticate": "Raticate", + "alola_raichu": "Raichu", + "alola_sandshrew": "Sandshrew", + "alola_sandslash": "Sandslash", + "alola_vulpix": "Vulpix", + "alola_ninetales": "Ninetales", + "alola_diglett": "Diglett", + "alola_dugtrio": "Dugtrio", + "alola_meowth": "Meowth", + "alola_persian": "Persian", + "alola_geodude": "Geodude", + "alola_graveler": "Graveler", + "alola_golem": "Golem", + "alola_grimer": "Grimer", + "alola_muk": "Muk", + "alola_exeggutor": "Exeggutor", + "alola_marowak": "Marowak", + "eternal_floette": "Floette", + "galar_meowth": "Meowth", + "galar_ponyta": "Ponyta", + "galar_rapidash": "Rapidash", + "galar_slowpoke": "Slowpoke", + "galar_slowbro": "Slowbro", + "galar_farfetchd": "Farfetch'd", + "galar_weezing": "Weezing", + "galar_mr_mime": "Mr. Mime", + "galar_articuno": "Articuno", + "galar_zapdos": "Zapdos", + "galar_moltres": "Moltres", + "galar_slowking": "Slowking", + "galar_corsola": "Corsola", + "galar_zigzagoon": "Zigzagoon", + "galar_linoone": "Linoone", + "galar_darumaka": "Darumaka", + "galar_darmanitan": "Darmanitan", + "galar_yamask": "Yamask", + "galar_stunfisk": "Stunfisk", + "hisui_growlithe": "Growlithe", + "hisui_arcanine": "Arcanine", + "hisui_voltorb": "Voltorb", + "hisui_electrode": "Electrode", + "hisui_typhlosion": "Typhlosion", + "hisui_qwilfish": "Qwilfish", + "hisui_sneasel": "Sneasel", + "hisui_samurott": "Samurott", + "hisui_lilligant": "Lilligant", + "hisui_zorua": "Zorua", + "hisui_zoroark": "Zoroark", + "hisui_braviary": "Braviary", + "hisui_sliggoo": "Sliggoo", + "hisui_goodra": "Goodra", + "hisui_avalugg": "Avalugg", + "hisui_decidueye": "Decidueye", + "paldea_tauros": "Tauros", + "paldea_wooper": "Wooper", + "bloodmoon_ursaluna": "Ursaluna", } as const; diff --git a/src/locales/pt_BR/splash-messages.ts b/src/locales/pt_BR/splash-messages.ts index 85c11300a9f7..498b64d1e011 100644 --- a/src/locales/pt_BR/splash-messages.ts +++ b/src/locales/pt_BR/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "Batalhas Ganhas!", - "joinTheDiscord": "Junte-se ao Discord!", - "infiniteLevels": "Níveis Infinitos!", - "everythingStacks": "Tudo Acumula!", - "optionalSaveScumming": "Você Pode Dar F5!", - "biomes": "35 Biomas!", - "openSource": "Código Aberto!", - "playWithSpeed": "Jogue na Velocidade 5x!", - "liveBugTesting": "Testamos os Bugs Ao Vivo!", - "heavyInfluence": "Grande Influência de RoR2!", - "pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!", - "nowWithMoreSalt": "O Choro é Livre!", - "infiniteFusionAtHome": "Infinite Fusion da Shopee!", - "brokenEggMoves": "Mov. de Ovo Apelões!", - "magnificent": "Magnífico!", - "mubstitute": "Mubstituto!", - "thatsCrazy": "Que Doidera!", - "oranceJuice": "Suco de Laranja!", - "questionableBalancing": "Balanceamento Questionável!", - "coolShaders": "Shader Maneiros!", - "aiFree": "Livre de IA!", - "suddenDifficultySpikes": "Ficou Difícil do Nada!", - "basedOnAnUnfinishedFlashGame": "Baseado num Jogo Online Inacabado!", - "moreAddictiveThanIntended": "Mais Viciante do que Planejado!", - "mostlyConsistentSeeds": "Consistente (na Maioria das Vezes)!", - "achievementPointsDontDoAnything": "Pontos de Conquista Não Fazem Nada!", - "youDoNotStartAtLevel": "Você Não Começa no Nível 2000!", - "dontTalkAboutTheManaphyEggIncident": "Não Fale do Incidente do Ovo de Manaphy!", - "alsoTryPokengine": "Também Jogue Pokéngine!", - "alsoTryEmeraldRogue": "Também Jogue Emerald Rogue!", - "alsoTryRadicalRed": "Também Jogue Radical Red!", - "eeveeExpo": "Eevee Expo!", - "ynoproject": "YNOproject!", -} as const; \ No newline at end of file + "battlesWon": "Batalhas Ganhas!", + "joinTheDiscord": "Junte-se ao Discord!", + "infiniteLevels": "Níveis Infinitos!", + "everythingStacks": "Tudo Acumula!", + "optionalSaveScumming": "Você Pode Dar F5!", + "biomes": "35 Biomas!", + "openSource": "Código Aberto!", + "playWithSpeed": "Jogue na Velocidade 5x!", + "liveBugTesting": "Testamos os Bugs Ao Vivo!", + "heavyInfluence": "Grande Influência de RoR2!", + "pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!", + "nowWithMoreSalt": "O Choro é Livre!", + "infiniteFusionAtHome": "Infinite Fusion da Shopee!", + "brokenEggMoves": "Mov. de Ovo Apelões!", + "magnificent": "Magnífico!", + "mubstitute": "Mubstituto!", + "thatsCrazy": "Que Doidera!", + "oranceJuice": "Suco de Laranja!", + "questionableBalancing": "Balanceamento Questionável!", + "coolShaders": "Shader Maneiros!", + "aiFree": "Livre de IA!", + "suddenDifficultySpikes": "Ficou Difícil do Nada!", + "basedOnAnUnfinishedFlashGame": "Baseado num Jogo Online Inacabado!", + "moreAddictiveThanIntended": "Mais Viciante do que Planejado!", + "mostlyConsistentSeeds": "Consistente (na Maioria das Vezes)!", + "achievementPointsDontDoAnything": "Pontos de Conquista Não Fazem Nada!", + "youDoNotStartAtLevel": "Você Não Começa no Nível 2000!", + "dontTalkAboutTheManaphyEggIncident": "Não Fale do Incidente do Ovo de Manaphy!", + "alsoTryPokengine": "Também Jogue Pokéngine!", + "alsoTryEmeraldRogue": "Também Jogue Emerald Rogue!", + "alsoTryRadicalRed": "Também Jogue Radical Red!", + "eeveeExpo": "Eevee Expo!", + "ynoproject": "YNOproject!", +} as const; diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index 7d77f48f290c..7ff0b24b04d9 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam": 'Começar com esses Pokémon?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "Crescimento:", - "ability": "Habilidade:", - "passive": "Passiva:", - "nature": "Natureza:", - "eggMoves": "Mov. de Ovo", - "start": "Iniciar", - "addToParty": "Adicionar à equipe", - "toggleIVs": "Mostrar IVs", - "manageMoves": "Mudar Movimentos", - "useCandies": "Usar Doces", - "selectMoveSwapOut": "Escolha um movimento para substituir.", - "selectMoveSwapWith": "Escolha o movimento que substituirá", - "unlockPassive": "Aprender Passiva", - "reduceCost": "Reduzir Custo", - "cycleShiny": "R: Mudar Shiny", - "cycleForm": 'F: Mudar Forma', - "cycleGender": 'G: Mudar Gênero', - "cycleAbility": 'E: Mudar Habilidade', - "cycleNature": 'N: Mudar Natureza', - "cycleVariant": 'V: Mudar Variante', - "enablePassive": "Ativar Passiva", - "disablePassive": "Desativar Passiva", - "locked": "Bloqueada", - "disabled": "Desativada", - "uncaught": "Não capturado" -} + "confirmStartTeam": "Começar com esses Pokémon?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "Crescimento:", + "ability": "Habilidade:", + "passive": "Passiva:", + "nature": "Natureza:", + "eggMoves": "Mov. de Ovo", + "start": "Iniciar", + "addToParty": "Adicionar à equipe", + "toggleIVs": "Mostrar IVs", + "manageMoves": "Mudar Movimentos", + "useCandies": "Usar Doces", + "selectMoveSwapOut": "Escolha um movimento para substituir.", + "selectMoveSwapWith": "Escolha o movimento que substituirá", + "unlockPassive": "Aprender Passiva", + "reduceCost": "Reduzir Custo", + "cycleShiny": "R: Mudar Shiny", + "cycleForm": "F: Mudar Forma", + "cycleGender": "G: Mudar Gênero", + "cycleAbility": "E: Mudar Habilidade", + "cycleNature": "N: Mudar Natureza", + "cycleVariant": "V: Mudar Variante", + "enablePassive": "Ativar Passiva", + "disablePassive": "Desativar Passiva", + "locked": "Bloqueada", + "disabled": "Desativada", + "uncaught": "Não capturado" +}; diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 96dc7d1934e8..add49fcb072f 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -2,243 +2,243 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "Elite dos Quatro", - "gym_leader": "Líder de Ginásio", - "gym_leader_female": "Líder de Ginásio", - "champion": "Campeão", - "rival": "Rival", - "professor": "Professor", - "frontier_brain": "Cérebro da Fronteira", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "Elite dos Quatro", + "gym_leader": "Líder de Ginásio", + "gym_leader_female": "Líder de Ginásio", + "champion": "Campeão", + "rival": "Rival", + "professor": "Professor", + "frontier_brain": "Cérebro da Fronteira", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "Trinador Ás", - "ace_trainer_female": "Trinadora Ás", - "ace_duo": "Dupla Ás", - "artist": "Artista", - "artist_female": "Artista", - "backpackers": "Mochileiros", - "backers": "Torcedores", - "backpacker": "Mochileiro", - "backpacker_female": "Mochileira", - "baker": "Padeira", - "battle_girl": "Lutadora", - "beauty": "Modelo", - "beginners": "Beginners", - "biker": "Motoqueiro", - "black_belt": "Faixa Preta", - "breeder": "Criador", - "breeder_female": "Criadora", - "breeders": "Criadores", - "clerk": "Funcionário", - "clerk_female": "Funcionária", - "colleagues": "Funcionários", - "crush_kin": "Casal Lutador", - "cyclist": "Ciclista", - "cyclist_female": "Ciclista", - "cyclists": "Ciclistas", - "dancer": "Dançarino", - "dancer_female": "Dançarina", - "depot_agent": "Ferroviário", - "doctor": "Doutor", - "doctor_female": "Doutora", - "fishermen": "Pescador", - "fishermen_female": "Pescadora", - "gentleman": "Cavalheiro", - "guitarist": "Guitarrista", - "guitarist_female": "Guitarrista", - "harlequin": "Arlequim", - "hiker": "Montanhista", - "hooligans": "Bandoleiro", - "hoopster": "Jogador de Basquete", - "infielder": "Jogador de Baseball", - "janitor": "Faxineiro", - "lady": "Dama", - "lass": "Senhorita", - "linebacker": "Zagueiro", - "maid": "Doméstica", - "madame": "Madame", - "medical_team": "Equipe Médica", - "musician": "Músico", - "hex_maniac": "Ocultista", - "nurse": "Enfermeira", - "nursery_aide": "Professora do Berçário", - "officer": "Policial", - "parasol_lady": "Moça de Sombrinha", - "pilot": "Piloto", - "pokéfan": "Pokefã", - "pokéfan_female": "Pokéfã", - "pokéfan_family": "Família Pokefã", - "preschooler": "Menino do Prezinho", - "preschooler_female": "Menina do Prezinho", - "preschoolers": "Alunos do Prezinho", - "psychic": "Médium", - "psychic_female": "Médium", - "psychics": "Médiuns", - "pokémon_ranger": "Guarda Pokémon", - "pokémon_ranger_female": "Guarda Pokémon", - "pokémon_rangers": "Guardas Pokémon", - "ranger": "Guarda", - "restaurant_staff": "Equipe do Restaurante", - "rich": "Burguês", - "rich_female": "Burguesa", - "rich_boy": "Riquinho", - "rich_couple": "Casal Burguês", - "rich_kid": "Garoto Rico", - "rich_kid_female": "Garota Rica", - "rich_kids": "Garotos Ricos", - "roughneck": "Arruaceiro", - "scientist": "Cientista", - "scientist_female": "Cientista", - "scientists": "Cientistas", - "smasher": "Tenista", - "snow_worker": "Operário da Neve", - "snow_worker_female": "Operária da Neve", - "striker": "Atacante", - "school_kid": "Estudante", - "school_kid_female": "Estudante", - "school_kids": "Estudantes", - "swimmer": "Nadador", - "swimmer_female": "Nadadora", - "swimmers": "Nadadores", - "twins": "Gêmeos", - "veteran": "Veterano", - "veteran_female": "Veterana", - "veteran_duo": "Dupla Veterana", - "waiter": "Garçom", - "waitress": "Garçonete", - "worker": "Operário", - "worker_female": "Operária", - "workers": "Operários", - "youngster": "Jovem", + "ace_trainer": "Trinador Ás", + "ace_trainer_female": "Trinadora Ás", + "ace_duo": "Dupla Ás", + "artist": "Artista", + "artist_female": "Artista", + "backpackers": "Mochileiros", + "backers": "Torcedores", + "backpacker": "Mochileiro", + "backpacker_female": "Mochileira", + "baker": "Padeira", + "battle_girl": "Lutadora", + "beauty": "Modelo", + "beginners": "Beginners", + "biker": "Motoqueiro", + "black_belt": "Faixa Preta", + "breeder": "Criador", + "breeder_female": "Criadora", + "breeders": "Criadores", + "clerk": "Funcionário", + "clerk_female": "Funcionária", + "colleagues": "Funcionários", + "crush_kin": "Casal Lutador", + "cyclist": "Ciclista", + "cyclist_female": "Ciclista", + "cyclists": "Ciclistas", + "dancer": "Dançarino", + "dancer_female": "Dançarina", + "depot_agent": "Ferroviário", + "doctor": "Doutor", + "doctor_female": "Doutora", + "fishermen": "Pescador", + "fishermen_female": "Pescadora", + "gentleman": "Cavalheiro", + "guitarist": "Guitarrista", + "guitarist_female": "Guitarrista", + "harlequin": "Arlequim", + "hiker": "Montanhista", + "hooligans": "Bandoleiro", + "hoopster": "Jogador de Basquete", + "infielder": "Jogador de Baseball", + "janitor": "Faxineiro", + "lady": "Dama", + "lass": "Senhorita", + "linebacker": "Zagueiro", + "maid": "Doméstica", + "madame": "Madame", + "medical_team": "Equipe Médica", + "musician": "Músico", + "hex_maniac": "Ocultista", + "nurse": "Enfermeira", + "nursery_aide": "Professora do Berçário", + "officer": "Policial", + "parasol_lady": "Moça de Sombrinha", + "pilot": "Piloto", + "pokéfan": "Pokefã", + "pokéfan_female": "Pokéfã", + "pokéfan_family": "Família Pokefã", + "preschooler": "Menino do Prezinho", + "preschooler_female": "Menina do Prezinho", + "preschoolers": "Alunos do Prezinho", + "psychic": "Médium", + "psychic_female": "Médium", + "psychics": "Médiuns", + "pokémon_ranger": "Guarda Pokémon", + "pokémon_ranger_female": "Guarda Pokémon", + "pokémon_rangers": "Guardas Pokémon", + "ranger": "Guarda", + "restaurant_staff": "Equipe do Restaurante", + "rich": "Burguês", + "rich_female": "Burguesa", + "rich_boy": "Riquinho", + "rich_couple": "Casal Burguês", + "rich_kid": "Garoto Rico", + "rich_kid_female": "Garota Rica", + "rich_kids": "Garotos Ricos", + "roughneck": "Arruaceiro", + "scientist": "Cientista", + "scientist_female": "Cientista", + "scientists": "Cientistas", + "smasher": "Tenista", + "snow_worker": "Operário da Neve", + "snow_worker_female": "Operária da Neve", + "striker": "Atacante", + "school_kid": "Estudante", + "school_kid_female": "Estudante", + "school_kids": "Estudantes", + "swimmer": "Nadador", + "swimmer_female": "Nadadora", + "swimmers": "Nadadores", + "twins": "Gêmeos", + "veteran": "Veterano", + "veteran_female": "Veterana", + "veteran_duo": "Dupla Veterana", + "waiter": "Garçom", + "waitress": "Garçonete", + "worker": "Operário", + "worker_female": "Operária", + "workers": "Operários", + "youngster": "Jovem", } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - "brock": "Brock", - "misty": "Misty", - "lt_surge": "Ten. Surge", - "erika": "Erika", - "janine": "Janine", - "sabrina": "Sabrina", - "blaine": "Blaine", - "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", - "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", - "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", - "gardenia": "Gardenia", - "maylene": "Maylene", - "crasher_wake": "Demolidor Wake", - "fantina": "Fantina", - "byron": "Byron", - "candice": "Candice", - "volkner": "Volkner", - "cilan": "Cilan", - "chili": "Chili", - "cress": "Cress", - "cheren": "Cheren", - "lenora": "Lenora", - "roxie": "Roxie", - "burgh": "Burgh", - "elesa": "Elesa", - "clay": "Clay", - "skyla": "Skyla", - "brycen": "Brycen", - "drayden": "Drayden", - "marlon": "Marlon", - "viola": "Viola", - "grant": "Grant", - "korrina": "Korrina", - "ramos": "Ramos", - "clemont": "Clemont", - "valerie": "Valerie", - "olympia": "Olympia", - "wulfric": "Wulfric", - "milo": "Milo", - "nessa": "Nessa", - "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", - "raihan": "Raihan", - "katy": "Katy", - "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", - "ryme": "Ryme", - "tulip": "Tulip", - "grusha": "Grusha", - "lorelei": "Lorelei", - "bruno": "Bruno", - "agatha": "Agatha", - "lance": "Lance", - "will": "Will", - "koga": "Koga", - "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", - "drake": "Drake", - "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", - "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", - "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", - "kahili": "Kahili", - "rika": "Rika", - "poppy": "Poppy", - "hassel": "Hassel", - "crispin": "Crispin", - "amarys": "Amarys", - "lacey": "Lacey", - "drayton": "Drayton", - "blue": "Blue", - "red": "Red", - "steven": "Steven", - "wallace": "Wallace", - "cynthia": "Cynthia", - "alder": "Alder", - "iris": "Iris", - "diantha": "Diantha", - "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", - "rival": "Finn", - "rival_female": "Ivy", -} as const; \ No newline at end of file + "brock": "Brock", + "misty": "Misty", + "lt_surge": "Ten. Surge", + "erika": "Erika", + "janine": "Janine", + "sabrina": "Sabrina", + "blaine": "Blaine", + "giovanni": "Giovanni", + "falkner": "Falkner", + "bugsy": "Bugsy", + "whitney": "Whitney", + "morty": "Morty", + "chuck": "Chuck", + "jasmine": "Jasmine", + "pryce": "Pryce", + "clair": "Clair", + "roxanne": "Roxanne", + "brawly": "Brawly", + "wattson": "Wattson", + "flannery": "Flannery", + "norman": "Norman", + "winona": "Winona", + "tate": "Tate", + "liza": "Liza", + "juan": "Juan", + "roark": "Roark", + "gardenia": "Gardenia", + "maylene": "Maylene", + "crasher_wake": "Demolidor Wake", + "fantina": "Fantina", + "byron": "Byron", + "candice": "Candice", + "volkner": "Volkner", + "cilan": "Cilan", + "chili": "Chili", + "cress": "Cress", + "cheren": "Cheren", + "lenora": "Lenora", + "roxie": "Roxie", + "burgh": "Burgh", + "elesa": "Elesa", + "clay": "Clay", + "skyla": "Skyla", + "brycen": "Brycen", + "drayden": "Drayden", + "marlon": "Marlon", + "viola": "Viola", + "grant": "Grant", + "korrina": "Korrina", + "ramos": "Ramos", + "clemont": "Clemont", + "valerie": "Valerie", + "olympia": "Olympia", + "wulfric": "Wulfric", + "milo": "Milo", + "nessa": "Nessa", + "kabu": "Kabu", + "bea": "Bea", + "allister": "Allister", + "opal": "Opal", + "bede": "Bede", + "gordie": "Gordie", + "melony": "Melony", + "piers": "Piers", + "marnie": "Marnie", + "raihan": "Raihan", + "katy": "Katy", + "brassius": "Brassius", + "iono": "Iono", + "kofu": "Kofu", + "larry": "Larry", + "ryme": "Ryme", + "tulip": "Tulip", + "grusha": "Grusha", + "lorelei": "Lorelei", + "bruno": "Bruno", + "agatha": "Agatha", + "lance": "Lance", + "will": "Will", + "koga": "Koga", + "karen": "Karen", + "sidney": "Sidney", + "phoebe": "Phoebe", + "glacia": "Glacia", + "drake": "Drake", + "aaron": "Aaron", + "bertha": "Bertha", + "flint": "Flint", + "lucian": "Lucian", + "shauntal": "Shauntal", + "marshal": "Marshal", + "grimsley": "Grimsley", + "caitlin": "Caitlin", + "malva": "Malva", + "siebold": "Siebold", + "wikstrom": "Wikstrom", + "drasna": "Drasna", + "hala": "Hala", + "molayne": "Molayne", + "olivia": "Olivia", + "acerola": "Acerola", + "kahili": "Kahili", + "rika": "Rika", + "poppy": "Poppy", + "hassel": "Hassel", + "crispin": "Crispin", + "amarys": "Amarys", + "lacey": "Lacey", + "drayton": "Drayton", + "blue": "Blue", + "red": "Red", + "steven": "Steven", + "wallace": "Wallace", + "cynthia": "Cynthia", + "alder": "Alder", + "iris": "Iris", + "diantha": "Diantha", + "hau": "Hau", + "geeta": "Geeta", + "nemona": "Nemona", + "kieran": "Kieran", + "leon": "Leon", + "rival": "Finn", + "rival_female": "Ivy", +} as const; diff --git a/src/locales/pt_BR/tutorial.ts b/src/locales/pt_BR/tutorial.ts index 1f79616481fe..0dd5c22e86d9 100644 --- a/src/locales/pt_BR/tutorial.ts +++ b/src/locales/pt_BR/tutorial.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `Bem-vindo ao PokéRogue! Este é um jogo Pokémon feito por fãs focado em batalhas com elementos roguelite. + "intro": `Bem-vindo ao PokéRogue! Este é um jogo Pokémon feito por fãs focado em batalhas com elementos roguelite. $Este jogo não é monetizado e não reivindicamos propriedade de Pokémon nem dos ativos protegidos $por direitos autorais usados. $O jogo é um trabalho em andamento, mas é totalmente jogável. @@ -9,30 +9,30 @@ export const tutorial: SimpleTranslationEntries = { $Se o jogo estiver rodando lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada $nas configurações do seu navegador.`, - "accessMenu": `Para acessar o menu, aperte M ou Esc. + "accessMenu": `Para acessar o menu, aperte M ou Esc. $O menu contém configurações e diversas funções.`, - "menu": `A partir deste menu, você pode acessar as configurações. + "menu": `A partir deste menu, você pode acessar as configurações. $Nas configurações, você pode alterar a velocidade do jogo, $o estilo da janela, entre outras opções. $Existem também vários outros recursos disponíveis aqui. $Não deixe de conferir todos eles!`, - "starterSelect": `Aqui você pode escolher seus iniciais.\nEsses serão os primeiro Pokémon da sua equipe. + "starterSelect": `Aqui você pode escolher seus iniciais.\nEsses serão os primeiro Pokémon da sua equipe. $Cada inicial tem seu custo. Sua equipe pode ter até 6\nmembros, desde que a soma dos custos não ultrapasse 10. $Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial. $Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou. $Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou. $Sempre capture vários Pokémon de várias espécies!`, - "pokerus": `Todo dia, 3 Pokémon iniciais ficam com uma borda roxa. + "pokerus": `Todo dia, 3 Pokémon iniciais ficam com uma borda roxa. $Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!`, - "statChange": `As mudanças de atributos se mantém após a batalha desde que o Pokémon não seja trocado. + "statChange": `As mudanças de atributos se mantém após a batalha desde que o Pokémon não seja trocado. $Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma. $Para ver as mudanças de atributos dos Pokémon em campo, mantena C ou Shift pressionado durante a batalha.`, - "selectItem": `Após cada batalha, você pode escolher entre 3 itens aleatórios. + "selectItem": `Após cada batalha, você pode escolher entre 3 itens aleatórios. $Você pode escolher apenas um deles. $Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes. $A maioria dos efeitos de itens não consumíveis podem ser acumulados. @@ -42,10 +42,10 @@ export const tutorial: SimpleTranslationEntries = { $Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe. $Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.`, - "eggGacha": `Aqui você pode trocar seus vouchers\npor ovos de Pokémon. + "eggGacha": `Aqui você pode trocar seus vouchers\npor ovos de Pokémon. $Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais para chocar. $Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais. $Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens. $Alguns Pokémon só podem ser obtidos através de seus ovos. $Temos 3 máquinas, cada uma com seu bônus específico,\nentão escolha a que mais lhe convém!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/voucher.ts b/src/locales/pt_BR/voucher.ts index 7af569e88cb9..f2bcb8d723ce 100644 --- a/src/locales/pt_BR/voucher.ts +++ b/src/locales/pt_BR/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Egg Voucher Gold", "locked": "Locked", "defeatTrainer": "Defeat {{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index de37cab78128..31027a691c3b 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "A luz do sol ficou clara!", - "sunnyLapseMessage": "A luz do sol está forte.", - "sunnyClearMessage": "A luz do sol sumiu.", - - "rainStartMessage": "Começou a chover!", - "rainLapseMessage": "A chuva continua forte.", - "rainClearMessage": "A chuva parou.", - - "sandstormStartMessage": "Uma tempestade de areia se formou!", - "sandstormLapseMessage": "A tempestade de areia é violenta.", - "sandstormClearMessage": "A tempestade de areia diminuiu.", - "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npela tempestade de areia!", - - "hailStartMessage": "Começou a chover granizo!", - "hailLapseMessage": "Granizo cai do céu.", - "hailClearMessage": "O granizo parou.", - "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npelo granizo!", - - "snowStartMessage": "Começou a nevar!", - "snowLapseMessage": "A neve continua caindo.", - "snowClearMessage": "Parou de nevar.", - - "fogStartMessage": "Uma névoa densa se formou!", - "fogLapseMessage": "A névoa continua forte.", - "fogClearMessage": "A névoa sumiu.", - - "heavyRainStartMessage": "Um temporal começou!", - "heavyRainLapseMessage": "O temporal continua forte.", - "heavyRainClearMessage": "O temporal parou.", + "sunnyStartMessage": "A luz do sol ficou clara!", + "sunnyLapseMessage": "A luz do sol está forte.", + "sunnyClearMessage": "A luz do sol sumiu.", + + "rainStartMessage": "Começou a chover!", + "rainLapseMessage": "A chuva continua forte.", + "rainClearMessage": "A chuva parou.", + + "sandstormStartMessage": "Uma tempestade de areia se formou!", + "sandstormLapseMessage": "A tempestade de areia é violenta.", + "sandstormClearMessage": "A tempestade de areia diminuiu.", + "sandstormDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npela tempestade de areia!", + + "hailStartMessage": "Começou a chover granizo!", + "hailLapseMessage": "Granizo cai do céu.", + "hailClearMessage": "O granizo parou.", + "hailDamageMessage": "{{pokemonPrefix}}{{pokemonName}} é atingido\npelo granizo!", + + "snowStartMessage": "Começou a nevar!", + "snowLapseMessage": "A neve continua caindo.", + "snowClearMessage": "Parou de nevar.", + + "fogStartMessage": "Uma névoa densa se formou!", + "fogLapseMessage": "A névoa continua forte.", + "fogClearMessage": "A névoa sumiu.", + + "heavyRainStartMessage": "Um temporal começou!", + "heavyRainLapseMessage": "O temporal continua forte.", + "heavyRainClearMessage": "O temporal parou.", - "harshSunStartMessage": "A luz do sol está escaldante!", - "harshSunLapseMessage": "A luz do sol é intensa.", - "harshSunClearMessage": "A luz do sol enfraqueceu.", - - "strongWindsStartMessage": "Ventos fortes apareceram!", - "strongWindsLapseMessage": "Os ventos fortes continuam.", - "strongWindsClearMessage": "Os ventos fortes diminuíram.", -} \ No newline at end of file + "harshSunStartMessage": "A luz do sol está escaldante!", + "harshSunLapseMessage": "A luz do sol é intensa.", + "harshSunClearMessage": "A luz do sol enfraqueceu.", + + "strongWindsStartMessage": "Ventos fortes apareceram!", + "strongWindsLapseMessage": "Os ventos fortes continuam.", + "strongWindsClearMessage": "Os ventos fortes diminuíram.", +}; diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index d40fad7a10a4..c8d4a2f6ee23 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!`, - 'badDreams': `{{pokemonName}} 被折磨着!` -} as const; \ No newline at end of file + "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!" +} as const; diff --git a/src/locales/zh_CN/battle-message-ui-handler.ts b/src/locales/zh_CN/battle-message-ui-handler.ts index 843a88860931..89be345c32f8 100644 --- a/src/locales/zh_CN/battle-message-ui-handler.ts +++ b/src/locales/zh_CN/battle-message-ui-handler.ts @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "相当好", "ivDecent": "一般般", "ivNoGood": "也许不行", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index f698fcc32ab2..5334bfe154bd 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "去吧! {{pokemonName}}!", "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", "switchQuestion": "要更换\n{{pokemonName}}吗?", - "trainerDefeated": `你击败了\n{{trainerName}}!`, + "trainerDefeated": "你击败了\n{{trainerName}}!", "pokemonCaught": "{{pokemonName}} 被抓住了!", "pokemon": "宝可梦", "sendOutPokemon": "上吧! {{pokemonName}}!", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "对 {{pokemonName}} 没有效果!!", "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", - "attackHitsCount": `击中 {{count}} 次!`, + "attackHitsCount": "击中 {{count}} 次!", "expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!", "levelUp": "{{pokemonName}} 升级到 Lv. {{level}}!", "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", @@ -46,11 +46,11 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "你不能从训练家战斗中逃跑!", "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", "runAwaySuccess": "你成功逃脱了!", - "runAwayCannotEscape": '你无法逃脱!', + "runAwayCannotEscape": "你无法逃脱!", "escapeVerbSwitch": "切换", "escapeVerbFlee": "逃跑", "notDisabled": "{{moveName}} 不再被禁用!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", "ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/berry.ts b/src/locales/zh_CN/berry.ts index 08b16d58e680..750a8bb2a2de 100644 --- a/src/locales/zh_CN/berry.ts +++ b/src/locales/zh_CN/berry.ts @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "苹野果", effect: "有招式的PP降到0时,恢复该招式10PP", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/command-ui-handler.ts b/src/locales/zh_CN/command-ui-handler.ts index 3c17efffd8ae..3ab08355aafc 100644 --- a/src/locales/zh_CN/command-ui-handler.ts +++ b/src/locales/zh_CN/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "战斗", - "ball": "精灵球", - "pokemon": "宝可梦", - "run": "逃跑", - "actionMessage": "要让\n{{pokemonName}} 做什么?", -} as const; \ No newline at end of file + "fight": "战斗", + "ball": "精灵球", + "pokemon": "宝可梦", + "run": "逃跑", + "actionMessage": "要让\n{{pokemonName}} 做什么?", +} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 2a01460b8559..be0960076550 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -24,29 +24,29 @@ import { voucher } from "./voucher"; export const zhCnConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - // splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + // splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/zh_CN/fight-ui-handler.ts b/src/locales/zh_CN/fight-ui-handler.ts index 8287a4d80db7..baa933f7ec00 100644 --- a/src/locales/zh_CN/fight-ui-handler.ts +++ b/src/locales/zh_CN/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "威力", - "accuracy": "命中", -} as const; \ No newline at end of file + "pp": "PP", + "power": "威力", + "accuracy": "命中", +} as const; diff --git a/src/locales/zh_CN/growth.ts b/src/locales/zh_CN/growth.ts index 49d6b59a9357..33a1dec8bb83 100644 --- a/src/locales/zh_CN/growth.ts +++ b/src/locales/zh_CN/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "最快", - "Fast": "较快", - "Medium_Fast": "快", - "Medium_Slow": "慢", - "Slow": "较慢", - "Fluctuating": "最慢" -} as const; \ No newline at end of file + "Erratic": "最快", + "Fast": "较快", + "Medium_Fast": "快", + "Medium_Slow": "慢", + "Slow": "较慢", + "Fluctuating": "最慢" +} as const; diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 22058daa7cb4..e3d0d158e33e 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": '游戏设置', - "ACHIEVEMENTS": "成就", - "STATS": "数据统计", - "VOUCHERS": "兑换券", - "EGG_LIST": "蛋列表", - "EGG_GACHA": "扭蛋机", - "MANAGE_DATA": "管理数据", - "COMMUNITY": "社区", - "SAVE_AND_QUIT": "保存并退出", - "LOG_OUT": "登出", - "slot": "存档位 {{slotNumber}}", - "importSession": "导入存档", - "importSlotSelect": "选择要导入到的存档位。", - "exportSession": "导出存档", - "exportSlotSelect": "选择要导出的存档位。", - "importData": "导入数据", - "exportData": "导出数据", - "cancel": "取消", - "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?" -} as const; \ No newline at end of file + "GAME_SETTINGS": "游戏设置", + "ACHIEVEMENTS": "成就", + "STATS": "数据统计", + "VOUCHERS": "兑换券", + "EGG_LIST": "蛋列表", + "EGG_GACHA": "扭蛋机", + "MANAGE_DATA": "管理数据", + "COMMUNITY": "社区", + "SAVE_AND_QUIT": "保存并退出", + "LOG_OUT": "登出", + "slot": "存档位 {{slotNumber}}", + "importSession": "导入存档", + "importSlotSelect": "选择要导入到的存档位。", + "exportSession": "导出存档", + "exportSlotSelect": "选择要导出的存档位。", + "importData": "导入数据", + "exportData": "导出数据", + "cancel": "取消", + "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?" +} as const; diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index c80f55eac61d..63b34811cc11 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "取消", - "continue": "继续", - "dailyRun": "每日挑战 (Beta)", - "loadGame": "加载游戏", - "newGame": "新游戏", - "selectGameMode": "选择一个游戏模式", - "logInOrCreateAccount": "登录或创建账户以开始游戏。无需邮箱!", - "username": "用户名", - "password": "密码", - "login": "登录", - "register": "注册", - "emptyUsername": "用户名不能为空", - "invalidLoginUsername": "提供的用户名无效", - "invalidRegisterUsername": "用户名只能包含字母、数字或下划线", - "invalidLoginPassword": "提供的密码无效", - "invalidRegisterPassword": "密码必须至少包含 6 个字符", - "usernameAlreadyUsed": "提供的用户名已被使用", - "accountNonExistent": "提供的用户不存在", - "unmatchingPassword": "提供的密码不匹配", - "passwordNotMatchingConfirmPassword": "密码必须与确认密码一致", - "confirmPassword": "确认密码", - "registrationAgeWarning": "注册即表示您确认您已年满 13 岁。", - "backToLogin": "返回登录", - "failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果\n问题仍然存在,请联系管理员。", - "sessionSuccess": "会话加载成功。", - "failedToLoadSession": "无法加载您的会话数据。它可能已损坏。", - "boyOrGirl": "你是男孩还是女孩?", - "boy": "男孩", - "girl": "女孩", - "evolving": "咦?\n{{pokemonName}} 开始进化了!", - "stoppedEvolving": "{{pokemonName}} 停止了进化。", - "pauseEvolutionsQuestion": "你确定要停止 {{pokemonName}} 的进化吗?\n你可以在队伍界面中重新进化。", - "evolutionsPaused": "{{pokemonName}} 的进化停止了。", - "evolutionDone": "恭喜!\n你的 {{pokemonName}} 进化成了 {{evolvedPokemonName}}!", - "dailyRankings": "每日排名", - "weeklyRankings": "每周排名", - "noRankings": "无排名", - "loading": "加载中...", - "playersOnline": "在线玩家", - "empty": "空", - "yes": "是", - "no": "否", -} as const; \ No newline at end of file + "cancel": "取消", + "continue": "继续", + "dailyRun": "每日挑战 (Beta)", + "loadGame": "加载游戏", + "newGame": "新游戏", + "selectGameMode": "选择一个游戏模式", + "logInOrCreateAccount": "登录或创建账户以开始游戏。无需邮箱!", + "username": "用户名", + "password": "密码", + "login": "登录", + "register": "注册", + "emptyUsername": "用户名不能为空", + "invalidLoginUsername": "提供的用户名无效", + "invalidRegisterUsername": "用户名只能包含字母、数字或下划线", + "invalidLoginPassword": "提供的密码无效", + "invalidRegisterPassword": "密码必须至少包含 6 个字符", + "usernameAlreadyUsed": "提供的用户名已被使用", + "accountNonExistent": "提供的用户不存在", + "unmatchingPassword": "提供的密码不匹配", + "passwordNotMatchingConfirmPassword": "密码必须与确认密码一致", + "confirmPassword": "确认密码", + "registrationAgeWarning": "注册即表示您确认您已年满 13 岁。", + "backToLogin": "返回登录", + "failedToLoadSaveData": "读取存档数据失败。请重新加载页面。如果\n问题仍然存在,请联系管理员。", + "sessionSuccess": "会话加载成功。", + "failedToLoadSession": "无法加载您的会话数据。它可能已损坏。", + "boyOrGirl": "你是男孩还是女孩?", + "boy": "男孩", + "girl": "女孩", + "evolving": "咦?\n{{pokemonName}} 开始进化了!", + "stoppedEvolving": "{{pokemonName}} 停止了进化。", + "pauseEvolutionsQuestion": "你确定要停止 {{pokemonName}} 的进化吗?\n你可以在队伍界面中重新进化。", + "evolutionsPaused": "{{pokemonName}} 的进化停止了。", + "evolutionDone": "恭喜!\n你的 {{pokemonName}} 进化成了 {{evolvedPokemonName}}!", + "dailyRankings": "每日排名", + "weeklyRankings": "每周排名", + "noRankings": "无排名", + "loading": "加载中...", + "playersOnline": "在线玩家", + "empty": "空", + "yes": "是", + "no": "否", +} as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 285f72ee3ae9..9103b291ad4e 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -384,4 +384,4 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "冰冻卡带", "DOUSE_DRIVE": "水流卡带", }, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index 1432fde5b7f4..1268bcc985c2 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "邪毒锁链", effect: "用由毒形成的锁链缠住对手\n注入毒素加以侵蚀。有时会\n让对手陷入剧毒状态", } -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/nature.ts b/src/locales/zh_CN/nature.ts index 00beeefdfa4f..80fd8d89869f 100644 --- a/src/locales/zh_CN/nature.ts +++ b/src/locales/zh_CN/nature.ts @@ -26,4 +26,4 @@ export const nature: SimpleTranslationEntries = { "Sassy": "自大", "Careful": "慎重", "Quirky": "浮躁" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/pokeball.ts b/src/locales/zh_CN/pokeball.ts index a3260946a825..6bf20f7e276a 100644 --- a/src/locales/zh_CN/pokeball.ts +++ b/src/locales/zh_CN/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "精灵球", - "greatBall": "超级球", - "ultraBall": "高级球", - "rogueBall": "肉鸽球", - "masterBall": "大师球", - "luxuryBall": "豪华球", -} as const; \ No newline at end of file + "pokeBall": "精灵球", + "greatBall": "超级球", + "ultraBall": "高级球", + "rogueBall": "肉鸽球", + "masterBall": "大师球", + "luxuryBall": "豪华球", +} as const; diff --git a/src/locales/zh_CN/pokemon-info.ts b/src/locales/zh_CN/pokemon-info.ts index 09c843bb8c2d..4c12acc3e67b 100644 --- a/src/locales/zh_CN/pokemon-info.ts +++ b/src/locales/zh_CN/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "最大HP", - "HPshortened": "最大HP", - "ATK": "攻击", - "ATKshortened": "攻击", - "DEF": "防御", - "DEFshortened": "防御", - "SPATK": "特攻", - "SPATKshortened": "特攻", - "SPDEF": "特防", - "SPDEFshortened": "特防", - "SPD": "速度", - "SPDshortened": "速度" - }, + Stat: { + "HP": "最大HP", + "HPshortened": "最大HP", + "ATK": "攻击", + "ATKshortened": "攻击", + "DEF": "防御", + "DEFshortened": "防御", + "SPATK": "特攻", + "SPATKshortened": "特攻", + "SPDEF": "特防", + "SPDEFshortened": "特防", + "SPD": "速度", + "SPDshortened": "速度" + }, - Type: { - "UNKNOWN": "未知", - "NORMAL": "一般", - "FIGHTING": "格斗", - "FLYING": "飞行", - "POISON": "毒", - "GROUND": "地面", - "ROCK": "岩石", - "BUG": "虫", - "GHOST": "幽灵", - "STEEL": "钢", - "FIRE": "火", - "WATER": "水", - "GRASS": "草", - "ELECTRIC": "电", - "PSYCHIC": "超能力", - "ICE": "冰", - "DRAGON": "龙", - "DARK": "恶", - "FAIRY": "妖精", - "STELLAR": "星晶", - }, -} as const; \ No newline at end of file + Type: { + "UNKNOWN": "未知", + "NORMAL": "一般", + "FIGHTING": "格斗", + "FLYING": "飞行", + "POISON": "毒", + "GROUND": "地面", + "ROCK": "岩石", + "BUG": "虫", + "GHOST": "幽灵", + "STEEL": "钢", + "FIRE": "火", + "WATER": "水", + "GRASS": "草", + "ELECTRIC": "电", + "PSYCHIC": "超能力", + "ICE": "冰", + "DRAGON": "龙", + "DARK": "恶", + "FAIRY": "妖精", + "STELLAR": "星晶", + }, +} as const; diff --git a/src/locales/zh_CN/pokemon.ts b/src/locales/zh_CN/pokemon.ts index 9aa0c27bc4ec..6d6e372046ea 100644 --- a/src/locales/zh_CN/pokemon.ts +++ b/src/locales/zh_CN/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "妙蛙种子", - "ivysaur": "妙蛙草", - "venusaur": "妙蛙花", - "charmander": "小火龙", - "charmeleon": "火恐龙", - "charizard": "喷火龙", - "squirtle": "杰尼龟", - "wartortle": "卡咪龟", - "blastoise": "水箭龟", - "caterpie": "绿毛虫", - "metapod": "铁甲蛹", - "butterfree": "巴大蝶", - "weedle": "独角虫", - "kakuna": "铁壳蛹", - "beedrill": "大针蜂", - "pidgey": "波波", - "pidgeotto": "比比鸟", - "pidgeot": "大比鸟", - "rattata": "小拉达", - "raticate": "拉达", - "spearow": "烈雀", - "fearow": "大嘴雀", - "ekans": "阿柏蛇", - "arbok": "阿柏怪", - "pikachu": "皮卡丘", - "raichu": "雷丘", - "sandshrew": "穿山鼠", - "sandslash": "穿山王", - "nidoran_f": "尼多兰", - "nidorina": "尼多娜", - "nidoqueen": "尼多后", - "nidoran_m": "尼多朗", - "nidorino": "尼多力诺", - "nidoking": "尼多王", - "clefairy": "皮皮", - "clefable": "皮可西", - "vulpix": "六尾", - "ninetales": "九尾", - "jigglypuff": "胖丁", - "wigglytuff": "胖可丁", - "zubat": "超音蝠", - "golbat": "大嘴蝠", - "oddish": "走路草", - "gloom": "臭臭花", - "vileplume": "霸王花", - "paras": "派拉斯", - "parasect": "派拉斯特", - "venonat": "毛球", - "venomoth": "摩鲁蛾", - "diglett": "地鼠", - "dugtrio": "三地鼠", - "meowth": "喵喵", - "persian": "猫老大", - "psyduck": "可达鸭", - "golduck": "哥达鸭", - "mankey": "猴怪", - "primeape": "火暴猴", - "growlithe": "卡蒂狗", - "arcanine": "风速狗", - "poliwag": "蚊香蝌蚪", - "poliwhirl": "蚊香君", - "poliwrath": "蚊香泳士", - "abra": "凯西", - "kadabra": "勇基拉", - "alakazam": "胡地", - "machop": "腕力", - "machoke": "豪力", - "machamp": "怪力", - "bellsprout": "喇叭芽", - "weepinbell": "口呆花", - "victreebel": "大食花", - "tentacool": "玛瑙水母", - "tentacruel": "毒刺水母", - "geodude": "小拳石", - "graveler": "隆隆石", - "golem": "隆隆岩", - "ponyta": "小火马", - "rapidash": "烈焰马", - "slowpoke": "呆呆兽", - "slowbro": "呆壳兽", - "magnemite": "小磁怪", - "magneton": "三合一磁怪", - "farfetchd": "大葱鸭", - "doduo": "嘟嘟", - "dodrio": "嘟嘟利", - "seel": "小海狮", - "dewgong": "白海狮", - "grimer": "臭泥", - "muk": "臭臭泥", - "shellder": "大舌贝", - "cloyster": "刺甲贝", - "gastly": "鬼斯", - "haunter": "鬼斯通", - "gengar": "耿鬼", - "onix": "大岩蛇", - "drowzee": "催眠貘", - "hypno": "引梦貘人", - "krabby": "大钳蟹", - "kingler": "巨钳蟹", - "voltorb": "霹雳电球", - "electrode": "顽皮雷弹", - "exeggcute": "蛋蛋", - "exeggutor": "椰蛋树", - "cubone": "卡拉卡拉", - "marowak": "嘎啦嘎啦", - "hitmonlee": "飞腿郎", - "hitmonchan": "快拳郎", - "lickitung": "大舌头", - "koffing": "瓦斯弹", - "weezing": "双弹瓦斯", - "rhyhorn": "独角犀牛", - "rhydon": "钻角犀兽", - "chansey": "吉利蛋", - "tangela": "蔓藤怪", - "kangaskhan": "袋兽", - "horsea": "墨海马", - "seadra": "海刺龙", - "goldeen": "角金鱼", - "seaking": "金鱼王", - "staryu": "海星星", - "starmie": "宝石海星", - "mr_mime": "魔墙人偶", - "scyther": "飞天螳螂", - "jynx": "迷唇姐", - "electabuzz": "电击兽", - "magmar": "鸭嘴火兽", - "pinsir": "凯罗斯", - "tauros": "肯泰罗", - "magikarp": "鲤鱼王", - "gyarados": "暴鲤龙", - "lapras": "拉普拉斯", - "ditto": "百变怪", - "eevee": "伊布", - "vaporeon": "水伊布", - "jolteon": "雷伊布", - "flareon": "火伊布", - "porygon": "多边兽", - "omanyte": "菊石兽", - "omastar": "多刺菊石兽", - "kabuto": "化石盔", - "kabutops": "镰刀盔", - "aerodactyl": "化石翼龙", - "snorlax": "卡比兽", - "articuno": "急冻鸟", - "zapdos": "闪电鸟", - "moltres": "火焰鸟", - "dratini": "迷你龙", - "dragonair": "哈克龙", - "dragonite": "快龙", - "mewtwo": "超梦", - "mew": "梦幻", - "chikorita": "菊草叶", - "bayleef": "月桂叶", - "meganium": "大竺葵", - "cyndaquil": "火球鼠", - "quilava": "火岩鼠", - "typhlosion": "火暴兽", - "totodile": "小锯鳄", - "croconaw": "蓝鳄", - "feraligatr": "大力鳄", - "sentret": "尾立", - "furret": "大尾立", - "hoothoot": "咕咕", - "noctowl": "猫头夜鹰", - "ledyba": "芭瓢虫", - "ledian": "安瓢虫", - "spinarak": "圆丝蛛", - "ariados": "阿利多斯", - "crobat": "叉字蝠", - "chinchou": "灯笼鱼", - "lanturn": "电灯怪", - "pichu": "皮丘", - "cleffa": "皮宝宝", - "igglybuff": "宝宝丁", - "togepi": "波克比", - "togetic": "波克基古", - "natu": "天然雀", - "xatu": "天然鸟", - "mareep": "咩利羊", - "flaaffy": "茸茸羊", - "ampharos": "电龙", - "bellossom": "美丽花", - "marill": "玛力露", - "azumarill": "玛力露丽", - "sudowoodo": "树才怪", - "politoed": "蚊香蛙皇", - "hoppip": "毽子草", - "skiploom": "毽子花", - "jumpluff": "毽子棉", - "aipom": "长尾怪手", - "sunkern": "向日种子", - "sunflora": "向日花怪", - "yanma": "蜻蜻蜓", - "wooper": "乌波", - "quagsire": "沼王", - "espeon": "太阳伊布", - "umbreon": "月亮伊布", - "murkrow": "黑暗鸦", - "slowking": "呆呆王", - "misdreavus": "梦妖", - "unown": "未知图腾", - "wobbuffet": "果然翁", - "girafarig": "麒麟奇", - "pineco": "榛果球", - "forretress": "佛烈托斯", - "dunsparce": "土龙弟弟", - "gligar": "天蝎", - "steelix": "大钢蛇", - "snubbull": "布鲁", - "granbull": "布鲁皇", - "qwilfish": "千针鱼", - "scizor": "巨钳螳螂", - "shuckle": "壶壶", - "heracross": "赫拉克罗斯", - "sneasel": "狃拉", - "teddiursa": "熊宝宝", - "ursaring": "圈圈熊", - "slugma": "熔岩虫", - "magcargo": "熔岩蜗牛", - "swinub": "小山猪", - "piloswine": "长毛猪", - "corsola": "太阳珊瑚", - "remoraid": "铁炮鱼", - "octillery": "章鱼桶", - "delibird": "信使鸟", - "mantine": "巨翅飞鱼", - "skarmory": "盔甲鸟", - "houndour": "戴鲁比", - "houndoom": "黑鲁加", - "kingdra": "刺龙王", - "phanpy": "小小象", - "donphan": "顿甲", - "porygon2": "多边兽2型", - "stantler": "惊角鹿", - "smeargle": "图图犬", - "tyrogue": "无畏小子", - "hitmontop": "战舞郎", - "smoochum": "迷唇娃", - "elekid": "电击怪", - "magby": "鸭嘴宝宝", - "miltank": "大奶罐", - "blissey": "幸福蛋", - "raikou": "雷公", - "entei": "炎帝", - "suicune": "水君", - "larvitar": "幼基拉斯", - "pupitar": "沙基拉斯", - "tyranitar": "班基拉斯", - "lugia": "洛奇亚", - "ho_oh": "凤王", - "celebi": "时拉比", - "treecko": "木守宫", - "grovyle": "森林蜥蜴", - "sceptile": "蜥蜴王", - "torchic": "火稚鸡", - "combusken": "力壮鸡", - "blaziken": "火焰鸡", - "mudkip": "水跃鱼", - "marshtomp": "沼跃鱼", - "swampert": "巨沼怪", - "poochyena": "土狼犬", - "mightyena": "大狼犬", - "zigzagoon": "蛇纹熊", - "linoone": "直冲熊", - "wurmple": "刺尾虫", - "silcoon": "甲壳茧", - "beautifly": "狩猎凤蝶", - "cascoon": "盾甲茧", - "dustox": "毒粉蛾", - "lotad": "莲叶童子", - "lombre": "莲帽小童", - "ludicolo": "乐天河童", - "seedot": "橡实果", - "nuzleaf": "长鼻叶", - "shiftry": "狡猾天狗", - "taillow": "傲骨燕", - "swellow": "大王燕", - "wingull": "长翅鸥", - "pelipper": "大嘴鸥", - "ralts": "拉鲁拉丝", - "kirlia": "奇鲁莉安", - "gardevoir": "沙奈朵", - "surskit": "溜溜糖球", - "masquerain": "雨翅蛾", - "shroomish": "蘑蘑菇", - "breloom": "斗笠菇", - "slakoth": "懒人獭", - "vigoroth": "过动猿", - "slaking": "请假王", - "nincada": "土居忍士", - "ninjask": "铁面忍者", - "shedinja": "脱壳忍者", - "whismur": "咕妞妞", - "loudred": "吼爆弹", - "exploud": "爆音怪", - "makuhita": "幕下力士", - "hariyama": "铁掌力士", - "azurill": "露力丽", - "nosepass": "朝北鼻", - "skitty": "向尾喵", - "delcatty": "优雅猫", - "sableye": "勾魂眼", - "mawile": "大嘴娃", - "aron": "可可多拉", - "lairon": "可多拉", - "aggron": "波士可多拉", - "meditite": "玛沙那", - "medicham": "恰雷姆", - "electrike": "落雷兽", - "manectric": "雷电兽", - "plusle": "正电拍拍", - "minun": "负电拍拍", - "volbeat": "电萤虫", - "illumise": "甜甜萤", - "roselia": "毒蔷薇", - "gulpin": "溶食兽", - "swalot": "吞食兽", - "carvanha": "利牙鱼", - "sharpedo": "巨牙鲨", - "wailmer": "吼吼鲸", - "wailord": "吼鲸王", - "numel": "呆火驼", - "camerupt": "喷火驼", - "torkoal": "煤炭龟", - "spoink": "跳跳猪", - "grumpig": "噗噗猪", - "spinda": "晃晃斑", - "trapinch": "大颚蚁", - "vibrava": "超音波幼虫", - "flygon": "沙漠蜻蜓", - "cacnea": "刺球仙人掌", - "cacturne": "梦歌仙人掌", - "swablu": "青绵鸟", - "altaria": "七夕青鸟", - "zangoose": "猫鼬斩", - "seviper": "饭匙蛇", - "lunatone": "月石", - "solrock": "太阳岩", - "barboach": "泥泥鳅", - "whiscash": "鲶鱼王", - "corphish": "龙虾小兵", - "crawdaunt": "铁螯龙虾", - "baltoy": "天秤偶", - "claydol": "念力土偶", - "lileep": "触手百合", - "cradily": "摇篮百合", - "anorith": "太古羽虫", - "armaldo": "太古盔甲", - "feebas": "丑丑鱼", - "milotic": "美纳斯", - "castform": "飘浮泡泡", - "kecleon": "变隐龙", - "shuppet": "怨影娃娃", - "banette": "诅咒娃娃", - "duskull": "夜巡灵", - "dusclops": "彷徨夜灵", - "tropius": "热带龙", - "chimecho": "风铃铃", - "absol": "阿勃梭鲁", - "wynaut": "小果然", - "snorunt": "雪童子", - "glalie": "冰鬼护", - "spheal": "海豹球", - "sealeo": "海魔狮", - "walrein": "帝牙海狮", - "clamperl": "珍珠贝", - "huntail": "猎斑鱼", - "gorebyss": "樱花鱼", - "relicanth": "古空棘鱼", - "luvdisc": "爱心鱼", - "bagon": "宝贝龙", - "shelgon": "甲壳龙", - "salamence": "暴飞龙", - "beldum": "铁哑铃", - "metang": "金属怪", - "metagross": "巨金怪", - "regirock": "雷吉洛克", - "regice": "雷吉艾斯", - "registeel": "雷吉斯奇鲁", - "latias": "拉帝亚斯", - "latios": "拉帝欧斯", - "kyogre": "盖欧卡", - "groudon": "固拉多", - "rayquaza": "烈空坐", - "jirachi": "基拉祈", - "deoxys": "代欧奇希斯", - "turtwig": "草苗龟", - "grotle": "树林龟", - "torterra": "土台龟", - "chimchar": "小火焰猴", - "monferno": "猛火猴", - "infernape": "烈焰猴", - "piplup": "波加曼", - "prinplup": "波皇子", - "empoleon": "帝王拿波", - "starly": "姆克儿", - "staravia": "姆克鸟", - "staraptor": "姆克鹰", - "bidoof": "大牙狸", - "bibarel": "大尾狸", - "kricketot": "圆法师", - "kricketune": "音箱蟀", - "shinx": "小猫怪", - "luxio": "勒克猫", - "luxray": "伦琴猫", - "budew": "含羞苞", - "roserade": "罗丝雷朵", - "cranidos": "头盖龙", - "rampardos": "战槌龙", - "shieldon": "盾甲龙", - "bastiodon": "护城龙", - "burmy": "结草儿", - "wormadam": "结草贵妇", - "mothim": "绅士蛾", - "combee": "三蜜蜂", - "vespiquen": "蜂女王", - "pachirisu": "帕奇利兹", - "buizel": "泳圈鼬", - "floatzel": "浮潜鼬", - "cherubi": "樱花宝", - "cherrim": "樱花儿", - "shellos": "无壳海兔", - "gastrodon": "海兔兽", - "ambipom": "双尾怪手", - "drifloon": "飘飘球", - "drifblim": "随风球", - "buneary": "卷卷耳", - "lopunny": "长耳兔", - "mismagius": "梦妖魔", - "honchkrow": "乌鸦头头", - "glameow": "魅力喵", - "purugly": "东施喵", - "chingling": "铃铛响", - "stunky": "臭鼬噗", - "skuntank": "坦克臭鼬", - "bronzor": "铜镜怪", - "bronzong": "青铜钟", - "bonsly": "盆才怪", - "mime_jr": "魔尼尼", - "happiny": "小福蛋", - "chatot": "聒噪鸟", - "spiritomb": "花岩怪", - "gible": "圆陆鲨", - "gabite": "尖牙陆鲨", - "garchomp": "烈咬陆鲨", - "munchlax": "小卡比兽", - "riolu": "利欧路", - "lucario": "路卡利欧", - "hippopotas": "沙河马", - "hippowdon": "河马兽", - "skorupi": "钳尾蝎", - "drapion": "龙王蝎", - "croagunk": "不良蛙", - "toxicroak": "毒骷蛙", - "carnivine": "尖牙笼", - "finneon": "荧光鱼", - "lumineon": "霓虹鱼", - "mantyke": "小球飞鱼", - "snover": "雪笠怪", - "abomasnow": "暴雪王", - "weavile": "玛狃拉", - "magnezone": "自爆磁怪", - "lickilicky": "大舌舔", - "rhyperior": "超甲狂犀", - "tangrowth": "巨蔓藤", - "electivire": "电击魔兽", - "magmortar": "鸭嘴炎兽", - "togekiss": "波克基斯", - "yanmega": "远古巨蜓", - "leafeon": "叶伊布", - "glaceon": "冰伊布", - "gliscor": "天蝎王", - "mamoswine": "象牙猪", - "porygon_z": "多边兽乙型", - "gallade": "艾路雷朵", - "probopass": "大朝北鼻", - "dusknoir": "黑夜魔灵", - "froslass": "雪妖女", - "rotom": "洛托姆", - "uxie": "由克希", - "mesprit": "艾姆利多", - "azelf": "亚克诺姆", - "dialga": "帝牙卢卡", - "palkia": "帕路奇亚", - "heatran": "席多蓝恩", - "regigigas": "雷吉奇卡斯", - "giratina": "骑拉帝纳", - "cresselia": "克雷色利亚", - "phione": "霏欧纳", - "manaphy": "玛纳霏", - "darkrai": "达克莱伊", - "shaymin": "谢米", - "arceus": "阿尔宙斯", - "victini": "比克提尼", - "snivy": "藤藤蛇", - "servine": "青藤蛇", - "serperior": "君主蛇", - "tepig": "暖暖猪", - "pignite": "炒炒猪", - "emboar": "炎武王", - "oshawott": "水水獭", - "dewott": "双刃丸", - "samurott": "大剑鬼", - "patrat": "探探鼠", - "watchog": "步哨鼠", - "lillipup": "小约克", - "herdier": "哈约克", - "stoutland": "长毛狗", - "purrloin": "扒手猫", - "liepard": "酷豹", - "pansage": "花椰猴", - "simisage": "花椰猿", - "pansear": "爆香猴", - "simisear": "爆香猿", - "panpour": "冷水猴", - "simipour": "冷水猿", - "munna": "食梦梦", - "musharna": "梦梦蚀", - "pidove": "豆豆鸽", - "tranquill": "咕咕鸽", - "unfezant": "高傲雉鸡", - "blitzle": "斑斑马", - "zebstrika": "雷电斑马", - "roggenrola": "石丸子", - "boldore": "地幔岩", - "gigalith": "庞岩怪", - "woobat": "滚滚蝙蝠", - "swoobat": "心蝙蝠", - "drilbur": "螺钉地鼠", - "excadrill": "龙头地鼠", - "audino": "差不多娃娃", - "timburr": "搬运小匠", - "gurdurr": "铁骨土人", - "conkeldurr": "修建老匠", - "tympole": "圆蝌蚪", - "palpitoad": "蓝蟾蜍", - "seismitoad": "蟾蜍王", - "throh": "投摔鬼", - "sawk": "打击鬼", - "sewaddle": "虫宝包", - "swadloon": "宝包茧", - "leavanny": "保姆虫", - "venipede": "百足蜈蚣", - "whirlipede": "车轮球", - "scolipede": "蜈蚣王", - "cottonee": "木棉球", - "whimsicott": "风妖精", - "petilil": "百合根娃娃", - "lilligant": "裙儿小姐", - "basculin": "野蛮鲈鱼", - "sandile": "黑眼鳄", - "krokorok": "混混鳄", - "krookodile": "流氓鳄", - "darumaka": "火红不倒翁", - "darmanitan": "达摩狒狒", - "maractus": "沙铃仙人掌", - "dwebble": "石居蟹", - "crustle": "岩殿居蟹", - "scraggy": "滑滑小子", - "scrafty": "头巾混混", - "sigilyph": "象征鸟", - "yamask": "哭哭面具", - "cofagrigus": "迭失棺", - "tirtouga": "原盖海龟", - "carracosta": "肋骨海龟", - "archen": "始祖小鸟", - "archeops": "始祖大鸟", - "trubbish": "破破袋", - "garbodor": "灰尘山", - "zorua": "索罗亚", - "zoroark": "索罗亚克", - "minccino": "泡沫栗鼠", - "cinccino": "奇诺栗鼠", - "gothita": "哥德宝宝", - "gothorita": "哥德小童", - "gothitelle": "哥德小姐", - "solosis": "单卵细胞球", - "duosion": "双卵细胞球", - "reuniclus": "人造细胞卵", - "ducklett": "鸭宝宝", - "swanna": "舞天鹅", - "vanillite": "迷你冰", - "vanillish": "多多冰", - "vanilluxe": "双倍多多冰", - "deerling": "四季鹿", - "sawsbuck": "萌芽鹿", - "emolga": "电飞鼠", - "karrablast": "盖盖虫", - "escavalier": "骑士蜗牛", - "foongus": "哎呀球菇", - "amoonguss": "败露球菇", - "frillish": "轻飘飘", - "jellicent": "胖嘟嘟", - "alomomola": "保姆曼波", - "joltik": "电电虫", - "galvantula": "电蜘蛛", - "ferroseed": "种子铁球", - "ferrothorn": "坚果哑铃", - "klink": "齿轮儿", - "klang": "齿轮组", - "klinklang": "齿轮怪", - "tynamo": "麻麻小鱼", - "eelektrik": "麻麻鳗", - "eelektross": "麻麻鳗鱼王", - "elgyem": "小灰怪", - "beheeyem": "大宇怪", - "litwick": "烛光灵", - "lampent": "灯火幽灵", - "chandelure": "水晶灯火灵", - "axew": "牙牙", - "fraxure": "斧牙龙", - "haxorus": "双斧战龙", - "cubchoo": "喷嚏熊", - "beartic": "冻原熊", - "cryogonal": "几何雪花", - "shelmet": "小嘴蜗", - "accelgor": "敏捷虫", - "stunfisk": "泥巴鱼", - "mienfoo": "功夫鼬", - "mienshao": "师父鼬", - "druddigon": "赤面龙", - "golett": "泥偶小人", - "golurk": "泥偶巨人", - "pawniard": "驹刀小兵", - "bisharp": "劈斩司令", - "bouffalant": "爆炸头水牛", - "rufflet": "毛头小鹰", - "braviary": "勇士雄鹰", - "vullaby": "秃鹰丫头", - "mandibuzz": "秃鹰娜", - "heatmor": "熔蚁兽", - "durant": "铁蚁", - "deino": "单首龙", - "zweilous": "双首暴龙", - "hydreigon": "三首恶龙", - "larvesta": "燃烧虫", - "volcarona": "火神蛾", - "cobalion": "勾帕路翁", - "terrakion": "代拉基翁", - "virizion": "毕力吉翁", - "tornadus": "龙卷云", - "thundurus": "雷电云", - "reshiram": "莱希拉姆", - "zekrom": "捷克罗姆", - "landorus": "土地云", - "kyurem": "酋雷姆", - "keldeo": "凯路迪欧", - "meloetta": "美洛耶塔", - "genesect": "盖诺赛克特", - "chespin": "哈力栗", - "quilladin": "胖胖哈力", - "chesnaught": "布里卡隆", - "fennekin": "火狐狸", - "braixen": "长尾火狐", - "delphox": "妖火红狐", - "froakie": "呱呱泡蛙", - "frogadier": "呱头蛙", - "greninja": "甲贺忍蛙", - "bunnelby": "掘掘兔", - "diggersby": "掘地兔", - "fletchling": "小箭雀", - "fletchinder": "火箭雀", - "talonflame": "烈箭鹰", - "scatterbug": "粉蝶虫", - "spewpa": "粉蝶蛹", - "vivillon": "彩粉蝶", - "litleo": "小狮狮", - "pyroar": "火炎狮", - "flabebe": "花蓓蓓", - "floette": "花叶蒂", - "florges": "花洁夫人", - "skiddo": "坐骑小羊", - "gogoat": "坐骑山羊", - "pancham": "顽皮熊猫", - "pangoro": "霸道熊猫", - "furfrou": "多丽米亚", - "espurr": "妙喵", - "meowstic": "超能妙喵", - "honedge": "独剑鞘", - "doublade": "双剑鞘", - "aegislash": "坚盾剑怪", - "spritzee": "粉香香", - "aromatisse": "芳香精", - "swirlix": "绵绵泡芙", - "slurpuff": "胖甜妮", - "inkay": "好啦鱿", - "malamar": "乌贼王", - "binacle": "龟脚脚", - "barbaracle": "龟足巨铠", - "skrelp": "垃垃藻", - "dragalge": "毒藻龙", - "clauncher": "铁臂枪虾", - "clawitzer": "钢炮臂虾", - "helioptile": "伞电蜥", - "heliolisk": "光电伞蜥", - "tyrunt": "宝宝暴龙", - "tyrantrum": "怪颚龙", - "amaura": "冰雪龙", - "aurorus": "冰雪巨龙", - "sylveon": "仙子伊布", - "hawlucha": "摔角鹰人", - "dedenne": "咚咚鼠", - "carbink": "小碎钻", - "goomy": "黏黏宝", - "sliggoo": "黏美儿", - "goodra": "黏美龙", - "klefki": "钥圈儿", - "phantump": "小木灵", - "trevenant": "朽木妖", - "pumpkaboo": "南瓜精", - "gourgeist": "南瓜怪人", - "bergmite": "冰宝", - "avalugg": "冰岩怪", - "noibat": "嗡蝠", - "noivern": "音波龙", - "xerneas": "哲尔尼亚斯", - "yveltal": "伊裴尔塔尔", - "zygarde": "基格尔德", - "diancie": "蒂安希", - "hoopa": "胡帕", - "volcanion": "波尔凯尼恩", - "rowlet": "木木枭", - "dartrix": "投羽枭", - "decidueye": "狙射树枭", - "litten": "火斑喵", - "torracat": "炎热喵", - "incineroar": "炽焰咆哮虎", - "popplio": "球球海狮", - "brionne": "花漾海狮", - "primarina": "西狮海壬", - "pikipek": "小笃儿", - "trumbeak": "喇叭啄鸟", - "toucannon": "铳嘴大鸟", - "yungoos": "猫鼬少", - "gumshoos": "猫鼬探长", - "grubbin": "强颚鸡母虫", - "charjabug": "虫电宝", - "vikavolt": "锹农炮虫", - "crabrawler": "好胜蟹", - "crabominable": "好胜毛蟹", - "oricorio": "花舞鸟", - "cutiefly": "萌虻", - "ribombee": "蝶结萌虻", - "rockruff": "岩狗狗", - "lycanroc": "鬃岩狼人", - "wishiwashi": "弱丁鱼", - "mareanie": "好坏星", - "toxapex": "超坏星", - "mudbray": "泥驴仔", - "mudsdale": "重泥挽马", - "dewpider": "滴蛛", - "araquanid": "滴蛛霸", - "fomantis": "伪螳草", - "lurantis": "兰螳花", - "morelull": "睡睡菇", - "shiinotic": "灯罩夜菇", - "salandit": "夜盗火蜥", - "salazzle": "焰后蜥", - "stufful": "童偶熊", - "bewear": "穿着熊", - "bounsweet": "甜竹竹", - "steenee": "甜舞妮", - "tsareena": "甜冷美后", - "comfey": "花疗环环", - "oranguru": "智挥猩", - "passimian": "投掷猴", - "wimpod": "胆小虫", - "golisopod": "具甲武者", - "sandygast": "沙丘娃", - "palossand": "噬沙堡爷", - "pyukumuku": "拳海参", - "type_null": "属性:空", - "silvally": "银伴战兽", - "minior": "小陨星", - "komala": "树枕尾熊", - "turtonator": "爆焰龟兽", - "togedemaru": "托戈德玛尔", - "mimikyu": "谜拟丘", - "bruxish": "磨牙彩皮鱼", - "drampa": "老翁龙", - "dhelmise": "破破舵轮", - "jangmo_o": "心鳞宝", - "hakamo_o": "鳞甲龙", - "kommo_o": "杖尾鳞甲龙", - "tapu_koko": "卡璞・鸣鸣", - "tapu_lele": "卡璞・蝶蝶", - "tapu_bulu": "卡璞・哞哞", - "tapu_fini": "卡璞・鳍鳍", - "cosmog": "科斯莫古", - "cosmoem": "科斯莫姆", - "solgaleo": "索尔迦雷欧", - "lunala": "露奈雅拉", - "nihilego": "虚吾伊德", - "buzzwole": "爆肌蚊", - "pheromosa": "费洛美螂", - "xurkitree": "电束木", - "celesteela": "铁火辉夜", - "kartana": "纸御剑", - "guzzlord": "恶食大王", - "necrozma": "奈克洛兹玛", - "magearna": "玛机雅娜", - "marshadow": "玛夏多", - "poipole": "毒贝比", - "naganadel": "四颚针龙", - "stakataka": "垒磊石", - "blacephalon": "砰头小丑", - "zeraora": "捷拉奥拉", - "meltan": "美录坦", - "melmetal": "美录梅塔", - "grookey": "敲音猴", - "thwackey": "啪咚猴", - "rillaboom": "轰擂金刚猩", - "scorbunny": "炎兔儿", - "raboot": "腾蹴小将", - "cinderace": "闪焰王牌", - "sobble": "泪眼蜥", - "drizzile": "变涩蜥", - "inteleon": "千面避役", - "skwovet": "贪心栗鼠", - "greedent": "藏饱栗鼠", - "rookidee": "稚山雀", - "corvisquire": "蓝鸦", - "corviknight": "钢铠鸦", - "blipbug": "索侦虫", - "dottler": "天罩虫", - "orbeetle": "以欧路普", - "nickit": "狡小狐", - "thievul": "猾大狐", - "gossifleur": "幼棉棉", - "eldegoss": "白蓬蓬", - "wooloo": "毛辫羊", - "dubwool": "毛毛角羊", - "chewtle": "咬咬龟", - "drednaw": "暴噬龟", - "yamper": "来电汪", - "boltund": "逐电犬", - "rolycoly": "小炭仔", - "carkol": "大炭车", - "coalossal": "巨炭山", - "applin": "啃果虫", - "flapple": "苹裹龙", - "appletun": "丰蜜龙", - "silicobra": "沙包蛇", - "sandaconda": "沙螺蟒", - "cramorant": "古月鸟", - "arrokuda": "刺梭鱼", - "barraskewda": "戽斗尖梭", - "toxel": "电音婴", - "toxtricity": "颤弦蝾螈", - "sizzlipede": "烧火蚣", - "centiskorch": "焚焰蚣", - "clobbopus": "拳拳蛸", - "grapploct": "八爪武师", - "sinistea": "来悲茶", - "polteageist": "怖思壶", - "hatenna": "迷布莉姆", - "hattrem": "提布莉姆", - "hatterene": "布莉姆温", - "impidimp": "捣蛋小妖", - "morgrem": "诈唬魔", - "grimmsnarl": "长毛巨魔", - "obstagoon": "堵拦熊", - "perrserker": "喵头目", - "cursola": "魔灵珊瑚", - "sirfetchd": "葱游兵", - "mr_rime": "踏冰人偶", - "runerigus": "迭失板", - "milcery": "小仙奶", - "alcremie": "霜奶仙", - "falinks": "列阵兵", - "pincurchin": "啪嚓海胆", - "snom": "雪吞虫", - "frosmoth": "雪绒蛾", - "stonjourner": "巨石丁", - "eiscue": "冰砌鹅", - "indeedee": "爱管侍", - "morpeko": "莫鲁贝可", - "cufant": "铜象", - "copperajah": "大王铜象", - "dracozolt": "雷鸟龙", - "arctozolt": "雷鸟海兽", - "dracovish": "鳃鱼龙", - "arctovish": "鳃鱼海兽", - "duraludon": "铝钢龙", - "dreepy": "多龙梅西亚", - "drakloak": "多龙奇", - "dragapult": "多龙巴鲁托", - "zacian": "苍响", - "zamazenta": "藏玛然特", - "eternatus": "无极汰那", - "kubfu": "熊徒弟", - "urshifu": "武道熊师", - "zarude": "萨戮德", - "regieleki": "雷吉艾勒奇", - "regidrago": "雷吉铎拉戈", - "glastrier": "雪暴马", - "spectrier": "灵幽马", - "calyrex": "蕾冠王", - "wyrdeer": "诡角鹿", - "kleavor": "劈斧螳螂", - "ursaluna": "月月熊", - "basculegion": "幽尾玄鱼", - "sneasler": "大狃拉", - "overqwil": "万针鱼", - "enamorus": "眷恋云", - "sprigatito": "新叶喵", - "floragato": "蒂蕾喵", - "meowscarada": "魔幻假面喵", - "fuecoco": "呆火鳄", - "crocalor": "炙烫鳄", - "skeledirge": "骨纹巨声鳄", - "quaxly": "润水鸭", - "quaxwell": "涌跃鸭", - "quaquaval": "狂欢浪舞鸭", - "lechonk": "爱吃豚", - "oinkologne": "飘香豚", - "tarountula": "团珠蛛", - "spidops": "操陷蛛", - "nymble": "豆蟋蟀", - "lokix": "烈腿蝗", - "pawmi": "布拨", - "pawmo": "布土拨", - "pawmot": "巴布土拨", - "tandemaus": "一对鼠", - "maushold": "一家鼠", - "fidough": "狗仔包", - "dachsbun": "麻花犬", - "smoliv": "迷你芙", - "dolliv": "奥利纽", - "arboliva": "奥利瓦", - "squawkabilly": "怒鹦哥", - "nacli": "盐石宝", - "naclstack": "盐石垒", - "garganacl": "盐石巨灵", - "charcadet": "炭小侍", - "armarouge": "红莲铠骑", - "ceruledge": "苍炎刃鬼", - "tadbulb": "光蚪仔", - "bellibolt": "电肚蛙", - "wattrel": "电海燕", - "kilowattrel": "大电海燕", - "maschiff": "偶叫獒", - "mabosstiff": "獒教父", - "shroodle": "滋汁鼹", - "grafaiai": "涂标客", - "bramblin": "纳噬草", - "brambleghast": "怖纳噬草", - "toedscool": "原野水母", - "toedscruel": "陆地水母", - "klawf": "毛崖蟹", - "capsakid": "热辣娃", - "scovillain": "狠辣椒", - "rellor": "虫滚泥", - "rabsca": "虫甲圣", - "flittle": "飘飘雏", - "espathra": "超能艳鸵", - "tinkatink": "小锻匠", - "tinkatuff": "巧锻匠", - "tinkaton": "巨锻匠", - "wiglett": "海地鼠", - "wugtrio": "三海地鼠", - "bombirdier": "下石鸟", - "finizen": "波普海豚", - "palafin": "海豚侠", - "varoom": "噗隆隆", - "revavroom": "普隆隆姆", - "cyclizar": "摩托蜥", - "orthworm": "拖拖蚓", - "glimmet": "晶光芽", - "glimmora": "晶光花", - "greavard": "墓仔狗", - "houndstone": "墓扬犬", - "flamigo": "缠红鹤", - "cetoddle": "走鲸", - "cetitan": "浩大鲸", - "veluza": "轻身鳕", - "dondozo": "吃吼霸", - "tatsugiri": "米立龙", - "annihilape": "弃世猴", - "clodsire": "土王", - "farigiraf": "奇麒麟", - "dudunsparce": "土龙节节", - "kingambit": "仆刀将军", - "great_tusk": "雄伟牙", - "scream_tail": "吼叫尾", - "brute_bonnet": "猛恶菇", - "flutter_mane": "振翼发", - "slither_wing": "爬地翅", - "sandy_shocks": "沙铁皮", - "iron_treads": "铁辙迹", - "iron_bundle": "铁包袱", - "iron_hands": "铁臂膀", - "iron_jugulis": "铁脖颈", - "iron_moth": "铁毒蛾", - "iron_thorns": "铁荆棘", - "frigibax": "凉脊龙", - "arctibax": "冻脊龙", - "baxcalibur": "戟脊龙", - "gimmighoul": "索财灵", - "gholdengo": "赛富豪", - "wo_chien": "古简蜗", - "chien_pao": "古剑豹", - "ting_lu": "古鼎鹿", - "chi_yu": "古玉鱼", - "roaring_moon": "轰鸣月", - "iron_valiant": "铁武者", - "koraidon": "故勒顿", - "miraidon": "密勒顿", - "walking_wake": "波荡水", - "iron_leaves": "铁斑叶", - "dipplin": "裹蜜虫", - "poltchageist": "斯魔茶", - "sinistcha": "来悲粗茶", - "okidogi": "够赞狗", - "munkidori": "愿增猿", - "fezandipiti": "吉雉鸡", - "ogerpon": "厄诡椪", - "archaludon": "铝钢桥龙", - "hydrapple": "蜜集大蛇", - "gouging_fire": "破空焰", - "raging_bolt": "猛雷鼓", - "iron_boulder": "铁磐岩", - "iron_crown": "铁头壳", - "terapagos": "太乐巴戈斯", - "pecharunt": "桃歹郎", - "alola_rattata": "小拉达", - "alola_raticate": "拉达", - "alola_raichu": "雷丘", - "alola_sandshrew": "穿山鼠", - "alola_sandslash": "穿山王", - "alola_vulpix": "六尾", - "alola_ninetales": "九尾", - "alola_diglett": "地鼠", - "alola_dugtrio": "三地鼠", - "alola_meowth": "喵喵", - "alola_persian": "猫老大", - "alola_geodude": "小拳石", - "alola_graveler": "隆隆石", - "alola_golem": "隆隆岩", - "alola_grimer": "臭泥", - "alola_muk": "臭臭泥", - "alola_exeggutor": "椰蛋树", - "alola_marowak": "嘎啦嘎啦", - "eternal_floette": "花叶蒂", - "galar_meowth": "喵喵", - "galar_ponyta": "小火马", - "galar_rapidash": "烈焰马", - "galar_slowpoke": "呆呆兽", - "galar_slowbro": "呆壳兽", - "galar_farfetchd": "大葱鸭", - "galar_weezing": "双弹瓦斯", - "galar_mr_mime": "魔墙人偶", - "galar_articuno": "急冻鸟", - "galar_zapdos": "闪电鸟", - "galar_moltres": "火焰鸟", - "galar_slowking": "呆呆王", - "galar_corsola": "太阳珊瑚", - "galar_zigzagoon": "蛇纹熊", - "galar_linoone": "直冲熊", - "galar_darumaka": "火红不倒翁", - "galar_darmanitan": "达摩狒狒", - "galar_yamask": "哭哭面具", - "galar_stunfisk": "泥巴鱼", - "hisui_growlithe": "卡蒂狗", - "hisui_arcanine": "风速狗", - "hisui_voltorb": "霹雳电球", - "hisui_electrode": "顽皮雷弹", - "hisui_typhlosion": "火暴兽", - "hisui_qwilfish": "千针鱼", - "hisui_sneasel": "狃拉", - "hisui_samurott": "大剑鬼", - "hisui_lilligant": "裙儿小姐", - "hisui_zorua": "索罗亚", - "hisui_zoroark": "索罗亚克", - "hisui_braviary": "勇士雄鹰", - "hisui_sliggoo": "黏美儿", - "hisui_goodra": "黏美龙", - "hisui_avalugg": "冰岩怪", - "hisui_decidueye": "狙射树枭", - "paldea_tauros": "肯泰罗", - "paldea_wooper": "乌波", - "bloodmoon_ursaluna": "月月熊", -} as const; \ No newline at end of file + "bulbasaur": "妙蛙种子", + "ivysaur": "妙蛙草", + "venusaur": "妙蛙花", + "charmander": "小火龙", + "charmeleon": "火恐龙", + "charizard": "喷火龙", + "squirtle": "杰尼龟", + "wartortle": "卡咪龟", + "blastoise": "水箭龟", + "caterpie": "绿毛虫", + "metapod": "铁甲蛹", + "butterfree": "巴大蝶", + "weedle": "独角虫", + "kakuna": "铁壳蛹", + "beedrill": "大针蜂", + "pidgey": "波波", + "pidgeotto": "比比鸟", + "pidgeot": "大比鸟", + "rattata": "小拉达", + "raticate": "拉达", + "spearow": "烈雀", + "fearow": "大嘴雀", + "ekans": "阿柏蛇", + "arbok": "阿柏怪", + "pikachu": "皮卡丘", + "raichu": "雷丘", + "sandshrew": "穿山鼠", + "sandslash": "穿山王", + "nidoran_f": "尼多兰", + "nidorina": "尼多娜", + "nidoqueen": "尼多后", + "nidoran_m": "尼多朗", + "nidorino": "尼多力诺", + "nidoking": "尼多王", + "clefairy": "皮皮", + "clefable": "皮可西", + "vulpix": "六尾", + "ninetales": "九尾", + "jigglypuff": "胖丁", + "wigglytuff": "胖可丁", + "zubat": "超音蝠", + "golbat": "大嘴蝠", + "oddish": "走路草", + "gloom": "臭臭花", + "vileplume": "霸王花", + "paras": "派拉斯", + "parasect": "派拉斯特", + "venonat": "毛球", + "venomoth": "摩鲁蛾", + "diglett": "地鼠", + "dugtrio": "三地鼠", + "meowth": "喵喵", + "persian": "猫老大", + "psyduck": "可达鸭", + "golduck": "哥达鸭", + "mankey": "猴怪", + "primeape": "火暴猴", + "growlithe": "卡蒂狗", + "arcanine": "风速狗", + "poliwag": "蚊香蝌蚪", + "poliwhirl": "蚊香君", + "poliwrath": "蚊香泳士", + "abra": "凯西", + "kadabra": "勇基拉", + "alakazam": "胡地", + "machop": "腕力", + "machoke": "豪力", + "machamp": "怪力", + "bellsprout": "喇叭芽", + "weepinbell": "口呆花", + "victreebel": "大食花", + "tentacool": "玛瑙水母", + "tentacruel": "毒刺水母", + "geodude": "小拳石", + "graveler": "隆隆石", + "golem": "隆隆岩", + "ponyta": "小火马", + "rapidash": "烈焰马", + "slowpoke": "呆呆兽", + "slowbro": "呆壳兽", + "magnemite": "小磁怪", + "magneton": "三合一磁怪", + "farfetchd": "大葱鸭", + "doduo": "嘟嘟", + "dodrio": "嘟嘟利", + "seel": "小海狮", + "dewgong": "白海狮", + "grimer": "臭泥", + "muk": "臭臭泥", + "shellder": "大舌贝", + "cloyster": "刺甲贝", + "gastly": "鬼斯", + "haunter": "鬼斯通", + "gengar": "耿鬼", + "onix": "大岩蛇", + "drowzee": "催眠貘", + "hypno": "引梦貘人", + "krabby": "大钳蟹", + "kingler": "巨钳蟹", + "voltorb": "霹雳电球", + "electrode": "顽皮雷弹", + "exeggcute": "蛋蛋", + "exeggutor": "椰蛋树", + "cubone": "卡拉卡拉", + "marowak": "嘎啦嘎啦", + "hitmonlee": "飞腿郎", + "hitmonchan": "快拳郎", + "lickitung": "大舌头", + "koffing": "瓦斯弹", + "weezing": "双弹瓦斯", + "rhyhorn": "独角犀牛", + "rhydon": "钻角犀兽", + "chansey": "吉利蛋", + "tangela": "蔓藤怪", + "kangaskhan": "袋兽", + "horsea": "墨海马", + "seadra": "海刺龙", + "goldeen": "角金鱼", + "seaking": "金鱼王", + "staryu": "海星星", + "starmie": "宝石海星", + "mr_mime": "魔墙人偶", + "scyther": "飞天螳螂", + "jynx": "迷唇姐", + "electabuzz": "电击兽", + "magmar": "鸭嘴火兽", + "pinsir": "凯罗斯", + "tauros": "肯泰罗", + "magikarp": "鲤鱼王", + "gyarados": "暴鲤龙", + "lapras": "拉普拉斯", + "ditto": "百变怪", + "eevee": "伊布", + "vaporeon": "水伊布", + "jolteon": "雷伊布", + "flareon": "火伊布", + "porygon": "多边兽", + "omanyte": "菊石兽", + "omastar": "多刺菊石兽", + "kabuto": "化石盔", + "kabutops": "镰刀盔", + "aerodactyl": "化石翼龙", + "snorlax": "卡比兽", + "articuno": "急冻鸟", + "zapdos": "闪电鸟", + "moltres": "火焰鸟", + "dratini": "迷你龙", + "dragonair": "哈克龙", + "dragonite": "快龙", + "mewtwo": "超梦", + "mew": "梦幻", + "chikorita": "菊草叶", + "bayleef": "月桂叶", + "meganium": "大竺葵", + "cyndaquil": "火球鼠", + "quilava": "火岩鼠", + "typhlosion": "火暴兽", + "totodile": "小锯鳄", + "croconaw": "蓝鳄", + "feraligatr": "大力鳄", + "sentret": "尾立", + "furret": "大尾立", + "hoothoot": "咕咕", + "noctowl": "猫头夜鹰", + "ledyba": "芭瓢虫", + "ledian": "安瓢虫", + "spinarak": "圆丝蛛", + "ariados": "阿利多斯", + "crobat": "叉字蝠", + "chinchou": "灯笼鱼", + "lanturn": "电灯怪", + "pichu": "皮丘", + "cleffa": "皮宝宝", + "igglybuff": "宝宝丁", + "togepi": "波克比", + "togetic": "波克基古", + "natu": "天然雀", + "xatu": "天然鸟", + "mareep": "咩利羊", + "flaaffy": "茸茸羊", + "ampharos": "电龙", + "bellossom": "美丽花", + "marill": "玛力露", + "azumarill": "玛力露丽", + "sudowoodo": "树才怪", + "politoed": "蚊香蛙皇", + "hoppip": "毽子草", + "skiploom": "毽子花", + "jumpluff": "毽子棉", + "aipom": "长尾怪手", + "sunkern": "向日种子", + "sunflora": "向日花怪", + "yanma": "蜻蜻蜓", + "wooper": "乌波", + "quagsire": "沼王", + "espeon": "太阳伊布", + "umbreon": "月亮伊布", + "murkrow": "黑暗鸦", + "slowking": "呆呆王", + "misdreavus": "梦妖", + "unown": "未知图腾", + "wobbuffet": "果然翁", + "girafarig": "麒麟奇", + "pineco": "榛果球", + "forretress": "佛烈托斯", + "dunsparce": "土龙弟弟", + "gligar": "天蝎", + "steelix": "大钢蛇", + "snubbull": "布鲁", + "granbull": "布鲁皇", + "qwilfish": "千针鱼", + "scizor": "巨钳螳螂", + "shuckle": "壶壶", + "heracross": "赫拉克罗斯", + "sneasel": "狃拉", + "teddiursa": "熊宝宝", + "ursaring": "圈圈熊", + "slugma": "熔岩虫", + "magcargo": "熔岩蜗牛", + "swinub": "小山猪", + "piloswine": "长毛猪", + "corsola": "太阳珊瑚", + "remoraid": "铁炮鱼", + "octillery": "章鱼桶", + "delibird": "信使鸟", + "mantine": "巨翅飞鱼", + "skarmory": "盔甲鸟", + "houndour": "戴鲁比", + "houndoom": "黑鲁加", + "kingdra": "刺龙王", + "phanpy": "小小象", + "donphan": "顿甲", + "porygon2": "多边兽2型", + "stantler": "惊角鹿", + "smeargle": "图图犬", + "tyrogue": "无畏小子", + "hitmontop": "战舞郎", + "smoochum": "迷唇娃", + "elekid": "电击怪", + "magby": "鸭嘴宝宝", + "miltank": "大奶罐", + "blissey": "幸福蛋", + "raikou": "雷公", + "entei": "炎帝", + "suicune": "水君", + "larvitar": "幼基拉斯", + "pupitar": "沙基拉斯", + "tyranitar": "班基拉斯", + "lugia": "洛奇亚", + "ho_oh": "凤王", + "celebi": "时拉比", + "treecko": "木守宫", + "grovyle": "森林蜥蜴", + "sceptile": "蜥蜴王", + "torchic": "火稚鸡", + "combusken": "力壮鸡", + "blaziken": "火焰鸡", + "mudkip": "水跃鱼", + "marshtomp": "沼跃鱼", + "swampert": "巨沼怪", + "poochyena": "土狼犬", + "mightyena": "大狼犬", + "zigzagoon": "蛇纹熊", + "linoone": "直冲熊", + "wurmple": "刺尾虫", + "silcoon": "甲壳茧", + "beautifly": "狩猎凤蝶", + "cascoon": "盾甲茧", + "dustox": "毒粉蛾", + "lotad": "莲叶童子", + "lombre": "莲帽小童", + "ludicolo": "乐天河童", + "seedot": "橡实果", + "nuzleaf": "长鼻叶", + "shiftry": "狡猾天狗", + "taillow": "傲骨燕", + "swellow": "大王燕", + "wingull": "长翅鸥", + "pelipper": "大嘴鸥", + "ralts": "拉鲁拉丝", + "kirlia": "奇鲁莉安", + "gardevoir": "沙奈朵", + "surskit": "溜溜糖球", + "masquerain": "雨翅蛾", + "shroomish": "蘑蘑菇", + "breloom": "斗笠菇", + "slakoth": "懒人獭", + "vigoroth": "过动猿", + "slaking": "请假王", + "nincada": "土居忍士", + "ninjask": "铁面忍者", + "shedinja": "脱壳忍者", + "whismur": "咕妞妞", + "loudred": "吼爆弹", + "exploud": "爆音怪", + "makuhita": "幕下力士", + "hariyama": "铁掌力士", + "azurill": "露力丽", + "nosepass": "朝北鼻", + "skitty": "向尾喵", + "delcatty": "优雅猫", + "sableye": "勾魂眼", + "mawile": "大嘴娃", + "aron": "可可多拉", + "lairon": "可多拉", + "aggron": "波士可多拉", + "meditite": "玛沙那", + "medicham": "恰雷姆", + "electrike": "落雷兽", + "manectric": "雷电兽", + "plusle": "正电拍拍", + "minun": "负电拍拍", + "volbeat": "电萤虫", + "illumise": "甜甜萤", + "roselia": "毒蔷薇", + "gulpin": "溶食兽", + "swalot": "吞食兽", + "carvanha": "利牙鱼", + "sharpedo": "巨牙鲨", + "wailmer": "吼吼鲸", + "wailord": "吼鲸王", + "numel": "呆火驼", + "camerupt": "喷火驼", + "torkoal": "煤炭龟", + "spoink": "跳跳猪", + "grumpig": "噗噗猪", + "spinda": "晃晃斑", + "trapinch": "大颚蚁", + "vibrava": "超音波幼虫", + "flygon": "沙漠蜻蜓", + "cacnea": "刺球仙人掌", + "cacturne": "梦歌仙人掌", + "swablu": "青绵鸟", + "altaria": "七夕青鸟", + "zangoose": "猫鼬斩", + "seviper": "饭匙蛇", + "lunatone": "月石", + "solrock": "太阳岩", + "barboach": "泥泥鳅", + "whiscash": "鲶鱼王", + "corphish": "龙虾小兵", + "crawdaunt": "铁螯龙虾", + "baltoy": "天秤偶", + "claydol": "念力土偶", + "lileep": "触手百合", + "cradily": "摇篮百合", + "anorith": "太古羽虫", + "armaldo": "太古盔甲", + "feebas": "丑丑鱼", + "milotic": "美纳斯", + "castform": "飘浮泡泡", + "kecleon": "变隐龙", + "shuppet": "怨影娃娃", + "banette": "诅咒娃娃", + "duskull": "夜巡灵", + "dusclops": "彷徨夜灵", + "tropius": "热带龙", + "chimecho": "风铃铃", + "absol": "阿勃梭鲁", + "wynaut": "小果然", + "snorunt": "雪童子", + "glalie": "冰鬼护", + "spheal": "海豹球", + "sealeo": "海魔狮", + "walrein": "帝牙海狮", + "clamperl": "珍珠贝", + "huntail": "猎斑鱼", + "gorebyss": "樱花鱼", + "relicanth": "古空棘鱼", + "luvdisc": "爱心鱼", + "bagon": "宝贝龙", + "shelgon": "甲壳龙", + "salamence": "暴飞龙", + "beldum": "铁哑铃", + "metang": "金属怪", + "metagross": "巨金怪", + "regirock": "雷吉洛克", + "regice": "雷吉艾斯", + "registeel": "雷吉斯奇鲁", + "latias": "拉帝亚斯", + "latios": "拉帝欧斯", + "kyogre": "盖欧卡", + "groudon": "固拉多", + "rayquaza": "烈空坐", + "jirachi": "基拉祈", + "deoxys": "代欧奇希斯", + "turtwig": "草苗龟", + "grotle": "树林龟", + "torterra": "土台龟", + "chimchar": "小火焰猴", + "monferno": "猛火猴", + "infernape": "烈焰猴", + "piplup": "波加曼", + "prinplup": "波皇子", + "empoleon": "帝王拿波", + "starly": "姆克儿", + "staravia": "姆克鸟", + "staraptor": "姆克鹰", + "bidoof": "大牙狸", + "bibarel": "大尾狸", + "kricketot": "圆法师", + "kricketune": "音箱蟀", + "shinx": "小猫怪", + "luxio": "勒克猫", + "luxray": "伦琴猫", + "budew": "含羞苞", + "roserade": "罗丝雷朵", + "cranidos": "头盖龙", + "rampardos": "战槌龙", + "shieldon": "盾甲龙", + "bastiodon": "护城龙", + "burmy": "结草儿", + "wormadam": "结草贵妇", + "mothim": "绅士蛾", + "combee": "三蜜蜂", + "vespiquen": "蜂女王", + "pachirisu": "帕奇利兹", + "buizel": "泳圈鼬", + "floatzel": "浮潜鼬", + "cherubi": "樱花宝", + "cherrim": "樱花儿", + "shellos": "无壳海兔", + "gastrodon": "海兔兽", + "ambipom": "双尾怪手", + "drifloon": "飘飘球", + "drifblim": "随风球", + "buneary": "卷卷耳", + "lopunny": "长耳兔", + "mismagius": "梦妖魔", + "honchkrow": "乌鸦头头", + "glameow": "魅力喵", + "purugly": "东施喵", + "chingling": "铃铛响", + "stunky": "臭鼬噗", + "skuntank": "坦克臭鼬", + "bronzor": "铜镜怪", + "bronzong": "青铜钟", + "bonsly": "盆才怪", + "mime_jr": "魔尼尼", + "happiny": "小福蛋", + "chatot": "聒噪鸟", + "spiritomb": "花岩怪", + "gible": "圆陆鲨", + "gabite": "尖牙陆鲨", + "garchomp": "烈咬陆鲨", + "munchlax": "小卡比兽", + "riolu": "利欧路", + "lucario": "路卡利欧", + "hippopotas": "沙河马", + "hippowdon": "河马兽", + "skorupi": "钳尾蝎", + "drapion": "龙王蝎", + "croagunk": "不良蛙", + "toxicroak": "毒骷蛙", + "carnivine": "尖牙笼", + "finneon": "荧光鱼", + "lumineon": "霓虹鱼", + "mantyke": "小球飞鱼", + "snover": "雪笠怪", + "abomasnow": "暴雪王", + "weavile": "玛狃拉", + "magnezone": "自爆磁怪", + "lickilicky": "大舌舔", + "rhyperior": "超甲狂犀", + "tangrowth": "巨蔓藤", + "electivire": "电击魔兽", + "magmortar": "鸭嘴炎兽", + "togekiss": "波克基斯", + "yanmega": "远古巨蜓", + "leafeon": "叶伊布", + "glaceon": "冰伊布", + "gliscor": "天蝎王", + "mamoswine": "象牙猪", + "porygon_z": "多边兽乙型", + "gallade": "艾路雷朵", + "probopass": "大朝北鼻", + "dusknoir": "黑夜魔灵", + "froslass": "雪妖女", + "rotom": "洛托姆", + "uxie": "由克希", + "mesprit": "艾姆利多", + "azelf": "亚克诺姆", + "dialga": "帝牙卢卡", + "palkia": "帕路奇亚", + "heatran": "席多蓝恩", + "regigigas": "雷吉奇卡斯", + "giratina": "骑拉帝纳", + "cresselia": "克雷色利亚", + "phione": "霏欧纳", + "manaphy": "玛纳霏", + "darkrai": "达克莱伊", + "shaymin": "谢米", + "arceus": "阿尔宙斯", + "victini": "比克提尼", + "snivy": "藤藤蛇", + "servine": "青藤蛇", + "serperior": "君主蛇", + "tepig": "暖暖猪", + "pignite": "炒炒猪", + "emboar": "炎武王", + "oshawott": "水水獭", + "dewott": "双刃丸", + "samurott": "大剑鬼", + "patrat": "探探鼠", + "watchog": "步哨鼠", + "lillipup": "小约克", + "herdier": "哈约克", + "stoutland": "长毛狗", + "purrloin": "扒手猫", + "liepard": "酷豹", + "pansage": "花椰猴", + "simisage": "花椰猿", + "pansear": "爆香猴", + "simisear": "爆香猿", + "panpour": "冷水猴", + "simipour": "冷水猿", + "munna": "食梦梦", + "musharna": "梦梦蚀", + "pidove": "豆豆鸽", + "tranquill": "咕咕鸽", + "unfezant": "高傲雉鸡", + "blitzle": "斑斑马", + "zebstrika": "雷电斑马", + "roggenrola": "石丸子", + "boldore": "地幔岩", + "gigalith": "庞岩怪", + "woobat": "滚滚蝙蝠", + "swoobat": "心蝙蝠", + "drilbur": "螺钉地鼠", + "excadrill": "龙头地鼠", + "audino": "差不多娃娃", + "timburr": "搬运小匠", + "gurdurr": "铁骨土人", + "conkeldurr": "修建老匠", + "tympole": "圆蝌蚪", + "palpitoad": "蓝蟾蜍", + "seismitoad": "蟾蜍王", + "throh": "投摔鬼", + "sawk": "打击鬼", + "sewaddle": "虫宝包", + "swadloon": "宝包茧", + "leavanny": "保姆虫", + "venipede": "百足蜈蚣", + "whirlipede": "车轮球", + "scolipede": "蜈蚣王", + "cottonee": "木棉球", + "whimsicott": "风妖精", + "petilil": "百合根娃娃", + "lilligant": "裙儿小姐", + "basculin": "野蛮鲈鱼", + "sandile": "黑眼鳄", + "krokorok": "混混鳄", + "krookodile": "流氓鳄", + "darumaka": "火红不倒翁", + "darmanitan": "达摩狒狒", + "maractus": "沙铃仙人掌", + "dwebble": "石居蟹", + "crustle": "岩殿居蟹", + "scraggy": "滑滑小子", + "scrafty": "头巾混混", + "sigilyph": "象征鸟", + "yamask": "哭哭面具", + "cofagrigus": "迭失棺", + "tirtouga": "原盖海龟", + "carracosta": "肋骨海龟", + "archen": "始祖小鸟", + "archeops": "始祖大鸟", + "trubbish": "破破袋", + "garbodor": "灰尘山", + "zorua": "索罗亚", + "zoroark": "索罗亚克", + "minccino": "泡沫栗鼠", + "cinccino": "奇诺栗鼠", + "gothita": "哥德宝宝", + "gothorita": "哥德小童", + "gothitelle": "哥德小姐", + "solosis": "单卵细胞球", + "duosion": "双卵细胞球", + "reuniclus": "人造细胞卵", + "ducklett": "鸭宝宝", + "swanna": "舞天鹅", + "vanillite": "迷你冰", + "vanillish": "多多冰", + "vanilluxe": "双倍多多冰", + "deerling": "四季鹿", + "sawsbuck": "萌芽鹿", + "emolga": "电飞鼠", + "karrablast": "盖盖虫", + "escavalier": "骑士蜗牛", + "foongus": "哎呀球菇", + "amoonguss": "败露球菇", + "frillish": "轻飘飘", + "jellicent": "胖嘟嘟", + "alomomola": "保姆曼波", + "joltik": "电电虫", + "galvantula": "电蜘蛛", + "ferroseed": "种子铁球", + "ferrothorn": "坚果哑铃", + "klink": "齿轮儿", + "klang": "齿轮组", + "klinklang": "齿轮怪", + "tynamo": "麻麻小鱼", + "eelektrik": "麻麻鳗", + "eelektross": "麻麻鳗鱼王", + "elgyem": "小灰怪", + "beheeyem": "大宇怪", + "litwick": "烛光灵", + "lampent": "灯火幽灵", + "chandelure": "水晶灯火灵", + "axew": "牙牙", + "fraxure": "斧牙龙", + "haxorus": "双斧战龙", + "cubchoo": "喷嚏熊", + "beartic": "冻原熊", + "cryogonal": "几何雪花", + "shelmet": "小嘴蜗", + "accelgor": "敏捷虫", + "stunfisk": "泥巴鱼", + "mienfoo": "功夫鼬", + "mienshao": "师父鼬", + "druddigon": "赤面龙", + "golett": "泥偶小人", + "golurk": "泥偶巨人", + "pawniard": "驹刀小兵", + "bisharp": "劈斩司令", + "bouffalant": "爆炸头水牛", + "rufflet": "毛头小鹰", + "braviary": "勇士雄鹰", + "vullaby": "秃鹰丫头", + "mandibuzz": "秃鹰娜", + "heatmor": "熔蚁兽", + "durant": "铁蚁", + "deino": "单首龙", + "zweilous": "双首暴龙", + "hydreigon": "三首恶龙", + "larvesta": "燃烧虫", + "volcarona": "火神蛾", + "cobalion": "勾帕路翁", + "terrakion": "代拉基翁", + "virizion": "毕力吉翁", + "tornadus": "龙卷云", + "thundurus": "雷电云", + "reshiram": "莱希拉姆", + "zekrom": "捷克罗姆", + "landorus": "土地云", + "kyurem": "酋雷姆", + "keldeo": "凯路迪欧", + "meloetta": "美洛耶塔", + "genesect": "盖诺赛克特", + "chespin": "哈力栗", + "quilladin": "胖胖哈力", + "chesnaught": "布里卡隆", + "fennekin": "火狐狸", + "braixen": "长尾火狐", + "delphox": "妖火红狐", + "froakie": "呱呱泡蛙", + "frogadier": "呱头蛙", + "greninja": "甲贺忍蛙", + "bunnelby": "掘掘兔", + "diggersby": "掘地兔", + "fletchling": "小箭雀", + "fletchinder": "火箭雀", + "talonflame": "烈箭鹰", + "scatterbug": "粉蝶虫", + "spewpa": "粉蝶蛹", + "vivillon": "彩粉蝶", + "litleo": "小狮狮", + "pyroar": "火炎狮", + "flabebe": "花蓓蓓", + "floette": "花叶蒂", + "florges": "花洁夫人", + "skiddo": "坐骑小羊", + "gogoat": "坐骑山羊", + "pancham": "顽皮熊猫", + "pangoro": "霸道熊猫", + "furfrou": "多丽米亚", + "espurr": "妙喵", + "meowstic": "超能妙喵", + "honedge": "独剑鞘", + "doublade": "双剑鞘", + "aegislash": "坚盾剑怪", + "spritzee": "粉香香", + "aromatisse": "芳香精", + "swirlix": "绵绵泡芙", + "slurpuff": "胖甜妮", + "inkay": "好啦鱿", + "malamar": "乌贼王", + "binacle": "龟脚脚", + "barbaracle": "龟足巨铠", + "skrelp": "垃垃藻", + "dragalge": "毒藻龙", + "clauncher": "铁臂枪虾", + "clawitzer": "钢炮臂虾", + "helioptile": "伞电蜥", + "heliolisk": "光电伞蜥", + "tyrunt": "宝宝暴龙", + "tyrantrum": "怪颚龙", + "amaura": "冰雪龙", + "aurorus": "冰雪巨龙", + "sylveon": "仙子伊布", + "hawlucha": "摔角鹰人", + "dedenne": "咚咚鼠", + "carbink": "小碎钻", + "goomy": "黏黏宝", + "sliggoo": "黏美儿", + "goodra": "黏美龙", + "klefki": "钥圈儿", + "phantump": "小木灵", + "trevenant": "朽木妖", + "pumpkaboo": "南瓜精", + "gourgeist": "南瓜怪人", + "bergmite": "冰宝", + "avalugg": "冰岩怪", + "noibat": "嗡蝠", + "noivern": "音波龙", + "xerneas": "哲尔尼亚斯", + "yveltal": "伊裴尔塔尔", + "zygarde": "基格尔德", + "diancie": "蒂安希", + "hoopa": "胡帕", + "volcanion": "波尔凯尼恩", + "rowlet": "木木枭", + "dartrix": "投羽枭", + "decidueye": "狙射树枭", + "litten": "火斑喵", + "torracat": "炎热喵", + "incineroar": "炽焰咆哮虎", + "popplio": "球球海狮", + "brionne": "花漾海狮", + "primarina": "西狮海壬", + "pikipek": "小笃儿", + "trumbeak": "喇叭啄鸟", + "toucannon": "铳嘴大鸟", + "yungoos": "猫鼬少", + "gumshoos": "猫鼬探长", + "grubbin": "强颚鸡母虫", + "charjabug": "虫电宝", + "vikavolt": "锹农炮虫", + "crabrawler": "好胜蟹", + "crabominable": "好胜毛蟹", + "oricorio": "花舞鸟", + "cutiefly": "萌虻", + "ribombee": "蝶结萌虻", + "rockruff": "岩狗狗", + "lycanroc": "鬃岩狼人", + "wishiwashi": "弱丁鱼", + "mareanie": "好坏星", + "toxapex": "超坏星", + "mudbray": "泥驴仔", + "mudsdale": "重泥挽马", + "dewpider": "滴蛛", + "araquanid": "滴蛛霸", + "fomantis": "伪螳草", + "lurantis": "兰螳花", + "morelull": "睡睡菇", + "shiinotic": "灯罩夜菇", + "salandit": "夜盗火蜥", + "salazzle": "焰后蜥", + "stufful": "童偶熊", + "bewear": "穿着熊", + "bounsweet": "甜竹竹", + "steenee": "甜舞妮", + "tsareena": "甜冷美后", + "comfey": "花疗环环", + "oranguru": "智挥猩", + "passimian": "投掷猴", + "wimpod": "胆小虫", + "golisopod": "具甲武者", + "sandygast": "沙丘娃", + "palossand": "噬沙堡爷", + "pyukumuku": "拳海参", + "type_null": "属性:空", + "silvally": "银伴战兽", + "minior": "小陨星", + "komala": "树枕尾熊", + "turtonator": "爆焰龟兽", + "togedemaru": "托戈德玛尔", + "mimikyu": "谜拟丘", + "bruxish": "磨牙彩皮鱼", + "drampa": "老翁龙", + "dhelmise": "破破舵轮", + "jangmo_o": "心鳞宝", + "hakamo_o": "鳞甲龙", + "kommo_o": "杖尾鳞甲龙", + "tapu_koko": "卡璞・鸣鸣", + "tapu_lele": "卡璞・蝶蝶", + "tapu_bulu": "卡璞・哞哞", + "tapu_fini": "卡璞・鳍鳍", + "cosmog": "科斯莫古", + "cosmoem": "科斯莫姆", + "solgaleo": "索尔迦雷欧", + "lunala": "露奈雅拉", + "nihilego": "虚吾伊德", + "buzzwole": "爆肌蚊", + "pheromosa": "费洛美螂", + "xurkitree": "电束木", + "celesteela": "铁火辉夜", + "kartana": "纸御剑", + "guzzlord": "恶食大王", + "necrozma": "奈克洛兹玛", + "magearna": "玛机雅娜", + "marshadow": "玛夏多", + "poipole": "毒贝比", + "naganadel": "四颚针龙", + "stakataka": "垒磊石", + "blacephalon": "砰头小丑", + "zeraora": "捷拉奥拉", + "meltan": "美录坦", + "melmetal": "美录梅塔", + "grookey": "敲音猴", + "thwackey": "啪咚猴", + "rillaboom": "轰擂金刚猩", + "scorbunny": "炎兔儿", + "raboot": "腾蹴小将", + "cinderace": "闪焰王牌", + "sobble": "泪眼蜥", + "drizzile": "变涩蜥", + "inteleon": "千面避役", + "skwovet": "贪心栗鼠", + "greedent": "藏饱栗鼠", + "rookidee": "稚山雀", + "corvisquire": "蓝鸦", + "corviknight": "钢铠鸦", + "blipbug": "索侦虫", + "dottler": "天罩虫", + "orbeetle": "以欧路普", + "nickit": "狡小狐", + "thievul": "猾大狐", + "gossifleur": "幼棉棉", + "eldegoss": "白蓬蓬", + "wooloo": "毛辫羊", + "dubwool": "毛毛角羊", + "chewtle": "咬咬龟", + "drednaw": "暴噬龟", + "yamper": "来电汪", + "boltund": "逐电犬", + "rolycoly": "小炭仔", + "carkol": "大炭车", + "coalossal": "巨炭山", + "applin": "啃果虫", + "flapple": "苹裹龙", + "appletun": "丰蜜龙", + "silicobra": "沙包蛇", + "sandaconda": "沙螺蟒", + "cramorant": "古月鸟", + "arrokuda": "刺梭鱼", + "barraskewda": "戽斗尖梭", + "toxel": "电音婴", + "toxtricity": "颤弦蝾螈", + "sizzlipede": "烧火蚣", + "centiskorch": "焚焰蚣", + "clobbopus": "拳拳蛸", + "grapploct": "八爪武师", + "sinistea": "来悲茶", + "polteageist": "怖思壶", + "hatenna": "迷布莉姆", + "hattrem": "提布莉姆", + "hatterene": "布莉姆温", + "impidimp": "捣蛋小妖", + "morgrem": "诈唬魔", + "grimmsnarl": "长毛巨魔", + "obstagoon": "堵拦熊", + "perrserker": "喵头目", + "cursola": "魔灵珊瑚", + "sirfetchd": "葱游兵", + "mr_rime": "踏冰人偶", + "runerigus": "迭失板", + "milcery": "小仙奶", + "alcremie": "霜奶仙", + "falinks": "列阵兵", + "pincurchin": "啪嚓海胆", + "snom": "雪吞虫", + "frosmoth": "雪绒蛾", + "stonjourner": "巨石丁", + "eiscue": "冰砌鹅", + "indeedee": "爱管侍", + "morpeko": "莫鲁贝可", + "cufant": "铜象", + "copperajah": "大王铜象", + "dracozolt": "雷鸟龙", + "arctozolt": "雷鸟海兽", + "dracovish": "鳃鱼龙", + "arctovish": "鳃鱼海兽", + "duraludon": "铝钢龙", + "dreepy": "多龙梅西亚", + "drakloak": "多龙奇", + "dragapult": "多龙巴鲁托", + "zacian": "苍响", + "zamazenta": "藏玛然特", + "eternatus": "无极汰那", + "kubfu": "熊徒弟", + "urshifu": "武道熊师", + "zarude": "萨戮德", + "regieleki": "雷吉艾勒奇", + "regidrago": "雷吉铎拉戈", + "glastrier": "雪暴马", + "spectrier": "灵幽马", + "calyrex": "蕾冠王", + "wyrdeer": "诡角鹿", + "kleavor": "劈斧螳螂", + "ursaluna": "月月熊", + "basculegion": "幽尾玄鱼", + "sneasler": "大狃拉", + "overqwil": "万针鱼", + "enamorus": "眷恋云", + "sprigatito": "新叶喵", + "floragato": "蒂蕾喵", + "meowscarada": "魔幻假面喵", + "fuecoco": "呆火鳄", + "crocalor": "炙烫鳄", + "skeledirge": "骨纹巨声鳄", + "quaxly": "润水鸭", + "quaxwell": "涌跃鸭", + "quaquaval": "狂欢浪舞鸭", + "lechonk": "爱吃豚", + "oinkologne": "飘香豚", + "tarountula": "团珠蛛", + "spidops": "操陷蛛", + "nymble": "豆蟋蟀", + "lokix": "烈腿蝗", + "pawmi": "布拨", + "pawmo": "布土拨", + "pawmot": "巴布土拨", + "tandemaus": "一对鼠", + "maushold": "一家鼠", + "fidough": "狗仔包", + "dachsbun": "麻花犬", + "smoliv": "迷你芙", + "dolliv": "奥利纽", + "arboliva": "奥利瓦", + "squawkabilly": "怒鹦哥", + "nacli": "盐石宝", + "naclstack": "盐石垒", + "garganacl": "盐石巨灵", + "charcadet": "炭小侍", + "armarouge": "红莲铠骑", + "ceruledge": "苍炎刃鬼", + "tadbulb": "光蚪仔", + "bellibolt": "电肚蛙", + "wattrel": "电海燕", + "kilowattrel": "大电海燕", + "maschiff": "偶叫獒", + "mabosstiff": "獒教父", + "shroodle": "滋汁鼹", + "grafaiai": "涂标客", + "bramblin": "纳噬草", + "brambleghast": "怖纳噬草", + "toedscool": "原野水母", + "toedscruel": "陆地水母", + "klawf": "毛崖蟹", + "capsakid": "热辣娃", + "scovillain": "狠辣椒", + "rellor": "虫滚泥", + "rabsca": "虫甲圣", + "flittle": "飘飘雏", + "espathra": "超能艳鸵", + "tinkatink": "小锻匠", + "tinkatuff": "巧锻匠", + "tinkaton": "巨锻匠", + "wiglett": "海地鼠", + "wugtrio": "三海地鼠", + "bombirdier": "下石鸟", + "finizen": "波普海豚", + "palafin": "海豚侠", + "varoom": "噗隆隆", + "revavroom": "普隆隆姆", + "cyclizar": "摩托蜥", + "orthworm": "拖拖蚓", + "glimmet": "晶光芽", + "glimmora": "晶光花", + "greavard": "墓仔狗", + "houndstone": "墓扬犬", + "flamigo": "缠红鹤", + "cetoddle": "走鲸", + "cetitan": "浩大鲸", + "veluza": "轻身鳕", + "dondozo": "吃吼霸", + "tatsugiri": "米立龙", + "annihilape": "弃世猴", + "clodsire": "土王", + "farigiraf": "奇麒麟", + "dudunsparce": "土龙节节", + "kingambit": "仆刀将军", + "great_tusk": "雄伟牙", + "scream_tail": "吼叫尾", + "brute_bonnet": "猛恶菇", + "flutter_mane": "振翼发", + "slither_wing": "爬地翅", + "sandy_shocks": "沙铁皮", + "iron_treads": "铁辙迹", + "iron_bundle": "铁包袱", + "iron_hands": "铁臂膀", + "iron_jugulis": "铁脖颈", + "iron_moth": "铁毒蛾", + "iron_thorns": "铁荆棘", + "frigibax": "凉脊龙", + "arctibax": "冻脊龙", + "baxcalibur": "戟脊龙", + "gimmighoul": "索财灵", + "gholdengo": "赛富豪", + "wo_chien": "古简蜗", + "chien_pao": "古剑豹", + "ting_lu": "古鼎鹿", + "chi_yu": "古玉鱼", + "roaring_moon": "轰鸣月", + "iron_valiant": "铁武者", + "koraidon": "故勒顿", + "miraidon": "密勒顿", + "walking_wake": "波荡水", + "iron_leaves": "铁斑叶", + "dipplin": "裹蜜虫", + "poltchageist": "斯魔茶", + "sinistcha": "来悲粗茶", + "okidogi": "够赞狗", + "munkidori": "愿增猿", + "fezandipiti": "吉雉鸡", + "ogerpon": "厄诡椪", + "archaludon": "铝钢桥龙", + "hydrapple": "蜜集大蛇", + "gouging_fire": "破空焰", + "raging_bolt": "猛雷鼓", + "iron_boulder": "铁磐岩", + "iron_crown": "铁头壳", + "terapagos": "太乐巴戈斯", + "pecharunt": "桃歹郎", + "alola_rattata": "小拉达", + "alola_raticate": "拉达", + "alola_raichu": "雷丘", + "alola_sandshrew": "穿山鼠", + "alola_sandslash": "穿山王", + "alola_vulpix": "六尾", + "alola_ninetales": "九尾", + "alola_diglett": "地鼠", + "alola_dugtrio": "三地鼠", + "alola_meowth": "喵喵", + "alola_persian": "猫老大", + "alola_geodude": "小拳石", + "alola_graveler": "隆隆石", + "alola_golem": "隆隆岩", + "alola_grimer": "臭泥", + "alola_muk": "臭臭泥", + "alola_exeggutor": "椰蛋树", + "alola_marowak": "嘎啦嘎啦", + "eternal_floette": "花叶蒂", + "galar_meowth": "喵喵", + "galar_ponyta": "小火马", + "galar_rapidash": "烈焰马", + "galar_slowpoke": "呆呆兽", + "galar_slowbro": "呆壳兽", + "galar_farfetchd": "大葱鸭", + "galar_weezing": "双弹瓦斯", + "galar_mr_mime": "魔墙人偶", + "galar_articuno": "急冻鸟", + "galar_zapdos": "闪电鸟", + "galar_moltres": "火焰鸟", + "galar_slowking": "呆呆王", + "galar_corsola": "太阳珊瑚", + "galar_zigzagoon": "蛇纹熊", + "galar_linoone": "直冲熊", + "galar_darumaka": "火红不倒翁", + "galar_darmanitan": "达摩狒狒", + "galar_yamask": "哭哭面具", + "galar_stunfisk": "泥巴鱼", + "hisui_growlithe": "卡蒂狗", + "hisui_arcanine": "风速狗", + "hisui_voltorb": "霹雳电球", + "hisui_electrode": "顽皮雷弹", + "hisui_typhlosion": "火暴兽", + "hisui_qwilfish": "千针鱼", + "hisui_sneasel": "狃拉", + "hisui_samurott": "大剑鬼", + "hisui_lilligant": "裙儿小姐", + "hisui_zorua": "索罗亚", + "hisui_zoroark": "索罗亚克", + "hisui_braviary": "勇士雄鹰", + "hisui_sliggoo": "黏美儿", + "hisui_goodra": "黏美龙", + "hisui_avalugg": "冰岩怪", + "hisui_decidueye": "狙射树枭", + "paldea_tauros": "肯泰罗", + "paldea_wooper": "乌波", + "bloodmoon_ursaluna": "月月熊", +} as const; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 0713b4543769..a4e511038f63 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'使用这些宝可梦开始游戏吗?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "成长速度:", - "ability": "特性:", - "passive": "被动:", - "nature": "性格:", - "eggMoves": '蛋招式', - "start": "开始", - "addToParty": "加入队伍", - "toggleIVs": '切换个体值', - "manageMoves": '管理招式', - "useCandies": '使用糖果', - "selectMoveSwapOut": "选择要替换的招式。", - "selectMoveSwapWith": "选择要替换成的招式", - "unlockPassive": "解锁被动", - "reduceCost": "降低花费", - "cycleShiny": "R: 切换闪光", - "cycleForm": 'F: 切换形态', - "cycleGender": 'G: 切换性别', - "cycleAbility": 'E: 切换特性', - "cycleNature": 'N: 切换性格', - "cycleVariant": 'V: 切换变种', - "enablePassive": "启用被动", - "disablePassive": "禁用被动", - "locked": "未解锁", - "disabled": "已禁用", - "uncaught": "未捕获" -} + "confirmStartTeam":"使用这些宝可梦开始游戏吗?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "成长速度:", + "ability": "特性:", + "passive": "被动:", + "nature": "性格:", + "eggMoves": "蛋招式", + "start": "开始", + "addToParty": "加入队伍", + "toggleIVs": "切换个体值", + "manageMoves": "管理招式", + "useCandies": "使用糖果", + "selectMoveSwapOut": "选择要替换的招式。", + "selectMoveSwapWith": "选择要替换成的招式", + "unlockPassive": "解锁被动", + "reduceCost": "降低花费", + "cycleShiny": "R: 切换闪光", + "cycleForm": "F: 切换形态", + "cycleGender": "G: 切换性别", + "cycleAbility": "E: 切换特性", + "cycleNature": "N: 切换性格", + "cycleVariant": "V: 切换变种", + "enablePassive": "启用被动", + "disablePassive": "禁用被动", + "locked": "未解锁", + "disabled": "已禁用", + "uncaught": "未捕获" +}; diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 7fa16d87fad3..4d8703629c47 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -2,299 +2,299 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "四天王", - "gym_leader": "道馆馆主", - "gym_leader_female": "道馆馆主", - "champion": "冠军", - "rival": "劲敌", - "professor": "博士", - "frontier_brain": "开拓头脑", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "四天王", + "gym_leader": "道馆馆主", + "gym_leader_female": "道馆馆主", + "champion": "冠军", + "rival": "劲敌", + "professor": "博士", + "frontier_brain": "开拓头脑", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "精英训练家", - "ace_trainer_female": "精英训练家", - "ace_duo": "精英组合", - "artist": "艺术家", - "artist_female": "艺术家", - "backers": "啦啦队", - "backpacker": "背包客", - "backpacker_female": "背包客", - "backpackers": "背包客组合", - "baker": "面包师", - "battle_girl": "对战少女", - "beauty": "大姐姐", - "beginners": "新人训练家组合", - "biker": "飙车族", - "black_belt": "空手道王", - "breeder": "宝可梦培育家", - "breeder_female": "宝可梦培育家", - "breeders": "宝可梦培育家组合", - "clerk": "商务人士", - "clerk_female": "职场OL", - "colleagues": "商务伙伴", - "crush_kin": "格斗姐弟", - "cyclist": "自行车手", - "cyclist_female": "自行车手", - "cyclists": "自行车手组合", - "dancer": "舞者", - "dancer_female": "舞者", - "depot_agent": "铁路员工", - "doctor": "医生", - "doctor_female": "医生", - "fisherman": "垂钓者", - "fisherman_female": "垂钓者", - "gentleman": "绅士", - "guitarist": "吉他手", - "guitarist_female": "吉他手", - "harlequin": "滑稽演员", - "hiker": "登山男", - "hooligans": "坏组合", - "hoopster": "篮球选手", - "infielder": "棒球选手", - "janitor": "清洁员", - "lady": "千金小姐", - "lass": "迷你裙", - "linebacker": "美式橄榄球选手", - "maid": "女仆", - "madame": "女士", - "medical_team": "医疗团队", - "musician": "音乐家", - "hex_maniac": "灵异迷", - "nurse": "护士", - "nursery_aide": "幼儿园老师", - "officer": "警察", - "parasol_lady": "阳伞姐姐", - "pilot": "飞行员", - "pokéfan": "发烧友俱乐部", - "pokéfan_female": "发烧友俱乐部", - "pokéfan_family": "同好夫妇", - "preschooler": "幼儿园小朋友", - "preschooler_female": "幼儿园小朋友", - "preschoolers": "幼儿园小朋友组合", - "psychic": "超能力者", - "psychic_female": "超能力者", - "psychics": "超能力者组合", - "pokémon_ranger": "宝可梦巡护员", - "pokémon_ranger_female": "宝可梦巡护员", - "pokémon_rangers": "宝可梦巡护员组合", - "ranger": "巡护员", - "restaurant_staff": "服务生组合", - "rich": "Rich", - "rich_female": "Rich", - "rich_boy": "富家少爷", - "rich_couple": "富豪夫妇", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "富二代组合", - "roughneck": "光头男", - "scientist": "研究员", - "scientist_female": "研究员", - "scientists": "研究员组合", - "smasher": "网球选手", - "snow_worker": "雪地工人", - "snow_worker_female": "雪地工人", - "striker": "足球选手", - "school_kid": "补习班学生", - "school_kid_female": "补习班学生", - "school_kids": "补习班学生组合", - "swimmer": "泳裤小伙子", - "swimmer_female": "比基尼大姐姐", - "swimmers": "泳装情侣", - "twins": "双胞胎", - "veteran": "资深训练家", - "veteran_female": "资深训练家", - "veteran_duo": "资深组合", - "waiter": "服务生", - "waitress": "女服务生", - "worker": "工人", - "worker_female": "工人", - "workers": "工人组合", - "youngster": "短裤小子" + "ace_trainer": "精英训练家", + "ace_trainer_female": "精英训练家", + "ace_duo": "精英组合", + "artist": "艺术家", + "artist_female": "艺术家", + "backers": "啦啦队", + "backpacker": "背包客", + "backpacker_female": "背包客", + "backpackers": "背包客组合", + "baker": "面包师", + "battle_girl": "对战少女", + "beauty": "大姐姐", + "beginners": "新人训练家组合", + "biker": "飙车族", + "black_belt": "空手道王", + "breeder": "宝可梦培育家", + "breeder_female": "宝可梦培育家", + "breeders": "宝可梦培育家组合", + "clerk": "商务人士", + "clerk_female": "职场OL", + "colleagues": "商务伙伴", + "crush_kin": "格斗姐弟", + "cyclist": "自行车手", + "cyclist_female": "自行车手", + "cyclists": "自行车手组合", + "dancer": "舞者", + "dancer_female": "舞者", + "depot_agent": "铁路员工", + "doctor": "医生", + "doctor_female": "医生", + "fisherman": "垂钓者", + "fisherman_female": "垂钓者", + "gentleman": "绅士", + "guitarist": "吉他手", + "guitarist_female": "吉他手", + "harlequin": "滑稽演员", + "hiker": "登山男", + "hooligans": "坏组合", + "hoopster": "篮球选手", + "infielder": "棒球选手", + "janitor": "清洁员", + "lady": "千金小姐", + "lass": "迷你裙", + "linebacker": "美式橄榄球选手", + "maid": "女仆", + "madame": "女士", + "medical_team": "医疗团队", + "musician": "音乐家", + "hex_maniac": "灵异迷", + "nurse": "护士", + "nursery_aide": "幼儿园老师", + "officer": "警察", + "parasol_lady": "阳伞姐姐", + "pilot": "飞行员", + "pokéfan": "发烧友俱乐部", + "pokéfan_female": "发烧友俱乐部", + "pokéfan_family": "同好夫妇", + "preschooler": "幼儿园小朋友", + "preschooler_female": "幼儿园小朋友", + "preschoolers": "幼儿园小朋友组合", + "psychic": "超能力者", + "psychic_female": "超能力者", + "psychics": "超能力者组合", + "pokémon_ranger": "宝可梦巡护员", + "pokémon_ranger_female": "宝可梦巡护员", + "pokémon_rangers": "宝可梦巡护员组合", + "ranger": "巡护员", + "restaurant_staff": "服务生组合", + "rich": "Rich", + "rich_female": "Rich", + "rich_boy": "富家少爷", + "rich_couple": "富豪夫妇", + "rich_kid": "Rich Kid", + "rich_kid_female": "Rich Kid", + "rich_kids": "富二代组合", + "roughneck": "光头男", + "scientist": "研究员", + "scientist_female": "研究员", + "scientists": "研究员组合", + "smasher": "网球选手", + "snow_worker": "雪地工人", + "snow_worker_female": "雪地工人", + "striker": "足球选手", + "school_kid": "补习班学生", + "school_kid_female": "补习班学生", + "school_kids": "补习班学生组合", + "swimmer": "泳裤小伙子", + "swimmer_female": "比基尼大姐姐", + "swimmers": "泳装情侣", + "twins": "双胞胎", + "veteran": "资深训练家", + "veteran_female": "资深训练家", + "veteran_duo": "资深组合", + "waiter": "服务生", + "waitress": "女服务生", + "worker": "工人", + "worker_female": "工人", + "workers": "工人组合", + "youngster": "短裤小子" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - // ---- 馆主 Gym leader ---- - // 关都地区 Kanto Region - "brock": "小刚", - "misty": "小霞", - "lt_surge": "马志士", - "erika": "莉佳", - "janine": "阿杏", - "sabrina": "娜姿", - "blaine": "夏伯", - "giovanni": "坂木", + // ---- 馆主 Gym leader ---- + // 关都地区 Kanto Region + "brock": "小刚", + "misty": "小霞", + "lt_surge": "马志士", + "erika": "莉佳", + "janine": "阿杏", + "sabrina": "娜姿", + "blaine": "夏伯", + "giovanni": "坂木", - // 城都地区 Johto Region - "falkner": "阿速", - "bugsy": "阿笔", - "whitney": "小茜", - "morty": "松叶", - "chuck": "阿四", - "jasmine": "阿蜜", - "pryce": "柳伯", - "clair": "小椿", + // 城都地区 Johto Region + "falkner": "阿速", + "bugsy": "阿笔", + "whitney": "小茜", + "morty": "松叶", + "chuck": "阿四", + "jasmine": "阿蜜", + "pryce": "柳伯", + "clair": "小椿", - // 丰缘地区 Hoenn Region - "roxanne": "杜娟", - "brawly": "藤树", - "wattson": "铁旋", - "flannery": "亚莎", - "norman": "千里", - "winona": "娜琪", - "tate": "小枫", - "liza": "小南", - "juan": "亚当", + // 丰缘地区 Hoenn Region + "roxanne": "杜娟", + "brawly": "藤树", + "wattson": "铁旋", + "flannery": "亚莎", + "norman": "千里", + "winona": "娜琪", + "tate": "小枫", + "liza": "小南", + "juan": "亚当", - // 神奥地区 Sinnoh Region - "roark": "瓢太", - "gardenia": "菜种", - "maylene": "阿李", - "crasher_wake": "吉宪", - "fantina": "梅丽莎", - "byron": "东瓜", - "candice": "小菘", - "volkner": "电次", + // 神奥地区 Sinnoh Region + "roark": "瓢太", + "gardenia": "菜种", + "maylene": "阿李", + "crasher_wake": "吉宪", + "fantina": "梅丽莎", + "byron": "东瓜", + "candice": "小菘", + "volkner": "电次", - // 合众地区 Unova Region - "cilan": "天桐", - "chili": "伯特", - "cress": "寇恩", - "cheren": "黑连", - "lenora": "芦荟", - "roxie": "霍米加", - "burgh": "亚堤", - "elesa": "小菊儿", - "clay": "菊老大", - "skyla": "风露", - "brycen": "哈奇库", - "drayden": "夏卡", - "marlon": "西子伊", + // 合众地区 Unova Region + "cilan": "天桐", + "chili": "伯特", + "cress": "寇恩", + "cheren": "黑连", + "lenora": "芦荟", + "roxie": "霍米加", + "burgh": "亚堤", + "elesa": "小菊儿", + "clay": "菊老大", + "skyla": "风露", + "brycen": "哈奇库", + "drayden": "夏卡", + "marlon": "西子伊", - // 卡洛斯地区 Kalos Region - "viola": "紫罗兰", - "grant": "查克洛", - "korrina": "可尔妮", - "ramos": "福爷", - "clemont": "希特隆", - "valerie": "玛绣", - "olympia": "葛吉花", - "wulfric": "得抚", + // 卡洛斯地区 Kalos Region + "viola": "紫罗兰", + "grant": "查克洛", + "korrina": "可尔妮", + "ramos": "福爷", + "clemont": "希特隆", + "valerie": "玛绣", + "olympia": "葛吉花", + "wulfric": "得抚", - // 伽勒尔地区 Galar Region - "milo": "亚洛", - "nessa": "露璃娜", - "kabu": "卡芜", - "bea": "彩豆", - "allister": "欧尼奥", - "opal": "波普菈", - "bede": "彼特", - "gordie": "玛瓜", - "melony": "美蓉", - "piers": "聂梓", - "marnie": "玛俐", - "raihan": "奇巴纳", + // 伽勒尔地区 Galar Region + "milo": "亚洛", + "nessa": "露璃娜", + "kabu": "卡芜", + "bea": "彩豆", + "allister": "欧尼奥", + "opal": "波普菈", + "bede": "彼特", + "gordie": "玛瓜", + "melony": "美蓉", + "piers": "聂梓", + "marnie": "玛俐", + "raihan": "奇巴纳", - // 帕底亚地区 Paldea Region - "katy": "阿枫", - "brassius": "寇沙", - "iono": "奇树", - "kofu": "海岱", - "larry": "青木", - "ryme": "莱姆", - "tulip": "莉普", - "grusha": "古鲁夏", + // 帕底亚地区 Paldea Region + "katy": "阿枫", + "brassius": "寇沙", + "iono": "奇树", + "kofu": "海岱", + "larry": "青木", + "ryme": "莱姆", + "tulip": "莉普", + "grusha": "古鲁夏", - // ---- 四天王 Elite Four ---- - // 关都地区 Kanto Region - "lorelei": "科拿", - "bruno": "希巴", - "agatha": "菊子", - "lance": "阿渡", + // ---- 四天王 Elite Four ---- + // 关都地区 Kanto Region + "lorelei": "科拿", + "bruno": "希巴", + "agatha": "菊子", + "lance": "阿渡", - // 城都地区 Johto Region - "will": "一树", - "koga": "阿桔", - "karen": "梨花", + // 城都地区 Johto Region + "will": "一树", + "koga": "阿桔", + "karen": "梨花", - // 丰都地区 Hoenn Region - "sidney": "花月", - "phoebe": "芙蓉", - "glacia": "波妮", - "drake": "源治", + // 丰都地区 Hoenn Region + "sidney": "花月", + "phoebe": "芙蓉", + "glacia": "波妮", + "drake": "源治", - // 神奥地区 Sinnoh Region - "aaron": "阿柳", - "bertha": "菊野", - "flint": "大叶", - "lucian": "悟松", + // 神奥地区 Sinnoh Region + "aaron": "阿柳", + "bertha": "菊野", + "flint": "大叶", + "lucian": "悟松", - // 合众地区 Unova Region - "shauntal": "婉龙", - "marshal": "连武", - "grimsley": "越橘", - "caitlin": "嘉德丽雅", + // 合众地区 Unova Region + "shauntal": "婉龙", + "marshal": "连武", + "grimsley": "越橘", + "caitlin": "嘉德丽雅", - // 卡洛斯地区 Kalos Region - "malva": "帕琦拉", - "siebold": "志米", - "wikstrom": "雁铠", - "drasna": "朵拉塞娜", + // 卡洛斯地区 Kalos Region + "malva": "帕琦拉", + "siebold": "志米", + "wikstrom": "雁铠", + "drasna": "朵拉塞娜", - // 阿罗拉地区 Alola Region - "hala": "哈拉", - "molayne": "马睿因", - "olivia": "丽姿", - "acerola": "阿塞萝拉", - "kahili": "卡希丽", + // 阿罗拉地区 Alola Region + "hala": "哈拉", + "molayne": "马睿因", + "olivia": "丽姿", + "acerola": "阿塞萝拉", + "kahili": "卡希丽", - // 帕底亚地区 Paldea Region - "rika": "辛俐", - "poppy": "波琵", - "hassel": "八朔", + // 帕底亚地区 Paldea Region + "rika": "辛俐", + "poppy": "波琵", + "hassel": "八朔", - // 蓝莓学院 Blueberry Academy - "crispin": "赤松", - "amarys": "纳莉", - "lacey": "紫竽", - "drayton": "杜若", + // 蓝莓学院 Blueberry Academy + "crispin": "赤松", + "amarys": "纳莉", + "lacey": "紫竽", + "drayton": "杜若", - // ---- 冠军 Champion ---- - // 关都地区 Kanto Region - "blue": "青绿", - "red": "赤红", + // ---- 冠军 Champion ---- + // 关都地区 Kanto Region + "blue": "青绿", + "red": "赤红", - // 丰缘地区 Hoenn Region - "steven": "大吾", - "wallace": "米可利", + // 丰缘地区 Hoenn Region + "steven": "大吾", + "wallace": "米可利", - // 神奥地区 Sinnoh Region - "cynthia": "竹兰", + // 神奥地区 Sinnoh Region + "cynthia": "竹兰", - // 合众地区 Unova Region - "alder": "阿戴克", - "iris": "艾莉丝", + // 合众地区 Unova Region + "alder": "阿戴克", + "iris": "艾莉丝", - // 卡洛斯地区 Kalos Region - "diantha": "卡露妮", + // 卡洛斯地区 Kalos Region + "diantha": "卡露妮", - // 阿罗拉地区 Alola Region - "hau": "哈乌", + // 阿罗拉地区 Alola Region + "hau": "哈乌", - // 伽勒尔地区 Galar Region - "leon": "丹帝", + // 伽勒尔地区 Galar Region + "leon": "丹帝", - // 帕底亚地区 paldea Region - "geeta": "也慈", - "nemona": "妮莫", + // 帕底亚地区 paldea Region + "geeta": "也慈", + "nemona": "妮莫", - // 蓝莓学院 Blueberry academy - "kieran": "乌栗", + // 蓝莓学院 Blueberry academy + "kieran": "乌栗", - // 劲敌 rival - "rival": "芬恩", - "rival_female": "艾薇", + // 劲敌 rival + "rival": "芬恩", + "rival_female": "艾薇", } as const; diff --git a/src/locales/zh_CN/tutorial.ts b/src/locales/zh_CN/tutorial.ts index f5e95fc9c68d..65fb8cd1d069 100644 --- a/src/locales/zh_CN/tutorial.ts +++ b/src/locales/zh_CN/tutorial.ts @@ -1,32 +1,32 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `欢迎来到PokéRogue!这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。 + "intro": `欢迎来到PokéRogue!这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。 $本游戏未进行商业化,我们没有\nPokémon或Pokémon使用的版 $权资产的所有权。 $游戏仍在开发中,但已可完整游玩。如需报\n告错误,请使用 Discord 社区。 $如果游戏运行缓慢,请确保在浏览器设置中\n打开了“硬件加速”。`, - "accessMenu": `在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。`, + "accessMenu": "在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。", - "menu": `在此菜单中,您可以访问设置。 + "menu": `在此菜单中,您可以访问设置。 $在设置中,您可以更改游戏速度、窗口样式\n和其他选项。 $这里还有各种其他功能,请务必全部查看!`, - "starterSelect": `在此页面中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。 + "starterSelect": `在此页面中,您可以选择您的初始宝可梦。\n这些是您最初的队伍成员。 $每个初始宝可梦都有一个费用值。您的队伍\n最多可以拥有6名成员,只要总费用不超过10。 $您还可以根据您捕获或孵化的变种选择性别\n、特性和形态。 $一个物种个体值是您捕获或孵化的所有宝可\n梦中最好的,所以尽量获得更多同种宝可梦!`, - "pokerus": `每天随机3个可选的初始宝可梦会有紫色边\n框。 + "pokerus": `每天随机3个可选的初始宝可梦会有紫色边\n框。 $如果您看到您拥有的初始宝可梦带有紫色边\n框,请尝试将其添加到您的队伍中。请务必 $查看其概况!`, - "statChange": `只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。 + "statChange": `只要您的宝可梦没有被召回,属性变化就会\n在战斗中持续存在。 $在训练家战斗之前和进入新的宝可梦群落之\n前,您的宝可梦会被召回。 $您还可以通过按住C或Shift键来查看\n场上宝可梦的能力变化。`, - "selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。 + "selectItem": `每次战斗后,您都可以选择 3 个随机物品。\n您只能选择其中一个。 $这些物品包括消耗品、宝可梦携带物品和永\n久被动道具。 $大多数非消耗品的效果会以各种方式叠加。 $某些物品只有在可以使用时才会出现,例如\n进化物品。 @@ -35,10 +35,10 @@ export const tutorial: SimpleTranslationEntries = { $您可以用金钱购买消耗品,并且随着您游戏\n的深入,将会有更多种类的消耗品可供选择。 $请务必在选择随机物品之前购买这些消耗品\n因为一旦您选择,游戏就会进入下一场战斗。`, - "eggGacha": `在此页面中,您可以使用您的兑换券兑换宝\n可梦蛋。 + "eggGacha": `在此页面中,您可以使用您的兑换券兑换宝\n可梦蛋。 $蛋需要孵化,并且在每场战斗后都会减少孵\n化周期。稀有蛋需要更长时间才能孵化。 $孵化的宝可梦不会被添加到您的队伍中,它\n们将被添加到您的初始宝可梦中。 $从蛋中孵化的宝可梦通常比野生宝可梦具有\n更好的个体值。 $有些宝可梦只能从蛋中获得。 $有 3 种不同的扭蛋机可供选择,每种扭蛋机\n都有不同的奖励,请选择最适合您的!`, -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/voucher.ts b/src/locales/zh_CN/voucher.ts index 7d0f8d2b2dd5..f7ef39b1df34 100644 --- a/src/locales/zh_CN/voucher.ts +++ b/src/locales/zh_CN/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "黄金扭蛋券", "locked": "锁定", "defeatTrainer": "你打败了{{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_CN/weather.ts b/src/locales/zh_CN/weather.ts index f78de2339c0d..2049b8a429cc 100644 --- a/src/locales/zh_CN/weather.ts +++ b/src/locales/zh_CN/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "日照变强了!", - "sunnyLapseMessage": "日照很强。", - "sunnyClearMessage": "日照复原了。", - - "rainStartMessage": "开始下雨了!", - "rainLapseMessage": "雨继续下。", - "rainClearMessage": "雨停了。", - - "sandstormStartMessage": "开始刮沙暴了!", - "sandstormLapseMessage": "沙暴肆虐。", - "sandstormClearMessage": "沙暴停止了!", - "sandstormDamageMessage": "沙暴袭击了{{pokemonPrefix}}{{pokemonName}}!", - - "hailStartMessage": "开始下冰雹了!", - "hailLapseMessage": "冰雹继续肆虐。", - "hailClearMessage": "冰雹不再下了。", - "hailDamageMessage": "冰雹袭击了{{pokemonPrefix}}{{pokemonName}}!", - - "snowStartMessage": "开始下雪了!", - "snowLapseMessage": "雪继续下。", - "snowClearMessage": "雪停了。", - - "fogStartMessage": "起雾了!", - "fogLapseMessage": "雾很浓。", - "fogClearMessage": "雾散了。", - - "heavyRainStartMessage": "开始下起了暴雨!", - "heavyRainLapseMessage": "暴雨势头不减。", - "heavyRainClearMessage": "暴雨停了。", - - "harshSunStartMessage": "日照变得非常强了!", - "harshSunLapseMessage": "强日照势头不减。", - "harshSunClearMessage": "日照复原了。", - - "strongWindsStartMessage": "吹起了神秘的乱流!", - "strongWindsLapseMessage": "神秘的乱流势头不减。", - "strongWindsClearMessage": "神秘的乱流停止了。" -} \ No newline at end of file + "sunnyStartMessage": "日照变强了!", + "sunnyLapseMessage": "日照很强。", + "sunnyClearMessage": "日照复原了。", + + "rainStartMessage": "开始下雨了!", + "rainLapseMessage": "雨继续下。", + "rainClearMessage": "雨停了。", + + "sandstormStartMessage": "开始刮沙暴了!", + "sandstormLapseMessage": "沙暴肆虐。", + "sandstormClearMessage": "沙暴停止了!", + "sandstormDamageMessage": "沙暴袭击了{{pokemonPrefix}}{{pokemonName}}!", + + "hailStartMessage": "开始下冰雹了!", + "hailLapseMessage": "冰雹继续肆虐。", + "hailClearMessage": "冰雹不再下了。", + "hailDamageMessage": "冰雹袭击了{{pokemonPrefix}}{{pokemonName}}!", + + "snowStartMessage": "开始下雪了!", + "snowLapseMessage": "雪继续下。", + "snowClearMessage": "雪停了。", + + "fogStartMessage": "起雾了!", + "fogLapseMessage": "雾很浓。", + "fogClearMessage": "雾散了。", + + "heavyRainStartMessage": "开始下起了暴雨!", + "heavyRainLapseMessage": "暴雨势头不减。", + "heavyRainClearMessage": "暴雨停了。", + + "harshSunStartMessage": "日照变得非常强了!", + "harshSunLapseMessage": "强日照势头不减。", + "harshSunClearMessage": "日照复原了。", + + "strongWindsStartMessage": "吹起了神秘的乱流!", + "strongWindsLapseMessage": "神秘的乱流势头不减。", + "strongWindsClearMessage": "神秘的乱流停止了。" +}; diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index b3c5063377fe..6c8f4bc4512e 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -1,6 +1,6 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const abilityTriggers: SimpleTranslationEntries = { - 'blockRecoilDamage' : `{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!`, - 'badDreams': `{{pokemonName}} 被折磨着!`, -} as const; \ No newline at end of file + "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!", +} as const; diff --git a/src/locales/zh_TW/ability.ts b/src/locales/zh_TW/ability.ts index 882948c95303..bf374c28f067 100644 --- a/src/locales/zh_TW/ability.ts +++ b/src/locales/zh_TW/ability.ts @@ -1,1146 +1,1146 @@ import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; export const ability: AbilityTranslationEntries = { - stench: { - name: "惡臭", - description: "通過釋放臭臭的氣味,在攻\n擊的時候,有時會使對手畏\n縮。", - }, - drizzle: { name: "降雨", description: "出場時,會將天氣變爲下雨\n。" }, - speedBoost: { name: "加速", description: "每一回合速度會變快。" }, - battleArmor: { - name: "戰鬥盔甲", - description: "被堅硬的甲殼守護着,不會\n被對手的攻擊擊中要害。", - }, - sturdy: { - name: "結實", - description: + stench: { + name: "惡臭", + description: "通過釋放臭臭的氣味,在攻\n擊的時候,有時會使對手畏\n縮。", + }, + drizzle: { name: "降雨", description: "出場時,會將天氣變爲下雨\n。" }, + speedBoost: { name: "加速", description: "每一回合速度會變快。" }, + battleArmor: { + name: "戰鬥盔甲", + description: "被堅硬的甲殼守護着,不會\n被對手的攻擊擊中要害。", + }, + sturdy: { + name: "結實", + description: "在HP全滿時,即使受到招\n式攻擊,也不會被一擊打倒\n。一擊必殺的招式也沒有效\n果。", - }, - damp: { - name: "溼氣", - description: "通過把周圍都弄溼,使誰都\n無法使用自爆等爆炸類的招\n式。", - }, - limber: { name: "柔軟", description: "因爲身體柔軟,不會變爲麻\n痹狀態。" }, - sandVeil: { name: "沙隱", description: "在沙暴的時候,閃避率會提\n高。" }, - static: { - name: "靜電", - description: "身上帶有靜電,有時會讓接\n觸到的對手麻痹。", - }, - voltAbsorb: { - name: "蓄電", - description: "受到電屬性的招式攻擊時,\n不會受到傷害,而是會回覆。", - }, - waterAbsorb: { - name: "儲水", - description: "受到水屬性的招式攻擊時,\n不會受到傷害,而是會回覆。", - }, - oblivious: { - name: "遲鈍", - description: + }, + damp: { + name: "溼氣", + description: "通過把周圍都弄溼,使誰都\n無法使用自爆等爆炸類的招\n式。", + }, + limber: { name: "柔軟", description: "因爲身體柔軟,不會變爲麻\n痹狀態。" }, + sandVeil: { name: "沙隱", description: "在沙暴的時候,閃避率會提\n高。" }, + static: { + name: "靜電", + description: "身上帶有靜電,有時會讓接\n觸到的對手麻痹。", + }, + voltAbsorb: { + name: "蓄電", + description: "受到電屬性的招式攻擊時,\n不會受到傷害,而是會回覆。", + }, + waterAbsorb: { + name: "儲水", + description: "受到水屬性的招式攻擊時,\n不會受到傷害,而是會回覆。", + }, + oblivious: { + name: "遲鈍", + description: "因爲感覺遲鈍,不會變爲着\n迷和被挑釁狀態。對威嚇也\n毫不動搖。", - }, - cloudNine: { name: "無關天氣", description: "任何天氣的影響都會消失。" }, - compoundEyes: { - name: "複眼", - description: "因爲擁有複眼,招式的命中\n率會提高。", - }, - insomnia: { - name: "不眠", - description: "因爲有着睡不着的體質,所\n以不會陷入睡眠狀態。", - }, - colorChange: { - name: "變色", - description: "自己的屬性會變爲從對手處\n所受招式的屬性。", - }, - immunity: { - name: "免疫", - description: "因爲體內擁有免疫能力,不\n會變爲中毒狀態。", - }, - flashFire: { - name: "引火", - description: + }, + cloudNine: { name: "無關天氣", description: "任何天氣的影響都會消失。" }, + compoundEyes: { + name: "複眼", + description: "因爲擁有複眼,招式的命中\n率會提高。", + }, + insomnia: { + name: "不眠", + description: "因爲有着睡不着的體質,所\n以不會陷入睡眠狀態。", + }, + colorChange: { + name: "變色", + description: "自己的屬性會變爲從對手處\n所受招式的屬性。", + }, + immunity: { + name: "免疫", + description: "因爲體內擁有免疫能力,不\n會變爲中毒狀態。", + }, + flashFire: { + name: "引火", + description: "受到火屬性的招式攻擊時,\n吸收火焰,自己使出的火屬\n性招式會變強。", - }, - shieldDust: { - name: "鱗粉", - description: "被鱗粉守護着,不會受到招\n式的追加效果影響。", - }, - ownTempo: { - name: "我行我素", - description: "因爲我行我素,不會變爲混\n亂狀態。對威嚇也毫不動搖。", - }, - suctionCups: { - name: "吸盤", - description: "用吸盤牢牢貼在地面上,讓\n替換寶可夢的招式和道具無\n效。", - }, - intimidate: { - name: "威嚇", - description: "出場時威嚇對手,讓其退縮\n,降低對手的攻擊。", - }, - shadowTag: { - name: "踩影", - description: "踩住對手的影子使其無法逃\n走或替換。", - }, - roughSkin: { - name: "粗糙皮膚", - description: "受到攻擊時,用粗糙的皮膚\n弄傷接觸到自己的對手。", - }, - wonderGuard: { - name: "神奇守護", - description: "不可思議的力量,只有效果\n絕佳的招式才能擊中。", - }, - levitate: { - name: "飄浮", - description: "從地面浮起,從而不會受到\n地面屬性招式的攻擊。", - }, - effectSpore: { - name: "孢子", - description: + }, + shieldDust: { + name: "鱗粉", + description: "被鱗粉守護着,不會受到招\n式的追加效果影響。", + }, + ownTempo: { + name: "我行我素", + description: "因爲我行我素,不會變爲混\n亂狀態。對威嚇也毫不動搖。", + }, + suctionCups: { + name: "吸盤", + description: "用吸盤牢牢貼在地面上,讓\n替換寶可夢的招式和道具無\n效。", + }, + intimidate: { + name: "威嚇", + description: "出場時威嚇對手,讓其退縮\n,降低對手的攻擊。", + }, + shadowTag: { + name: "踩影", + description: "踩住對手的影子使其無法逃\n走或替換。", + }, + roughSkin: { + name: "粗糙皮膚", + description: "受到攻擊時,用粗糙的皮膚\n弄傷接觸到自己的對手。", + }, + wonderGuard: { + name: "神奇守護", + description: "不可思議的力量,只有效果\n絕佳的招式才能擊中。", + }, + levitate: { + name: "飄浮", + description: "從地面浮起,從而不會受到\n地面屬性招式的攻擊。", + }, + effectSpore: { + name: "孢子", + description: "受到攻擊時,有時會把接觸\n到自己的對手變爲中毒、麻\n痹或睡眠狀態。", - }, - synchronize: { - name: "同步", - description: "將自己的中毒、麻痹或灼傷\n狀態傳染給對手。", - }, - clearBody: { - name: "恆淨之軀", - description: "不會因爲對手的招式或特性\n而被降低能力。", - }, - naturalCure: { - name: "自然回覆", - description: "回到同行隊伍後,異常狀態\n就會被治癒。", - }, - lightningRod: { - name: "避雷針", - description: + }, + synchronize: { + name: "同步", + description: "將自己的中毒、麻痹或灼傷\n狀態傳染給對手。", + }, + clearBody: { + name: "恆淨之軀", + description: "不會因爲對手的招式或特性\n而被降低能力。", + }, + naturalCure: { + name: "自然回覆", + description: "回到同行隊伍後,異常狀態\n就會被治癒。", + }, + lightningRod: { + name: "避雷針", + description: "將電屬性的招式吸引到自己\n身上,不會受到傷害,而是\n會提高特攻。", - }, - sereneGrace: { - name: "天恩", - description: "託天恩的福,招式的追加效\n果容易出現。", - }, - swiftSwim: { name: "悠遊自如", description: "下雨天氣時,速度會提高。" }, - chlorophyll: { name: "葉綠素", description: "晴朗天氣時,速度會提高。" }, - illuminate: { - name: "發光", - description: "通過讓周圍變亮來保持命中\n率不會被降低。", - }, - trace: { - name: "複製", - description: "出場時,複製對手的特性,\n變爲與之相同的特性。", - }, - hugePower: { name: "大力士", description: "物理攻擊的威力會變爲2倍\n。" }, - poisonPoint: { - name: "毒刺", - description: "有時會讓接觸到自己的對手\n變爲中毒狀態。", - }, - innerFocus: { - name: "精神力", - description: + }, + sereneGrace: { + name: "天恩", + description: "託天恩的福,招式的追加效\n果容易出現。", + }, + swiftSwim: { name: "悠遊自如", description: "下雨天氣時,速度會提高。" }, + chlorophyll: { name: "葉綠素", description: "晴朗天氣時,速度會提高。" }, + illuminate: { + name: "發光", + description: "通過讓周圍變亮來保持命中\n率不會被降低。", + }, + trace: { + name: "複製", + description: "出場時,複製對手的特性,\n變爲與之相同的特性。", + }, + hugePower: { name: "大力士", description: "物理攻擊的威力會變爲2倍\n。" }, + poisonPoint: { + name: "毒刺", + description: "有時會讓接觸到自己的對手\n變爲中毒狀態。", + }, + innerFocus: { + name: "精神力", + description: "擁有經過鍛鍊的精神,而不\n會因對手的攻擊而畏縮。對\n威嚇也毫不動搖。", - }, - magmaArmor: { - name: "熔岩鎧甲", - description: "將熾熱的熔岩覆蓋在身上,\n不會變爲冰凍狀態。", - }, - waterVeil: { - name: "水幕", - description: "將水幕裹在身上,不會變爲\n灼傷狀態。", - }, - magnetPull: { - name: "磁力", - description: "用磁力吸住鋼屬性的寶可夢\n,使其無法逃走。", - }, - soundproof: { - name: "隔音", - description: "通過屏蔽聲音,不受到聲音\n招式的影響。", - }, - rainDish: { name: "雨盤", description: "下雨天氣時,會緩緩回覆\nHP。" }, - sandStream: { name: "揚沙", description: "出場時,會把天氣變爲沙暴。" }, - pressure: { - name: "壓迫感", - description: "給予對手壓迫感,大量減少\n其使用招式的PP。", - }, - thickFat: { - name: "厚脂肪", - description: + }, + magmaArmor: { + name: "熔岩鎧甲", + description: "將熾熱的熔岩覆蓋在身上,\n不會變爲冰凍狀態。", + }, + waterVeil: { + name: "水幕", + description: "將水幕裹在身上,不會變爲\n灼傷狀態。", + }, + magnetPull: { + name: "磁力", + description: "用磁力吸住鋼屬性的寶可夢\n,使其無法逃走。", + }, + soundproof: { + name: "隔音", + description: "通過屏蔽聲音,不受到聲音\n招式的影響。", + }, + rainDish: { name: "雨盤", description: "下雨天氣時,會緩緩回覆\nHP。" }, + sandStream: { name: "揚沙", description: "出場時,會把天氣變爲沙暴。" }, + pressure: { + name: "壓迫感", + description: "給予對手壓迫感,大量減少\n其使用招式的PP。", + }, + thickFat: { + name: "厚脂肪", + description: "因爲被厚厚的脂肪保護着,\n會讓火屬性和冰屬性的招式\n傷害減半。", - }, - earlyBird: { - name: "早起", - description: "即使變爲睡眠狀態,也能以\n2倍的速度提早醒來。", - }, - flameBody: { - name: "火焰之軀", - description: "有時會讓接觸到自己的對手\n變爲灼傷狀態。", - }, - runAway: { name: "逃跑", description: "一定能從野生寶可夢那兒逃\n走。" }, - keenEye: { - name: "銳利目光", - description: "多虧了銳利的目光,命中率\n不會被降低。", - }, - hyperCutter: { - name: "怪力鉗", - description: "因爲擁有以力量自豪的鉗子,\n不會被對手降低攻擊。", - }, - pickup: { - name: "撿拾", - description: "有時會撿來對手用過的道具,\n冒險過程中也會撿到。", - }, - truant: { name: "懶惰", description: "如果使出招式,下一回合就\n會休息。" }, - hustle: { name: "活力", description: "自己的攻擊變高,但命中率\n會降低。" }, - cuteCharm: { - name: "迷人之軀", - description: "有時會讓接觸到自己的對手\n着迷。", - }, - plus: { - name: "正電", - description: + }, + earlyBird: { + name: "早起", + description: "即使變爲睡眠狀態,也能以\n2倍的速度提早醒來。", + }, + flameBody: { + name: "火焰之軀", + description: "有時會讓接觸到自己的對手\n變爲灼傷狀態。", + }, + runAway: { name: "逃跑", description: "一定能從野生寶可夢那兒逃\n走。" }, + keenEye: { + name: "銳利目光", + description: "多虧了銳利的目光,命中率\n不會被降低。", + }, + hyperCutter: { + name: "怪力鉗", + description: "因爲擁有以力量自豪的鉗子,\n不會被對手降低攻擊。", + }, + pickup: { + name: "撿拾", + description: "有時會撿來對手用過的道具,\n冒險過程中也會撿到。", + }, + truant: { name: "懶惰", description: "如果使出招式,下一回合就\n會休息。" }, + hustle: { name: "活力", description: "自己的攻擊變高,但命中率\n會降低。" }, + cuteCharm: { + name: "迷人之軀", + description: "有時會讓接觸到自己的對手\n着迷。", + }, + plus: { + name: "正電", + description: "出場的夥伴之間如果有正電\n或負電特性的寶可夢,自己\n的特攻會提高。", - }, - minus: { - name: "負電", - description: + }, + minus: { + name: "負電", + description: "出場的夥伴之間如果有正電\n或負電特性的寶可夢,自己\n的特攻會提高。", - }, - forecast: { - name: "陰晴不定", - description: + }, + forecast: { + name: "陰晴不定", + description: "受天氣的影響,會變爲水屬\n性、火屬性或冰屬性中的某\n一個。", - }, - stickyHold: { - name: "黏着", - description: "因爲道具是粘在黏性身體上\n的,所以不會被對手奪走。", - }, - shedSkin: { - name: "蛻皮", - description: "通過蛻去身上的皮,有時會\n治癒異常狀態。", - }, - guts: { - name: "毅力", - description: "如果變爲異常狀態,會拿出\n毅力,攻擊會提高。", - }, - marvelScale: { - name: "神奇鱗片", - description: "如果變爲異常狀態,神奇鱗\n片會發生反應,防禦會提高。", - }, - liquidOoze: { - name: "污泥漿", - description: + }, + stickyHold: { + name: "黏着", + description: "因爲道具是粘在黏性身體上\n的,所以不會被對手奪走。", + }, + shedSkin: { + name: "蛻皮", + description: "通過蛻去身上的皮,有時會\n治癒異常狀態。", + }, + guts: { + name: "毅力", + description: "如果變爲異常狀態,會拿出\n毅力,攻擊會提高。", + }, + marvelScale: { + name: "神奇鱗片", + description: "如果變爲異常狀態,神奇鱗\n片會發生反應,防禦會提高。", + }, + liquidOoze: { + name: "污泥漿", + description: "吸收了污泥漿的對手會因強\n烈的惡臭而受到傷害,減少\nHP。", - }, - overgrow: { - name: "茂盛", - description: "HP減少的時候,草屬性的\n招式威力會提高。", - }, - blaze: { - name: "猛火", - description: "HP減少的時候,火屬性的\n招式威力會提高。", - }, - torrent: { - name: "激流", - description: "HP減少的時候,水屬性的\n招式威力會提高。", - }, - swarm: { - name: "蟲之預感", - description: "HP減少的時候,蟲屬性的\n招式威力會提高。", - }, - rockHead: { - name: "堅硬腦袋", - description: "即使使出會受反作用力傷害\n的招式,HP也不會減少。", - }, - drought: { name: "日照", description: "出場時,會將天氣變爲晴朗。" }, - arenaTrap: { name: "沙穴", description: "在戰鬥中讓對手無法逃走。" }, - vitalSpirit: { - name: "幹勁", - description: "通過激發出幹勁,不會變爲\n睡眠狀態。", - }, - whiteSmoke: { - name: "白色煙霧", - description: "被白色煙霧保護着,不會被\n對手降低能力。", - }, - purePower: { - name: "瑜伽之力", - description: "因瑜伽的力量,物理攻擊的\n威力會變爲2倍。", - }, - shellArmor: { - name: "硬殼盔甲", - description: "被堅硬的殼保護着,對手的\n攻擊不會擊中要害。", - }, - airLock: { name: "氣閘", description: "所有天氣的影響都會消失。" }, - tangledFeet: { - name: "蹣跚", - description: "在混亂狀態時,閃避率會提\n高。", - }, - motorDrive: { - name: "電氣引擎", - description: + }, + overgrow: { + name: "茂盛", + description: "HP減少的時候,草屬性的\n招式威力會提高。", + }, + blaze: { + name: "猛火", + description: "HP減少的時候,火屬性的\n招式威力會提高。", + }, + torrent: { + name: "激流", + description: "HP減少的時候,水屬性的\n招式威力會提高。", + }, + swarm: { + name: "蟲之預感", + description: "HP減少的時候,蟲屬性的\n招式威力會提高。", + }, + rockHead: { + name: "堅硬腦袋", + description: "即使使出會受反作用力傷害\n的招式,HP也不會減少。", + }, + drought: { name: "日照", description: "出場時,會將天氣變爲晴朗。" }, + arenaTrap: { name: "沙穴", description: "在戰鬥中讓對手無法逃走。" }, + vitalSpirit: { + name: "幹勁", + description: "通過激發出幹勁,不會變爲\n睡眠狀態。", + }, + whiteSmoke: { + name: "白色煙霧", + description: "被白色煙霧保護着,不會被\n對手降低能力。", + }, + purePower: { + name: "瑜伽之力", + description: "因瑜伽的力量,物理攻擊的\n威力會變爲2倍。", + }, + shellArmor: { + name: "硬殼盔甲", + description: "被堅硬的殼保護着,對手的\n攻擊不會擊中要害。", + }, + airLock: { name: "氣閘", description: "所有天氣的影響都會消失。" }, + tangledFeet: { + name: "蹣跚", + description: "在混亂狀態時,閃避率會提\n高。", + }, + motorDrive: { + name: "電氣引擎", + description: "受到電屬性的招式攻擊時,\n不會受到傷害,而是速度會\n提高。", - }, - rivalry: { - name: "鬥爭心", - description: + }, + rivalry: { + name: "鬥爭心", + description: "面對性別相同的對手,會燃\n起鬥爭心,變得更強。而面\n對性別不同的,則會變弱。", - }, - steadfast: { - name: "不屈之心", - description: "每次畏縮時,不屈之心就會\n燃起,速度也會提高。", - }, - snowCloak: { name: "雪隱", description: "下雪天氣時,閃避率會提高。" }, - gluttony: { - name: "貪喫鬼", - description: + }, + steadfast: { + name: "不屈之心", + description: "每次畏縮時,不屈之心就會\n燃起,速度也會提高。", + }, + snowCloak: { name: "雪隱", description: "下雪天氣時,閃避率會提高。" }, + gluttony: { + name: "貪喫鬼", + description: "原本HP變得很少時纔會喫\n樹果,在HP還有一半時就\n會把它喫掉。", - }, - angerPoint: { - name: "憤怒穴位", - description: "要害被擊中時,會大發雷霆\n,攻擊力變爲最大。", - }, - unburden: { - name: "輕裝", - description: "失去所持有的道具時,速度\n會提高。", - }, - heatproof: { - name: "耐熱", - description: "耐熱的體質會讓火屬性的招\n式傷害減半。", - }, - simple: { name: "單純", description: "能力變化會變爲平時的2倍。" }, - drySkin: { - name: "乾燥皮膚", - description: + }, + angerPoint: { + name: "憤怒穴位", + description: "要害被擊中時,會大發雷霆\n,攻擊力變爲最大。", + }, + unburden: { + name: "輕裝", + description: "失去所持有的道具時,速度\n會提高。", + }, + heatproof: { + name: "耐熱", + description: "耐熱的體質會讓火屬性的招\n式傷害減半。", + }, + simple: { name: "單純", description: "能力變化會變爲平時的2倍。" }, + drySkin: { + name: "乾燥皮膚", + description: "下雨天氣時和受到水屬性的\n招式時,HP會回覆。晴朗\n天氣時和受到火屬性的招式\n時,HP會減少。", - }, - download: { - name: "下載", - description: + }, + download: { + name: "下載", + description: "比較對手的防禦和特防,根\n據較低的那項能力相應地提\n高自己的攻擊或特攻。", - }, - ironFist: { name: "鐵拳", description: "使用拳類招式的威力會提高。" }, - poisonHeal: { - name: "毒療", - description: "變爲中毒狀態時,HP不會\n減少,反而會增加起來。", - }, - adaptability: { - name: "適應力", - description: "與自身同屬性的招式威力會\n提高。", - }, - skillLink: { - name: "連續攻擊", - description: "如果使用連續招式,總是能\n使出最高次數。", - }, - hydration: { - name: "溼潤之軀", - description: "下雨天氣時,異常狀態會治\n愈。", - }, - solarPower: { - name: "太陽之力", - description: "晴朗天氣時,特攻會提高,\n而每回合HP會減少。", - }, - quickFeet: { - name: "飛毛腿", - description: "變爲異常狀態時,速度會提\n高。", - }, - normalize: { - name: "一般皮膚", - description: + }, + ironFist: { name: "鐵拳", description: "使用拳類招式的威力會提高。" }, + poisonHeal: { + name: "毒療", + description: "變爲中毒狀態時,HP不會\n減少,反而會增加起來。", + }, + adaptability: { + name: "適應力", + description: "與自身同屬性的招式威力會\n提高。", + }, + skillLink: { + name: "連續攻擊", + description: "如果使用連續招式,總是能\n使出最高次數。", + }, + hydration: { + name: "溼潤之軀", + description: "下雨天氣時,異常狀態會治\n愈。", + }, + solarPower: { + name: "太陽之力", + description: "晴朗天氣時,特攻會提高,\n而每回合HP會減少。", + }, + quickFeet: { + name: "飛毛腿", + description: "變爲異常狀態時,速度會提\n高。", + }, + normalize: { + name: "一般皮膚", + description: "無論是什麼屬性的招式,全\n部會變爲一般屬性。威力會\n少量提高。", - }, - sniper: { name: "狙擊手", description: "擊中要害時,威力會變得更\n強。" }, - magicGuard: { name: "魔法防守", description: "不會受到攻擊以外的傷害。" }, - noGuard: { - name: "無防守", - description: "由於無防守戰術,雙方使出\n的招式都必定會擊中。", - }, - stall: { name: "慢出", description: "使出招式的順序必定會變爲\n最後。" }, - technician: { - name: "技術高手", - description: "攻擊時可以將低威力招式的\n威力提高。", - }, - leafGuard: { - name: "葉子防守", - description: "晴朗天氣時,不會變爲異常\n狀態。", - }, - klutz: { name: "笨拙", description: "無法使用持有的道具。" }, - moldBreaker: { - name: "破格", - description: "可以不受對手特性的干擾,\n向對手使出招式。", - }, - superLuck: { - name: "超幸運", - description: "因爲擁有超幸運,攻擊容易\n擊中對手的要害。", - }, - aftermath: { - name: "引爆", - description: "變爲瀕死時,會對接觸到自\n己的對手造成傷害。", - }, - anticipation: { - name: "危險預知", - description: "可以察覺到對手擁有的危險\n招式。", - }, - forewarn: { - name: "預知夢", - description: "出場時,只讀取1個對手擁\n有的招式。", - }, - unaware: { - name: "純樸", - description: "可以無視對手能力的變化,\n進行攻擊。", - }, - tintedLens: { - name: "有色眼鏡", - description: "可以將效果不好的招式以通\n常的威力使出。", - }, - filter: { - name: "過濾", - description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", - }, - slowStart: { - name: "慢啓動", - description: "在5回合內,攻擊和速度減\n半。", - }, - scrappy: { - name: "膽量", - description: + }, + sniper: { name: "狙擊手", description: "擊中要害時,威力會變得更\n強。" }, + magicGuard: { name: "魔法防守", description: "不會受到攻擊以外的傷害。" }, + noGuard: { + name: "無防守", + description: "由於無防守戰術,雙方使出\n的招式都必定會擊中。", + }, + stall: { name: "慢出", description: "使出招式的順序必定會變爲\n最後。" }, + technician: { + name: "技術高手", + description: "攻擊時可以將低威力招式的\n威力提高。", + }, + leafGuard: { + name: "葉子防守", + description: "晴朗天氣時,不會變爲異常\n狀態。", + }, + klutz: { name: "笨拙", description: "無法使用持有的道具。" }, + moldBreaker: { + name: "破格", + description: "可以不受對手特性的干擾,\n向對手使出招式。", + }, + superLuck: { + name: "超幸運", + description: "因爲擁有超幸運,攻擊容易\n擊中對手的要害。", + }, + aftermath: { + name: "引爆", + description: "變爲瀕死時,會對接觸到自\n己的對手造成傷害。", + }, + anticipation: { + name: "危險預知", + description: "可以察覺到對手擁有的危險\n招式。", + }, + forewarn: { + name: "預知夢", + description: "出場時,只讀取1個對手擁\n有的招式。", + }, + unaware: { + name: "純樸", + description: "可以無視對手能力的變化,\n進行攻擊。", + }, + tintedLens: { + name: "有色眼鏡", + description: "可以將效果不好的招式以通\n常的威力使出。", + }, + filter: { + name: "過濾", + description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", + }, + slowStart: { + name: "慢啓動", + description: "在5回合內,攻擊和速度減\n半。", + }, + scrappy: { + name: "膽量", + description: "一般屬性和格鬥屬性的招式\n可以擊中幽靈屬性的寶可夢\n。對威嚇也毫不動搖。", - }, - stormDrain: { - name: "引水", - description: + }, + stormDrain: { + name: "引水", + description: "將水屬性的招式引到自己身\n上,不會受到傷害,而是會\n提高特攻。", - }, - iceBody: { - name: "冰凍之軀", - description: "下雪天氣時,會緩緩回覆\nHP。", - }, - solidRock: { - name: "堅硬岩石", - description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", - }, - snowWarning: { name: "降雪", description: "出場時,會將天氣變爲下雪。" }, - honeyGather: { - name: "採蜜", - description: "戰鬥結束時,有時候會撿來\n甜甜蜜。", - }, - frisk: { - name: "察覺", - description: "進入戰鬥時,神奇寶貝可以檢查對方神奇寶貝的能力。", - }, - reckless: { - name: "捨身", - description: "自己會因反作用力受傷的招\n式,其威力會提高。", - }, - multitype: { - name: "多屬性", - description: "自己的屬性會根據持有的石\n板而改變。", - }, - flowerGift: { - name: "花之禮", - description: "晴朗天氣時,自己與同伴的\n攻擊和特防能力會提高。", - }, - badDreams: { name: "夢魘", description: "給予睡眠狀態的對手傷害。" }, - pickpocket: { - name: "順手牽羊", - description: "盜取接觸到自己的對手的道\n具。", - }, - sheerForce: { - name: "強行", - description: "招式的追加效果消失,但因\n此能以更高的威力使出招式\n。", - }, - contrary: { - name: "唱反調", - description: + }, + iceBody: { + name: "冰凍之軀", + description: "下雪天氣時,會緩緩回覆\nHP。", + }, + solidRock: { + name: "堅硬岩石", + description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", + }, + snowWarning: { name: "降雪", description: "出場時,會將天氣變爲下雪。" }, + honeyGather: { + name: "採蜜", + description: "戰鬥結束時,有時候會撿來\n甜甜蜜。", + }, + frisk: { + name: "察覺", + description: "進入戰鬥時,神奇寶貝可以檢查對方神奇寶貝的能力。", + }, + reckless: { + name: "捨身", + description: "自己會因反作用力受傷的招\n式,其威力會提高。", + }, + multitype: { + name: "多屬性", + description: "自己的屬性會根據持有的石\n板而改變。", + }, + flowerGift: { + name: "花之禮", + description: "晴朗天氣時,自己與同伴的\n攻擊和特防能力會提高。", + }, + badDreams: { name: "夢魘", description: "給予睡眠狀態的對手傷害。" }, + pickpocket: { + name: "順手牽羊", + description: "盜取接觸到自己的對手的道\n具。", + }, + sheerForce: { + name: "強行", + description: "招式的追加效果消失,但因\n此能以更高的威力使出招式\n。", + }, + contrary: { + name: "唱反調", + description: "能力的變化發生逆轉,原本\n提高時會降低,而原本降低\n時會提高。", - }, - unnerve: { - name: "緊張感", - description: "讓對手緊張,使其無法食用\n樹果。", - }, - defiant: { - name: "不服輸", - description: "被對手降低能力時,攻擊會\n大幅提高。", - }, - defeatist: { - name: "軟弱", - description: "HP減半時,會變得軟弱,\n攻擊和特攻會減半。", - }, - cursedBody: { - name: "詛咒之軀", - description: "受到攻擊時,有時會把對手\n的招式變爲定身法狀態。", - }, - healer: { name: "治癒之心", description: "有時會治癒異常狀態的同伴。" }, - friendGuard: { name: "友情防守", description: "可以減少我方的傷害。" }, - weakArmor: { - name: "碎裂鎧甲", - description: "受到物理招式的傷害時,防\n御會降低,速度會大幅提高。", - }, - heavyMetal: { name: "重金屬", description: "自身的重量會變爲2倍。" }, - lightMetal: { name: "輕金屬", description: "自身的重量會減半。" }, - multiscale: { - name: "多重鱗片", - description: "HP全滿時,受到的傷害會\n變少。", - }, - toxicBoost: { - name: "中毒激升", - description: "變爲中毒狀態時,物理招式\n的威力會提高。", - }, - flareBoost: { - name: "受熱激升", - description: "變爲灼傷狀態時,特殊招式\n的威力會提高。", - }, - harvest: { - name: "收穫", - description: "可以多次製作出已被使用掉\n的樹果。", - }, - telepathy: { - name: "心靈感應", - description: "讀取我方的攻擊,並閃避其\n招式傷害。", - }, - moody: { - name: "心情不定", - description: "每一回合,能力中的某項會\n大幅提高,而某項會降低。", - }, - overcoat: { - name: "防塵", - description: + }, + unnerve: { + name: "緊張感", + description: "讓對手緊張,使其無法食用\n樹果。", + }, + defiant: { + name: "不服輸", + description: "被對手降低能力時,攻擊會\n大幅提高。", + }, + defeatist: { + name: "軟弱", + description: "HP減半時,會變得軟弱,\n攻擊和特攻會減半。", + }, + cursedBody: { + name: "詛咒之軀", + description: "受到攻擊時,有時會把對手\n的招式變爲定身法狀態。", + }, + healer: { name: "治癒之心", description: "有時會治癒異常狀態的同伴。" }, + friendGuard: { name: "友情防守", description: "可以減少我方的傷害。" }, + weakArmor: { + name: "碎裂鎧甲", + description: "受到物理招式的傷害時,防\n御會降低,速度會大幅提高。", + }, + heavyMetal: { name: "重金屬", description: "自身的重量會變爲2倍。" }, + lightMetal: { name: "輕金屬", description: "自身的重量會減半。" }, + multiscale: { + name: "多重鱗片", + description: "HP全滿時,受到的傷害會\n變少。", + }, + toxicBoost: { + name: "中毒激升", + description: "變爲中毒狀態時,物理招式\n的威力會提高。", + }, + flareBoost: { + name: "受熱激升", + description: "變爲灼傷狀態時,特殊招式\n的威力會提高。", + }, + harvest: { + name: "收穫", + description: "可以多次製作出已被使用掉\n的樹果。", + }, + telepathy: { + name: "心靈感應", + description: "讀取我方的攻擊,並閃避其\n招式傷害。", + }, + moody: { + name: "心情不定", + description: "每一回合,能力中的某項會\n大幅提高,而某項會降低。", + }, + overcoat: { + name: "防塵", + description: "不會受到沙暴的傷害。也不\n會受到粉末類和孢子類招式\n的影響。", - }, - poisonTouch: { - name: "毒手", - description: "只通過接觸就有可能讓對手\n變爲中毒狀態。", - }, - regenerator: { - name: "再生力", - description: "退回同行隊伍後,HP會少\n量回復。", - }, - bigPecks: { name: "健壯胸肌", description: "不會受到防禦降低的效果。" }, - sandRush: { name: "撥沙", description: "沙暴天氣時,速度會提高。" }, - wonderSkin: { - name: "奇蹟皮膚", - description: "成爲不易受到變化招式攻擊\n的身體。", - }, - analytic: { - name: "分析", - description: "如果在最後使出招式,招式\n的威力會提高。", - }, - illusion: { - name: "幻覺", - description: "假扮成同行隊伍中的最後一\n只寶可夢出場,迷惑對手。", - }, - imposter: { name: "變身者", description: "變身爲當前面對的寶可夢。" }, - infiltrator: { - name: "穿透", - description: "可以穿透對手的壁障或替身\n進行攻擊。", - }, - mummy: { - name: "木乃伊", - description: "被對手接觸到後,會將對手\n變爲木乃伊。", - }, - moxie: { - name: "自信過度", - description: "如果打倒對手,就會充滿自\n信,攻擊會提高。", - }, - justified: { - name: "正義之心", - description: "受到惡屬性的招式攻擊時,\n因爲正義感,攻擊會提高。", - }, - rattled: { - name: "膽怯", - description: + }, + poisonTouch: { + name: "毒手", + description: "只通過接觸就有可能讓對手\n變爲中毒狀態。", + }, + regenerator: { + name: "再生力", + description: "退回同行隊伍後,HP會少\n量回復。", + }, + bigPecks: { name: "健壯胸肌", description: "不會受到防禦降低的效果。" }, + sandRush: { name: "撥沙", description: "沙暴天氣時,速度會提高。" }, + wonderSkin: { + name: "奇蹟皮膚", + description: "成爲不易受到變化招式攻擊\n的身體。", + }, + analytic: { + name: "分析", + description: "如果在最後使出招式,招式\n的威力會提高。", + }, + illusion: { + name: "幻覺", + description: "假扮成同行隊伍中的最後一\n只寶可夢出場,迷惑對手。", + }, + imposter: { name: "變身者", description: "變身爲當前面對的寶可夢。" }, + infiltrator: { + name: "穿透", + description: "可以穿透對手的壁障或替身\n進行攻擊。", + }, + mummy: { + name: "木乃伊", + description: "被對手接觸到後,會將對手\n變爲木乃伊。", + }, + moxie: { + name: "自信過度", + description: "如果打倒對手,就會充滿自\n信,攻擊會提高。", + }, + justified: { + name: "正義之心", + description: "受到惡屬性的招式攻擊時,\n因爲正義感,攻擊會提高。", + }, + rattled: { + name: "膽怯", + description: "受到惡屬性、幽靈屬性和蟲\n屬性的攻擊或威嚇時,會因\n膽怯而速度提高。", - }, - magicBounce: { - name: "魔法鏡", - description: "可以不受到由對手使出的變\n化招式影響,並將其反彈。", - }, - sapSipper: { - name: "食草", - description: + }, + magicBounce: { + name: "魔法鏡", + description: "可以不受到由對手使出的變\n化招式影響,並將其反彈。", + }, + sapSipper: { + name: "食草", + description: "受到草屬性的招式攻擊時,\n不會受到傷害,而是攻擊會\n提高。", - }, - prankster: { name: "惡作劇之心", description: "可以率先使出變化招式。" }, - sandForce: { - name: "沙之力", - description: + }, + prankster: { name: "惡作劇之心", description: "可以率先使出變化招式。" }, + sandForce: { + name: "沙之力", + description: "沙暴天氣時,岩石屬性、地\n面屬性和鋼屬性的招式威力\n會提高。", - }, - ironBarbs: { - name: "鐵刺", - description: "用鐵刺給予接觸到自己的對\n手傷害。", - }, - zenMode: { - name: "達摩模式", - description: "HP變爲一半以下時,樣子\n會改變。", - }, - victoryStar: { - name: "勝利之星", - description: "自己和同伴的命中率會提高。", - }, - turboblaze: { - name: "渦輪火焰", - description: "可以不受對手特性的干擾,\n向對手使出招式。", - }, - teravolt: { - name: "兆級電壓", - description: "可以不受對手特性的干擾,\n向對手使出招式。", - }, - aromaVeil: { - name: "芳香幕", - description: "可以防住向自己和同伴發出\n的心靈攻擊。", - }, - flowerVeil: { - name: "花幕", - description: "我方的草屬性寶可夢能力不\n會降低,也不會變爲異常狀\n態。", - }, - cheekPouch: { - name: "頰囊", - description: "無論是哪種樹果,食用後,\nHP都會回覆。", - }, - protean: { - name: "變幻自如", - description: + }, + ironBarbs: { + name: "鐵刺", + description: "用鐵刺給予接觸到自己的對\n手傷害。", + }, + zenMode: { + name: "達摩模式", + description: "HP變爲一半以下時,樣子\n會改變。", + }, + victoryStar: { + name: "勝利之星", + description: "自己和同伴的命中率會提高。", + }, + turboblaze: { + name: "渦輪火焰", + description: "可以不受對手特性的干擾,\n向對手使出招式。", + }, + teravolt: { + name: "兆級電壓", + description: "可以不受對手特性的干擾,\n向對手使出招式。", + }, + aromaVeil: { + name: "芳香幕", + description: "可以防住向自己和同伴發出\n的心靈攻擊。", + }, + flowerVeil: { + name: "花幕", + description: "我方的草屬性寶可夢能力不\n會降低,也不會變爲異常狀\n態。", + }, + cheekPouch: { + name: "頰囊", + description: "無論是哪種樹果,食用後,\nHP都會回覆。", + }, + protean: { + name: "變幻自如", + description: "變爲與自己使出的招式相同\n的屬性。每次出場戰鬥僅生\n效一次。", - }, - furCoat: { - name: "毛皮大衣", - description: "對手給予的物理招式的傷害\n會減半。", - }, - magician: { - name: "魔術師", - description: "奪走被自己的招式擊中的對\n手的道具。", - }, - bulletproof: { - name: "防彈", - description: "可以防住對手的球和彈類招\n式。", - }, - competitive: { - name: "好勝", - description: "如果被對手降低能力,特攻\n會大幅提高。", - }, - strongJaw: { - name: "強壯之顎", - description: "因爲顎部強壯,啃咬類招式\n的威力會提高。", - }, - refrigerate: { - name: "冰凍皮膚", - description: "一般屬性的招式會變爲冰屬\n性。威力會少量提高。", - }, - sweetVeil: { - name: "甜幕", - description: "自己和同伴的寶可夢不會變\n爲睡眠狀態。", - }, - stanceChange: { - name: "戰鬥切換", - description: + }, + furCoat: { + name: "毛皮大衣", + description: "對手給予的物理招式的傷害\n會減半。", + }, + magician: { + name: "魔術師", + description: "奪走被自己的招式擊中的對\n手的道具。", + }, + bulletproof: { + name: "防彈", + description: "可以防住對手的球和彈類招\n式。", + }, + competitive: { + name: "好勝", + description: "如果被對手降低能力,特攻\n會大幅提高。", + }, + strongJaw: { + name: "強壯之顎", + description: "因爲顎部強壯,啃咬類招式\n的威力會提高。", + }, + refrigerate: { + name: "冰凍皮膚", + description: "一般屬性的招式會變爲冰屬\n性。威力會少量提高。", + }, + sweetVeil: { + name: "甜幕", + description: "自己和同伴的寶可夢不會變\n爲睡眠狀態。", + }, + stanceChange: { + name: "戰鬥切換", + description: "如果使出攻擊招式,會變爲\n刀劍形態,如果使出招式“\n王者盾牌”,會變爲盾牌形\n態。", - }, - galeWings: { - name: "疾風之翼", - description: "HP全滿時,飛行屬性的招\n式可以率先使出。", - }, - megaLauncher: { - name: "超級發射器", - description: "波動和波導類招式的威力會\n提高。", - }, - grassPelt: { name: "草之毛皮", description: "在青草場地時,防禦會提高。" }, - symbiosis: { - name: "共生", - description: "同伴使用道具時,會把自己\n持有的道具傳遞給同伴。", - }, - toughClaws: { name: "硬爪", description: "接觸到對手的招式威力會提\n高。" }, - pixilate: { - name: "妖精皮膚", - description: "一般屬性的招式會變爲妖精\n屬性。威力會少量提高。", - }, - gooey: { - name: "黏滑", - description: "對於用攻擊接觸到自己的對\n手,會降低其速度。", - }, - aerilate: { - name: "飛行皮膚", - description: "一般屬性的招式會變爲飛行\n屬性。威力會少量提高。", - }, - parentalBond: { name: "親子愛", description: "親子倆可以合計攻擊2次。" }, - darkAura: { name: "暗黑氣場", description: "全體的惡屬性招式變強。" }, - fairyAura: { name: "妖精氣場", description: "全體的妖精屬性招式變強。" }, - auraBreak: { - name: "氣場破壞", - description: "讓氣場的效果發生逆轉,降\n低威力。", - }, - primordialSea: { - name: "始源之海", - description: "變爲不會受到火屬性攻擊的\n天氣。", - }, - desolateLand: { - name: "終結之地", - description: "變爲不會受到水屬性攻擊的\n天氣。", - }, - deltaStream: { - name: "德爾塔氣流", - description: "變爲令飛行屬性的弱點消失\n的天氣。", - }, - stamina: { name: "持久力", description: "受到攻擊時,防禦會提高。" }, - wimpOut: { - name: "躍躍欲逃", - description: "HP變爲一半時,會慌慌張\n張逃走,退回同行隊伍中。", - }, - emergencyExit: { - name: "危險迴避", - description: "HP變爲一半時,爲了迴避\n危險,會退回到同行隊伍中。", - }, - waterCompaction: { - name: "遇水凝固", - description: "受到水屬性的招式攻擊時,\n防禦會大幅提高。", - }, - merciless: { - name: "不仁不義", - description: "攻擊中毒狀態的對手時,\n必定會擊中要害。", - }, - shieldsDown: { - name: "界限盾殼", - description: "HP變爲一半時,殼會壞掉,\n變得有攻擊性。", - }, - stakeout: { - name: "蹲守", - description: "可以對替換出場的對手以2\n倍的傷害進行攻擊。", - }, - waterBubble: { - name: "水泡", - description: "降低自己受到的火屬性招式\n的威力,不會灼傷。", - }, - steelworker: { name: "鋼能力者", description: "鋼屬性的招式威力會提高。" }, - berserk: { - name: "怒火沖天", - description: "因對手的攻擊HP變爲一半\n時,特攻會提高。", - }, - slushRush: { name: "撥雪", description: "下雪天氣時,速度會提高。" }, - longReach: { - name: "遠隔", - description: "可以不接觸對手就使出所有\n的招式。", - }, - liquidVoice: { - name: "溼潤之聲", - description: "所有的聲音招式都變爲水屬\n性。", - }, - triage: { name: "先行治療", description: "可以率先使出回覆招式。" }, - galvanize: { - name: "電氣皮膚", - description: "一般屬性的招式會變爲電屬\n性。威力會少量提高。", - }, - surgeSurfer: { - name: "衝浪之尾", - description: "電氣場地時,速度會變爲2\n倍。", - }, - schooling: { - name: "魚羣", - description: + }, + galeWings: { + name: "疾風之翼", + description: "HP全滿時,飛行屬性的招\n式可以率先使出。", + }, + megaLauncher: { + name: "超級發射器", + description: "波動和波導類招式的威力會\n提高。", + }, + grassPelt: { name: "草之毛皮", description: "在青草場地時,防禦會提高。" }, + symbiosis: { + name: "共生", + description: "同伴使用道具時,會把自己\n持有的道具傳遞給同伴。", + }, + toughClaws: { name: "硬爪", description: "接觸到對手的招式威力會提\n高。" }, + pixilate: { + name: "妖精皮膚", + description: "一般屬性的招式會變爲妖精\n屬性。威力會少量提高。", + }, + gooey: { + name: "黏滑", + description: "對於用攻擊接觸到自己的對\n手,會降低其速度。", + }, + aerilate: { + name: "飛行皮膚", + description: "一般屬性的招式會變爲飛行\n屬性。威力會少量提高。", + }, + parentalBond: { name: "親子愛", description: "親子倆可以合計攻擊2次。" }, + darkAura: { name: "暗黑氣場", description: "全體的惡屬性招式變強。" }, + fairyAura: { name: "妖精氣場", description: "全體的妖精屬性招式變強。" }, + auraBreak: { + name: "氣場破壞", + description: "讓氣場的效果發生逆轉,降\n低威力。", + }, + primordialSea: { + name: "始源之海", + description: "變爲不會受到火屬性攻擊的\n天氣。", + }, + desolateLand: { + name: "終結之地", + description: "變爲不會受到水屬性攻擊的\n天氣。", + }, + deltaStream: { + name: "德爾塔氣流", + description: "變爲令飛行屬性的弱點消失\n的天氣。", + }, + stamina: { name: "持久力", description: "受到攻擊時,防禦會提高。" }, + wimpOut: { + name: "躍躍欲逃", + description: "HP變爲一半時,會慌慌張\n張逃走,退回同行隊伍中。", + }, + emergencyExit: { + name: "危險迴避", + description: "HP變爲一半時,爲了迴避\n危險,會退回到同行隊伍中。", + }, + waterCompaction: { + name: "遇水凝固", + description: "受到水屬性的招式攻擊時,\n防禦會大幅提高。", + }, + merciless: { + name: "不仁不義", + description: "攻擊中毒狀態的對手時,\n必定會擊中要害。", + }, + shieldsDown: { + name: "界限盾殼", + description: "HP變爲一半時,殼會壞掉,\n變得有攻擊性。", + }, + stakeout: { + name: "蹲守", + description: "可以對替換出場的對手以2\n倍的傷害進行攻擊。", + }, + waterBubble: { + name: "水泡", + description: "降低自己受到的火屬性招式\n的威力,不會灼傷。", + }, + steelworker: { name: "鋼能力者", description: "鋼屬性的招式威力會提高。" }, + berserk: { + name: "怒火沖天", + description: "因對手的攻擊HP變爲一半\n時,特攻會提高。", + }, + slushRush: { name: "撥雪", description: "下雪天氣時,速度會提高。" }, + longReach: { + name: "遠隔", + description: "可以不接觸對手就使出所有\n的招式。", + }, + liquidVoice: { + name: "溼潤之聲", + description: "所有的聲音招式都變爲水屬\n性。", + }, + triage: { name: "先行治療", description: "可以率先使出回覆招式。" }, + galvanize: { + name: "電氣皮膚", + description: "一般屬性的招式會變爲電屬\n性。威力會少量提高。", + }, + surgeSurfer: { + name: "衝浪之尾", + description: "電氣場地時,速度會變爲2\n倍。", + }, + schooling: { + name: "魚羣", + description: "HP多的時候會聚起來變強。\nHP剩餘量變少時,羣體\n會分崩離析。", - }, - disguise: { - name: "畫皮", - description: "通過畫皮覆蓋住身體,可以\n防住1次攻擊。", - }, - battleBond: { - name: "牽絆變身", - description: + }, + disguise: { + name: "畫皮", + description: "通過畫皮覆蓋住身體,可以\n防住1次攻擊。", + }, + battleBond: { + name: "牽絆變身", + description: "打倒對手時,與訓練家的牽\n絆會增強,自己的攻擊、特\n攻、速度會提高。", - }, - powerConstruct: { - name: "羣聚變形", - description: "HP變爲一半時,細胞們會\n趕來支援,變爲完全體形態。", - }, - corrosion: { - name: "腐蝕", - description: "可以使鋼屬性和毒屬性的寶\n可夢也陷入中毒狀態。", - }, - comatose: { - name: "絕對睡眠", - description: + }, + powerConstruct: { + name: "羣聚變形", + description: "HP變爲一半時,細胞們會\n趕來支援,變爲完全體形態。", + }, + corrosion: { + name: "腐蝕", + description: "可以使鋼屬性和毒屬性的寶\n可夢也陷入中毒狀態。", + }, + comatose: { + name: "絕對睡眠", + description: "總是半夢半醒的狀態,絕對\n不會醒來。可以就這麼睡着\n進行攻擊。", - }, - queenlyMajesty: { - name: "女王的威嚴", - description: "向對手施加威懾力,使其無\n法對我方使出先制招式。", - }, - innardsOut: { - name: "飛出的內在物", - description: "被對手打倒的時候,會給予\n對手相當於HP剩餘量的傷\n害。", - }, - dancer: { - name: "舞者", - description: "有誰使出跳舞招式時,自己\n也能就這麼接着使出跳舞招\n式。", - }, - battery: { name: "蓄電池", description: "會提高我方的特殊招式的威\n力。" }, - fluffy: { - name: "毛茸茸", - description: + }, + queenlyMajesty: { + name: "女王的威嚴", + description: "向對手施加威懾力,使其無\n法對我方使出先制招式。", + }, + innardsOut: { + name: "飛出的內在物", + description: "被對手打倒的時候,會給予\n對手相當於HP剩餘量的傷\n害。", + }, + dancer: { + name: "舞者", + description: "有誰使出跳舞招式時,自己\n也能就這麼接着使出跳舞招\n式。", + }, + battery: { name: "蓄電池", description: "會提高我方的特殊招式的威\n力。" }, + fluffy: { + name: "毛茸茸", + description: "會將對手所給予的接觸類招\n式的傷害減半,但火屬性招\n式的傷害會變爲2倍。", - }, - dazzling: { - name: "鮮豔之軀", - description: "讓對手嚇一跳,使其無法對\n我方使出先制招式。", - }, - soulHeart: { - name: "魂心", - description: "寶可夢每次變爲瀕死狀態時\n,特攻會提高。", - }, - tanglingHair: { - name: "捲髮", - description: "對於用攻擊接觸到自己的對\n手,會降低其速度。", - }, - receiver: { - name: "接球手", - description: "繼承被打倒的同伴的特性,\n變爲相同的特性。", - }, - powerOfAlchemy: { - name: "化學之力", - description: "繼承被打倒的同伴的特性,\n變爲相同的特性。", - }, - beastBoost: { - name: "異獸提升", - description: "打倒對手的時候,自己最高\n的那項能力會提高。", - }, - rksSystem: { - name: "AR系統", - description: "根據持有的存儲碟,自己的\n屬性會改變。", - }, - electricSurge: { - name: "電氣製造者", - description: "出場時,會佈下電氣場地。", - }, - psychicSurge: { - name: "精神製造者", - description: "出場時,會佈下精神場地。", - }, - mistySurge: { name: "薄霧製造者", description: "出場時,會佈下薄霧場地。" }, - grassySurge: { - name: "青草製造者", - description: "出場時,會佈下青草場地。", - }, - fullMetalBody: { - name: "金屬防護", - description: "不會因爲對手的招式或特性\n而被降低能力。", - }, - shadowShield: { - name: "幻影防守", - description: "HP全滿時,受到的傷害會\n變少。", - }, - prismArmor: { - name: "棱鏡裝甲", - description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", - }, - neuroforce: { - name: "腦核之力", - description: "效果絕佳的攻擊,威力會變\n得更強。", - }, - intrepidSword: { - name: "不撓之劍", - description: "首次出場時,攻擊會提高。", - }, - dauntlessShield: { - name: "不屈之盾", - description: "首次出場時,防禦會提高。", - }, - libero: { - name: "自由者", - description: + }, + dazzling: { + name: "鮮豔之軀", + description: "讓對手嚇一跳,使其無法對\n我方使出先制招式。", + }, + soulHeart: { + name: "魂心", + description: "寶可夢每次變爲瀕死狀態時\n,特攻會提高。", + }, + tanglingHair: { + name: "捲髮", + description: "對於用攻擊接觸到自己的對\n手,會降低其速度。", + }, + receiver: { + name: "接球手", + description: "繼承被打倒的同伴的特性,\n變爲相同的特性。", + }, + powerOfAlchemy: { + name: "化學之力", + description: "繼承被打倒的同伴的特性,\n變爲相同的特性。", + }, + beastBoost: { + name: "異獸提升", + description: "打倒對手的時候,自己最高\n的那項能力會提高。", + }, + rksSystem: { + name: "AR系統", + description: "根據持有的存儲碟,自己的\n屬性會改變。", + }, + electricSurge: { + name: "電氣製造者", + description: "出場時,會佈下電氣場地。", + }, + psychicSurge: { + name: "精神製造者", + description: "出場時,會佈下精神場地。", + }, + mistySurge: { name: "薄霧製造者", description: "出場時,會佈下薄霧場地。" }, + grassySurge: { + name: "青草製造者", + description: "出場時,會佈下青草場地。", + }, + fullMetalBody: { + name: "金屬防護", + description: "不會因爲對手的招式或特性\n而被降低能力。", + }, + shadowShield: { + name: "幻影防守", + description: "HP全滿時,受到的傷害會\n變少。", + }, + prismArmor: { + name: "棱鏡裝甲", + description: "受到效果絕佳的攻擊時,可\n以減弱其威力。", + }, + neuroforce: { + name: "腦核之力", + description: "效果絕佳的攻擊,威力會變\n得更強。", + }, + intrepidSword: { + name: "不撓之劍", + description: "首次出場時,攻擊會提高。", + }, + dauntlessShield: { + name: "不屈之盾", + description: "首次出場時,防禦會提高。", + }, + libero: { + name: "自由者", + description: "變爲與自己使出的招式相同\n的屬性。每次出場戰鬥僅生\n效一次。", - }, - ballFetch: { - name: "撿球", - description: "沒有攜帶道具時,會拾取第\n1個投出後捕捉失敗的精靈\n球。", - }, - cottonDown: { - name: "棉絮", - description: + }, + ballFetch: { + name: "撿球", + description: "沒有攜帶道具時,會拾取第\n1個投出後捕捉失敗的精靈\n球。", + }, + cottonDown: { + name: "棉絮", + description: "受到攻擊後撒下棉絮,降低\n除自己以外的所有寶可夢的\n速度。", - }, - propellerTail: { - name: "螺旋尾鰭", - description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", - }, - mirrorArmor: { - name: "鏡甲", - description: "只反彈自己受到的能力降低\n效果。", - }, - gulpMissile: { - name: "一口導彈", - description: + }, + propellerTail: { + name: "螺旋尾鰭", + description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", + }, + mirrorArmor: { + name: "鏡甲", + description: "只反彈自己受到的能力降低\n效果。", + }, + gulpMissile: { + name: "一口導彈", + description: "衝浪或潛水時會叼來獵物。\n受到傷害時,會吐出獵物進\n行攻擊。", - }, - stalwart: { - name: "堅毅", - description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", - }, - steamEngine: { - name: "蒸汽機", - description: "受到水屬性或火屬性的招式\n攻擊時,速度會巨幅提高。", - }, - punkRock: { - name: "龐克搖滾", - description: "聲音招式的威力會提高。受\n到的聲音招式傷害會減半。", - }, - sandSpit: { name: "吐沙", description: "受到攻擊時,會颳起沙暴。" }, - iceScales: { - name: "冰鱗粉", - description: "由於有冰鱗粉的守護,受到\n的特殊攻擊傷害會減半。", - }, - ripen: { name: "熟成", description: "使樹果成熟,效果變爲2倍。" }, - iceFace: { - name: "結凍頭", - description: + }, + stalwart: { + name: "堅毅", + description: "能無視具有吸引對手招式效\n果的特性或招式的影響。", + }, + steamEngine: { + name: "蒸汽機", + description: "受到水屬性或火屬性的招式\n攻擊時,速度會巨幅提高。", + }, + punkRock: { + name: "龐克搖滾", + description: "聲音招式的威力會提高。受\n到的聲音招式傷害會減半。", + }, + sandSpit: { name: "吐沙", description: "受到攻擊時,會颳起沙暴。" }, + iceScales: { + name: "冰鱗粉", + description: "由於有冰鱗粉的守護,受到\n的特殊攻擊傷害會減半。", + }, + ripen: { name: "熟成", description: "使樹果成熟,效果變爲2倍。" }, + iceFace: { + name: "結凍頭", + description: "頭部的冰會代替自己承受物\n理攻擊,但是樣子會改變。\n下雪時,冰會恢復原狀。", - }, - powerSpot: { - name: "能量點", - description: "只要處在相鄰位置,招式的\n威力就會提高。", - }, - mimicry: { - name: "擬態", - description: "寶可夢的屬性會根據場地的\n狀態而變化。", - }, - screenCleaner: { - name: "除障", - description: + }, + powerSpot: { + name: "能量點", + description: "只要處在相鄰位置,招式的\n威力就會提高。", + }, + mimicry: { + name: "擬態", + description: "寶可夢的屬性會根據場地的\n狀態而變化。", + }, + screenCleaner: { + name: "除障", + description: "出場時,敵方和我方的光牆\n、反射壁和極光幕的效果會\n消失。", - }, - steelySpirit: { - name: "鋼之意志", - description: "我方的鋼屬性攻擊威力會提\n高。", - }, - perishBody: { - name: "滅亡之軀", - description: + }, + steelySpirit: { + name: "鋼之意志", + description: "我方的鋼屬性攻擊威力會提\n高。", + }, + perishBody: { + name: "滅亡之軀", + description: "受到接觸類招式攻擊時,雙\n方都會在3回合後變爲瀕死\n狀態。替換後效果消失。", - }, - wanderingSpirit: { - name: "遊魂", - description: "與使用接觸類招式攻擊自己\n的寶可夢互換特性。", - }, - gorillaTactics: { - name: "一猩一意", - description: "雖然攻擊會提高,但是隻能\n使出一開始所選的招式。", - }, - neutralizingGas: { - name: "化學變化氣體", - description: + }, + wanderingSpirit: { + name: "遊魂", + description: "與使用接觸類招式攻擊自己\n的寶可夢互換特性。", + }, + gorillaTactics: { + name: "一猩一意", + description: "雖然攻擊會提高,但是隻能\n使出一開始所選的招式。", + }, + neutralizingGas: { + name: "化學變化氣體", + description: "特性爲化學變化氣體的寶可\n夢在場時,場上所有寶可夢\n的特性效果都會消失或者無\n法生效。", - }, - pastelVeil: { - name: "粉彩護幕", - description: "自己和同伴都不會陷入中毒\n的異常狀態。", - }, - hungerSwitch: { - name: "飽了又餓", - description: "每回合結束時會在滿腹花紋\n與空腹花紋之間交替改變樣\n子。", - }, - quickDraw: { name: "速擊", description: "有時能比對手先一步行動。" }, - unseenFist: { - name: "無形拳", - description: + }, + pastelVeil: { + name: "粉彩護幕", + description: "自己和同伴都不會陷入中毒\n的異常狀態。", + }, + hungerSwitch: { + name: "飽了又餓", + description: "每回合結束時會在滿腹花紋\n與空腹花紋之間交替改變樣\n子。", + }, + quickDraw: { name: "速擊", description: "有時能比對手先一步行動。" }, + unseenFist: { + name: "無形拳", + description: "如果使出的是接觸到對手的\n招式,就可以無視守護效果\n進行攻擊。", - }, - curiousMedicine: { - name: "怪藥", - description: "出場時會從貝殼撒藥,將我\n方的能力變化復原。", - }, - transistor: { name: "電晶體", description: "電屬性的招式威力會提高。" }, - dragonsMaw: { name: "龍顎", description: "龍屬性的招式威力會提高。" }, - chillingNeigh: { - name: "蒼白嘶鳴", - description: "打倒對手時會用冰冷的聲音\n嘶鳴並提高攻擊。", - }, - grimNeigh: { - name: "漆黑嘶鳴", - description: "打倒對手時會用恐怖的聲音\n嘶鳴並提高特攻。", - }, - asOneGlastrier: { - name: "人馬一體", - description: "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這兩種特性。", - }, - asOneSpectrier: { - name: "人馬一體", - description: "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這兩種特性。", - }, - lingeringAroma: { - name: "甩不掉的氣味", - description: "被對手接觸到後,甩不掉的\n氣味會沾上對手。", - }, - seedSower: { - name: "掉出種子", - description: "受到攻擊時,會將腳下變成\n青草場地。", - }, - thermalExchange: { - name: "熱交換", - description: + }, + curiousMedicine: { + name: "怪藥", + description: "出場時會從貝殼撒藥,將我\n方的能力變化復原。", + }, + transistor: { name: "電晶體", description: "電屬性的招式威力會提高。" }, + dragonsMaw: { name: "龍顎", description: "龍屬性的招式威力會提高。" }, + chillingNeigh: { + name: "蒼白嘶鳴", + description: "打倒對手時會用冰冷的聲音\n嘶鳴並提高攻擊。", + }, + grimNeigh: { + name: "漆黑嘶鳴", + description: "打倒對手時會用恐怖的聲音\n嘶鳴並提高特攻。", + }, + asOneGlastrier: { + name: "人馬一體", + description: "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這兩種特性。", + }, + asOneSpectrier: { + name: "人馬一體", + description: "兼備蕾冠王的緊張感和靈幽\n馬的漆黑嘶鳴這兩種特性。", + }, + lingeringAroma: { + name: "甩不掉的氣味", + description: "被對手接觸到後,甩不掉的\n氣味會沾上對手。", + }, + seedSower: { + name: "掉出種子", + description: "受到攻擊時,會將腳下變成\n青草場地。", + }, + thermalExchange: { + name: "熱交換", + description: "受到火屬性的招式攻擊時,\n攻擊會提高,且不會陷入灼\n傷狀態。", - }, - angerShell: { - name: "憤怒甲殼", - description: + }, + angerShell: { + name: "憤怒甲殼", + description: "因被對手攻擊而HP變爲一\n半時,會因憤怒降低防禦和\n特防。但攻擊、特攻、速度\n會提高。", - }, - purifyingSalt: { - name: "潔淨之鹽", - description: + }, + purifyingSalt: { + name: "潔淨之鹽", + description: "因潔淨的鹽而不會陷入異常\n狀態。會讓幽靈屬性的招式\n傷害減半。", - }, - wellBakedBody: { - name: "焦香之軀", - description: + }, + wellBakedBody: { + name: "焦香之軀", + description: "受到火屬性的招式攻擊時,\n不會受到傷害,而是會大幅\n提高防禦。", - }, - windRider: { - name: "乘風", - description: + }, + windRider: { + name: "乘風", + description: "吹起了順風或受到風的招式\n攻擊時,不會受到傷害,而\n是會提高攻擊。", - }, - guardDog: { - name: "看門犬", - description: + }, + guardDog: { + name: "看門犬", + description: "受到威嚇時,攻擊會提高。\n讓替換寶可夢的招式和道具\n無效。", - }, - rockyPayload: { name: "搬巖", description: "岩石屬性的招式威力會提高。" }, - windPower: { - name: "風力發電", - description: "受到風的招式攻擊時,會變\n爲充電狀態。", - }, - zeroToHero: { - name: "全能變身", - description: "回到同行隊伍後,會變爲全\n能形態。", - }, - commander: { - name: "發號施令", - description: + }, + rockyPayload: { name: "搬巖", description: "岩石屬性的招式威力會提高。" }, + windPower: { + name: "風力發電", + description: "受到風的招式攻擊時,會變\n爲充電狀態。", + }, + zeroToHero: { + name: "全能變身", + description: "回到同行隊伍後,會變爲全\n能形態。", + }, + commander: { + name: "發號施令", + description: "出場時,若我方當中有喫吼\n霸,就會進入其口中,並從\n其口中發出指令。", - }, - electromorphosis: { - name: "電力轉換", - description: "受到傷害時,會變爲充電狀\n態。", - }, - protosynthesis: { - name: "古代活性", - description: "攜帶着驅勁能量或天氣爲晴\n朗時,數值最高的能力會提\n高。", - }, - quarkDrive: { - name: "夸克充能", - description: + }, + electromorphosis: { + name: "電力轉換", + description: "受到傷害時,會變爲充電狀\n態。", + }, + protosynthesis: { + name: "古代活性", + description: "攜帶着驅勁能量或天氣爲晴\n朗時,數值最高的能力會提\n高。", + }, + quarkDrive: { + name: "夸克充能", + description: "攜帶着驅勁能量或在電氣場\n地上時,數值最高的能力會\n提高。", - }, - goodAsGold: { - name: "黃金之軀", - description: "不會氧化的堅固黃金身軀不\n會受到對手的變化招式的影\n響。", - }, - vesselOfRuin: { - name: "災禍之鼎", - description: "以能呼喚災厄的鼎的力量降\n低除自己以外的寶可夢的特\n攻。", - }, - swordOfRuin: { - name: "災禍之劍", - description: "以能呼喚災厄的劍的力量降\n低除自己以外的寶可夢的防\n御。", - }, - tabletsOfRuin: { - name: "災禍之簡", - description: "以能呼喚災厄的簡的力量降\n低除自己以外的寶可夢的攻\n擊。", - }, - beadsOfRuin: { - name: "災禍之玉", - description: + }, + goodAsGold: { + name: "黃金之軀", + description: "不會氧化的堅固黃金身軀不\n會受到對手的變化招式的影\n響。", + }, + vesselOfRuin: { + name: "災禍之鼎", + description: "以能呼喚災厄的鼎的力量降\n低除自己以外的寶可夢的特\n攻。", + }, + swordOfRuin: { + name: "災禍之劍", + description: "以能呼喚災厄的劍的力量降\n低除自己以外的寶可夢的防\n御。", + }, + tabletsOfRuin: { + name: "災禍之簡", + description: "以能呼喚災厄的簡的力量降\n低除自己以外的寶可夢的攻\n擊。", + }, + beadsOfRuin: { + name: "災禍之玉", + description: "以能呼喚災厄的勾玉的力量\n降低除自己以外的寶可夢的\n特防。", - }, - orichalcumPulse: { - name: "緋紅脈動", - description: + }, + orichalcumPulse: { + name: "緋紅脈動", + description: "出場時,會將天氣變爲晴朗\n。日照強烈時,會通過古代\n的脈動升高攻擊。", - }, - hadronEngine: { - name: "強子引擎", - description: + }, + hadronEngine: { + name: "強子引擎", + description: "出場時,會佈下電氣場地。\n處於電氣場地時,會通過未\n來的機關升高特攻。", - }, - opportunist: { - name: "跟風", - description: "對手的能力提高時,自己也\n會趁機同樣地提高能力。", - }, - cudChew: { - name: "反芻", - description: "喫了樹果後,會在下一回合\n結束時從胃反芻出來再喫1\n次。", - }, - sharpness: { name: "鋒銳", description: "提高切割對手的招式的威力。" }, - supremeOverlord: { - name: "大將", - description: + }, + opportunist: { + name: "跟風", + description: "對手的能力提高時,自己也\n會趁機同樣地提高能力。", + }, + cudChew: { + name: "反芻", + description: "喫了樹果後,會在下一回合\n結束時從胃反芻出來再喫1\n次。", + }, + sharpness: { name: "鋒銳", description: "提高切割對手的招式的威力。" }, + supremeOverlord: { + name: "大將", + description: "出場時,攻擊和特攻會按照\n目前被打倒的同伴數量逐漸\n提升,被打倒越多,提升越\n多。", - }, - costar: { name: "同臺共演", description: "出場時,複製同伴的能力變\n化。" }, - toxicDebris: { - name: "毒滿地", - description: "受到物理招式的傷害時,會\n在對手腳下散佈毒菱。", - }, - armorTail: { - name: "尾甲", - description: "包裹頭部的神祕尾巴使對手\n無法對我方使出先制招式。", - }, - earthEater: { - name: "食土", - description: + }, + costar: { name: "同臺共演", description: "出場時,複製同伴的能力變\n化。" }, + toxicDebris: { + name: "毒滿地", + description: "受到物理招式的傷害時,會\n在對手腳下散佈毒菱。", + }, + armorTail: { + name: "尾甲", + description: "包裹頭部的神祕尾巴使對手\n無法對我方使出先制招式。", + }, + earthEater: { + name: "食土", + description: "受到地面屬性的招式攻擊時\n,不會受到傷害,而是會得\n到回覆。", - }, - myceliumMight: { - name: "菌絲之力", - description: + }, + myceliumMight: { + name: "菌絲之力", + description: "使出變化招式時,雖然行動\n必定會變慢,但能不受對手\n的特性妨礙。", - }, - mindsEye: { - name: "心眼", - description: + }, + mindsEye: { + name: "心眼", + description: "一般屬性和格鬥屬性的招式\n可以擊中幽靈屬性的寶可夢。\n無視對手的閃避率的變化,\n且命中率不會被降低。", - }, - supersweetSyrup: { - name: "甘露之蜜", - description: + }, + supersweetSyrup: { + name: "甘露之蜜", + description: "首次出場時,會散發出甜膩\n的蜜的香味來降低對手的閃\n避率。", - }, - hospitality: { - name: "款待", - description: "出場時款待同伴,回覆其少\n量HP。", - }, - toxicChain: { - name: "毒鎖鏈", - description: + }, + hospitality: { + name: "款待", + description: "出場時款待同伴,回覆其少\n量HP。", + }, + toxicChain: { + name: "毒鎖鏈", + description: "憑藉含有毒素的鎖鏈的力量,\n有時能讓被招式擊中的對\n手陷入劇毒狀態。", - }, - embodyAspectTeal: { - name: "面影輝映", - description: "將回憶映於心中,讓水井面\n具發出光輝,提高自己的特\n防。", - }, - embodyAspectWellspring: { - name: "面影輝映", - description: "將回憶映於心中,讓碧草面\n具發出光輝,提高自己的速\n度。", - }, - embodyAspectHearthflame: { - name: "面影輝映", - description: "將回憶映於心中,讓火竈面\n具發出光輝,提高自己的攻\n擊。", - }, - embodyAspectCornerstone: { - name: "面影輝映", - description: "將回憶映於心中,讓礎石面\n具發出光輝,提高自己的防\n御。", - }, - teraShift: { - name: "太晶變形", - description: "出場時,會吸收周圍的能量\n,變爲太晶形態。", - }, - teraShell: { - name: "太晶甲殼", - description: + }, + embodyAspectTeal: { + name: "面影輝映", + description: "將回憶映於心中,讓水井面\n具發出光輝,提高自己的特\n防。", + }, + embodyAspectWellspring: { + name: "面影輝映", + description: "將回憶映於心中,讓碧草面\n具發出光輝,提高自己的速\n度。", + }, + embodyAspectHearthflame: { + name: "面影輝映", + description: "將回憶映於心中,讓火竈面\n具發出光輝,提高自己的攻\n擊。", + }, + embodyAspectCornerstone: { + name: "面影輝映", + description: "將回憶映於心中,讓礎石面\n具發出光輝,提高自己的防\n御。", + }, + teraShift: { + name: "太晶變形", + description: "出場時,會吸收周圍的能量\n,變爲太晶形態。", + }, + teraShell: { + name: "太晶甲殼", + description: "甲殼蘊藏着全部屬性的力量\n,會將自己HP全滿時受到\n的傷害全都變爲效果不好。", - }, - teraformZero: { - name: "歸零化境", - description: + }, + teraformZero: { + name: "歸零化境", + description: "太樂巴戈斯變爲星晶形態時\n,蘊藏在它身上的力量會將\n天氣和場地的影響全部歸零。", - }, - poisonPuppeteer: { - name: "毒傀儡", - description: + }, + poisonPuppeteer: { + name: "毒傀儡", + description: "因桃歹郎的招式而陷入中毒\n狀態的對手同時也會陷入混\n亂狀態。", - }, + }, } as const; diff --git a/src/locales/zh_TW/battle-message-ui-handler.ts b/src/locales/zh_TW/battle-message-ui-handler.ts index 614521af0d52..3f8892749fe9 100644 --- a/src/locales/zh_TW/battle-message-ui-handler.ts +++ b/src/locales/zh_TW/battle-message-ui-handler.ts @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "相當好", "ivDecent": "一般般", "ivNoGood": "也許不行", -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index f48178392bd7..c1fd9155daef 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -11,7 +11,7 @@ export const battle: SimpleTranslationEntries = { "playerGo": "去吧! {{pokemonName}}!", "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", "switchQuestion": "要更換\n{{pokemonName}}嗎?", - "trainerDefeated": `你擊敗了\n{{trainerName}}!`, + "trainerDefeated": "你擊敗了\n{{trainerName}}!", "pokemonCaught": "{{pokemonName}} 被抓住了!", "pokemon": "寶可夢", "sendOutPokemon": "上吧! {{pokemonName}}!", @@ -21,7 +21,7 @@ export const battle: SimpleTranslationEntries = { "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", "hitResultOneHitKO": "一擊切殺!", "attackFailed": "但是失敗了!", - "attackHitsCount": `擊中 {{count}} 次!`, + "attackHitsCount": "擊中 {{count}} 次!", "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", "learnMove": "{{pokemonName}} 學會了{{moveName}}!", @@ -46,11 +46,11 @@ export const battle: SimpleTranslationEntries = { "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", "runAwaySuccess": "你成功逃脫了!", - "runAwayCannotEscape": '你無法逃脫!', + "runAwayCannotEscape": "你無法逃脫!", "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", "notDisabled": "{{moveName}} 不再被禁用!", "skipItemQuestion": "你要跳過拾取道具嗎?", "eggHatching": "咦?", "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描?" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_TW/berry.ts b/src/locales/zh_TW/berry.ts index 58546537c241..931efb2c22f0 100644 --- a/src/locales/zh_TW/berry.ts +++ b/src/locales/zh_TW/berry.ts @@ -1,48 +1,48 @@ import { BerryTranslationEntries } from "#app/plugins/i18n"; export const berry: BerryTranslationEntries = { - "SITRUS": { - name: "文柚果", - effect: "HP低於50%時,恢復最大HP的25%", - }, - "LUM": { - name: "木子果", - effect: "治癒任何異常狀態和混亂狀態", - }, - "ENIGMA": { - name: "謎芝果", - effect: "受到效果絕佳的招式攻擊時,恢復25%最大HP", - }, - "LIECHI": { - name: "枝荔果", - effect: "HP低於25%時,攻擊提升一個等級", - }, - "GANLON": { - name: "龍睛果", - effect: "HP低於25%時,防禦提升一個等級", - }, - "PETAYA": { - name: "龍火果", - effect: "HP低於25%時,特攻提升一個等級", - }, - "APICOT": { - name: "杏仔果", - effect: "HP低於25%時,特防提升一個等級", - }, - "SALAC": { - name: "沙鱗果", - effect: "HP低於25%時,速度提升一個等級", - }, - "LANSAT": { - name: "蘭薩果", - effect: "HP低於25%時,擊中要害率提升兩個等級", - }, - "STARF": { - name: "星桃果", - effect: "HP低於25%時,提高隨機一項能力兩個等級", - }, - "LEPPA": { - name: "蘋野果", - effect: "有招式的PP降到0時,恢復該招式10PP", - }, + "SITRUS": { + name: "文柚果", + effect: "HP低於50%時,恢復最大HP的25%", + }, + "LUM": { + name: "木子果", + effect: "治癒任何異常狀態和混亂狀態", + }, + "ENIGMA": { + name: "謎芝果", + effect: "受到效果絕佳的招式攻擊時,恢復25%最大HP", + }, + "LIECHI": { + name: "枝荔果", + effect: "HP低於25%時,攻擊提升一個等級", + }, + "GANLON": { + name: "龍睛果", + effect: "HP低於25%時,防禦提升一個等級", + }, + "PETAYA": { + name: "龍火果", + effect: "HP低於25%時,特攻提升一個等級", + }, + "APICOT": { + name: "杏仔果", + effect: "HP低於25%時,特防提升一個等級", + }, + "SALAC": { + name: "沙鱗果", + effect: "HP低於25%時,速度提升一個等級", + }, + "LANSAT": { + name: "蘭薩果", + effect: "HP低於25%時,擊中要害率提升兩個等級", + }, + "STARF": { + name: "星桃果", + effect: "HP低於25%時,提高隨機一項能力兩個等級", + }, + "LEPPA": { + name: "蘋野果", + effect: "有招式的PP降到0時,恢復該招式10PP", + }, } as const; diff --git a/src/locales/zh_TW/command-ui-handler.ts b/src/locales/zh_TW/command-ui-handler.ts index 5dada588d8da..6431d9034479 100644 --- a/src/locales/zh_TW/command-ui-handler.ts +++ b/src/locales/zh_TW/command-ui-handler.ts @@ -1,9 +1,9 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const commandUiHandler: SimpleTranslationEntries = { - "fight": "戰鬥", - "ball": "精靈球", - "pokemon": "寶可夢", - "run": "逃跑", - "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", -} as const; \ No newline at end of file + "fight": "戰鬥", + "ball": "精靈球", + "pokemon": "寶可夢", + "run": "逃跑", + "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", +} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index af838249c6ee..05bc59d01418 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -23,29 +23,29 @@ import { berry } from "./berry"; import { voucher } from "./voucher"; export const zhTWConfig = { - ability: ability, - abilityTriggers: abilityTriggers, - battle: battle, - commandUiHandler: commandUiHandler, - egg: egg, - fightUiHandler: fightUiHandler, - growth: growth, - menu: menu, - menuUiHandler: menuUiHandler, - modifierType: modifierType, - move: move, - nature: nature, - pokeball: pokeball, - pokemon: pokemon, - pokemonInfo: pokemonInfo, - splashMessages: splashMessages, - starterSelectUiHandler: starterSelectUiHandler, - titles: titles, - trainerClasses: trainerClasses, - trainerNames: trainerNames, - tutorial: tutorial, - weather: weather, - battleMessageUiHandler: battleMessageUiHandler, - berry: berry, - voucher: voucher, -} + ability: ability, + abilityTriggers: abilityTriggers, + battle: battle, + commandUiHandler: commandUiHandler, + egg: egg, + fightUiHandler: fightUiHandler, + growth: growth, + menu: menu, + menuUiHandler: menuUiHandler, + modifierType: modifierType, + move: move, + nature: nature, + pokeball: pokeball, + pokemon: pokemon, + pokemonInfo: pokemonInfo, + splashMessages: splashMessages, + starterSelectUiHandler: starterSelectUiHandler, + titles: titles, + trainerClasses: trainerClasses, + trainerNames: trainerNames, + tutorial: tutorial, + weather: weather, + battleMessageUiHandler: battleMessageUiHandler, + berry: berry, + voucher: voucher, +}; diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.ts index daf3e132ad0e..d25599036b08 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.ts @@ -18,4 +18,4 @@ export const egg: SimpleTranslationEntries = { "tooManyEggs": "你的蛋太多啦!", "pull": "抽", "pulls": "抽" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_TW/fight-ui-handler.ts b/src/locales/zh_TW/fight-ui-handler.ts index d86767bd13d6..eb10031ac86a 100644 --- a/src/locales/zh_TW/fight-ui-handler.ts +++ b/src/locales/zh_TW/fight-ui-handler.ts @@ -1,7 +1,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const fightUiHandler: SimpleTranslationEntries = { - "pp": "PP", - "power": "威力", - "accuracy": "命中率", -} as const; \ No newline at end of file + "pp": "PP", + "power": "威力", + "accuracy": "命中率", +} as const; diff --git a/src/locales/zh_TW/growth.ts b/src/locales/zh_TW/growth.ts index 3312366867a8..941ddb39e666 100644 --- a/src/locales/zh_TW/growth.ts +++ b/src/locales/zh_TW/growth.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const growth: SimpleTranslationEntries = { - "Erratic": "最快", - "Fast": "快", - "Medium_Fast": "較快", - "Medium_Slow": "較慢", - "Slow": "慢", - "Fluctuating": "最慢" -} as const; \ No newline at end of file + "Erratic": "最快", + "Fast": "快", + "Medium_Fast": "較快", + "Medium_Slow": "較慢", + "Slow": "慢", + "Fluctuating": "最慢" +} as const; diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index 2f22ab1288d1..c38b447effd9 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -1,23 +1,23 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menuUiHandler: SimpleTranslationEntries = { - "GAME_SETTINGS": '遊戲設置', - "ACHIEVEMENTS": "成就", - "STATS": "數據", - "VOUCHERS": "兌換劵", - "EGG_LIST": "蛋列表", - "EGG_GACHA": "扭蛋機", - "MANAGE_DATA": "管理數據", - "COMMUNITY": "社群", - "RETURN_TO_TITLE": "返回標題畫面", - "LOG_OUT": "登出", - "slot": "存檔位 {{slotNumber}}", - "importSession": "導入存檔", - "importSlotSelect": "選擇要導入到的存檔位。", - "exportSession": "導出存檔", - "exportSlotSelect": "選擇要導出的存檔位。", - "importData": "導入數據", - "exportData": "導出數據", - "cancel": "取消", - "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" -} as const; \ No newline at end of file + "GAME_SETTINGS": "遊戲設置", + "ACHIEVEMENTS": "成就", + "STATS": "數據", + "VOUCHERS": "兌換劵", + "EGG_LIST": "蛋列表", + "EGG_GACHA": "扭蛋機", + "MANAGE_DATA": "管理數據", + "COMMUNITY": "社群", + "RETURN_TO_TITLE": "返回標題畫面", + "LOG_OUT": "登出", + "slot": "存檔位 {{slotNumber}}", + "importSession": "導入存檔", + "importSlotSelect": "選擇要導入到的存檔位。", + "exportSession": "導出存檔", + "exportSlotSelect": "選擇要導出的存檔位。", + "importData": "導入數據", + "exportData": "導出數據", + "cancel": "取消", + "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" +} as const; diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 13f6786b5cf0..f2d64e99ed8b 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -6,46 +6,46 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const menu: SimpleTranslationEntries = { - "cancel": "取消", - "continue": "繼續", - "dailyRun": "每日挑戰 (Beta)", - "loadGame": "加載遊戲", - "newGame": "新遊戲", - "selectGameMode": "選擇遊戲模式", - "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!", - "username": "用戶名", - "password": "密碼", - "login": "登入", - "register": "注冊", - "emptyUsername": "用戶名不能為空", - "invalidLoginUsername": "提供的用戶名無效", - "invalidRegisterUsername": "用戶名只能包含字母,數字或下劃線", - "invalidLoginPassword": "提供的密碼無效", - "invalidRegisterPassword": "密碼必需至少包含6個字符", - "usernameAlreadyUsed": "用戶名稱已被使用", - "accountNonExistent": "用戶不存在", - "unmatchingPassword": "提供的密碼不匹配", - "passwordNotMatchingConfirmPassword": "密碼必需與確認密碼一致", - "confirmPassword": "確認密碼", - "registrationAgeWarning": "注冊表示您確認您已年滿13歲。", - "backToLogin": "返回登錄", - "failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在,請聯繫管理員。", - "sessionSuccess": "工作階段加載成功.", - "failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。", - "boyOrGirl": "你是男孩還是女孩?", - "boy": "男孩", - "girl": "女孩", - "evolving": "甚麼?\n{{pokemonName}} 要進化了!", - "stoppedEvolving": "{{pokemonName}} 停止了進化。", - "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。", - "evolutionsPaused": "{{pokemonName}}的進化已暫停。", - "evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!", - "dailyRankings": "每日排名", - "weeklyRankings": "每週排名", - "noRankings": "無排名", - "loading": "加載中…", - "playersOnline": "在線玩家", - "empty":"空", - "yes":"是", - "no":"否", -} as const; \ No newline at end of file + "cancel": "取消", + "continue": "繼續", + "dailyRun": "每日挑戰 (Beta)", + "loadGame": "加載遊戲", + "newGame": "新遊戲", + "selectGameMode": "選擇遊戲模式", + "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!", + "username": "用戶名", + "password": "密碼", + "login": "登入", + "register": "注冊", + "emptyUsername": "用戶名不能為空", + "invalidLoginUsername": "提供的用戶名無效", + "invalidRegisterUsername": "用戶名只能包含字母,數字或下劃線", + "invalidLoginPassword": "提供的密碼無效", + "invalidRegisterPassword": "密碼必需至少包含6個字符", + "usernameAlreadyUsed": "用戶名稱已被使用", + "accountNonExistent": "用戶不存在", + "unmatchingPassword": "提供的密碼不匹配", + "passwordNotMatchingConfirmPassword": "密碼必需與確認密碼一致", + "confirmPassword": "確認密碼", + "registrationAgeWarning": "注冊表示您確認您已年滿13歲。", + "backToLogin": "返回登錄", + "failedToLoadSaveData": "讀取存檔數據失敗。請重新加載頁面。如果\n問題仍然存在,請聯繫管理員。", + "sessionSuccess": "工作階段加載成功.", + "failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。", + "boyOrGirl": "你是男孩還是女孩?", + "boy": "男孩", + "girl": "女孩", + "evolving": "甚麼?\n{{pokemonName}} 要進化了!", + "stoppedEvolving": "{{pokemonName}} 停止了進化。", + "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。", + "evolutionsPaused": "{{pokemonName}}的進化已暫停。", + "evolutionDone": "恭喜!\n你的 {{pokemonName}} 進化成了 {{evolvedPokemonName}}!", + "dailyRankings": "每日排名", + "weeklyRankings": "每週排名", + "noRankings": "無排名", + "loading": "加載中…", + "playersOnline": "在線玩家", + "empty":"空", + "yes":"是", + "no":"否", +} as const; diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index 47c96ffef71d..7369c64b06a6 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -1,434 +1,434 @@ import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; export const modifierType: ModifierTypeTranslationEntries = { - ModifierType: { - AddPokeballModifierType: { - name: "{{modifierCount}}x {{pokeballName}}", - description: + ModifierType: { + AddPokeballModifierType: { + name: "{{modifierCount}}x {{pokeballName}}", + description: "獲得 {{pokeballName}} x{{modifierCount}} (已有:{{pokeballAmount}}) \n捕捉倍率:{{catchRate}}", - }, - AddVoucherModifierType: { - name: "{{modifierCount}}x {{voucherTypeName}}", - description: "獲得 {{voucherTypeName}} x{{modifierCount}}", - }, - PokemonHeldItemModifierType: { - extra: { - inoperable: "{{pokemonName}} 無法攜帶\n這個物品!", - tooMany: "{{pokemonName}} 已有太多\n這個物品!", - }, - }, - PokemonHpRestoreModifierType: { - description: + }, + AddVoucherModifierType: { + name: "{{modifierCount}}x {{voucherTypeName}}", + description: "獲得 {{voucherTypeName}} x{{modifierCount}}", + }, + PokemonHeldItemModifierType: { + extra: { + inoperable: "{{pokemonName}} 無法攜帶\n這個物品!", + tooMany: "{{pokemonName}} 已有太多\n這個物品!", + }, + }, + PokemonHpRestoreModifierType: { + description: "爲一隻寶可夢恢復 {{restorePoints}} HP 或 {{restorePercent}}% HP,取最大值", - extra: { - fully: "爲一隻寶可夢恢復全部HP", - fullyWithStatus: "爲一隻寶可夢恢復全部HP並消除所有負面\n狀態", - }, - }, - PokemonReviveModifierType: { - description: "復活一隻寶可夢並恢復 {{restorePercent}}% HP", - }, - PokemonStatusHealModifierType: { - description: "爲一隻寶可夢消除所有負面狀態", - }, - PokemonPpRestoreModifierType: { - description: "爲一隻寶可夢的一個招式恢復 {{restorePoints}} PP", - extra: { fully: "完全恢復一隻寶可夢一個招式的PP" }, - }, - PokemonAllMovePpRestoreModifierType: { - description: "爲一隻寶可夢的所有招式恢復 {{restorePoints}} PP", - extra: { fully: "爲一隻寶可夢的所有招式恢復所有PP" }, - }, - PokemonPpUpModifierType: { - description: + extra: { + fully: "爲一隻寶可夢恢復全部HP", + fullyWithStatus: "爲一隻寶可夢恢復全部HP並消除所有負面\n狀態", + }, + }, + PokemonReviveModifierType: { + description: "復活一隻寶可夢並恢復 {{restorePercent}}% HP", + }, + PokemonStatusHealModifierType: { + description: "爲一隻寶可夢消除所有負面狀態", + }, + PokemonPpRestoreModifierType: { + description: "爲一隻寶可夢的一個招式恢復 {{restorePoints}} PP", + extra: { fully: "完全恢復一隻寶可夢一個招式的PP" }, + }, + PokemonAllMovePpRestoreModifierType: { + description: "爲一隻寶可夢的所有招式恢復 {{restorePoints}} PP", + extra: { fully: "爲一隻寶可夢的所有招式恢復所有PP" }, + }, + PokemonPpUpModifierType: { + description: "永久提升一個招式的PP,每5點最大PP增加{{upPoints}} (最多3點)。", - }, - PokemonNatureChangeModifierType: { - name: "{{natureName}}薄荷", - description: + }, + PokemonNatureChangeModifierType: { + name: "{{natureName}}薄荷", + description: "將一隻寶可夢的性格改爲{{natureName}}併爲該寶可\n夢永久解鎖該性格.", - }, - DoubleBattleChanceBoosterModifierType: { - description: "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍", - }, - TempBattleStatBoosterModifierType: { - description: + }, + DoubleBattleChanceBoosterModifierType: { + description: "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍", + }, + TempBattleStatBoosterModifierType: { + description: "爲所有成員寶可夢提升一級{{tempBattleStatName}},持續5場戰鬥", - }, - AttackTypeBoosterModifierType: { - description: "一隻寶可夢的{{moveType}}系招式威力提升20%", - }, - PokemonLevelIncrementModifierType: { - description: "一隻寶可夢等級提升1級", - }, - AllPokemonLevelIncrementModifierType: { - description: "所有成員寶可夢等級提升1級", - }, - PokemonBaseStatBoosterModifierType: { - description: + }, + AttackTypeBoosterModifierType: { + description: "一隻寶可夢的{{moveType}}系招式威力提升20%", + }, + PokemonLevelIncrementModifierType: { + description: "一隻寶可夢等級提升1級", + }, + AllPokemonLevelIncrementModifierType: { + description: "所有成員寶可夢等級提升1級", + }, + PokemonBaseStatBoosterModifierType: { + description: "增加持有者的{{statName}}10%,個體值越高堆疊\n上限越高.", - }, - AllPokemonFullHpRestoreModifierType: { - description: "所有寶可夢完全恢復HP", - }, - AllPokemonFullReviveModifierType: { - description: "復活所有瀕死寶可夢,完全恢復HP", - }, - MoneyRewardModifierType: { - description: "獲得{{moneyMultiplier}}金錢 (₽{{moneyAmount}})", - extra: { small: "少量", moderate: "中等", large: "大量" }, - }, - ExpBoosterModifierType: { - description: "經驗值獲取量增加{{boostPercent}}%", - }, - PokemonExpBoosterModifierType: { - description: "持有者經驗值獲取量增加{{boostPercent}}%", - }, - PokemonFriendshipBoosterModifierType: { - description: "每場戰鬥獲得的好感度提升50%", - }, - PokemonMoveAccuracyBoosterModifierType: { - description: "招式命中率增加{{accuracyAmount}} (最大100)", - }, - PokemonMultiHitModifierType: { - description: + }, + AllPokemonFullHpRestoreModifierType: { + description: "所有寶可夢完全恢復HP", + }, + AllPokemonFullReviveModifierType: { + description: "復活所有瀕死寶可夢,完全恢復HP", + }, + MoneyRewardModifierType: { + description: "獲得{{moneyMultiplier}}金錢 (₽{{moneyAmount}})", + extra: { small: "少量", moderate: "中等", large: "大量" }, + }, + ExpBoosterModifierType: { + description: "經驗值獲取量增加{{boostPercent}}%", + }, + PokemonExpBoosterModifierType: { + description: "持有者經驗值獲取量增加{{boostPercent}}%", + }, + PokemonFriendshipBoosterModifierType: { + description: "每場戰鬥獲得的好感度提升50%", + }, + PokemonMoveAccuracyBoosterModifierType: { + description: "招式命中率增加{{accuracyAmount}} (最大100)", + }, + PokemonMultiHitModifierType: { + description: "攻擊造成一次額外傷害,每次堆疊額外傷害\n分別衰減60/75/82.5%", - }, - TmModifierType: { - name: "招式學習器 {{moveId}} - {{moveName}}", - description: "教會一隻寶可夢{{moveName}}", - }, - EvolutionItemModifierType: { description: "使某些寶可夢進化" }, - FormChangeItemModifierType: { description: "使某些寶可夢更改形態" }, - FusePokemonModifierType: { - description: + }, + TmModifierType: { + name: "招式學習器 {{moveId}} - {{moveName}}", + description: "教會一隻寶可夢{{moveName}}", + }, + EvolutionItemModifierType: { description: "使某些寶可夢進化" }, + FormChangeItemModifierType: { description: "使某些寶可夢更改形態" }, + FusePokemonModifierType: { + description: "融合兩隻寶可夢 (改變特性, 平分基礎點數\n和屬性, 共享招式池)", - }, - TerastallizeModifierType: { - name: "{{teraType}}太晶碎塊", - description: "持有者獲得{{teraType}}太晶化10場戰鬥", - }, - ContactHeldItemTransferChanceModifierType: { - description: "攻擊時{{chancePercent}}%概率偷取對手物品", - }, - TurnHeldItemTransferModifierType: { - description: "持有者每回合從對手那裏獲得一個持有的物品", - }, - EnemyAttackStatusEffectChanceModifierType: { - description: "攻擊時{{chancePercent}}%概率造成{{statusEffect}}", - }, - EnemyEndureChanceModifierType: { - description: "增加{{chancePercent}}%遭受攻擊的概率", - }, - RARE_CANDY: { name: "神奇糖果" }, - RARER_CANDY: { name: "超神奇糖果" }, - MEGA_BRACELET: { - name: "超級手鐲", - description: "能讓攜帶着超級石戰鬥的寶可夢進行\n超級進化", - }, - DYNAMAX_BAND: { - name: "極巨腕帶", - description: "能讓攜帶着極巨菇菇戰鬥的寶可夢進行\n極巨化", - }, - TERA_ORB: { - name: "太晶珠", - description: "能讓攜帶着太晶碎塊戰鬥的寶可夢進行\n太晶化", - }, - MAP: { - name: "地圖", - description: "允許你在切換寶可夢羣落時選擇目的地", - }, - POTION: { name: "傷藥" }, - SUPER_POTION: { name: "好傷藥" }, - HYPER_POTION: { name: "厲害傷藥" }, - MAX_POTION: { name: "全滿藥" }, - FULL_RESTORE: { name: "全復藥" }, - REVIVE: { name: "活力碎片" }, - MAX_REVIVE: { name: "活力塊" }, - FULL_HEAL: { name: "萬靈藥" }, - SACRED_ASH: { name: "聖灰" }, - REVIVER_SEED: { - name: "復活種子", - description: "恢復1只瀕死寶可夢的HP至1/2", - }, - ETHER: { name: "PP單項小補劑" }, - MAX_ETHER: { name: "PP單項全補劑" }, - ELIXIR: { name: "PP多項小補劑" }, - MAX_ELIXIR: { name: "PP多項全補劑" }, - PP_UP: { name: "PP提升劑" }, - PP_MAX: { name: "PP極限提升劑" }, - LURE: { name: "引蟲香水" }, - SUPER_LURE: { name: "白銀香水" }, - MAX_LURE: { name: "黃金香水" }, - MEMORY_MUSHROOM: { - name: "回憶蘑菇", - description: "回憶一個寶可夢已經遺忘的招式", - }, - EXP_SHARE: { - name: "學習裝置", - description: "未參加對戰的寶可夢獲得20%的經驗值", - }, - EXP_BALANCE: { - name: "均衡型學習裝置", - description: "隊伍中的低級寶可夢獲得更多經驗值", - }, - OVAL_CHARM: { - name: "圓形護符", - description: + }, + TerastallizeModifierType: { + name: "{{teraType}}太晶碎塊", + description: "持有者獲得{{teraType}}太晶化10場戰鬥", + }, + ContactHeldItemTransferChanceModifierType: { + description: "攻擊時{{chancePercent}}%概率偷取對手物品", + }, + TurnHeldItemTransferModifierType: { + description: "持有者每回合從對手那裏獲得一個持有的物品", + }, + EnemyAttackStatusEffectChanceModifierType: { + description: "攻擊時{{chancePercent}}%概率造成{{statusEffect}}", + }, + EnemyEndureChanceModifierType: { + description: "增加{{chancePercent}}%遭受攻擊的概率", + }, + RARE_CANDY: { name: "神奇糖果" }, + RARER_CANDY: { name: "超神奇糖果" }, + MEGA_BRACELET: { + name: "超級手鐲", + description: "能讓攜帶着超級石戰鬥的寶可夢進行\n超級進化", + }, + DYNAMAX_BAND: { + name: "極巨腕帶", + description: "能讓攜帶着極巨菇菇戰鬥的寶可夢進行\n極巨化", + }, + TERA_ORB: { + name: "太晶珠", + description: "能讓攜帶着太晶碎塊戰鬥的寶可夢進行\n太晶化", + }, + MAP: { + name: "地圖", + description: "允許你在切換寶可夢羣落時選擇目的地", + }, + POTION: { name: "傷藥" }, + SUPER_POTION: { name: "好傷藥" }, + HYPER_POTION: { name: "厲害傷藥" }, + MAX_POTION: { name: "全滿藥" }, + FULL_RESTORE: { name: "全復藥" }, + REVIVE: { name: "活力碎片" }, + MAX_REVIVE: { name: "活力塊" }, + FULL_HEAL: { name: "萬靈藥" }, + SACRED_ASH: { name: "聖灰" }, + REVIVER_SEED: { + name: "復活種子", + description: "恢復1只瀕死寶可夢的HP至1/2", + }, + ETHER: { name: "PP單項小補劑" }, + MAX_ETHER: { name: "PP單項全補劑" }, + ELIXIR: { name: "PP多項小補劑" }, + MAX_ELIXIR: { name: "PP多項全補劑" }, + PP_UP: { name: "PP提升劑" }, + PP_MAX: { name: "PP極限提升劑" }, + LURE: { name: "引蟲香水" }, + SUPER_LURE: { name: "白銀香水" }, + MAX_LURE: { name: "黃金香水" }, + MEMORY_MUSHROOM: { + name: "回憶蘑菇", + description: "回憶一個寶可夢已經遺忘的招式", + }, + EXP_SHARE: { + name: "學習裝置", + description: "未參加對戰的寶可夢獲得20%的經驗值", + }, + EXP_BALANCE: { + name: "均衡型學習裝置", + description: "隊伍中的低級寶可夢獲得更多經驗值", + }, + OVAL_CHARM: { + name: "圓形護符", + description: "當多隻寶可夢參與戰鬥,分別獲得總經驗值\n10%的額外經驗值", - }, - EXP_CHARM: { name: "經驗護符" }, - SUPER_EXP_CHARM: { name: "超級經驗護符" }, - GOLDEN_EXP_CHARM: { name: "黃金經驗護符" }, - LUCKY_EGG: { name: "幸運蛋" }, - GOLDEN_EGG: { name: "金蛋" }, - SOOTHE_BELL: { name: "安撫之鈴" }, - SOUL_DEW: { - name: "心之水滴", - description: "增加寶可夢性格影響10% (加算)", - }, - NUGGET: { name: "金珠" }, - BIG_NUGGET: { name: "巨大金珠" }, - RELIC_GOLD: { name: "古代金幣" }, - AMULET_COIN: { name: "護符金幣", description: "金錢獎勵增加20%" }, - GOLDEN_PUNCH: { - name: "黃金拳頭", - description: "將50%造成的傷害轉換爲金錢", - }, - COIN_CASE: { - name: "代幣盒", - description: "每十場戰鬥, 獲得自己金錢10%的利息", - }, - LOCK_CAPSULE: { - name: "上鎖的容器", - description: "允許在刷新物品時鎖定物品稀有度", - }, - GRIP_CLAW: { name: "緊纏鉤爪" }, - WIDE_LENS: { name: "廣角鏡" }, - MULTI_LENS: { name: "多重鏡" }, - HEALING_CHARM: { - name: "治癒護符", - description: "HP恢復量增加10% (含復活)", - }, - CANDY_JAR: { name: "糖果罐", description: "神奇糖果提供的升級提升1級" }, - BERRY_POUCH: { - name: "樹果袋", - description: "使用樹果時有33%的幾率不會消耗樹果", - }, - FOCUS_BAND: { - name: "氣勢頭帶", - description: + }, + EXP_CHARM: { name: "經驗護符" }, + SUPER_EXP_CHARM: { name: "超級經驗護符" }, + GOLDEN_EXP_CHARM: { name: "黃金經驗護符" }, + LUCKY_EGG: { name: "幸運蛋" }, + GOLDEN_EGG: { name: "金蛋" }, + SOOTHE_BELL: { name: "安撫之鈴" }, + SOUL_DEW: { + name: "心之水滴", + description: "增加寶可夢性格影響10% (加算)", + }, + NUGGET: { name: "金珠" }, + BIG_NUGGET: { name: "巨大金珠" }, + RELIC_GOLD: { name: "古代金幣" }, + AMULET_COIN: { name: "護符金幣", description: "金錢獎勵增加20%" }, + GOLDEN_PUNCH: { + name: "黃金拳頭", + description: "將50%造成的傷害轉換爲金錢", + }, + COIN_CASE: { + name: "代幣盒", + description: "每十場戰鬥, 獲得自己金錢10%的利息", + }, + LOCK_CAPSULE: { + name: "上鎖的容器", + description: "允許在刷新物品時鎖定物品稀有度", + }, + GRIP_CLAW: { name: "緊纏鉤爪" }, + WIDE_LENS: { name: "廣角鏡" }, + MULTI_LENS: { name: "多重鏡" }, + HEALING_CHARM: { + name: "治癒護符", + description: "HP恢復量增加10% (含復活)", + }, + CANDY_JAR: { name: "糖果罐", description: "神奇糖果提供的升級提升1級" }, + BERRY_POUCH: { + name: "樹果袋", + description: "使用樹果時有33%的幾率不會消耗樹果", + }, + FOCUS_BAND: { + name: "氣勢頭帶", + description: "攜帶該道具的寶可夢有10%幾率在受到\n攻擊而將陷入瀕死狀態時,保留1點HP不陷入瀕死狀態", - }, - QUICK_CLAW: { - name: "先制之爪", - description: "有10%的幾率無視速度優先使出招式\n(先制技能優先)", - }, - KINGS_ROCK: { - name: "王者之證", - description: + }, + QUICK_CLAW: { + name: "先制之爪", + description: "有10%的幾率無視速度優先使出招式\n(先制技能優先)", + }, + KINGS_ROCK: { + name: "王者之證", + description: "攜帶該道具的寶可夢使用任意原本不會造成\n畏縮狀態的攻擊招式並造成傷害時,有\n10%幾率使目標陷入畏縮狀態", - }, - LEFTOVERS: { - name: "喫剩的東西", - description: "攜帶該道具的寶可夢在每個回合結束時恢復\n最大HP的1/16", - }, - SHELL_BELL: { - name: "貝殼之鈴", - description: + }, + LEFTOVERS: { + name: "喫剩的東西", + description: "攜帶該道具的寶可夢在每個回合結束時恢復\n最大HP的1/16", + }, + SHELL_BELL: { + name: "貝殼之鈴", + description: "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8", - }, - BATON: { - name: "接力棒", - description: "允許在切換寶可夢時保留能力變化, 對陷阱\n同樣生效", - }, - SHINY_CHARM: { - name: "閃耀護符", - description: "顯著增加野生寶可夢的閃光概率", - }, - ABILITY_CHARM: { - name: "特性護符", - description: "顯著增加野生寶可夢有隱藏特性的概率", - }, - IV_SCANNER: { - name: "個體值探測器", - description: + }, + BATON: { + name: "接力棒", + description: "允許在切換寶可夢時保留能力變化, 對陷阱\n同樣生效", + }, + SHINY_CHARM: { + name: "閃耀護符", + description: "顯著增加野生寶可夢的閃光概率", + }, + ABILITY_CHARM: { + name: "特性護符", + description: "顯著增加野生寶可夢有隱藏特性的概率", + }, + IV_SCANNER: { + name: "個體值探測器", + description: "允許掃描野生寶可夢的個體值。 每個次顯示\n2個個體值. 最好的個體值優先顯示", - }, - DNA_SPLICERS: { name: "基因之楔" }, - MINI_BLACK_HOLE: { name: "迷你黑洞" }, - GOLDEN_POKEBALL: { - name: "黃金精靈球", - description: "在每場戰鬥結束後增加一個額外物品選項", - }, - ENEMY_DAMAGE_BOOSTER: { - name: "傷害硬幣", - description: "增加5%造成傷害", - }, - ENEMY_DAMAGE_REDUCTION: { - name: "防禦硬幣", - description: "減少2.5%承受傷害", - }, - ENEMY_HEAL: { name: "恢復硬幣", description: "每回合恢復2%最大HP" }, - ENEMY_ATTACK_POISON_CHANCE: { name: "劇毒硬幣" }, - ENEMY_ATTACK_PARALYZE_CHANCE: { name: "麻痹硬幣" }, - ENEMY_ATTACK_SLEEP_CHANCE: { name: "睡眠硬幣" }, - ENEMY_ATTACK_FREEZE_CHANCE: { name: "冰凍硬幣" }, - ENEMY_ATTACK_BURN_CHANCE: { name: "灼燒硬幣" }, - ENEMY_STATUS_EFFECT_HEAL_CHANCE: { - name: "萬靈藥硬幣", - description: "增加10%每回合治癒異常狀態的概率", - }, - ENEMY_ENDURE_CHANCE: { name: "忍受硬幣" }, - ENEMY_FUSED_CHANCE: { - name: "融合硬幣", - description: "增加1%野生融合寶可夢出現概率", - }, - }, - TempBattleStatBoosterItem: { - x_attack: "力量強化", - x_defense: "防禦強化", - x_sp_atk: "特攻強化", - x_sp_def: "特防強化", - x_speed: "速度強化", - x_accuracy: "命中強化", - dire_hit: "要害攻擊", - }, - AttackTypeBoosterItem: { - silk_scarf: "絲綢圍巾", - black_belt: "黑帶", - sharp_beak: "銳利鳥嘴", - poison_barb: "毒針", - soft_sand: "柔軟沙子", - hard_stone: "硬石頭", - silver_powder: "銀粉", - spell_tag: "詛咒之符", - metal_coat: "金屬膜", - charcoal: "木炭", - mystic_water: "神祕水滴", - miracle_seed: "奇蹟種子", - magnet: "磁鐵", - twisted_spoon: "彎曲的湯匙", - never_melt_ice: "不融冰", - dragon_fang: "龍之牙", - black_glasses: "黑色眼鏡", - fairy_feather: "妖精之羽", - }, - BaseStatBoosterItem: { - hp_up: "HP增強劑", - protein: "攻擊增強劑", - iron: "防禦增強劑", - calcium: "特攻增強劑", - zinc: "特防增強劑", - carbos: "速度增強劑", - }, - EvolutionItem: { - NONE: "無", - LINKING_CORD: "聯繫繩", - SUN_STONE: "日之石", - MOON_STONE: "月之石", - LEAF_STONE: "葉之石", - FIRE_STONE: "火之石", - WATER_STONE: "水之石", - THUNDER_STONE: "雷之石", - ICE_STONE: "冰之石", - DUSK_STONE: "暗之石", - DAWN_STONE: "覺醒之石", - SHINY_STONE: "光之石", - CRACKED_POT: "破裂的茶壺", - SWEET_APPLE: "甜甜蘋果", - TART_APPLE: "酸酸蘋果", - STRAWBERRY_SWEET: "草莓糖飾", - UNREMARKABLE_TEACUP: "凡作茶碗", - CHIPPED_POT: "缺損的茶壺", - BLACK_AUGURITE: "黑奇石", - GALARICA_CUFF: "伽勒豆蔻手環", - GALARICA_WREATH: "伽勒豆蔻花圈", - PEAT_BLOCK: "泥炭塊", - AUSPICIOUS_ARMOR: "慶祝之鎧", - MALICIOUS_ARMOR: "咒術之鎧", - MASTERPIECE_TEACUP: "傑作茶碗", - METAL_ALLOY: "複合金屬", - SCROLL_OF_DARKNESS: "惡之掛軸", - SCROLL_OF_WATERS: "水之掛軸", - SYRUPY_APPLE: "蜜汁蘋果", - }, - FormChangeItem: { - NONE: "無", - ABOMASITE: "暴雪王進化石", - ABSOLITE: "阿勃梭魯進化石", - AERODACTYLITE: "化石翼龍進化石", - AGGRONITE: "波士可多拉進化石", - ALAKAZITE: "胡地進化石", - ALTARIANITE: "七夕青鳥進化石", - AMPHAROSITE: "電龍進化石", - AUDINITE: "差不多娃娃進化石", - BANETTITE: "詛咒娃娃進化石", - BEEDRILLITE: "大針蜂進化石", - BLASTOISINITE: "水箭龜進化石", - BLAZIKENITE: "火焰雞進化石", - CAMERUPTITE: "噴火駝進化石", - CHARIZARDITE_X: "噴火龍進化石X", - CHARIZARDITE_Y: "噴火龍進化石Y", - DIANCITE: "蒂安希進化石", - GALLADITE: "艾路雷朵進化石", - GARCHOMPITE: "烈咬陸鯊進化石", - GARDEVOIRITE: "沙奈朵進化石", - GENGARITE: "耿鬼進化石", - GLALITITE: "冰鬼護進化石", - GYARADOSITE: "暴鯉龍進化石", - HERACRONITE: "赫拉克羅斯進化石", - HOUNDOOMINITE: "黑魯加進化石", - KANGASKHANITE: "袋獸進化石", - LATIASITE: "拉帝亞斯進化石", - LATIOSITE: "拉帝歐斯進化石", - LOPUNNITE: "長耳兔進化石", - LUCARIONITE: "路卡利歐進化石", - MANECTITE: "雷電獸進化石", - MAWILITE: "大嘴娃進化石", - MEDICHAMITE: "恰雷姆進化石", - METAGROSSITE: "巨金怪進化石", - MEWTWONITE_X: "超夢進化石X", - MEWTWONITE_Y: "超夢進化石Y", - PIDGEOTITE: "大比鳥進化石", - PINSIRITE: "凱羅斯進化石", - RAYQUAZITE: "烈空坐進化石", - SABLENITE: "勾魂眼進化石", - SALAMENCITE: "暴飛龍進化石", - SCEPTILITE: "蜥蜴王進化石", - SCIZORITE: "巨鉗螳螂進化石", - SHARPEDONITE: "巨牙鯊進化石", - SLOWBRONITE: "呆殼獸進化石", - STEELIXITE: "大鋼蛇進化石", - SWAMPERTITE: "巨沼怪進化石", - TYRANITARITE: "班基拉斯進化石", - VENUSAURITE: "妙蛙花進化石", - BLUE_ORB: "靛藍色寶珠", - RED_ORB: "硃紅色寶珠", - SHARP_METEORITE: "銳利隕石", - HARD_METEORITE: "堅硬隕石", - SMOOTH_METEORITE: "光滑隕石", - ADAMANT_CRYSTAL: "大金剛寶玉", - LUSTROUS_ORB: "白玉寶珠", - GRISEOUS_CORE: "大白金寶玉", - REVEAL_GLASS: "現形鏡", - GRACIDEA: "葛拉西蒂亞花", - MAX_MUSHROOMS: "極巨菇菇", - DARK_STONE: "黑暗石", - LIGHT_STONE: "光明石", - PRISON_BOTTLE: "懲戒之壺", - N_LUNARIZER: "奈克洛露奈合體器", - N_SOLARIZER: "奈克洛索爾合體器", - RUSTED_SWORD: "腐朽的劍", - RUSTED_SHIELD: "腐朽的盾", - ICY_REINS_OF_UNITY: "牽絆繮繩(冰)", - SHADOW_REINS_OF_UNITY: "牽絆繮繩(幽靈)", - WELLSPRING_MASK: "水井面具", - HEARTHFLAME_MASK: "火竈面具", - CORNERSTONE_MASK: "礎石面具", - SHOCK_DRIVE: "閃電卡帶", - BURN_DRIVE: "火焰卡帶", - CHILL_DRIVE: "冰凍卡帶", - DOUSE_DRIVE: "水流卡帶", }, + DNA_SPLICERS: { name: "基因之楔" }, + MINI_BLACK_HOLE: { name: "迷你黑洞" }, + GOLDEN_POKEBALL: { + name: "黃金精靈球", + description: "在每場戰鬥結束後增加一個額外物品選項", + }, + ENEMY_DAMAGE_BOOSTER: { + name: "傷害硬幣", + description: "增加5%造成傷害", + }, + ENEMY_DAMAGE_REDUCTION: { + name: "防禦硬幣", + description: "減少2.5%承受傷害", + }, + ENEMY_HEAL: { name: "恢復硬幣", description: "每回合恢復2%最大HP" }, + ENEMY_ATTACK_POISON_CHANCE: { name: "劇毒硬幣" }, + ENEMY_ATTACK_PARALYZE_CHANCE: { name: "麻痹硬幣" }, + ENEMY_ATTACK_SLEEP_CHANCE: { name: "睡眠硬幣" }, + ENEMY_ATTACK_FREEZE_CHANCE: { name: "冰凍硬幣" }, + ENEMY_ATTACK_BURN_CHANCE: { name: "灼燒硬幣" }, + ENEMY_STATUS_EFFECT_HEAL_CHANCE: { + name: "萬靈藥硬幣", + description: "增加10%每回合治癒異常狀態的概率", + }, + ENEMY_ENDURE_CHANCE: { name: "忍受硬幣" }, + ENEMY_FUSED_CHANCE: { + name: "融合硬幣", + description: "增加1%野生融合寶可夢出現概率", + }, + }, + TempBattleStatBoosterItem: { + x_attack: "力量強化", + x_defense: "防禦強化", + x_sp_atk: "特攻強化", + x_sp_def: "特防強化", + x_speed: "速度強化", + x_accuracy: "命中強化", + dire_hit: "要害攻擊", + }, + AttackTypeBoosterItem: { + silk_scarf: "絲綢圍巾", + black_belt: "黑帶", + sharp_beak: "銳利鳥嘴", + poison_barb: "毒針", + soft_sand: "柔軟沙子", + hard_stone: "硬石頭", + silver_powder: "銀粉", + spell_tag: "詛咒之符", + metal_coat: "金屬膜", + charcoal: "木炭", + mystic_water: "神祕水滴", + miracle_seed: "奇蹟種子", + magnet: "磁鐵", + twisted_spoon: "彎曲的湯匙", + never_melt_ice: "不融冰", + dragon_fang: "龍之牙", + black_glasses: "黑色眼鏡", + fairy_feather: "妖精之羽", + }, + BaseStatBoosterItem: { + hp_up: "HP增強劑", + protein: "攻擊增強劑", + iron: "防禦增強劑", + calcium: "特攻增強劑", + zinc: "特防增強劑", + carbos: "速度增強劑", + }, + EvolutionItem: { + NONE: "無", + LINKING_CORD: "聯繫繩", + SUN_STONE: "日之石", + MOON_STONE: "月之石", + LEAF_STONE: "葉之石", + FIRE_STONE: "火之石", + WATER_STONE: "水之石", + THUNDER_STONE: "雷之石", + ICE_STONE: "冰之石", + DUSK_STONE: "暗之石", + DAWN_STONE: "覺醒之石", + SHINY_STONE: "光之石", + CRACKED_POT: "破裂的茶壺", + SWEET_APPLE: "甜甜蘋果", + TART_APPLE: "酸酸蘋果", + STRAWBERRY_SWEET: "草莓糖飾", + UNREMARKABLE_TEACUP: "凡作茶碗", + CHIPPED_POT: "缺損的茶壺", + BLACK_AUGURITE: "黑奇石", + GALARICA_CUFF: "伽勒豆蔻手環", + GALARICA_WREATH: "伽勒豆蔻花圈", + PEAT_BLOCK: "泥炭塊", + AUSPICIOUS_ARMOR: "慶祝之鎧", + MALICIOUS_ARMOR: "咒術之鎧", + MASTERPIECE_TEACUP: "傑作茶碗", + METAL_ALLOY: "複合金屬", + SCROLL_OF_DARKNESS: "惡之掛軸", + SCROLL_OF_WATERS: "水之掛軸", + SYRUPY_APPLE: "蜜汁蘋果", + }, + FormChangeItem: { + NONE: "無", + ABOMASITE: "暴雪王進化石", + ABSOLITE: "阿勃梭魯進化石", + AERODACTYLITE: "化石翼龍進化石", + AGGRONITE: "波士可多拉進化石", + ALAKAZITE: "胡地進化石", + ALTARIANITE: "七夕青鳥進化石", + AMPHAROSITE: "電龍進化石", + AUDINITE: "差不多娃娃進化石", + BANETTITE: "詛咒娃娃進化石", + BEEDRILLITE: "大針蜂進化石", + BLASTOISINITE: "水箭龜進化石", + BLAZIKENITE: "火焰雞進化石", + CAMERUPTITE: "噴火駝進化石", + CHARIZARDITE_X: "噴火龍進化石X", + CHARIZARDITE_Y: "噴火龍進化石Y", + DIANCITE: "蒂安希進化石", + GALLADITE: "艾路雷朵進化石", + GARCHOMPITE: "烈咬陸鯊進化石", + GARDEVOIRITE: "沙奈朵進化石", + GENGARITE: "耿鬼進化石", + GLALITITE: "冰鬼護進化石", + GYARADOSITE: "暴鯉龍進化石", + HERACRONITE: "赫拉克羅斯進化石", + HOUNDOOMINITE: "黑魯加進化石", + KANGASKHANITE: "袋獸進化石", + LATIASITE: "拉帝亞斯進化石", + LATIOSITE: "拉帝歐斯進化石", + LOPUNNITE: "長耳兔進化石", + LUCARIONITE: "路卡利歐進化石", + MANECTITE: "雷電獸進化石", + MAWILITE: "大嘴娃進化石", + MEDICHAMITE: "恰雷姆進化石", + METAGROSSITE: "巨金怪進化石", + MEWTWONITE_X: "超夢進化石X", + MEWTWONITE_Y: "超夢進化石Y", + PIDGEOTITE: "大比鳥進化石", + PINSIRITE: "凱羅斯進化石", + RAYQUAZITE: "烈空坐進化石", + SABLENITE: "勾魂眼進化石", + SALAMENCITE: "暴飛龍進化石", + SCEPTILITE: "蜥蜴王進化石", + SCIZORITE: "巨鉗螳螂進化石", + SHARPEDONITE: "巨牙鯊進化石", + SLOWBRONITE: "呆殼獸進化石", + STEELIXITE: "大鋼蛇進化石", + SWAMPERTITE: "巨沼怪進化石", + TYRANITARITE: "班基拉斯進化石", + VENUSAURITE: "妙蛙花進化石", + BLUE_ORB: "靛藍色寶珠", + RED_ORB: "硃紅色寶珠", + SHARP_METEORITE: "銳利隕石", + HARD_METEORITE: "堅硬隕石", + SMOOTH_METEORITE: "光滑隕石", + ADAMANT_CRYSTAL: "大金剛寶玉", + LUSTROUS_ORB: "白玉寶珠", + GRISEOUS_CORE: "大白金寶玉", + REVEAL_GLASS: "現形鏡", + GRACIDEA: "葛拉西蒂亞花", + MAX_MUSHROOMS: "極巨菇菇", + DARK_STONE: "黑暗石", + LIGHT_STONE: "光明石", + PRISON_BOTTLE: "懲戒之壺", + N_LUNARIZER: "奈克洛露奈合體器", + N_SOLARIZER: "奈克洛索爾合體器", + RUSTED_SWORD: "腐朽的劍", + RUSTED_SHIELD: "腐朽的盾", + ICY_REINS_OF_UNITY: "牽絆繮繩(冰)", + SHADOW_REINS_OF_UNITY: "牽絆繮繩(幽靈)", + WELLSPRING_MASK: "水井面具", + HEARTHFLAME_MASK: "火竈面具", + CORNERSTONE_MASK: "礎石面具", + SHOCK_DRIVE: "閃電卡帶", + BURN_DRIVE: "火焰卡帶", + CHILL_DRIVE: "冰凍卡帶", + DOUSE_DRIVE: "水流卡帶", + }, } as const; diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts index 8813e2113ee1..80604445e9db 100644 --- a/src/locales/zh_TW/move.ts +++ b/src/locales/zh_TW/move.ts @@ -1,3680 +1,3680 @@ import { MoveTranslationEntries } from "#app/plugins/i18n"; export const move: MoveTranslationEntries = { - pound: { name: "拍擊", effect: "使用長長的尾巴或手等拍打\n對手進行攻擊" }, - karateChop: { - name: "空手劈", - effect: "用鋒利的手刀劈向對手進行\n攻擊。容易擊中要害", - }, - doubleSlap: { - name: "連環巴掌", - effect: "用連環巴掌拍打對手進行攻\n擊。連續攻擊2~5次", - }, - cometPunch: { - name: "連續拳", - effect: "用拳頭怒濤般的毆打對手進\n行攻擊。連續攻擊2~5次", - }, - megaPunch: { name: "百萬噸重拳", effect: "用充滿力量的拳頭攻擊對手" }, - payDay: { - name: "聚寶功", - effect: "向對手的身體投擲小金幣進\n行攻擊。戰鬥後可以拿到錢", - }, - firePunch: { - name: "火焰拳", - effect: "用充滿火焰的拳頭攻擊對手。\n有時會讓對手陷入灼傷狀\n態", - }, - icePunch: { - name: "冰凍拳", - effect: "用充滿寒氣的拳頭攻擊對手。\n有時會讓對手陷入冰凍狀\n態", - }, - thunderPunch: { - name: "雷電拳", - effect: "用充滿電流的拳頭攻擊對手。\n有時會讓對手陷入麻痹狀\n態", - }, - scratch: { name: "抓", effect: "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" }, - viseGrip: { name: "夾住", effect: "將對手從兩側夾住,給予傷\n害" }, - guillotine: { - name: "極落鉗", - effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊昏厥", - }, - razorWind: { - name: "旋風刀", - effect: "製造風之刃,於第2回合攻\n擊對手。容易擊中要害", - }, - swordsDance: { - name: "劍舞", - effect: "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊", - }, - cut: { name: "居合劈", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" }, - gust: { name: "起風", effect: "用翅膀將颳起的狂風襲向對\n手進行攻擊" }, - wingAttack: { - name: "翅膀攻擊", - effect: "大大地展開美麗的翅膀,將\n其撞向對手進行攻擊", - }, - whirlwind: { - name: "吹飛", - effect: "吹飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - fly: { name: "飛翔", effect: "第1回合飛上天空,第2回\n合攻擊對手" }, - bind: { - name: "綁緊", - effect: "使用長長的身體或藤蔓等,\n在4~5回合內綁緊對手進\n行攻擊", - }, - slam: { name: "摔打", effect: "使用長長的尾巴或藤蔓等摔\n打對手進行攻擊" }, - vineWhip: { - name: "藤鞭", - effect: "用如同鞭子般彎曲而細長的\n藤蔓摔打對手進行攻擊", - }, - stomp: { - name: "踩踏", - effect: "用大腳踩踏對手進行攻擊。\n有時會使對手畏縮", - }, - doubleKick: { - name: "二連踢", - effect: "用2只腳踢飛對手進行攻擊。\n連續2次給予傷害", - }, - megaKick: { - name: "百萬噸重踢", - effect: "使出力大無窮的重踢踢飛對\n手進行攻擊", - }, - jumpKick: { - name: "飛踢", - effect: "使出高高的騰空踢攻擊對手。\n如果踢偏則自己會受到傷\n害", - }, - rollingKick: { - name: "迴旋踢", - effect: "一邊使身體快速旋轉,一邊\n踢飛對手進行攻擊。有時會\n使對手畏縮", - }, - sandAttack: { name: "潑沙", effect: "向對手臉上潑沙子,從而降\n低命中率" }, - headbutt: { - name: "頭錘", - effect: "將頭伸出,筆直地撲向對手\n進行攻擊。有時會使對手畏\n縮", - }, - hornAttack: { name: "角撞", effect: "用尖銳的角攻擊對手" }, - furyAttack: { - name: "亂擊", - effect: "用角或喙刺向對手進行攻擊。\n連續攻擊2~5次", - }, - hornDrill: { - name: "角鑽", - effect: "用旋轉的角刺入對手進行攻\n擊。只要命中就會一擊昏厥", - }, - tackle: { name: "撞擊", effect: "用整個身體撞向對手進行攻\n擊" }, - bodySlam: { - name: "泰山壓頂", - effect: "用整個身體壓住對手進行攻\n擊。有時會讓對手陷入麻痹\n狀態", - }, - wrap: { - name: "緊束", - effect: "使用長長的身體或藤蔓等,\n在4~5回合內緊束對手進\n行攻擊", - }, - takeDown: { - name: "猛撞", - effect: "以驚人的氣勢撞向對手進行\n攻擊。自己也會受到少許傷\n害", - }, - thrash: { - name: "大鬧一番", - effect: "在2~3回合內,亂打一氣\n地攻擊對手。大鬧一番後自\n己會陷入混亂", - }, - doubleEdge: { - name: "捨身衝撞", - effect: "拼命地猛撞向對手進行攻擊。\n自己也會受到不小的傷害", - }, - tailWhip: { - name: "搖尾巴", - effect: "可愛地左右搖晃尾巴,誘使\n對手疏忽大意。會降低對手\n的防禦", - }, - poisonSting: { - name: "毒針", - effect: "將有毒的針刺入對手進行攻\n擊。有時會讓對手陷入中毒\n狀態", - }, - twineedle: { - name: "雙針", - effect: "將2根針刺入對手,連續2\n次給予傷害。有時會讓對手\n陷入中毒狀態", - }, - pinMissile: { - name: "飛彈針", - effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", - }, - leer: { - name: "瞪眼", - effect: "用犀利的眼神使其害怕,從\n而降低對手的防禦", - }, - bite: { - name: "咬住", - effect: "用尖銳的牙咬住對手進行攻\n擊。有時會使對手畏縮", - }, - growl: { - name: "叫聲", - effect: "讓對手聽可愛的叫聲,引開\n注意力使其疏忽,從而降低\n對手的攻擊", - }, - roar: { - name: "吼叫", - effect: "放走對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - sing: { - name: "唱歌", - effect: "讓對手聽舒適、美妙的歌聲,\n從而陷入睡眠狀態", - }, - supersonic: { - name: "超音波", - effect: "從身體發出特殊的音波,從\n而使對手混亂", - }, - sonicBoom: { - name: "音爆", - effect: "將衝擊波撞向對手進行攻擊。\n必定會給予20的傷害", - }, - disable: { - name: "定身法", - effect: "阻礙對手行動,之前使出的\n招式將在4回合內無法使用", - }, - acid: { - name: "溶解液", - effect: "將強酸潑向對手進行攻擊。\n有時會降低對手的特防", - }, - ember: { - name: "火花", - effect: "向對手發射小型火焰進行攻\n擊。有時會讓對手陷入灼傷\n狀態", - }, - flamethrower: { - name: "噴射火焰", - effect: "向對手發射烈焰進行攻擊。\n有時會讓對手陷入灼傷狀態", - }, - mist: { - name: "白霧", - effect: "用白霧覆蓋身體。在5回合\n內不會讓對手降低自己的能\n力", - }, - waterGun: { name: "水槍", effect: "向對手猛烈地噴射水流進行\n攻擊" }, - hydroPump: { name: "水炮", effect: "向對手猛烈地噴射大量水流\n進行攻擊" }, - surf: { name: "衝浪", effect: "利用大浪攻擊自己周圍所有\n的寶可夢" }, - iceBeam: { - name: "冰凍光束", - effect: "向對手發射冰凍光束進行攻\n擊。有時會讓對手陷入冰凍\n狀態", - }, - blizzard: { - name: "暴風雪", - effect: "將猛烈的暴風雪刮向對手進\n行攻擊。有時會讓對手陷入\n冰凍狀態", - }, - psybeam: { - name: "幻象光線", - effect: "向對手發射神奇的光線進行\n攻擊。有時會使對手混亂", - }, - bubbleBeam: { - name: "泡沫光線", - effect: "向對手猛烈地噴射泡沫進行\n攻擊。有時會降低對手的速\n度", - }, - auroraBeam: { - name: "極光束", - effect: "向對手發射虹色光束進行攻\n擊。有時會降低對手的攻擊", - }, - hyperBeam: { - name: "破壞光線", - effect: "向對手發射強烈的光線進行\n攻擊。下一回合自己將無法\n動彈", - }, - peck: { name: "啄", effect: "用尖銳的喙或角刺向對手進\n行攻擊" }, - drillPeck: { - name: "啄鑽", - effect: "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊", - }, - submission: { - name: "深淵翻滾", - effect: "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害", - }, - lowKick: { - name: "踢倒", - effect: "用力踢對手的腳,使其摔倒\n進行攻擊。對手越重,威力\n越大", - }, - counter: { - name: "雙倍奉還", - effect: "從對手那裏受到物理攻擊的\n傷害將以2倍返還給同一個\n對手", - }, - seismicToss: { - name: "地球上投", - effect: "利用引力將對手甩飛出去。\n給予對手和自己等級相同的\n傷害", - }, - strength: { name: "怪力", effect: "使出渾身力氣毆打對手進行\n攻擊" }, - absorb: { - name: "吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - megaDrain: { - name: "超級吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - leechSeed: { - name: "寄生種子", - effect: "植入寄生種子後,將在每回\n合一點一點吸取對手的HP,\n從而用來回復自己的HP", - }, - growth: { name: "生長", effect: "讓身體一下子長大,從而提\n高攻擊和特攻" }, - razorLeaf: { - name: "飛葉快刀", - effect: "飛出葉片,切斬對手進行攻\n擊。容易擊中要害", - }, - solarBeam: { - name: "日光束", - effect: "第1回合收集滿滿的日光,\n第2回合發射光束進行攻擊", - }, - poisonPowder: { - name: "毒粉", - effect: "撒出毒粉,從而讓對手陷入\n中毒狀態", - }, - stunSpore: { - name: "麻痹粉", - effect: "撒出麻痹粉,從而讓對手陷\n入麻痹狀態", - }, - sleepPowder: { - name: "催眠粉", - effect: "撒出催眠粉,從而讓對手陷\n入睡眠狀態", - }, - petalDance: { - name: "花瓣舞", - effect: "在2~3回合內,散落花瓣\n攻擊對手。之後自己會陷入\n混亂", - }, - stringShot: { - name: "吐絲", - effect: "用口中吐出的絲纏繞對手,\n從而大幅降低對手的速度", - }, - dragonRage: { - name: "龍之怒", - effect: "將憤怒的衝擊波撞向對手進\n行攻擊。必定會給予40的\n傷害", - }, - fireSpin: { - name: "火焰旋渦", - effect: "將對手困在激烈的火焰旋渦\n中,在4~5回合內進行攻\n擊", - }, - thunderShock: { - name: "電擊", - effect: "發出電流刺激對手進行攻擊。\n有時會讓對手陷入麻痹狀\n態", - }, - thunderbolt: { - name: "十萬伏特", - effect: "向對手發出強力電擊進行攻\n擊。有時會讓對手陷入麻痹\n狀態", - }, - thunderWave: { - name: "電磁波", - effect: "向對手發出微弱的電擊,從\n而讓對手陷入麻痹狀態", - }, - thunder: { - name: "打雷", - effect: "向對手劈下暴雷進行攻擊。\n有時會讓對手陷入麻痹狀態", - }, - rockThrow: { name: "落石", effect: "拿起小岩石,投擲對手進行\n攻擊" }, - earthquake: { - name: "地震", - effect: "利用地震的衝擊,攻擊自己\n周圍所有的寶可夢", - }, - fissure: { - name: "地裂", - effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊昏厥", - }, - dig: { name: "挖洞", effect: "第1回合鑽入地底,第2回\n合攻擊對手" }, - toxic: { - name: "劇毒", - effect: "讓對手陷入劇毒狀態。隨着\n回合的推進,中毒傷害會增\n加", - }, - confusion: { - name: "念力", - effect: "向對手發送微弱的念力進行\n攻擊。有時會使對手混亂", - }, - psychic: { - name: "精神強念", - effect: "向對手發送強大的念力進行\n攻擊。有時會降低對手的特\n防", - }, - hypnosis: { - name: "催眠術", - effect: "施以誘導睡意的暗示,讓對\n手陷入睡眠狀態", - }, - meditate: { - name: "瑜伽姿勢", - effect: "喚醒身體深處沉睡的力量,\n從而提高自己的攻擊", - }, - agility: { - name: "高速移動", - effect: "讓身體放鬆變得輕盈,以便\n高速移動。大幅提高自己的\n速度", - }, - quickAttack: { - name: "電光一閃", - effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", - }, - rage: { - name: "憤怒", - effect: "如果在使出招式後受到攻擊\n的話,會因憤怒的力量而提\n高攻擊", - }, - teleport: { - name: "瞬間移動", - effect: "當有後備寶可夢時使用,就\n可以進行替換。野生的寶可\n夢使用則會逃走", - }, - nightShade: { - name: "黑夜魔影", - effect: "顯示恐怖幻影,只給予對手\n和自己等級相同的傷害", - }, - mimic: { - name: "模仿", - effect: "可以將對手最後使用的招式,\n在戰鬥內變成自己的招式", - }, - screech: { - name: "刺耳聲", - effect: "發出不由自主想要捂起耳朵\n的刺耳聲,從而大幅降低對\n手的防禦", - }, - doubleTeam: { - name: "影子分身", - effect: "通過快速移動來製造分身,\n擾亂對手,從而提高閃避率", - }, - recover: { - name: "自我再生", - effect: "讓細胞再生,從而回復自己\n最大HP的一半", - }, - harden: { - name: "變硬", - effect: "全身使勁,讓身體變硬,從\n而提高自己的防禦", - }, - minimize: { - name: "變小", - effect: "蜷縮身體顯得很小,從而大\n幅提高自己的閃避率", - }, - smokescreen: { - name: "煙幕", - effect: "向對手噴出煙或墨汁等,從\n而降低對手的命中率", - }, - confuseRay: { - name: "奇異之光", - effect: "顯示奇怪的光,擾亂對手。\n使對手混亂", - }, - withdraw: { - name: "縮入殼中", - effect: "縮入殼裏保護身體,從而提\n高自己的防禦", - }, - defenseCurl: { - name: "變圓", - effect: "將身體蜷曲變圓,從而提高\n自己的防禦", - }, - barrier: { - name: "屏障", - effect: "製造堅固的壁障,從而大幅\n提高自己的防禦", - }, - lightScreen: { - name: "光牆", - effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的特\n殊攻擊的傷害", - }, - haze: { - name: "黑霧", - effect: "升起黑霧,將正在場上戰鬥\n的全體寶可夢的能力變回原\n點", - }, - reflect: { - name: "反射壁", - effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的物\n理攻擊的傷害", - }, - focusEnergy: { - name: "聚氣", - effect: "深深地吸口氣,集中精神。\n自己的攻擊會變得容易擊中\n要害", - }, - bide: { - name: "忍耐", - effect: "在2回合內忍受攻擊,受到\n的傷害會2倍返還給對手", - }, - metronome: { - name: "揮指", - effect: "揮動手指刺激自己的大腦,\n從許多的招式中隨機使出1\n個", - }, - mirrorMove: { - name: "鸚鵡學舌", - effect: "模仿對手使用的招式,自己\n也使用相同招式", - }, - selfDestruct: { - name: "玉石俱碎", - effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入昏\n厥", - }, - eggBomb: { name: "炸蛋", effect: "向對手用力投擲大大的蛋進\n行攻擊" }, - lick: { - name: "舌舔", - effect: "用長長的舌頭,舔遍對手進\n行攻擊。有時會讓對手陷入\n麻痹狀態", - }, - smog: { - name: "濁霧", - effect: "將骯髒的濃霧吹向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", - }, - sludge: { - name: "污泥攻擊", - effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", - }, - boneClub: { - name: "骨棒", - effect: "用手中的骨頭毆打對手進行\n攻擊。有時會使對手畏縮", - }, - fireBlast: { - name: "大字爆炎", - effect: "用大字形狀的火焰燒盡對手。\n有時會讓對手陷入灼傷狀\n態", - }, - waterfall: { - name: "攀瀑", - effect: "以驚人的氣勢撲向對手。有\n時會使對手畏縮", - }, - clamp: { - name: "貝殼夾擊", - effect: "用非常堅固且厚實的貝殼,\n在4~5回合內夾住對手進\n行攻擊", - }, - swift: { - name: "高速星星", - effect: "發射星形的光攻擊對手。攻\n擊必定會命中", - }, - skullBash: { - name: "火箭頭錘", - effect: "第1回合把頭縮進去,從而\n提高防禦。第2回合攻擊對\n手", - }, - spikeCannon: { - name: "尖刺加農炮", - effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", - }, - constrict: { - name: "纏繞", - effect: "用觸手或青藤等纏繞進行攻\n擊。有時會降低對手的速度", - }, - amnesia: { - name: "瞬間失憶", - effect: "將頭腦清空,瞬間忘記某事,\n從而大幅提高自己的特防", - }, - kinesis: { - name: "折彎湯匙", - effect: "折彎湯匙引開注意,從而降\n低對手的命中率", - }, - softBoiled: { name: "生蛋", effect: "回覆自己最大HP的一半" }, - highJumpKick: { - name: "飛膝踢", - effect: "跳起後用膝蓋撞對手進行攻\n擊。如果撞偏則自己會受到\n傷害", - }, - glare: { - name: "大蛇瞪眼", - effect: "用腹部的花紋使對手害怕,\n從而讓其陷入麻痹狀態", - }, - dreamEater: { - name: "食夢", - effect: "喫掉正在睡覺的對手的夢進\n行攻擊。回覆對手所受到傷\n害的一半HP", - }, - poisonGas: { - name: "毒瓦斯", - effect: "將毒瓦斯吹到對手的臉上,\n從而讓對手陷入中毒狀態", - }, - barrage: { - name: "投球", - effect: "向對手投擲圓形物體進行攻\n擊。連續攻擊2~5次", - }, - leechLife: { - name: "吸血", - effect: "吸取血液攻擊對手。可以回\n復給予對手傷害的一半HP", - }, - lovelyKiss: { - name: "惡魔之吻", - effect: "用恐怖的臉強吻對手。讓對\n手陷入睡眠狀態", - }, - skyAttack: { - name: "神鳥猛擊", - effect: "第2回合攻擊對手。偶爾使\n對手畏縮。也容易擊中要害", - }, - transform: { - name: "變身", - effect: "變身成對手寶可夢的樣子,\n能夠使用和對手完全相同的\n招式", - }, - bubble: { - name: "泡沫", - effect: "向對手用力吹起無數泡泡進\n行攻擊。有時會降低對手的\n速度", - }, - dizzyPunch: { - name: "迷昏拳", - effect: "有節奏地出拳攻擊對手。有\n時會使對手混亂", - }, - spore: { - name: "蘑菇孢子", - effect: "沙沙沙地撒滿具有催眠效果\n的孢子,從而讓對手陷入睡\n眠狀態", - }, - flash: { - name: "閃光", - effect: "使出光芒,從而降低對手的\n命中率。也可在陰暗的洞窟\n裏照亮四周", - }, - psywave: { - name: "精神波", - effect: "向對手發射神奇的念波進行\n攻擊。每次使用,傷害都會\n改變", - }, - splash: { - name: "躍起", - effect: "也不攻擊只是一蹦一蹦地跳,\n什麼都不會發生…", - }, - acidArmor: { - name: "溶化", - effect: "通過細胞的變化進行液化,\n從而大幅提高自己的防禦", - }, - crabhammer: { - name: "蟹鉗錘", - effect: "用大鉗子敲打對手進行攻擊。\n容易擊中要害", - }, - explosion: { - name: "大爆炸", - effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入昏厥", - }, - furySwipes: { - name: "亂抓", - effect: "用爪子或鐮刀等抓對手進行\n攻擊。連續攻擊2~5次", - }, - bonemerang: { - name: "骨頭回力鏢", - effect: "用手中的骨頭投擲對手,來\n回連續2次給予傷害", - }, - rest: { - name: "睡覺", - effect: "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態", - }, - rockSlide: { - name: "巖崩", - effect: "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮", - }, - hyperFang: { - name: "終結門牙", - effect: "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮", - }, - sharpen: { - name: "棱角化", - effect: "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊", - }, - conversion: { - name: "紋理", - effect: "將自己的屬性轉換成和已學\n會的招式中第一個招式相同\n的屬性", - }, - triAttack: { - name: "三重攻擊", - effect: "用3種光線進行攻擊。有時\n會讓對手陷入麻痹、灼傷或\n冰凍的狀態", - }, - superFang: { - name: "憤怒門牙", - effect: "用鋒利的門牙猛烈地咬住對\n手進行攻擊。對手的HP減\n半", - }, - slash: { - name: "劈開", - effect: "用爪子或鐮刀等劈開對手進\n行攻擊。容易擊中要害", - }, - substitute: { - name: "替身", - effect: "削減少許自己的HP,製造\n分身。分身將成爲自己的替\n身", - }, - struggle: { - name: "掙扎", - effect: "當自己的PP耗盡時,努力\n掙扎攻擊對手。自己也會受\n到少許傷害", - }, - sketch: { - name: "寫生", - effect: "將對手使用的招式變成自己\n的招式。使用1次後寫生消\n失", - }, - tripleKick: { - name: "三連踢", - effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", - }, - thief: { - name: "小偷", - effect: "攻擊的同時盜取道具。當自\n己攜帶道具時,不會去盜取", - }, - spiderWeb: { - name: "蛛網", - effect: "將黏糊糊的細絲一層一層纏\n住對手,使其不能從戰鬥中\n逃走", - }, - mindReader: { - name: "心之眼", - effect: "用心感受對手的行動,下次\n攻擊必定會擊中對手", - }, - nightmare: { - name: "惡夢", - effect: "讓在睡眠狀態下的對手做惡\n夢,每回合會緩緩減少HP", - }, - flameWheel: { - name: "火焰輪", - effect: "讓火焰覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入灼傷狀態", - }, - snore: { - name: "打鼾", - effect: "在自己睡覺時,發出噪音進\n行攻擊。有時會使對手畏縮", - }, - curse: { - name: "詛咒", - effect: "使用該招式的寶可夢,其屬\n性是幽靈屬性或其他屬性時,\n效果會不一樣", - }, - flail: { - name: "抓狂", - effect: "抓狂般亂打進行攻擊。自己\n的HP越少,招式的威力越\n大", - }, - conversion2: { - name: "紋理2", - effect: "爲了可以抵抗對手最後使用\n的招式,從而使自己的屬性\n發生變化", - }, - aeroblast: { - name: "氣旋攻擊", - effect: "發射空氣旋渦進行攻擊。容\n易擊中要害", - }, - cottonSpore: { - name: "棉孢子", - effect: "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度", - }, - reversal: { - name: "絕處逢生", - effect: "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大", - }, - spite: { - name: "怨恨", - effect: "對對手最後使用的招式懷有\n怨恨,減少4PP該招式", - }, - powderSnow: { - name: "細雪", - effect: "將冰冷的細雪吹向對手進行\n攻擊。有時會讓對手陷入冰\n凍狀態", - }, - protect: { - name: "守住", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - machPunch: { - name: "音速拳", - effect: "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊", - }, - scaryFace: { - name: "可怕面孔", - effect: "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度", - }, - feintAttack: { - name: "出奇一擊", - effect: "悄悄地靠近對手,趁其不備\n進行毆打。攻擊必定會命中", - }, - sweetKiss: { - name: "天使之吻", - effect: "像天使般可愛地親吻對手,\n從而使對手混亂", - }, - bellyDrum: { - name: "腹鼓", - effect: "將自己的HP減少到最大\nHP的一半,從而最大限度提\n高自己的攻擊", - }, - sludgeBomb: { - name: "污泥炸彈", - effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", - }, - mudSlap: { - name: "擲泥", - effect: "向對手的臉等投擲泥塊進行\n攻擊。會降低對手的命中率", - }, - octazooka: { - name: "章魚桶炮", - effect: "向對手的臉等噴出墨汁進行\n攻擊。有時會降低對手的命\n中率", - }, - spikes: { - name: "撒菱", - effect: "在對手的腳下扔撒菱。對替\n換出場的對手的寶可夢給予\n傷害", - }, - zapCannon: { - name: "電磁炮", - effect: "發射大炮一樣的電流進行攻\n擊。讓對手陷入麻痹狀態", - }, - foresight: { - name: "識破", - effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", - }, - destinyBond: { - name: "同命", - effect: "使出招式後,當受到對手攻\n擊陷入昏厥時,對手也會一\n同昏厥。連續使出則會失敗", - }, - perishSong: { - name: "終焉之歌", - effect: "傾聽歌聲的寶可夢經過3回\n合陷入昏厥。替換後效果消\n失", - }, - icyWind: { - name: "冰凍之風", - effect: "將結冰的冷氣吹向對手進行\n攻擊。會降低對手的速度", - }, - detect: { - name: "看穿", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - boneRush: { - name: "骨棒亂打", - effect: "用堅硬的骨頭毆打對手進行\n攻擊。連續攻擊2~5次", - }, - lockOn: { name: "鎖定", effect: "緊緊瞄準對手,下次攻擊必\n定會打中" }, - outrage: { - name: "逆鱗", - effect: "在2~3回合內,亂打一氣\n地進行攻擊。大鬧一番後自\n己會陷入混亂", - }, - sandstorm: { - name: "沙暴", - effect: "在5回合內揚起沙暴,除巖\n石、地面和鋼屬性以外的寶\n可夢,都會受到傷害。岩石\n屬性的特防還會提高", - }, - gigaDrain: { - name: "終極吸取", - effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", - }, - endure: { - name: "挺住", - effect: "即使受到攻擊,也至少會留\n下1HP。連續使出則容易\n失敗", - }, - charm: { - name: "撒嬌", - effect: "可愛地凝視,誘使對手疏忽\n大意,從而大幅降低對手的\n攻擊", - }, - rollout: { - name: "滾動", - effect: "在5回合內連續滾動攻擊對\n手。招式每次擊中,威力就\n會提高", - }, - falseSwipe: { - name: "點到爲止", - effect: "對手的HP至少會留下1\nHP,如此般手下留情地攻擊", - }, - swagger: { - name: "虛張聲勢", - effect: "激怒對手,使其混亂。因爲\n憤怒,對手的攻擊會大幅提\n高", - }, - milkDrink: { name: "喝牛奶", effect: "回覆自己最大HP的一半" }, - spark: { - name: "電光", - effect: "讓電流覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", - }, - furyCutter: { - name: "連斬", - effect: "用鐮刀或爪子等切斬對手進\n行攻擊。連續擊中,威力就\n會提高", - }, - steelWing: { - name: "鋼翼", - effect: "用堅硬的翅膀敲打對手進行\n攻擊。有時會提高自己的防\n御", - }, - meanLook: { - name: "黑色目光", - effect: "用好似要勾人心魂的黑色目\n光一動不動地凝視對手,使\n其不能從戰鬥中逃走", - }, - attract: { - name: "迷人", - effect: "♂誘惑♀或♀誘惑♂,讓對\n手着迷。對手將很難使出招\n式", - }, - sleepTalk: { - name: "夢話", - effect: "從自己已學會的招式中任意\n使出1個。只能在自己睡覺\n時使用", - }, - healBell: { - name: "治癒鈴聲", - effect: "讓同伴聽舒適的鈴音,從而\n治癒我方全員的異常狀態", - }, - return: { - name: "報恩", - effect: "爲了訓練家而全力攻擊對手。\n親密度越高,威力越大", - }, - present: { - name: "禮物", - effect: "遞給對手設有圈套的盒子進\n行攻擊。也有可能回覆對手\nHP", - }, - frustration: { - name: "遷怒", - effect: "爲了發泄不滿而全力攻擊對\n手。親密度越低,威力越大", - }, - safeguard: { - name: "神祕守護", - effect: "在5回合內被神奇的力量守\n護,從而不會陷入異常狀態", - }, - painSplit: { - name: "分擔痛楚", - effect: "將自己的HP和對手的HP\n相加,然後自己和對手友好\n地平分", - }, - sacredFire: { - name: "神聖之火", - effect: "用神祕的火焰燒盡對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - magnitude: { - name: "震級", - effect: "晃動地面,攻擊自己周圍所\n有的寶可夢。招式的威力會\n有各種變化", - }, - dynamicPunch: { - name: "爆裂拳", - effect: "使出渾身力氣出拳進行攻擊。\n必定會使對手混亂", - }, - megahorn: { - name: "超級角擊", - effect: "用堅硬且華麗的角狠狠地刺\n入對手進行攻擊", - }, - dragonBreath: { - name: "龍息", - effect: "將強烈的氣息吹向對手進行\n攻擊。有時會讓對手陷入麻\n痹狀態", - }, - batonPass: { - name: "接棒", - effect: "和後備寶可夢進行替換。換\n上的寶可夢能直接繼承其能\n力的變化", - }, - encore: { - name: "再來一次", - effect: "讓對手接受再來一次,連續\n3次使出最後使用的招式", - }, - pursuit: { - name: "追打", - effect: "當對手替換寶可夢上場時使\n出此招式的話,能夠以2倍\n的威力進行攻擊", - }, - rapidSpin: { - name: "高速旋轉", - effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能提高自己的速\n度", - }, - sweetScent: { name: "甜甜香氣", effect: "用香氣大幅降低對手的閃避\n率" }, - ironTail: { - name: "鐵尾", - effect: "使用堅硬的尾巴摔打對手進\n行攻擊。有時會降低對手的\n防禦", - }, - metalClaw: { - name: "金屬爪", - effect: "用鋼鐵之爪劈開對手進行攻\n擊。有時會提高自己的攻擊", - }, - vitalThrow: { - name: "借力摔", - effect: "會在對手之後進行攻擊。但\n是自己的攻擊必定會命中", - }, - morningSun: { - name: "晨光", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - synthesis: { - name: "光合作用", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - moonlight: { - name: "月光", - effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", - }, - hiddenPower: { - name: "覺醒力量", - effect: "招式的屬性會隨着使用此招\n式的寶可夢而改變", - }, - crossChop: { - name: "十字劈", - effect: "用兩手呈十字劈打對手進行\n攻擊。容易擊中要害", - }, - twister: { - name: "龍捲風", - effect: "興起龍捲風,將對手卷入進\n行攻擊。有時會使對手畏縮", - }, - rainDance: { - name: "求雨", - effect: "在5回合內一直降雨,從而\n提高水屬性的招式威力。火\n屬性的招式威力則降低", - }, - sunnyDay: { - name: "大晴天", - effect: "在5回合內讓日照變得強烈,\n從而提高火屬性的招式威\n力。水屬性的招式威力則降\n低", - }, - crunch: { - name: "咬碎", - effect: "用利牙咬碎對手進行攻擊。\n有時會降低對手的防禦", - }, - mirrorCoat: { - name: "鏡面反射", - effect: "從對手那裏受到特殊攻擊的\n傷害將以2倍返還給同一個\n對手", - }, - psychUp: { - name: "自我暗示", - effect: "向自己施以自我暗示,將能\n力變化的狀態變得和對手一\n樣", - }, - extremeSpeed: { - name: "神速", - effect: "以迅雷不及掩耳之勢猛撞向\n對手進行攻擊。必定能夠先\n制攻擊", - }, - ancientPower: { - name: "原始之力", - effect: "用原始之力進行攻擊。有時\n會提高自己所有的能力", - }, - shadowBall: { - name: "暗影球", - effect: "投擲一團黑影進行攻擊。有\n時會降低對手的特防", - }, - futureSight: { - name: "預知未來", - effect: "在使用招式2回合後,向對\n手發送一團念力進行攻擊", - }, - rockSmash: { - name: "碎巖", - effect: "用拳頭進行攻擊。有時會降\n低對手的防禦", - }, - whirlpool: { - name: "潮旋", - effect: "將對手困在激烈的水流旋渦\n中,在4~5回合內進行攻\n擊", - }, - beatUp: { - name: "圍攻", - effect: "我方全員進行攻擊。同行的\n寶可夢越多,招式的攻擊次\n數越多", - }, - fakeOut: { - name: "擊掌奇襲", - effect: "進行先制攻擊,使對手畏縮。\n要在出場後立刻使出才能\n成功", - }, - uproar: { - name: "吵鬧", - effect: "在3回合內大吵大鬧攻擊對\n手。在此期間誰都不能入眠", - }, - stockpile: { - name: "蓄力", - effect: "積蓄力量,提高自己的防禦\n和特防。最多積蓄3次", - }, - spitUp: { - name: "噴出", - effect: "將積蓄的力量撞向對手進行\n攻擊。積蓄得越多,威力越\n大", - }, - swallow: { - name: "吞下", - effect: "將積蓄的力量吞下,從而回\n復自己的HP。積蓄得越多,\n回覆越大", - }, - heatWave: { - name: "熱風", - effect: "將炎熱的氣息吹向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - hail: { - name: "冰雹", - effect: "在5回合內一直降冰雹,除\n冰屬性的寶可夢以外,給予\n全體寶可夢傷害", - }, - torment: { - name: "無理取鬧", - effect: "向對手無理取鬧,令其不能\n連續2次使出相同招式", - }, - flatter: { - name: "吹捧", - effect: "吹捧對手,使其混亂。同時\n還會提高對手的特攻", - }, - willOWisp: { - name: "磷火", - effect: "放出怪異的火焰,從而讓對\n手陷入灼傷狀態", - }, - memento: { - name: "臨別禮物", - effect: "雖然會使自己陷入昏厥,但\n是能夠大幅降低對手的攻擊\n和特攻", - }, - facade: { - name: "硬撐", - effect: "當自己處於中毒、麻痹、灼\n傷狀態時,向對手使出此招\n式的話,威力會變成2倍", - }, - focusPunch: { - name: "真氣拳", - effect: "集中精神出拳。在招式使出\n前若受到攻擊則會失敗", - }, - smellingSalts: { - name: "清醒", - effect: "對於麻痹狀態下的對手,威\n力會變成2倍。但相反對手\n的麻痹也會被治癒", - }, - followMe: { - name: "看我嘛", - effect: "引起對手的注意,將對手的\n攻擊全部轉移到自己身上", - }, - naturePower: { - name: "自然之力", - effect: "用自然之力進行攻擊。根據\n所使用場所的不同,使出的\n招式也會有所變化", - }, - charge: { - name: "充電", - effect: "變爲充電狀態,提高下次使\n出的電屬性的招式威力。自\n己的特防也會提高", - }, - taunt: { - name: "挑釁", - effect: "使對手憤怒。在3回合內讓\n對手只能使出給予傷害的招\n式", - }, - helpingHand: { - name: "幫助", - effect: "幫助夥伴。被幫助的寶可夢,\n其招式威力變得比平時大", - }, - trick: { name: "戲法", effect: "抓住對手的空隙,交換自己\n和對手的持有物" }, - rolePlay: { - name: "扮演", - effect: "扮演對手,讓自己的特性變\n得和對手相同", - }, - wish: { - name: "祈願", - effect: "在下一回合回覆自己或是替\n換出場的寶可夢最大HP的\n一半", - }, - assist: { - name: "藉助", - effect: "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個", - }, - ingrain: { - name: "紮根", - effect: "在大地上紮根,每回合回覆\n自己的HP。因爲紮根了,\n所以不能替換寶可夢", - }, - superpower: { - name: "蠻力", - effect: "發揮驚人的力量攻擊對手。\n自己的攻擊和防禦會降低", - }, - magicCoat: { - name: "魔法反射", - effect: "當對手使出會變成異常狀態\n的招式或寄生種子等時,會\n將對手的招式反射回去", - }, - recycle: { - name: "回收利用", - effect: "使戰鬥中已經消耗掉的自己\n的持有物再生,並可以再次\n使用", - }, - revenge: { - name: "報復", - effect: "如果受到對手的招式攻擊,\n就能給予對手2倍的傷害", - }, - brickBreak: { - name: "劈瓦", - effect: "將手刀猛烈地揮下攻擊對手。\n還可以破壞光牆和反射壁\n等", - }, - yawn: { - name: "哈欠", - effect: "打個大哈欠引起睡意。在下\n一回合讓對手陷入睡眠狀態", - }, - knockOff: { - name: "拍落", - effect: "拍落對手的持有物,直到戰\n鬥結束都不能使用。對手攜\n帶道具時會增加傷害", - }, - endeavor: { - name: "蠻幹", - effect: "給予傷害,使對手的HP變\n得和自己的HP一樣", - }, - eruption: { - name: "噴火", - effect: "爆發怒火攻擊對手。自己的\nHP越少,招式的威力越小", - }, - skillSwap: { name: "特性互換", effect: "利用超能力互換自己和對手\n的特性" }, - imprison: { - name: "封印", - effect: "如果對手有和自己相同的招\n式,那麼只有對手無法使用\n該招式", - }, - refresh: { - name: "煥然一新", - effect: "讓身體休息,治癒自己身上\n所中的毒、麻痹、灼傷的異\n常狀態", - }, - grudge: { - name: "怨念", - effect: "因對手的招式而陷入昏厥時\n給對手施加怨念,讓該招式\n的PP變成0", - }, - snatch: { - name: "搶奪", - effect: "將對手打算使用的回覆招式\n或能力變化招式奪爲己用", - }, - secretPower: { - name: "祕密之力", - effect: "根據使用場所不同,該招式\n的追加效果也會有所變化", - }, - dive: { - name: "潛水", - effect: "第1回合潛入水中,第2回\n合浮上來進行攻擊", - }, - armThrust: { - name: "猛推", - effect: "用張開着的雙手猛推對手進\n行攻擊。連續攻擊2~5次", - }, - camouflage: { - name: "保護色", - effect: "根據所在場所不同,如水邊\n、草叢和洞窟等,可以改變\n自己的屬性", - }, - tailGlow: { - name: "螢火", - effect: "凝視閃爍的光芒,集中自己\n的精神,從而巨幅提高特攻", - }, - lusterPurge: { - name: "潔淨光芒", - effect: "釋放耀眼的光芒進行攻擊。\n有時會降低對手的特防", - }, - mistBall: { - name: "薄霧球", - effect: "用圍繞着霧狀羽毛的球進行\n攻擊。有時會降低對手的特\n攻", - }, - featherDance: { - name: "羽毛舞", - effect: "撒出羽毛,籠罩在對手的周\n圍。大幅降低對手的攻擊", - }, - teeterDance: { - name: "搖晃舞", - effect: "搖搖晃晃地跳起舞蹈,讓自\n己周圍的寶可夢陷入混亂狀\n態", - }, - blazeKick: { - name: "火焰踢", - effect: "攻擊對手後,有時會使其陷\n入灼傷狀態。也容易擊中要\n害", - }, - mudSport: { - name: "玩泥巴", - effect: "一旦使用此招式,周圍就會\n弄得到處是泥。在5回合內\n減弱電屬性的招式", - }, - iceBall: { - name: "冰球", - effect: "在5回合內攻擊對手。招式\n每次擊中,威力就會提高", - }, - needleArm: { - name: "尖刺臂", - effect: "用帶刺的手臂猛烈地揮舞進\n行攻擊。有時會使對手畏縮", - }, - slackOff: { name: "偷懶", effect: "偷懶休息。回覆自己最大\nHP的一半" }, - hyperVoice: { - name: "巨聲", - effect: "給予對手又吵又響的巨大震\n動進行攻擊", - }, - poisonFang: { - name: "劇毒牙", - effect: "用有毒的牙齒咬住對手進行\n攻擊。有時會使對手中劇毒", - }, - crushClaw: { - name: "撕裂爪", - effect: "用堅硬的銳爪劈開對手進行\n攻擊。有時會降低對手的防\n御", - }, - blastBurn: { - name: "爆炸烈焰", - effect: "用爆炸的火焰燒盡對手進行\n攻擊。下一回合自己將無法\n動彈", - }, - hydroCannon: { - name: "加農水炮", - effect: "向對手噴射水炮進行攻擊。\n下一回合自己將無法動彈", - }, - meteorMash: { - name: "彗星拳", - effect: "使出彗星般的拳頭攻擊對手。\n有時會提高自己的攻擊", - }, - astonish: { - name: "驚嚇", - effect: "用尖叫聲等突然驚嚇對手進\n行攻擊。有時會使對手畏縮", - }, - weatherBall: { - name: "氣象球", - effect: "根據使用時的天氣,招式屬\n性和威力會改變", - }, - aromatherapy: { - name: "芳香治療", - effect: "讓同伴聞沁人心脾的香氣,\n從而治癒我方全員的異常狀\n態", - }, - fakeTears: { - name: "假哭", - effect: "裝哭流淚。使對手不知所措,\n從而大幅降低對手的特防", - }, - airCutter: { - name: "空氣利刃", - effect: "用銳利的風切斬對手進行攻\n擊。容易擊中要害", - }, - overheat: { - name: "過熱", - effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", - }, - odorSleuth: { - name: "氣味偵測", - effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", - }, - rockTomb: { - name: "岩石封鎖", - effect: "投擲岩石進行攻擊。封住對\n手的行動,從而降低速度", - }, - silverWind: { - name: "銀色旋風", - effect: "在風中摻入鱗粉攻擊對手。\n有時會提高自己的全部能力", - }, - metalSound: { - name: "金屬音", - effect: "讓對手聽摩擦金屬般討厭的\n聲音。大幅降低對手的特防", - }, - grassWhistle: { - name: "草笛", - effect: "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態", - }, - tickle: { - name: "撓癢", - effect: "給對手撓癢,使其發笑,從\n而降低對手的攻擊和防禦", - }, - cosmicPower: { - name: "宇宙力量", - effect: "汲取宇宙中神祕的力量,從\n而提高自己的防禦和特防", - }, - waterSpout: { - name: "噴水", - effect: "掀起潮水進行攻擊。自己的\nHP越少,招式的威力越小", - }, - signalBeam: { - name: "信號光束", - effect: "發射神奇的光線進行攻擊。\n有時會使對手混亂", - }, - shadowPunch: { name: "暗影拳", effect: "使出混影之拳。攻擊必定會\n命中" }, - extrasensory: { - name: "神通力", - effect: "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮", - }, - skyUppercut: { - name: "沖天拳", - effect: "用衝向天空般高高的上勾拳\n頂起對手進行攻擊", - }, - sandTomb: { - name: "流沙深淵", - effect: "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊", - }, - sheerCold: { - name: "絕對零度", - effect: "給對手一擊昏厥。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中", - }, - muddyWater: { - name: "濁流", - effect: "向對手噴射渾濁的水進行攻\n擊。有時會降低對手的命中\n率", - }, - bulletSeed: { - name: "種子機關槍", - effect: "向對手猛烈地發射種子進行\n攻擊。連續攻擊2~5次", - }, - aerialAce: { - name: "燕返", - effect: "以敏捷的動作戲弄對手後進\n行切斬。攻擊必定會命中", - }, - icicleSpear: { - name: "冰錐", - effect: "向對手發射鋒利的冰柱進行\n攻擊。連續攻擊2~5次", - }, - ironDefense: { - name: "鐵壁", - effect: "將皮膚變得堅硬如鐵,從而\n大幅提高自己的防禦", - }, - block: { - name: "擋路", - effect: "張開雙手進行阻擋,封住對\n手的退路,使其不能逃走", - }, - howl: { - name: "長嚎", - effect: "大聲吼叫提高氣勢,從而提\n高自己和同伴的攻擊", - }, - dragonClaw: { name: "龍爪", effect: "用尖銳的巨爪劈開對手進行\n攻擊" }, - frenzyPlant: { - name: "瘋狂植物", - effect: "用大樹摔打對手進行攻擊。\n下一回合自己將無法動彈", - }, - bulkUp: { - name: "健美", - effect: "使出全身力氣繃緊肌肉,從\n而提高自己的攻擊和防禦", - }, - bounce: { - name: "彈跳", - effect: "彈跳到高高的空中,第2回\n合攻擊對手。有時會讓對手\n陷入麻痹狀態", - }, - mudShot: { - name: "泥巴射擊", - effect: "向對手投擲泥塊進行攻擊。\n同時降低對手的速度", - }, - poisonTail: { - name: "毒尾", - effect: "用尾巴拍打。有時會讓對手\n陷入中毒狀態,也容易擊中\n要害", - }, - covet: { - name: "渴望", - effect: "一邊可愛地撒嬌,一邊靠近\n對手進行攻擊,還能奪取對\n手攜帶的道具", - }, - voltTackle: { - name: "伏特攻擊", - effect: "讓電流覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入麻痹狀\n態", - }, - magicalLeaf: { - name: "魔法葉", - effect: "散落可以追蹤對手的神奇葉\n片。攻擊必定會命中", - }, - waterSport: { - name: "玩水", - effect: "用水溼透周圍。在5回合內\n減弱火屬性的招式", - }, - calmMind: { name: "冥想", effect: "靜心凝神,從而提高自己的\n特攻和特防" }, - leafBlade: { - name: "葉刃", - effect: "像用劍一般操縱葉片切斬對\n手進行攻擊。容易擊中要害", - }, - dragonDance: { - name: "龍之舞", - effect: "激烈地跳起神祕且強有力的\n舞蹈。從而提高自己的攻擊\n和速度", - }, - rockBlast: { - name: "岩石爆擊", - effect: "向對手發射堅硬的岩石進行\n攻擊。連續攻擊2~5次", - }, - shockWave: { - name: "電擊波", - effect: "向對手快速發出電擊。攻擊\n必定會命中", - }, - waterPulse: { - name: "水之波動", - effect: "用水的震動攻擊對手。有時\n會使對手混亂", - }, - doomDesire: { - name: "破滅之願", - effect: "使用招式2回合後,會用無\n數道光束攻擊對手", - }, - psychoBoost: { - name: "精神突進", - effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", - }, - roost: { - name: "羽棲", - effect: "降到地面,使身體休息。回\n復自己最大HP的一半", - }, - gravity: { - name: "重力", - effect: "在5回合內,飄浮特性和飛\n行屬性的寶可夢會被地面屬\n性的招式擊中。飛向空中的\n招式也將無法使用", - }, - miracleEye: { - name: "奇蹟之眼", - effect: "使出後對惡屬性寶可夢沒有\n效果的招式以及閃避率高的\n對手,變得能夠打中", - }, - wakeUpSlap: { - name: "喚醒巴掌", - effect: "給予睡眠狀態下的對手較大\n的傷害。但相反對手會從睡\n眠中醒過來", - }, - hammerArm: { - name: "臂錘", - effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", - }, - gyroBall: { - name: "陀螺球", - effect: "讓身體高速旋轉並撞擊對手。\n速度比對手越慢,威力越\n大", - }, - healingWish: { - name: "治癒之願", - effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP", - }, - brine: { - name: "鹽水", - effect: "當對手的HP負傷到一半左\n右時,招式威力會變成2倍", - }, - naturalGift: { - name: "自然之恩", - effect: "從樹果上獲得力量進行攻擊。\n根據攜帶的樹果,招式屬\n性和威力會改變", - }, - feint: { - name: "佯攻", - effect: "能夠攻擊正在使用守住或看\n穿等招式的對手。解除其守\n護效果", - }, - pluck: { - name: "啄食", - effect: "用喙進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", - }, - tailwind: { - name: "順風", - effect: "颳起猛烈的旋風,在4回合\n內提高我方全員的速度", - }, - acupressure: { - name: "點穴", - effect: "通過點穴讓身體舒筋活絡。\n大幅提高某1項能力", - }, - metalBurst: { - name: "金屬爆炸", - effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", - }, - uTurn: { - name: "急速折返", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - closeCombat: { - name: "近身戰", - effect: "放棄守護,向對手的懷裏突\n擊。自己的防禦和特防會降\n低", - }, - payback: { - name: "以牙還牙", - effect: "蓄力攻擊。如果能在對手之\n後攻擊,招式的威力會變成\n2倍", - }, - assurance: { - name: "惡意追擊", - effect: "如果此回合內對手已經受到\n傷害的話,招式威力會變成\n2倍", - }, - embargo: { - name: "查封", - effect: "讓對手在5回合內不能使用\n寶可夢攜帶的道具。訓練家\n也不能給那隻寶可夢使用道\n具", - }, - fling: { - name: "投擲", - effect: "快速投擲攜帶的道具進行攻\n擊。根據道具不同,威力和\n效果會改變", - }, - psychoShift: { - name: "精神轉移", - effect: "利用超能力施以暗示,從而\n將自己受到的異常狀態轉移\n給對手", - }, - trumpCard: { - name: "王牌", - effect: "王牌招式的剩餘PP越少,\n招式的威力越大", - }, - healBlock: { - name: "回覆封鎖", - effect: "在5回合內無法通過招式、\n特性或攜帶的道具來回復H\nP", - }, - wringOut: { - name: "絞緊", - effect: "用力勒緊對手進行攻擊。對\n手的HP越多,威力越大", - }, - powerTrick: { - name: "力量戲法", - effect: "利用超能力交換自己的攻擊\n和防禦的力量", - }, - gastroAcid: { - name: "胃液", - effect: "將胃液吐向對手的身體。沾\n上的胃液會消除對手的特性\n效果", - }, - luckyChant: { - name: "幸運咒語", - effect: "向天許願,從而在5回合內\n不會被對手的攻擊打中要害", - }, - meFirst: { - name: "搶先一步", - effect: "提高威力,搶先使出對手想\n要使出的招式。如果不先使\n出則會失敗", - }, - copycat: { - name: "仿效", - effect: "模仿對手剛纔使出的招式,\n並使出相同招式。如果對手\n還沒出招則會失敗", - }, - powerSwap: { - name: "力量互換", - effect: "利用超能力互換自己和對手\n的攻擊以及特攻的能力變化", - }, - guardSwap: { - name: "防守互換", - effect: "利用超能力互換自己和對手\n的防禦以及特防的能力變化", - }, - punishment: { - name: "懲罰", - effect: "根據能力變化,對手提高的\n力量越大,招式的威力越大", - }, - lastResort: { - name: "珍藏", - effect: "當戰鬥中已學會的招式全部\n使用過後,才能開始使出珍\n藏的招式", - }, - worrySeed: { - name: "煩惱種子", - effect: "種植心神不寧的種子。使對\n手不能入眠,並將特性變成\n不眠", - }, - suckerPunch: { - name: "突襲", - effect: "可以比對手先攻擊。對手使\n出的招式如果不是攻擊招式\n則會失敗", - }, - toxicSpikes: { - name: "毒菱", - effect: "在對手的腳下撒毒菱。使對\n手替換出場的寶可夢中毒", - }, - heartSwap: { - name: "心靈互換", - effect: "利用超能力互換自己和對手\n之間的能力變化", - }, - aquaRing: { - name: "水流環", - effect: "在自己身體的周圍覆蓋用水\n製造的幕。每回合回覆HP", - }, - magnetRise: { - name: "電磁飄浮", - effect: "利用電氣產生的磁力浮在空\n中。在5回合內可以飄浮", - }, - flareBlitz: { - name: "閃焰衝鋒", - effect: "讓火焰覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入灼傷狀\n態", - }, - forcePalm: { - name: "發勁", - effect: "向對手的身體發出衝擊波進\n行攻擊。有時會讓對手陷入\n麻痹狀態", - }, - auraSphere: { - name: "波導彈", - effect: "從體內產生出波導之力,然\n後向對手發出。攻擊必定會\n命中", - }, - rockPolish: { - name: "岩石打磨", - effect: "打磨自己的身體,減少空氣\n阻力。可以大幅提高自己的\n速度", - }, - poisonJab: { - name: "毒擊", - effect: "用帶毒的觸手或手臂刺入對\n手。有時會讓對手陷入中毒\n狀態", - }, - darkPulse: { - name: "惡之波動", - effect: "從體內發出充滿惡意的恐怖\n氣場。有時會使對手畏縮", - }, - nightSlash: { - name: "暗襲要害", - effect: "抓住瞬間的空隙切斬對手。\n容易擊中要害", - }, - aquaTail: { - name: "水流尾", effect: "如驚濤駭浪般揮動大尾巴攻\n擊對手" - }, - seedBomb: { - name: "種子炸彈", - effect: "將外殼堅硬的大種子,從上\n方砸下攻擊對手", - }, - airSlash: { - name: "空氣之刃", - effect: "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮", - }, - xScissor: { - name: "十字剪", - effect: "將鐮刀或爪子像剪刀般地交\n叉,順勢劈開對手", - }, - bugBuzz: { - name: "蟲鳴", - effect: "利用振動發出音波進行攻擊。\n有時會降低對手的特防", - }, - dragonPulse: { - name: "龍之波動", - effect: "從大大的口中掀起衝擊波攻\n擊對手", - }, - dragonRush: { - name: "龍之俯衝", - effect: "釋放出駭人的殺氣,一邊威\n懾一邊撞擊對手。有時會使\n對手畏縮", - }, - powerGem: { - name: "力量寶石", effect: "發射如寶石般閃耀的光芒攻\n擊對手" - }, - drainPunch: { - name: "吸取拳", - effect: "用拳頭吸取對手的力量。可\n以回覆給予對手傷害的一半\nHP", - }, - vacuumWave: { - name: "真空波", - effect: "揮動拳頭,掀起真空波。必\n定能夠先制攻擊", - }, - focusBlast: { - name: "真氣彈", - effect: "提高氣勢,釋放出全部力量。\n有時會降低對手的特防", - }, - energyBall: { - name: "能量球", - effect: "發射從自然收集的生命力量。\n有時會降低對手的特防", - }, - braveBird: { - name: "勇鳥猛攻", - effect: "收攏翅膀,通過低空飛行突\n擊對手。自己也會受到不小\n的傷害", - }, - earthPower: { - name: "大地之力", - effect: "向對手腳下釋放出大地之力。\n有時會降低對手的特防", - }, - switcheroo: { - name: "掉包", - effect: "用一閃而過的速度交換自己\n和對手的持有物", - }, - gigaImpact: { - name: "終極衝擊", - effect: "使出自己渾身力量突擊對手。\n下一回合自己將無法動彈", - }, - nastyPlot: { - name: "詭計", - effect: "謀劃詭計,激活頭腦。大幅\n提高自己的特攻", - }, - bulletPunch: { - name: "子彈拳", - effect: "向對手使出如子彈般快速而\n堅硬的拳頭。必定能夠先制\n攻擊", - }, - avalanche: { - name: "雪崩", - effect: "如果受到對手的招式攻擊,\n就能給予該對手2倍威力的\n攻擊", - }, - iceShard: { - name: "冰礫", - effect: "瞬間製作冰塊,快速地扔向\n對手。必定能夠先制攻擊", - }, - shadowClaw: { - name: "暗影爪", - effect: "以影子做成的銳爪,劈開對\n手。容易擊中要害", - }, - thunderFang: { - name: "雷電牙", - effect: "用蓄滿電流的牙齒咬住對手。\n有時會使對手畏縮或陷入\n麻痹狀態", - }, - iceFang: { - name: "冰凍牙", - effect: "用藏有冷氣的牙齒咬住對手。\n有時會使對手畏縮或陷入\n冰凍狀態", - }, - fireFang: { - name: "火焰牙", - effect: "用覆蓋着火焰的牙齒咬住對\n手。有時會使對手畏縮或陷\n入灼傷狀態", - }, - shadowSneak: { - name: "影子偷襲", - effect: "伸長影子,從對手的背後進\n行攻擊。必定能夠先制攻擊", - }, - mudBomb: { - name: "泥巴炸彈", - effect: "向對手發射堅硬的泥彈進行\n攻擊。有時會降低對手的命\n中率", - }, - psychoCut: { - name: "精神利刃", - effect: "用實體化的心之利刃劈開對\n手。容易擊中要害", - }, - zenHeadbutt: { - name: "意念頭錘", - effect: "將思念的力量集中在前額進\n行攻擊。有時會使對手畏縮", - }, - mirrorShot: { - name: "鏡光射擊", - effect: "拋光自己的身體,向對手釋\n放出閃光之力。有時會降低\n對手的命中率", - }, - flashCannon: { - name: "加農光炮", - effect: "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防", - }, - rockClimb: { - name: "攀巖", - effect: "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一", - }, - defog: { - name: "清除濃霧", - effect: "用強風吹開對手的反射壁或\n光牆等。也會降低對手的閃\n避率", - }, - trickRoom: { - name: "戲法空間", - effect: "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動", - }, - dracoMeteor: { - name: "流星羣", - effect: "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低", - }, - discharge: { - name: "放電", - effect: "用耀眼的電擊攻擊自己周圍\n所有的寶可夢。有時會陷入\n麻痹狀態", - }, - lavaPlume: { - name: "噴煙", - effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", - }, - leafStorm: { - name: "飛葉風暴", - effect: "用尖尖的葉片向對手卷起風\n暴。使用之後因爲反作用力\n自己的特攻會大幅降低", - }, - powerWhip: { - name: "強力鞭打", - effect: "激烈地揮舞青藤或觸手摔打\n對手進行攻擊", - }, - rockWrecker: { - name: "岩石炮", - effect: "向對手發射巨大的岩石進行\n攻擊。下一回合自己將無法\n動彈", - }, - crossPoison: { - name: "十字毒刃", - effect: "用毒刃劈開對手。有時會讓\n對手陷入中毒狀態,也容易\n擊中要害", - }, - gunkShot: { - name: "垃圾射擊", - effect: "用骯髒的垃圾撞向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", - }, - ironHead: { - name: "鐵頭", - effect: "用鋼鐵般堅硬的頭部進行攻\n擊。有時會使對手畏縮", - }, - magnetBomb: { - name: "磁鐵炸彈", - effect: "發射吸住對手的鋼鐵炸彈。\n攻擊必定會命中", - }, - stoneEdge: { - name: "尖石攻擊", - effect: "用尖尖的岩石刺入對手進行\n攻擊。容易擊中要害", - }, - captivate: { - name: "誘惑", - effect: "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻", - }, - stealthRock: { - name: "隱形巖", - effect: "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害", - }, - grassKnot: { - name: "打草結", - effect: "用草纏住並絆倒對手。對手\n越重,威力越大", - }, - chatter: { - name: "喋喋不休", - effect: "用非常煩人的,喋喋不休的\n音波攻擊對手。使對手混亂", - }, - judgment: { - name: "制裁光礫", - effect: "向對手放出無數的光彈。屬\n性會根據自己攜帶的石板不\n同而改變", - }, - bugBite: { - name: "蟲咬", - effect: "咬住進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", - }, - chargeBeam: { - name: "充電光束", - effect: "向對手發射電擊光束。由於\n蓄滿電流,有時會提高自己\n的特攻", - }, - woodHammer: { - name: "木槌", - effect: "用堅硬的軀體撞擊對手進行\n攻擊。自己也會受到不小的\n傷害", - }, - aquaJet: { - name: "水流噴射", - effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", - }, - attackOrder: { - name: "攻擊指令", - effect: "召喚手下,讓其朝對手發起\n攻擊。容易擊中要害", - }, - defendOrder: { - name: "防禦指令", - effect: "召喚手下,讓其附在自己的\n身體上。可以提高自己的防\n御和特防", - }, - healOrder: { - name: "回覆指令", - effect: "召喚手下療傷。回覆自己最\n大HP的一半", - }, - headSmash: { - name: "雙刃頭錘", - effect: "拼命使出渾身力氣,向對手\n進行頭錘攻擊。自己也會受\n到非常大的傷害", - }, - doubleHit: { - name: "二連擊", - effect: "使用尾巴等拍打對手進行攻\n擊。連續2次給予傷害", - }, - roarOfTime: { - name: "時光咆哮", - effect: "釋放出扭曲時間般的強大力\n量攻擊對手。下一回合自己\n將無法動彈", - }, - spacialRend: { - name: "亞空裂斬", - effect: "將對手連同周圍的空間一起\n撕裂並給予傷害。容易擊中\n要害", - }, - lunarDance: { - name: "新月舞", - effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的全\n部狀態", - }, - crushGrip: { - name: "捏碎", - effect: "用駭人的力量捏碎對手。對\n手剩餘的HP越多,威力越\n大", - }, - magmaStorm: { - name: "熔岩風暴", - effect: "將對手困在熊熊燃燒的火焰\n中,在4~5回合內進行攻\n擊", - }, - darkVoid: { - name: "暗黑洞", - effect: "將對手強制拖入黑暗的世界,\n從而讓對手陷入睡眠狀態", - }, - seedFlare: { - name: "種子閃光", - effect: "從身體裏產生衝擊波。有時\n會大幅降低對手的特防", - }, - ominousWind: { - name: "奇異之風", - effect: "突然颳起毛骨悚然的暴風攻\n擊對手。有時會提高自己的\n全部能力", - }, - shadowForce: { - name: "暗影潛襲", - effect: "第1回合消失蹤影,第2回\n合攻擊對手。即使對手正受\n保護,也能擊中", - }, - honeClaws: { - name: "磨爪", - effect: "將爪子磨得更加鋒利。提高\n自己的攻擊和命中率", - }, - wideGuard: { - name: "廣域防守", - effect: "在1回合內防住擊打我方全\n員的攻擊", - }, - guardSplit: { - name: "防守平分", - effect: "利用超能力將自己和對手的\n防禦和特防相加,再進行平\n分", - }, - powerSplit: { - name: "力量平分", - effect: "利用超能力將自己和對手的\n攻擊和特攻相加,再進行平\n分", - }, - wonderRoom: { - name: "奇妙空間", - effect: "製造出離奇的空間。在5回\n合內互換所有寶可夢的防禦\n和特防", - }, - psyshock: { - name: "精神衝擊", - effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", - }, - venoshock: { - name: "毒液衝擊", - effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,威力\n會變成2倍", - }, - autotomize: { - name: "身體輕量化", - effect: "削掉身體上沒用的部分。大\n幅提高自己的速度,同時體\n重也會變輕", - }, - ragePowder: { - name: "憤怒粉", - effect: "將令人煩躁的粉末撒在自己\n身上,用以吸引對手的注意。\n使對手的攻擊全部指向自\n己", - }, - telekinesis: { - name: "意念移物", - effect: "利用超能力使對手浮起來。\n在3回合內攻擊會變得容易\n打中對手", - }, - magicRoom: { - name: "魔法空間", - effect: "製造出離奇的空間。在5回\n合內所有寶可夢攜帶道具的\n效果都會消失", - }, - smackDown: { - name: "擊落", - effect: "扔石頭或炮彈,攻擊飛行的\n對手。對手會被擊落,掉到\n地面", - }, - stormThrow: { - name: "山嵐摔", - effect: "向對手使出強烈的一擊。攻\n擊必定會擊中要害", - }, - flameBurst: { - name: "烈焰濺射", - effect: "如果擊中,爆裂的火焰會攻\n擊到對手。爆裂出的火焰還\n會飛濺到旁邊的對手", - }, - sludgeWave: { - name: "污泥波", - effect: "用污泥波攻擊自己周圍所有\n的寶可夢。有時會陷入中毒\n狀態", - }, - quiverDance: { - name: "蝶舞", - effect: "輕巧地跳起神祕而又美麗的\n舞蹈。提高自己的特攻、特\n防和速度", - }, - heavySlam: { - name: "重磅衝撞", - effect: "用沉重的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", - }, - synchronoise: { - name: "同步干擾", - effect: "用神奇電波對周圍所有和自\n己屬性相同的寶可夢給予傷\n害", - }, - electroBall: { - name: "電球", - effect: "用電氣團撞向對手。自己比\n對手速度越快,威力越大", - }, - soak: { - name: "浸水", effect: "將大量的水潑向對手,從而\n使其變成水屬性" - }, - flameCharge: { - name: "蓄能焰襲", - effect: "讓火焰覆蓋全身,攻擊對手。\n積蓄力量來提高自己的速\n度", - }, - coil: { - name: "盤蜷", - effect: "盤蜷着集中精神。提高自己\n的攻擊、防禦和命中率", - }, - lowSweep: { - name: "下盤踢", - effect: "以敏捷的動作瞄準對手的腳\n進行攻擊。會降低對手的速\n度", - }, - acidSpray: { - name: "酸液炸彈", - effect: "噴出能溶化對手的液體進行\n攻擊。會大幅降低對手的特\n防", - }, - foulPlay: { - name: "欺詐", - effect: "利用對手的力量進行攻擊。\n正和自己戰鬥的對手,其攻\n擊越高,傷害越大", - }, - simpleBeam: { - name: "單純光束", - effect: "向對手發送謎之念波。接收\n到念波的對手,其特性會變\n爲單純", - }, - entrainment: { - name: "找夥伴", - effect: "用神奇的節奏跳舞。使對手\n模仿自己的動作,從而將特\n性變成一樣", - }, - afterYou: { - name: "您先請", - effect: "支援我方或對手的行動,使\n其緊接着此招式之後行動", - }, - round: { - name: "輪唱", - effect: "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高", - }, - echoedVoice: { - name: "回聲", - effect: "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高", - }, - chipAway: { - name: "逐步擊破", - effect: "看準機會穩步攻擊。無視對\n手的能力變化,直接給予傷\n害", - }, - clearSmog: { - name: "清除之煙", - effect: "向對手投擲特殊的泥塊進行\n攻擊。使其能力變回原點", - }, - storedPower: { - name: "輔助力量", - effect: "用蓄積起來的力量攻擊對手。\n自己的能力提高得越多,\n威力就越大", - }, - quickGuard: { - name: "快速防守", - effect: "守護自己和同伴,以防對手\n的先制攻擊", - }, - allySwitch: { - name: "交換場地", - effect: "用神奇的力量瞬間移動,互\n換自己和同伴所在的位置。\n連續使出則容易失敗", - }, - scald: { - name: "熱水", - effect: "向對手噴射煮得翻滾的開水\n進行攻擊。有時會讓對手陷\n入灼傷狀態", - }, - shellSmash: { - name: "破殼", - effect: "打破外殼,降低自己的防禦\n和特防,但大幅提高攻擊、\n特攻和速度", - }, - healPulse: { - name: "治癒波動", - effect: "放出治癒波動,從而回復對\n手最大HP的一半", - }, - hex: { - name: "禍不單行", - effect: "接二連三地進行攻擊。對處\n於異常狀態的對手給予較大\n的傷害", - }, - skyDrop: { - name: "自由落體", - effect: "第1回合將對手帶到空中,\n第2回合將其摔下進行攻擊。\n被帶到空中的對手不能動\n彈", - }, - shiftGear: { - name: "換檔", - effect: "轉動齒輪,不僅提高自己的\n攻擊,還會大幅提高速度", - }, - circleThrow: { - name: "巴投", - effect: "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - incinerate: { - name: "燒淨", - effect: "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用", - }, - quash: { - name: "延後", effect: "壓制對手,從而將其行動順\n序放到最後" - }, - acrobatics: { - name: "雜技", - effect: "輕巧地攻擊對手。自己沒有\n攜帶道具時,會給予較大的\n傷害", - }, - reflectType: { - name: "鏡面屬性", - effect: "反射對手的屬性,讓自己也\n變成一樣的屬性", - }, - retaliate: { - name: "報仇", - effect: "爲倒下的同伴報仇。如果上\n一回合有同伴倒下,威力就\n會提高", - }, - finalGambit: { - name: "搏命", - effect: "拼命攻擊對手。雖然自己陷\n入昏厥,但會給予對手和自\n己目前HP等量的傷害", - }, - bestow: { - name: "傳遞禮物", - effect: "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手", - }, - inferno: { - name: "烈火深淵", - effect: "用烈焰包裹住對手進行攻擊。\n讓對手陷入灼傷狀態", - }, - waterPledge: { - name: "水之誓約", - effect: "用水柱進行攻擊。如果和火\n組合,威力就會提高,天空\n中會掛上彩虹", - }, - firePledge: { - name: "火之誓約", - effect: "用火柱進行攻擊。如果和草\n組合,威力就會提高,周圍\n會變成火海", - }, - grassPledge: { - name: "草之誓約", - effect: "用草柱進行攻擊。如果和水\n組合,威力就會提高,周圍\n會變成溼地", - }, - voltSwitch: { - name: "伏特替換", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - struggleBug: { - name: "蟲之抵抗", - effect: "抵抗並攻擊對手。會降低對\n手的特攻", - }, - bulldoze: { - name: "重踏", - effect: "用力踩踏地面並攻擊自己周\n圍所有的寶可夢。會降低對\n方的速度", - }, - frostBreath: { - name: "冰息", - effect: "將冰冷的氣息吹向對手進行\n攻擊。必定會擊中要害", - }, - dragonTail: { - name: "龍尾", - effect: "彈飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", - }, - workUp: { - name: "自我激勵", effect: "激勵自己,從而提高攻擊和\n特攻" - }, - electroweb: { - name: "電網", - effect: "用電網捉住對手進行攻擊。\n會降低對手的速度", - }, - wildCharge: { - name: "瘋狂伏特", - effect: "讓電流覆蓋全身,撞向對手\n進行攻擊。自己也會受到少\n許傷害", - }, - drillRun: { - name: "直衝鑽", - effect: "像鋼鑽一樣,一邊旋轉身體\n一邊撞擊對手。容易擊中要\n害", - }, - dualChop: { - name: "二連劈", - effect: "用身體堅硬的部分拍打對手\n進行攻擊。連續2次給予傷\n害", - }, - heartStamp: { - name: "愛心印章", - effect: "以可愛的動作使對手疏忽,\n乘機給出強烈的一擊。有時\n會使對手畏縮", - }, - hornLeech: { - name: "木角", - effect: "將角刺入,吸取對手的養分。\n可以回覆給予對手傷害的\n一半HP", - }, - sacredSword: { - name: "聖劍", - effect: "用劍切斬對手進行攻擊。無\n視對手的能力變化,直接給\n予傷害", - }, - razorShell: { - name: "貝殼刃", - effect: "用鋒利的貝殼切斬對手進行\n攻擊。有時會降低對手的防\n御", - }, - heatCrash: { - name: "高溫重壓", - effect: "用燃燒的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", - }, - leafTornado: { - name: "青草攪拌器", - effect: "用鋒利的葉片包裹住對手進\n行攻擊。有時會降低對手的\n命中率", - }, - steamroller: { - name: "瘋狂滾壓", - effect: "旋轉揉成團的身體壓扁對手。\n有時會使對手畏縮", - }, - cottonGuard: { - name: "棉花防守", - effect: "用軟綿綿的絨毛包裹住自己\n的身體進行守護。巨幅提高\n自己的防禦", - }, - nightDaze: { - name: "暗黑爆破", - effect: "放出黑暗的衝擊波攻擊對手。\n有時會降低對手的命中率", - }, - psystrike: { - name: "精神擊破", - effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", - }, - tailSlap: { - name: "掃尾拍打", - effect: "用堅硬的尾巴拍打對手進行\n攻擊。連續攻擊2~5次", - }, - hurricane: { - name: "暴風", - effect: "用強烈的風席捲對手進行攻\n擊。有時會使對手混亂", - }, - headCharge: { - name: "爆炸頭突擊", - effect: "用厲害的爆炸頭猛撞向對手\n進行攻擊。自己也會受到少\n許傷害", - }, - gearGrind: { - name: "齒輪飛盤", - effect: "向對手投擲鋼鐵齒輪進行攻\n擊。連續2次給予傷害", - }, - searingShot: { - name: "火焰彈", - effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", - }, - technoBlast: { - name: "高科技光炮", - effect: "向對手放出光彈。屬性會根\n據自己攜帶的卡帶不同而改\n變", - }, - relicSong: { - name: "古老之歌", - effect: "讓對手聽古老之歌,打動對\n手的內心進行攻擊。有時會\n讓對手陷入睡眠狀態", - }, - secretSword: { - name: "神祕之劍", - effect: "用長角切斬對手進行攻擊。\n角上擁有的神奇力量將給予\n物理傷害", - }, - glaciate: { - name: "冰封世界", - effect: "將冰凍的冷氣吹向對手進行\n攻擊。會降低對手的速度", - }, - boltStrike: { - name: "雷擊", - effect: "讓強大的電流覆蓋全身,猛\n撞向對手進行攻擊。有時會\n讓對手陷入麻痹狀態", - }, - blueFlare: { - name: "青焰", - effect: "用美麗而激烈的青焰包裹住\n對手進行攻擊。有時會讓對\n手陷入灼傷狀態", - }, - fieryDance: { - name: "火之舞", - effect: "讓火焰覆蓋全身,振翅攻擊\n對手。有時會提高自己的特\n攻", - }, - freezeShock: { - name: "冰凍伏特", - effect: "用覆蓋着電流的冰塊,在第\n2回合撞向對手。有時會讓\n對手陷入麻痹狀態", - }, - iceBurn: { - name: "極寒冷焰", - effect: "用能夠凍結一切的強烈冷氣,\n在第2回合包裹住對手。\n有時會讓對手陷入灼傷狀態", - }, - snarl: { - name: "大聲咆哮", - effect: "沒完沒了地大聲斥責,從而\n降低對手的特攻", - }, - icicleCrash: { - name: "冰柱墜擊", - effect: "用大冰柱激烈地撞向對手進\n行攻擊。有時會使對手畏縮", - }, - vCreate: { - name: "V熱焰", - effect: "從前額產生灼熱的火焰,舍\n身撞擊對手。防禦、特防和\n速度會降低", - }, - fusionFlare: { - name: "交錯火焰", - effect: "釋放出巨大的火焰。受到巨\n大的閃電影響時,招式威力\n會提高", - }, - fusionBolt: { - name: "交錯閃電", - effect: "釋放出巨大的閃電。受到巨\n大的火焰影響時,招式威力\n會提高", - }, - flyingPress: { - name: "飛身重壓", - effect: "從空中俯衝向對手。此招式\n同時帶有格鬥屬性和飛行屬\n性", - }, - matBlock: { - name: "掀榻榻米", - effect: "將掀起來的榻榻米當作盾牌,\n防住自己和同伴免受招式\n傷害。變化招式無法防住", - }, - belch: { - name: "打嗝", - effect: "朝着對手打嗝,並給予傷害。\n如果不喫樹果則無法使出", - }, - rototiller: { - name: "耕地", - effect: "翻耕土地,使草木更容易成\n長。會提高草屬性寶可夢的\n攻擊和特攻", - }, - stickyWeb: { - name: "黏黏網", - effect: "在對手周圍圍上黏黏的網,\n降低替換出場的對手的速度", - }, - fellStinger: { - name: "致命針刺", - effect: "如果使用此招式打倒對手,\n攻擊會巨幅提高", - }, - phantomForce: { - name: "潛靈奇襲", - effect: "第1回合消失在某處,第2\n回合攻擊對手。可以無視守\n護進行攻擊", - }, - trickOrTreat: { - name: "萬聖夜", - effect: "邀請對手參加萬聖夜。使對\n手被追加幽靈屬性", - }, - nobleRoar: { - name: "戰吼", - effect: "發出戰吼威嚇對手,從而降\n低對手的攻擊和特攻", - }, - ionDeluge: { - name: "等離子浴", - effect: "將帶電粒子擴散開來,使一\n般屬性的招式變成電屬性", - }, - parabolicCharge: { - name: "拋物面充電", - effect: "給周圍全體寶可夢造成傷害。\n可以回覆給予傷害的一半\nHP", - }, - forestsCurse: { - name: "森林咒術", - effect: "向對手施加森林咒術。中了\n咒術的對手會被追加草屬性", - }, - petalBlizzard: { - name: "落英繽紛", - effect: "猛烈地颳起飛雪般的落花,\n攻擊周圍所有的寶可夢,並\n給予傷害", - }, - freezeDry: { - name: "冷凍乾燥", - effect: "急劇冷凍對手,有時會讓對\n手陷入冰凍狀態。對於水屬\n性寶可夢也是效果絕佳", - }, - disarmingVoice: { - name: "魅惑之聲", - effect: "發出魅惑的叫聲,給予對手\n精神上的傷害。攻擊必定會\n命中", - }, - partingShot: { - name: "拋下狠話", - effect: "拋下狠話威嚇對手,降低攻\n擊和特攻後,和後備寶可夢\n進行替換", - }, - topsyTurvy: { - name: "顛倒", - effect: "顛倒對手身上的所有能力變\n化,變成和原來相反的狀態", - }, - drainingKiss: { - name: "吸取之吻", - effect: "用一個吻吸取對手的HP。\n回覆給予對手傷害的一半以\n上的HP", - }, - craftyShield: { - name: "戲法防守", - effect: "使用神奇的力量防住攻擊我\n方的變化招式。但無法防住\n傷害招式的攻擊", - }, - flowerShield: { - name: "鮮花防守", - effect: "使用神奇的力量提高在場的\n所有草屬性寶可夢的防禦", - }, - grassyTerrain: { - name: "青草場地", - effect: "在5回合內變成青草場地。\n地面上的寶可夢每回合都能\n回覆。草屬性的招式威力還\n會提高", - }, - mistyTerrain: { - name: "薄霧場地", - effect: "在5回合內,地面上的寶可\n夢不會陷入異常狀態。龍屬\n性招式的傷害也會減半", - }, - electrify: { - name: "輸電", - effect: "對手使出招式前,如果輸電,\n則該回合對手的招式變成\n電屬性", - }, - playRough: { - name: "嬉鬧", - effect: "與對手嬉鬧並攻擊。有時會\n降低對手的攻擊", - }, - fairyWind: { - name: "妖精之風", effect: "颳起妖精之風,吹向對手進\n行攻擊" - }, - moonblast: { - name: "月亮之力", - effect: "借用月亮的力量攻擊對手。\n有時會降低對手的特攻", - }, - boomburst: { - name: "爆音波", - effect: "通過震耳欲聾的爆炸聲產生\n的破壞力,攻擊自己周圍所\n有的寶可夢", - }, - fairyLock: { - name: "妖精之鎖", - effect: "通過封鎖,下一回合所有的\n寶可夢都無法逃走", - }, - kingsShield: { - name: "王者盾牌", - effect: "防住對手攻擊的同時,自己\n變爲防禦姿態。能夠降低所\n接觸到的對手的攻擊", - }, - playNice: { - name: "和睦相處", - effect: "和對手和睦相處,使其失去\n戰鬥的氣力,從而降低對手\n的攻擊", - }, - confide: { - name: "密語", - effect: "和對手進行密語,使其失去\n集中力,從而降低對手的特\n攻", - }, - diamondStorm: { - name: "鑽石風暴", - effect: "掀起鑽石風暴給予傷害。有\n時會大幅提高自己的防禦", - }, - steamEruption: { - name: "蒸汽爆炸", - effect: "將滾燙的蒸汽噴向對手。有\n時會讓對手灼傷", - }, - hyperspaceHole: { - name: "異次元洞", - effect: "通過異次元洞,突然出現在\n對手的側面進行攻擊。還可\n以無視守住和看穿等招式", - }, - waterShuriken: { - name: "飛水手裏劍", - effect: "用粘液製成的手裏劍,連續\n攻擊2~5次。必定能夠先\n制攻擊", - }, - mysticalFire: { - name: "魔法火焰", - effect: "從口中噴出特別灼熱的火焰\n進行攻擊。降低對手的特攻", - }, - spikyShield: { - name: "尖刺防守", - effect: "防住對手攻擊的同時,削減\n接觸到自己的對手的體力", - }, - aromaticMist: { - name: "芳香薄霧", - effect: "通過神奇的芳香,提高我方\n寶可夢的特防", - }, - eerieImpulse: { - name: "怪異電波", - effect: "從身體放射出怪異電波,讓\n對手沐浴其中,從而大幅降\n低其特攻", - }, - venomDrench: { - name: "毒液陷阱", - effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,其攻\n擊、特攻和速度都會降低", - }, - powder: { - name: "粉塵", - effect: "如果被撒到粉塵的對手使用\n火招式,則會爆炸並給予傷\n害", - }, - geomancy: { - name: "大地掌控", - effect: "第1回合吸收能量,第2回\n合大幅提高特攻、特防和速\n度", - }, - magneticFlux: { - name: "磁場操控", - effect: "通過操控磁場,會提高特性\n爲正電和負電的寶可夢的防\n御和特防", - }, - happyHour: { - name: "歡樂時光", - effect: "如果使用歡樂時光,戰鬥後\n得到的錢會翻倍", - }, - electricTerrain: { - name: "電氣場地", - effect: "在5回合內變成電氣場地。\n地面上的寶可夢將無法入眠。\n電屬性的招式威力還會提\n高", - }, - dazzlingGleam: { name: "魔法閃耀", effect: "向對手發射強光,並給予傷\n害" }, - celebrate: { name: "慶祝", effect: "寶可夢爲十分開心的你慶祝" }, - holdHands: { - name: "牽手", - effect: "我方寶可夢之間牽手。能帶\n來非常幸福的心情", - }, - babyDollEyes: { - name: "圓瞳", - effect: "用圓瞳凝視對手,從而降低\n其攻擊。必定能夠先制攻擊", - }, - nuzzle: { - name: "蹭蹭臉頰", - effect: "將帶電的臉頰蹭蹭對手進行\n攻擊。讓對手陷入麻痹狀態", - }, - holdBack: { - name: "手下留情", - effect: "在攻擊的時候手下留情,從\n而使對手的HP至少會留下\n1HP", - }, - infestation: { - name: "糾纏不休", - effect: "在4~5回合內死纏爛打地\n進行攻擊。在此期間對手將\n無法逃走", - }, - powerUpPunch: { - name: "增強拳", - effect: "通過反覆擊打對手,使自己\n的拳頭慢慢變硬。打中對手\n攻擊就會提高", - }, - oblivionWing: { - name: "歸天之翼", - effect: "從鎖定的對手身上吸取HP。\n回覆給予對手傷害的一半\n以上的HP", - }, - thousandArrows: { - name: "千箭齊發", - effect: "可以擊中浮在空中的寶可夢。\n空中的對手被擊落後,會\n掉到地面", - }, - thousandWaves: { - name: "千波激盪", - effect: "從地面掀起波浪進行攻擊。\n被掀入波浪中的對手,將無\n法從戰鬥中逃走", - }, - landsWrath: { - name: "大地神力", - effect: "聚集大地的力量,將此力量\n集中攻擊對手,並給予傷害", - }, - lightOfRuin: { - name: "破滅之光", - effect: "借用永恆之花的力量,發射\n出強力光線。自己也會受到\n非常大的傷害", - }, - originPulse: { - name: "根源波動", - effect: "用無數青白色且閃耀的光線\n攻擊對手", - }, - precipiceBlades: { - name: "斷崖之劍", - effect: "將大地的力量變化爲利刃攻\n擊對手", - }, - dragonAscent: { - name: "畫龍點睛", - effect: "從天空中急速下降攻擊對手。\n自己的防禦和特防會降低", - }, - hyperspaceFury: { - name: "異次元猛攻", - effect: "用許多手臂,無視對手的守\n住或看穿等招式進行連續攻\n擊,自己的防禦會降低", - }, - breakneckBlitzPhysical: { - name: "一般Z究極無敵大沖撞", - effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", - }, - breakneckBlitzSpecial: { - name: "一般Z究極無敵大沖撞", - effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", - }, - allOutPummelingPhysical: { - name: "格鬥Z全力無雙激烈拳", - effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - allOutPummelingSpecial: { - name: "格鬥Z全力無雙激烈拳", - effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - supersonicSkystrikePhysical: { - name: "飛行Z極速俯衝轟烈撞", - effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", - }, - supersonicSkystrikeSpecial: { - name: "飛行Z極速俯衝轟烈撞", - effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", - }, - acidDownpourPhysical: { - name: "毒Z強酸劇毒滅絕雨", - effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", - }, - acidDownpourSpecial: { - name: "毒Z強酸劇毒滅絕雨", - effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", - }, - tectonicRagePhysical: { - name: "地面Z地隆嘯天大終結", - effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", - }, - tectonicRageSpecial: { - name: "地面Z地隆嘯天大終結", - effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", - }, - continentalCrushPhysical: { - name: "岩石Z毀天滅地巨巖墜", - effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", - }, - continentalCrushSpecial: { - name: "岩石Z毀天滅地巨巖墜", - effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", - }, - savageSpinOutPhysical: { - name: "蟲Z絕對捕食迴旋斬", - effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", - }, - savageSpinOutSpecial: { - name: "蟲Z絕對捕食迴旋斬", - effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", - }, - neverEndingNightmarePhysical: { - name: "幽靈Z無盡暗夜之誘惑", - effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", - }, - neverEndingNightmareSpecial: { - name: "幽靈Z無盡暗夜之誘惑", - effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", - }, - corkscrewCrashPhysical: { - name: "鋼Z超絕螺旋連擊", - effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", - }, - corkscrewCrashSpecial: { - name: "鋼Z超絕螺旋連擊", - effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", - }, - infernoOverdrivePhysical: { - name: "火Z超強極限爆焰彈", - effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - infernoOverdriveSpecial: { - name: "火Z超強極限爆焰彈", - effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", - }, - hydroVortexPhysical: { - name: "水Z超級水流大漩渦", - effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", - }, - hydroVortexSpecial: { - name: "水Z超級水流大漩渦", - effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", - }, - bloomDoomPhysical: { - name: "草Z絢爛繽紛花怒放", - effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", - }, - bloomDoomSpecial: { - name: "草Z絢爛繽紛花怒放", - effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", - }, - gigavoltHavocPhysical: { - name: "電Z終極伏特狂雷閃", - effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", - }, - gigavoltHavocSpecial: { - name: "電Z終極伏特狂雷閃", - effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", - }, - shatteredPsychePhysical: { - name: "超能力Z至高精神破壞波", - effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", - }, - shatteredPsycheSpecial: { - name: "超能力Z至高精神破壞波", - effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", - }, - subzeroSlammerPhysical: { - name: "冰Z激狂大地萬里冰", - effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", - }, - subzeroSlammerSpecial: { - name: "冰Z激狂大地萬里冰", - effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", - }, - devastatingDrakePhysical: { - name: "龍Z究極巨龍震天地", - effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", - }, - devastatingDrakeSpecial: { - name: "龍Z究極巨龍震天地", - effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", - }, - blackHoleEclipsePhysical: { - name: "惡Z黑洞吞噬萬物滅", - effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", - }, - blackHoleEclipseSpecial: { - name: "惡Z黑洞吞噬萬物滅", - effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", - }, - twinkleTacklePhysical: { - name: "妖精Z可愛星星飛天撞", - effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", - }, - twinkleTackleSpecial: { - name: "妖精Z可愛星星飛天撞", - effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", - }, - catastropika: { - name: "皮卡丘Z皮卡皮卡必殺擊", - effect: "通過Z力量,皮卡丘全身覆\n蓋最強電力,全力猛撲對手", - }, - shoreUp: { - name: "集沙", - effect: "回覆自己最大HP的一半。\n在沙暴中回覆得更多", - }, - firstImpression: { - name: "迎頭一擊", - effect: "威力很高的招式,但只有在\n出場戰鬥時,立刻使出才能\n成功", - }, - banefulBunker: { - name: "碉堡", - effect: "防住對手攻擊的同時,讓接\n觸到自己的對手中毒", - }, - spiritShackle: { - name: "縫影", - effect: "攻擊的同時,縫住對手的影\n子,使其無法逃走", - }, - darkestLariat: { - name: "DD金勾臂", - effect: "旋轉雙臂打向對手。無視對\n手的能力變化,直接給予傷\n害", - }, - sparklingAria: { - name: "泡影的詠歎調", - effect: "隨着唱歌會放出很多氣球。\n受到此招式攻擊時,灼傷會\n被治癒", - }, - iceHammer: { - name: "冰錘", - effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", - }, - floralHealing: { - name: "花療", - effect: "回覆對手最大HP的一半。\n在青草場地時,效果會提高", - }, - highHorsepower: { name: "十萬馬力", effect: "使出全身力量,猛攻對手" }, - strengthSap: { - name: "吸取力量", - effect: "給自己回覆和對手攻擊力相\n同數值的HP,然後降低對\n手的攻擊", - }, - solarBlade: { - name: "日光刃", - effect: "第1回合收集滿滿的日光,\n第2回合將此力量集中在劍\n上進行攻擊", - }, - leafage: { name: "樹葉", effect: "將葉片打向對手,進行攻擊" }, - spotlight: { - name: "聚光燈", - effect: "給寶可夢打上聚光燈,該回\n合只能瞄準該寶可夢", - }, - toxicThread: { - name: "毒絲", - effect: "將混有毒的絲吐向對手。使\n其中毒,從而降低對手的速\n度", - }, - laserFocus: { name: "磨礪", effect: "集中精神,下次攻擊必定會\n擊中要害" }, - gearUp: { - name: "輔助齒輪", - effect: "啓動齒輪,提高特性爲正電\n和負電的寶可夢的攻擊和特\n攻", - }, - throatChop: { - name: "深淵突刺", - effect: "受到此招式攻擊的對手,會\n因爲地獄般的痛苦,在2回\n合內,變得無法使出聲音類\n招式", - }, - pollenPuff: { - name: "花粉團", - effect: "對敵人使用是會爆炸的糰子。\n對我方使用則是給予回覆\n的糰子", - }, - anchorShot: { - name: "擲錨", - effect: "將錨纏住對手進行攻擊。使\n對手無法逃走", - }, - psychicTerrain: { - name: "精神場地", - effect: "在5回合內,地面上的寶可\n夢不會受到先制招式的攻擊。\n超能力屬性的招式威力會\n提高", - }, - lunge: { - name: "猛撲", - effect: "全力猛撲對手進行攻擊。從\n而降低對手的攻擊", - }, - fireLash: { - name: "火焰鞭", - effect: "用燃燒的鞭子抽打對手。受\n到攻擊的對手防禦會降低", - }, - powerTrip: { - name: "囂張", - effect: "耀武揚威地攻擊對手,自己\n的能力提高得越多,威力就\n越大", - }, - burnUp: { - name: "燃盡", - effect: "將自己全身燃燒起火焰來,\n給予對手大大的傷害。自己\n的火屬性將會消失", - }, - speedSwap: { name: "速度互換", effect: "將對手和自己的速度進行互\n換" }, - smartStrike: { - name: "修長之角", - effect: "用尖尖的角刺入對手進行攻\n擊。攻擊必定會命中", - }, - purify: { - name: "淨化", - effect: "治癒對手的異常狀態。治癒\n後可以回覆自己的HP", - }, - revelationDance: { - name: "覺醒之舞", - effect: "全力跳舞進行攻擊。此招式\n的屬性將變得和自己的屬性\n相同", - }, - coreEnforcer: { - name: "核心懲罰者", - effect: "如果給予過傷害的對手已經\n結束行動,其特性就會被消\n除", - }, - tropKick: { - name: "熱帶踢", - effect: "向對手使出來自南國的火熱\n腳踢。從而降低對手的攻擊", - }, - instruct: { - name: "號令", - effect: "向對手下達指示,讓其再次\n使出剛纔的招式", - }, - beakBlast: { - name: "鳥嘴加農炮", - effect: "先加熱鳥嘴後再進行攻擊。\n鳥嘴在加熱時對手觸碰的話,\n就會使其灼傷", - }, - clangingScales: { - name: "鱗片噪音", - effect: "摩擦全身鱗片,發出響亮的\n聲音進行攻擊。攻擊後自己\n的防禦會降低", - }, - dragonHammer: { - name: "龍錘", - effect: "將身體當作錘子,向對手發\n動襲擊,給予傷害", - }, - brutalSwing: { - name: "狂舞揮打", - effect: "用自己的身體狂舞揮打,給\n予對手傷害", - }, - auroraVeil: { - name: "極光幕", - effect: "在5回合內減弱物理和特殊\n的傷害。只有下雪時才能使\n出", - }, - sinisterArrowRaid: { - name: "狙射樹梟Z遮天蔽日暗影箭", - effect: "通過Z力量製造出無數箭的\n狙射樹梟將全力射穿對手進\n行攻擊", - }, - maliciousMoonsault: { - name: "熾焰咆哮虎Z極惡飛躍粉碎擊", - effect: "通過Z力量得到強壯肉體的\n熾焰咆哮虎將全力撞向對手\n進行攻擊", - }, - oceanicOperetta: { - name: "西獅海壬Z海神莊嚴交響樂", - effect: "通過Z力量召喚大量水的西\n獅海壬將全力攻擊對手", - }, - guardianOfAlola: { - name: "卡璞Z巨人衛士・阿羅拉", - effect: "通過Z力量得到阿羅拉之力\n的土地神寶可夢將全力進行\n攻擊。對手的剩餘HP會減\n少很多", - }, - soulStealing7StarStrike: { - name: "瑪夏多Z七星奪魂腿", - effect: "得到Z力量的瑪夏多將全力\n使出拳頭和腳踢的連續招式\n叩打對手", - }, - stokedSparksurfer: { - name: "阿羅雷Z駕雷馭電戲衝浪", - effect: "得到Z力量的阿羅拉地區的\n雷丘將全力進行攻擊。從而\n讓對手陷入麻痹狀態", - }, - pulverizingPancake: { - name: "卡比獸Z認真起來大爆擊", - effect: "通過Z力量使得認真起來的\n卡比獸躍動巨大身軀,全力\n向對手發動襲擊", - }, - extremeEvoboost: { - name: "伊布Z九彩昇華齊聚頂", - effect: "得到Z力量的伊布將藉助進\n化後夥伴們的力量,大幅提\n高能力", - }, - genesisSupernova: { - name: "夢幻Z起源超新星大爆炸", - effect: "得到Z力量的夢幻將全力攻\n擊對手。腳下會變成精神場\n地", - }, - shellTrap: { - name: "陷阱甲殼", - effect: "設下甲殼陷阱。如果對手使\n出物理招式,陷阱就會爆炸\n並給予對手傷害", - }, - fleurCannon: { - name: "花朵加農炮", - effect: "放出強力光束後,自己的特\n攻會大幅降低", - }, - psychicFangs: { - name: "精神之牙", - effect: "利用精神力量咬住對手進行\n攻擊。還可以破壞光牆和反\n射壁等", - }, - stompingTantrum: { - name: "跺腳", - effect: "化悔恨爲力量進行攻擊。如\n果上一回合招式沒有打中,\n威力就會翻倍", - }, - shadowBone: { - name: "暗影之骨", - effect: "用附有靈魂的骨頭毆打對手\n進行攻擊。有時會降低對手\n的防禦", - }, - accelerock: { - name: "衝巖", - effect: "迅速撞向對手進行攻擊。必\n定能夠先制攻擊", - }, - liquidation: { - name: "水流裂破", - effect: "用水之力量撞向對手進行攻\n擊。有時會降低對手的防禦", - }, - prismaticLaser: { - name: "棱鏡鐳射", - effect: "用棱鏡的力量發射強烈光線。\n下一回合自己將無法動彈", - }, - spectralThief: { - name: "暗影偷盜", - effect: "潛入對手的影子進行攻擊。\n會奪取對手的能力提升", - }, - sunsteelStrike: { - name: "流星閃衝", - effect: "以流星般的氣勢猛撞對手。\n可以無視對手的特性進行攻\n擊", - }, - moongeistBeam: { - name: "暗影之光", - effect: "放出奇怪的光線攻擊對手。\n可以無視對手的特性進行攻\n擊", - }, - tearfulLook: { - name: "淚眼汪汪", - effect: "變得淚眼汪汪,讓對手喪失\n鬥志。從而降低對手的攻擊\n和特攻", - }, - zingZap: { - name: "麻麻刺刺", - effect: "撞向對手,併發出強電,使\n其感到麻麻刺刺的。有時會\n使對手畏縮", - }, - naturesMadness: { - name: "自然之怒", - effect: "向對手釋放自然之怒。對手\n的HP會減半", - }, - multiAttack: { - name: "多屬性攻擊", - effect: "一邊覆蓋高能量,一邊撞向\n對手進行攻擊。根據存儲碟\n不同,屬性會改變", - }, - tenMillionVoltThunderbolt: { - name: "智皮卡Z千萬伏特", - effect: "戴着帽子的皮卡丘將通過Z\n力量增強的電擊全力釋放給\n對手。容易擊中要害", - }, - mindBlown: { - name: "驚爆大頭", - effect: "讓自己的頭爆炸,來攻擊周\n圍的一切。自己也會受到傷\n害", - }, - plasmaFists: { - name: "等離子閃電拳", - effect: "用覆蓋着電流的拳頭進行攻\n擊。使一般屬性的招式變成\n電屬性", - }, - photonGeyser: { - name: "光子噴湧", - effect: "用光柱來進行攻擊。比較自\n己的攻擊和特攻,用數值相\n對較高的一項給予對方傷害", - }, - lightThatBurnsTheSky: { - name: "究極奈克洛Z焚天滅世熾光爆", - effect: "奈克洛茲瑪會無視對手的特\n性效果,在攻擊和特攻之間,\n用數值相對較高的一項給\n予對方傷害", - }, - searingSunrazeSmash: { - name: "索爾迦雷歐Z日光迴旋下蒼穹", - effect: "得到Z力量的索爾迦雷歐將\n全力進行攻擊。可以無視對\n手的特性效果", - }, - menacingMoonrazeMaelstrom: { - name: "露奈雅拉Z月華飛濺落靈霄", - effect: "得到Z力量的露奈雅拉將全\n力進行攻擊。可以無視對手\n的特性效果", - }, - letsSnuggleForever: { - name: "謎擬丘Z親密無間大亂揍", - effect: "得到Z力量的謎擬Q將全力\n進行亂揍攻擊", - }, - splinteredStormshards: { - name: "鬃巖狼人Z狼嘯石牙颶風暴", - effect: "得到Z力量的鬃巖狼人將全\n力進行攻擊。而且會消除場\n地狀態", - }, - clangorousSoulblaze: { - name: "杖尾鱗甲龍Z熾魂熱舞烈音爆", - effect: "得到Z力量的杖尾鱗甲龍將\n全力攻擊對手。並且自己的\n能力會提高", - }, - zippyZap: { - name: "電電加速", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", - }, - splishySplash: { - name: "滔滔衝浪", - effect: "往巨浪中注入電能後衝撞對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", - }, - floatyFall: { - name: "飄飄墜落", - effect: "輕飄飄地浮起來後,再猛地\n俯衝下去進行攻擊。有時會\n使對手畏縮", - }, - pikaPapow: { - name: "閃閃雷光", - effect: "皮卡丘越喜歡訓練家,電擊\n的威力就越強。攻擊必定會\n命中", - }, - bouncyBubble: { - name: "活活氣泡", - effect: "投擲水球進行攻擊。吸水後\n能回覆等同於造成的傷害一\n半的HP", - }, - buzzyBuzz: { - name: "麻麻電擊", - effect: "放出電擊攻擊對手。讓對手\n陷入麻痹狀態", - }, - sizzlySlide: { - name: "熊熊火爆", - effect: "用燃起大火的身體猛烈地衝\n撞對手。讓對手陷入灼傷狀\n態", - }, - glitzyGlow: { - name: "嘩嘩氣場", - effect: "利用念力強攻,粉碎對方信\n心。製造一道能減弱對手特\n殊攻擊的神奇牆壁", - }, - baddyBad: { - name: "壞壞領域", - effect: "惡行惡相地進行攻擊。製造\n一道能減弱對手物理攻擊的\n神奇牆壁", - }, - sappySeed: { - name: "茁茁炸彈", - effect: "長出巨大的藤蔓,播撒種子\n進行攻擊。種子每回合都會\n吸取對手的HP", - }, - freezyFrost: { - name: "冰冰霜凍", - effect: "利用冰冷的黑霧結晶進行攻\n擊。使全體寶可夢的能力變\n回原點", - }, - sparklySwirl: { - name: "亮亮風暴", - effect: "利用芬芳刺鼻的龍捲風吞噬\n對方。能治癒我方寶可夢的\n異常狀態", - }, - veeveeVolley: { - name: "砰砰擊破", - effect: "伊布越喜歡訓練家,衝撞的\n威力就越強。攻擊必定會命\n中", - }, - doubleIronBash: { - name: "鋼拳雙擊", - effect: "以胸口的螺帽爲中心旋轉,\n並連續2次揮動手臂打擊對\n手。有時會使對手畏縮", - }, - maxGuard: { - name: "極巨防壁", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", - }, - dynamaxCannon: { - name: "極巨炮", - effect: "將凝縮在體內的能量從核心\n放出進行攻擊", - }, - snipeShot: { - name: "狙擊", - effect: "能無視具有吸引對手招式效\n果的特性或招式的影響。可\n以向選定的對手進行攻擊", - }, - jawLock: { - name: "緊咬不放", - effect: "使雙方直到一方昏厥爲止無\n法替換寶可夢。其中一方退\n場則可以解除效果", - }, - stuffCheeks: { name: "大快朵頤", effect: "喫掉攜帶的樹果,大幅提高\n防禦" }, - noRetreat: { - name: "背水一戰", - effect: "提高自己的所有能力,但無\n法替換或逃走", - }, - tarShot: { - name: "瀝青射擊", - effect: "潑灑黏糊糊的瀝青,降低對\n手的速度。火屬性會變成對\n手的弱點", - }, - magicPowder: { - name: "魔法粉", - effect: "向對手噴灑魔法粉,使對手\n變爲超能力屬性", - }, - dragonDarts: { - name: "龍箭", - effect: "讓多龍梅西亞進行2次攻擊。\n如果對手有2只寶可夢,\n則對它們各進行1次攻擊", - }, - teatime: { - name: "茶會", - effect: "舉辦一場茶會,場上的所有\n寶可夢都會喫掉自己攜帶的\n樹果", - }, - octolock: { - name: "蛸固", - effect: "讓對手無法逃走。對手被固\n定後,每回合都會降低防禦\n和特防", - }, - boltBeak: { - name: "電喙", - effect: "用帶電的喙啄刺對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", - }, - fishiousRend: { - name: "鰓咬", - effect: "用堅硬的腮咬住對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", - }, - courtChange: { name: "換場", effect: "用神奇的力量交換雙方的場\n地效果" }, - maxFlare: { - name: "極巨火爆", - effect: "極巨化寶可夢使出的火屬性\n攻擊。可在5回合內讓日照\n變得強烈", - }, - maxFlutterby: { - name: "極巨蟲蠱", - effect: "極巨化寶可夢使出的蟲屬性\n攻擊。會降低對手的特攻", - }, - maxLightning: { - name: "極巨閃電", - effect: "極巨化寶可夢使出的電屬性\n攻擊。可在5回合內將腳下\n變成電氣場地", - }, - maxStrike: { - name: "極巨攻擊", - effect: "極巨化寶可夢使出的一般屬\n性攻擊。會降低對手的速度", - }, - maxKnuckle: { - name: "極巨拳鬥", - effect: "極巨化寶可夢使出的格鬥屬\n性攻擊。會提高我方的攻擊", - }, - maxPhantasm: { - name: "極巨幽魂", - effect: "極巨化寶可夢使出的幽靈屬\n性攻擊。會降低對手的防禦", - }, - maxHailstorm: { - name: "極巨寒冰", - effect: "極巨化寶可夢使出的冰屬性\n攻擊。在5回合內會下雪", - }, - maxOoze: { - name: "極巨酸毒", - effect: "極巨化寶可夢使出的毒屬性\n攻擊。會提高我方的特攻", - }, - maxGeyser: { - name: "極巨水流", - effect: "極巨化寶可夢使出的水屬性\n攻擊。可在5回合內降下大\n雨", - }, - maxAirstream: { - name: "極巨飛衝", - effect: "極巨化寶可夢使出的飛行屬\n性攻擊。會提高我方的速度", - }, - maxStarfall: { - name: "極巨妖精", - effect: "極巨化寶可夢使出的妖精屬\n性攻擊。可在5回合內將腳\n下變成薄霧場地", - }, - maxWyrmwind: { - name: "極巨龍騎", - effect: "極巨化寶可夢使出的龍屬性\n攻擊。會降低對手的攻擊", - }, - maxMindstorm: { - name: "極巨超能", - effect: "極巨化寶可夢使出的超能力\n屬性攻擊。可在5回合內將\n腳下變成精神場地", - }, - maxRockfall: { - name: "極巨岩石", - effect: "極巨化寶可夢使出的岩石屬\n性攻擊。可在5回合內捲起\n沙暴", - }, - maxQuake: { - name: "極巨大地", - effect: "極巨化寶可夢使出的地面屬\n性攻擊。會提高我方的特防", - }, - maxDarkness: { - name: "極巨惡霸", - effect: "極巨化寶可夢使出的惡屬性\n攻擊。會降低對手的特防", - }, - maxOvergrowth: { - name: "極巨草原", - effect: "極巨化寶可夢使出的草屬性\n攻擊。可在5回合內將腳下\n變成青草場地", - }, - maxSteelspike: { - name: "極巨鋼鐵", - effect: "極巨化寶可夢使出的鋼屬性\n攻擊。會提高我方的防禦", - }, - clangorousSoul: { - name: "魂舞烈音爆", - effect: "削減少許自己的HP,使所\n有能力都提高", - }, - bodyPress: { - name: "撲擊", - effect: "用身體撞向對手進行攻擊。\n防禦越高,給予的傷害就越\n高", - }, - decorate: { name: "裝飾", effect: "通過裝飾,大幅提高對方的\n攻擊和特攻" }, - drumBeating: { - name: "鼓擊", - effect: "用鼓點來控制鼓的根部進行\n攻擊,從而降低對手的速度", - }, - snapTrap: { - name: "捕獸夾", - effect: "使用捕獸夾,在4~5回合\n內,夾住對手進行攻擊", - }, - pyroBall: { - name: "火焰球", - effect: "點燃小石子,形成火球攻擊\n對手。有時會使對手陷入灼\n傷狀態", - }, - behemothBlade: { - name: "巨獸斬", - effect: "以全身力氣舉起強大的劍,\n猛烈地劈向對手進行攻擊", - }, - behemothBash: { - name: "巨獸彈", - effect: "將全身變化爲堅固的盾,猛\n烈地撞向對手進行攻擊", - }, - auraWheel: { - name: "氣場輪", - effect: "用儲存在頰囊裏的能量進行\n攻擊,並提高自己的速度。\n其屬性會隨着莫魯貝可的樣\n子而改變", - }, - breakingSwipe: { - name: "廣域破壞", - effect: "用堅韌的尾巴猛掃對手進行\n攻擊,從而降低對手的攻擊", - }, - branchPoke: { - name: "木枝突刺", - effect: "使用尖銳的樹枝刺向對手進\n行攻擊", - }, - overdrive: { - name: "破音", - effect: "奏響吉他和貝斯,釋放出發\n出巨響的劇烈震動攻擊對手", - }, - appleAcid: { - name: "蘋果酸", - effect: "使用從酸蘋果中提取出來的\n酸性液體進行攻擊。降低對\n手的特防", - }, - gravApple: { - name: "萬有引力", - effect: "從高處落下蘋果,給予對手\n傷害。可降低對手的防禦", - }, - spiritBreak: { - name: "靈魂衝擊", - effect: "用足以讓對手一蹶不振的氣\n勢進行攻擊。會降低對手的\n特攻", - }, - strangeSteam: { - name: "神奇蒸汽", - effect: "噴出煙霧攻擊對手。有時會\n使對手混亂", - }, - lifeDew: { - name: "生命水滴", - effect: "噴灑出神奇的水,回覆自己\n和場上同伴的HP", - }, - obstruct: { - name: "攔堵", - effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗。一旦觸碰,\n防禦就會大幅降低", - }, - falseSurrender: { - name: "假跪真撞", - effect: "裝作低頭認錯的樣子,用凌\n亂的頭髮進行突刺。攻擊必\n定會命中", - }, - meteorAssault: { - name: "流星突擊", - effect: "大力揮舞粗壯的莖進行攻擊。\n但同時自己也會被晃暈,\n下一回合自己將無法動彈", - }, - eternabeam: { - name: "無極光束", - effect: "無極汰那變回原來的樣子後,\n發動的最強攻擊。下一回\n合自己將無法動彈", - }, - steelBeam: { - name: "鐵蹄光線", - effect: "將從全身聚集的鋼鐵化爲光\n束,激烈地發射出去。自己\n也會受到傷害", - }, - expandingForce: { - name: "廣域戰力", - effect: "利用精神力量攻擊對手。在\n精神場地上威力會有所提高,\n能對所有對手造成傷害", - }, - steelRoller: { - name: "鐵滾輪", - effect: "在破壞場地的同時攻擊對手。\n如果腳下沒有任何場地狀\n態存在,使出此招式時便會\n失敗", - }, - scaleShot: { - name: "鱗射", - effect: "發射鱗片進行攻擊。連續攻\n擊2~5次。速度會提高但\n防禦會降低", - }, - meteorBeam: { - name: "流星光束", - effect: "第1回合聚集宇宙之力提高\n特攻,第2回合攻擊對手", - }, - shellSideArm: { - name: "臂貝武器", - effect: "從物理攻擊和特殊攻擊中選\n擇可造成較多傷害的方式進\n行攻擊。有時會讓對手陷入\n中毒狀態", - }, - mistyExplosion: { - name: "薄霧炸裂", - effect: "對自己周圍的所有寶可夢進\n行攻擊,但使出後,自己會\n陷入昏厥。在薄霧場地上,\n招式威力會提高", - }, - grassyGlide: { - name: "青草滑梯", - effect: "彷彿在地面上滑行般地攻擊\n對手。在青草場地上,必定\n能夠先制攻擊", - }, - risingVoltage: { - name: "電力上升", - effect: "用從地面升騰而起的電擊進\n行攻擊。當對手處於電氣場\n地上時,招式威力會變成2\n倍", - }, - terrainPulse: { - name: "大地波動", - effect: "藉助場地的力量進行攻擊。\n視使出招式時場地狀態不同,\n招式的屬性和威力會有所\n變化", - }, - skitterSmack: { - name: "爬擊", - effect: "從對手背後爬近後進行攻擊。\n會降低對手的特攻", - }, - burningJealousy: { - name: "妒火", - effect: "用嫉妒的能量攻擊對手。會\n讓在該回合內能力有所提高\n的寶可夢陷入灼傷狀態", - }, - lashOut: { - name: "泄憤", - effect: "攻擊對手以發泄對其感到的\n惱怒情緒。如果在該回合內\n自身能力遭到降低,招式的\n威力會變成2倍", - }, - poltergeist: { - name: "靈騷", - effect: "操縱對手的持有物進行攻擊。\n當對手沒有攜帶道具時,\n使出此招式時便會失敗", - }, - corrosiveGas: { - name: "腐蝕氣體", - effect: "用具有強酸性的氣體包裹住\n自己周圍所有的寶可夢,並\n融化其所攜帶的道具", - }, - coaching: { - name: "指導", - effect: "通過進行正確合理的指導,\n提高我方全員的攻擊和防禦", - }, - flipTurn: { - name: "快速折返", - effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", - }, - tripleAxel: { - name: "三旋擊", - effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", - }, - dualWingbeat: { - name: "雙翼", - effect: "將翅膀撞向對手進行攻擊。\n連續2次給予傷害", - }, - scorchingSands: { - name: "熱沙大地", - effect: "將滾燙的沙子砸向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", - }, - jungleHealing: { - name: "叢林治療", - effect: "與叢林融爲一體,回覆自己\n和場上同伴的HP和狀態", - }, - wickedBlow: { - name: "闇冥強擊", - effect: "將惡之流派修煉至大成的猛\n烈一擊。必定會擊中要害", - }, - surgingStrikes: { - name: "水流連打", - effect: "將水之流派修煉至大成的仿\n若行雲流水般的3次連擊。\n必定會擊中要害", - }, - thunderCage: { - name: "雷電囚籠", - effect: "將對手困在電流四濺的囚籠\n中,在4~5回合內進行攻\n擊", - }, - dragonEnergy: { - name: "巨龍威能", - effect: "把生命力轉換爲力量攻擊對\n手。自己的HP越少,招式\n的威力越小", - }, - freezingGlare: { - name: "冰冷視線", - effect: "從雙眼發射精神力量進行攻\n擊。有時會讓對手陷入冰凍\n狀態", - }, - fieryWrath: { - name: "怒火中燒", - effect: "將憤怒轉化爲火焰般的氣場\n進行攻擊。有時會使對手畏\n縮", - }, - thunderousKick: { - name: "雷鳴蹴擊", - effect: "以雷電般的動作戲耍對手的\n同時使出腳踢。可降低對手\n的防禦", - }, - glacialLance: { - name: "雪矛", - effect: "向對手投擲掀起暴風雪的冰\n矛進行攻擊", - }, - astralBarrage: { name: "星碎", effect: "用大量的小靈體向對手發起\n攻擊" }, - eerieSpell: { - name: "詭異咒語", - effect: "用強大的精神力量攻擊。讓\n對手最後使用的招式減少3\nPP", - }, - direClaw: { - name: "克命爪", - effect: "以破滅之爪進行攻擊。有時\n還會讓對手陷入中毒、麻痹\n、睡眠之中的一種狀態", - }, - psyshieldBash: { - name: "屏障猛攻", - effect: "讓意念的能量覆蓋全身,撞\n向對手進行攻擊。會提高自\n己的防禦", - }, - powerShift: { name: "力量轉換", effect: "將自己的攻擊與防禦互相交\n換" }, - stoneAxe: { - name: "巖斧", - effect: "用岩石之斧進行攻擊。散落\n的岩石碎片會飄浮在對手周\n圍", - }, - springtideStorm: { - name: "陽春風暴", - effect: "用交織着愛與恨的烈風席捲\n對手進行攻擊。有時會降低\n對手的攻擊", - }, - mysticalPower: { - name: "神祕之力", - effect: "放出不可思議的力量攻擊。\n會提高自己的特攻", - }, - ragingFury: { - name: "大憤慨", - effect: "在2~3回合內,一邊放出\n火焰,一邊瘋狂亂打。大鬧\n一番後自己會陷入混亂", - }, - waveCrash: { - name: "波動衝", - effect: "讓水覆蓋全身後撞向對手。\n自己也會受到不少傷害", - }, - chloroblast: { - name: "葉綠爆震", - effect: "將自己的葉綠素凝聚起來後\n放出去進行攻擊。自己也會\n受到傷害", - }, - mountainGale: { - name: "冰山風", - effect: "將冰山般巨大的冰塊砸向對\n手進行攻擊。有時會使對手\n畏縮", - }, - victoryDance: { - name: "勝利之舞", - effect: "激烈地跳起喚來勝利的舞蹈,\n提高自己的攻擊、防禦和\n速度", - }, - headlongRush: { - name: "突飛猛撲", - effect: "向對手使出灌注了全心全力\n的撞擊。自己的防禦和特防\n會降低", - }, - barbBarrage: { - name: "毒千針", - effect: "用無數的毒針進行攻擊。有\n時還會讓對手陷入中毒狀態。\n攻擊處於中毒狀態的對手\n時,威力會變成2倍", - }, - esperWing: { - name: "氣場之翼", - effect: "用經過氣場強化的翅膀撕裂\n對手。容易擊中要害。會提\n高自己的速度", - }, - bitterMalice: { - name: "冤冤相報", - effect: "用令人毛骨悚然的怨念進行\n攻擊。會降低對手的攻擊", - }, - shelter: { - name: "閉關", - effect: "將皮膚變得堅硬如鐵盾,從\n而大幅提高自己的防禦", - }, - tripleArrows: { - name: "三連箭", - effect: "使出一記腿技後同時發射3\n箭。有時會降低對手的防禦\n或使對手畏縮。容易擊中要\n害", - }, - infernalParade: { - name: "羣魔亂舞", - effect: "用無數的火球進行攻擊。有\n時會讓對手陷入灼傷狀態。\n攻擊處於異常狀態的對手時,\n威力會變成2倍", - }, - ceaselessEdge: { - name: "祕劍・千重濤", - effect: "用貝殼之劍進行攻擊。散落\n的貝殼碎片會散落在對手腳\n下成爲撒菱", - }, - bleakwindStorm: { - name: "枯葉風暴", - effect: "用足以讓身心都止不住顫抖\n的冰冷狂風進行攻擊。有時\n會降低對手的速度", - }, - wildboltStorm: { - name: "鳴雷風暴", - effect: "呼喚雷雲引起風暴,用雷與\n風進行激烈的攻擊。有時會\n讓對手陷入麻痹狀態", - }, - sandsearStorm: { - name: "熱沙風暴", - effect: "用灼熱的沙子和強烈的風席\n卷對手進行攻擊。有時會讓\n對手陷入灼傷狀態", - }, - lunarBlessing: { - name: "新月祈禱", - effect: "向新月獻上祈禱,回覆自己\n和場上同伴的HP和狀態", - }, - takeHeart: { - name: "勇氣填充", - effect: "鼓起衝勁,治癒自己的異常\n狀態,同時提高自己的特攻\n和特防", - }, - gMaxWildfire: { - name: "超極巨深淵滅焰", - effect: "超極巨化的噴火龍使出的火\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxBefuddle: { - name: "超極巨蝶影蠱惑", - effect: "超極巨化的巴大蝶使出的蟲\n屬性攻擊。會讓對手陷入中\n毒、麻痹或睡眠狀態", - }, - gMaxVoltCrash: { - name: "超極鉅萬雷轟頂", - effect: "超極巨化的皮卡丘使出的電\n屬性攻擊。會讓對手陷入麻\n痹狀態", - }, - gMaxGoldRush: { - name: "超極巨特大金幣", - effect: "超極巨化的喵喵使出的一般\n屬性攻擊。會讓對手陷入混\n亂狀態,並可獲得金錢", - }, - gMaxChiStrike: { - name: "超極巨會心一擊", - effect: "超極巨化的怪力使出的格鬥\n屬性攻擊。會變得容易擊中\n要害", - }, - gMaxTerror: { - name: "超極巨幻影幽魂", - effect: "超極巨化的耿鬼使出的幽靈\n屬性攻擊。會踩住對手的影\n子,讓其無法被替換", - }, - gMaxResonance: { - name: "超極巨極光旋律", - effect: "超極巨化的拉普拉斯使出的\n冰屬性攻擊。可在5回合內\n減弱受到的傷害", - }, - gMaxCuddle: { - name: "超極巨熱情擁抱", - effect: "超極巨化的伊布使出的一般\n屬性攻擊。會讓對手陷入着\n迷狀態", - }, - gMaxReplenish: { - name: "超極巨資源再生", - effect: "超極巨化的卡比獸使出的一\n般屬性攻擊。會讓喫掉的樹\n果再生", - }, - gMaxMalodor: { - name: "超極巨臭氣沖天", - effect: "超極巨化的灰塵山使出的毒\n屬性攻擊。會讓對手陷入中\n毒狀態", - }, - gMaxStonesurge: { - name: "超極巨巖陣以待", - effect: "超極巨化的暴噬龜使出的水\n屬性攻擊。會發射無數銳利\n的岩石", - }, - gMaxWindRage: { - name: "超極巨旋風襲捲", - effect: "超極巨化的鋼鎧鴉使出的飛\n行屬性攻擊。可消除反射壁\n和光牆", - }, - gMaxStunShock: { - name: "超極巨異毒電場", - effect: "超極巨化的顫弦蠑螈使出的\n電屬性攻擊。會讓對手陷入\n中毒或麻痹狀態", - }, - gMaxFinale: { - name: "超極巨幸福圓滿", - effect: "超極巨化的霜奶仙使出的妖\n精屬性攻擊。可回覆我方的\nHP", - }, - gMaxDepletion: { - name: "超極巨劣化衰變", - effect: "超極巨化的鋁鋼龍使出的龍\n屬性攻擊。可減少對手最後\n使用的招式的PP", - }, - gMaxGravitas: { - name: "超極巨天道七星", - effect: "超極巨化的以歐路普使出的\n超能力屬性攻擊。在5回合\n內重力會產生變化", - }, - gMaxVolcalith: { - name: "超極巨炎石噴發", - effect: "超極巨化的巨炭山使出的巖\n石屬性攻擊。可在4回合內\n給予對手傷害", - }, - gMaxSandblast: { - name: "超極巨沙塵漫天", - effect: "超極巨化的沙螺蟒使出的地\n面屬性攻擊。在4~5回合\n內會狂刮沙暴", - }, - gMaxSnooze: { - name: "超極巨睡魔降臨", - effect: "超極巨化的長毛巨魔使出的\n惡屬性攻擊。會通過打大哈\n欠讓對手產生睡意", - }, - gMaxTartness: { - name: "超極巨酸不溜丟", - effect: "超極巨化的蘋裹龍使出的草\n屬性攻擊。會降低對手的閃\n避率", - }, - gMaxSweetness: { - name: "超極巨瓊漿玉液", - effect: "超極巨化的豐蜜龍使出的草\n屬性攻擊。會治癒我方的異\n常狀態", - }, - gMaxSmite: { - name: "超極巨天譴雷誅", - effect: "超極巨化的布莉姆溫使出的\n妖精屬性攻擊。會讓對手陷\n入混亂狀態", - }, - gMaxSteelsurge: { - name: "超極巨鋼鐵陣法", - effect: "超極巨化的大王銅象使出的\n鋼屬性攻擊。會發射無數銳\n利的刺", - }, - gMaxMeltdown: { - name: "超極巨液金熔擊", - effect: "超極巨化的美錄梅塔使出的\n鋼屬性攻擊。會讓對手無法\n連續使出相同的招式", - }, - gMaxFoamBurst: { - name: "超極巨激漩泡渦", - effect: "超極巨化的巨鉗蟹使出的水\n屬性攻擊。會大幅降低對手\n的速度", - }, - gMaxCentiferno: { - name: "超極巨百火焚野", - effect: "超極巨化的焚焰蚣使出的火\n屬性攻擊。可在4~5回合\n內將對手困在火焰中", - }, - gMaxVineLash: { - name: "超極巨灰飛鞭滅", - effect: "超極巨化的妙蛙花使出的草\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxCannonade: { - name: "超極巨水炮轟滅", - effect: "超極巨化的水箭龜使出的水\n屬性攻擊。可在4回合內給\n予對手傷害", - }, - gMaxDrumSolo: { - name: "超極巨狂擂亂打", - effect: "超極巨化的轟擂金剛猩使出\n的草屬性攻擊。不會受到對\n手特性的干擾", - }, - gMaxFireball: { - name: "超極巨破陣火球", - effect: "超極巨化的閃焰王牌使出的\n火屬性攻擊。不會受到對手\n特性的干擾", - }, - gMaxHydrosnipe: { - name: "超極巨狙擊神射", - effect: "超極巨化的千面避役使出的\n水屬性攻擊。不會受到對手\n特性的干擾", - }, - gMaxOneBlow: { - name: "超極巨奪命一擊", - effect: "超極巨化的武道熊師使出的\n惡屬性攻擊。是可以無視極\n巨防壁的一擊", - }, - gMaxRapidFlow: { - name: "超極巨流水連擊", - effect: "超極巨化的武道熊師使出的\n水屬性攻擊。是可以無視極\n巨防壁的連擊", - }, - teraBlast: { - name: "太晶爆發", - effect: "太晶化時,會放出太晶屬性\n的能量攻擊。比較自己的攻\n擊和特攻,用數值相對較高\n的一項給予對方傷害。(其\n他屬性)/用攻擊和特攻數\n值較高的一項給予傷害。對\n正處於太晶化的對手效果絕\n佳。自己的攻擊和特攻會降\n低。(星晶", - }, - silkTrap: { - name: "線阱", - effect: "用絲設置陷阱。防住對方攻\n擊的同時,能夠降低所接觸\n到的對手的速度", - }, - axeKick: { - name: "下壓踢", - effect: "將踢起的腳跟往下劈向對手\n進行攻擊。有時會使對手混\n亂。如果劈偏則自己會受到\n傷害", - }, - lastRespects: { - name: "掃墓", - effect: "爲了化解夥伴的悔恨而進行\n攻擊。被打倒的我方寶可夢\n越多,招式的威力越高", - }, - luminaCrash: { - name: "琉光衝激", - effect: "放出連精神都能影響到的奇\n妙怪光進行攻擊。會大幅降\n低對方的特防", - }, - orderUp: { - name: "上菜", - effect: "以瀟灑的身手進行攻擊。若\n口中有米立龍,會按其樣子\n提高能力", - }, - jetPunch: { - name: "噴射拳", - effect: "將激流覆蓋於拳頭,以肉眼\n無法辨識的速度打出拳擊。\n必定能夠先制攻擊", - }, - spicyExtract: { - name: "辣椒精華", - effect: "放出極爲辛辣的精華。對手\n的攻擊會大幅提高,防禦會\n大幅降低", - }, - spinOut: { - name: "疾速轉輪", - effect: "通過往腿上增加負荷,以激\n烈的旋轉給予對手傷害。自\n己的速度會大幅降低", - }, - populationBomb: { - name: "鼠數兒", - effect: "夥伴們會紛紛趕來集合,以\n羣體行動給予對手攻擊。連\n續命中1~10次", - }, - iceSpinner: { - name: "冰旋", - effect: "腳上覆蓋薄冰,旋轉着撞擊\n對手。通過旋轉的動作破壞\n場地", - }, - glaiveRush: { - name: "巨劍突擊", - effect: "有勇無謀的捨身突擊。使出\n招式後,對手的攻擊必定會\n命中,且傷害會變成2倍", - }, - revivalBlessing: { - name: "復生祈禱", - effect: "通過以慈愛之心祈禱,讓陷\n入昏厥的後備寶可夢以回覆\n一半HP的狀態復活", - }, - saltCure: { - name: "鹽醃", - effect: "使對手陷入鹽醃狀態,每回\n合給予對手傷害。對手爲鋼\n或水屬性時會更痛苦", - }, - tripleDive: { - name: "三連鑽", - effect: "以默契的跳躍濺起水花擊向\n對手。連續3次給予傷害", - }, - mortalSpin: { - name: "晶光轉轉", - effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能讓對手陷入中\n毒狀態", - }, - doodle: { - name: "描繪", - effect: "把握並映射出對手的本質,\n讓自己和同伴寶可夢的特性\n變得和對手相同", - }, - filletAway: { - name: "甩肉", - effect: "削減自己的HP,大幅提高\n攻擊和特攻以及速度", - }, - kowtowCleave: { - name: "僕刀", - effect: "下跪讓對手大意後發起襲擊\n劈向對手。攻擊必定會命中", - }, - flowerTrick: { - name: "千變萬花", - effect: "將做了手腳的花束扔向對手\n進行攻擊。必定會命中,且\n會擊中要害", - }, - torchSong: { - name: "閃焰高歌", - effect: "如唱歌一樣噴出熊熊燃燒的\n火焰燒焦對手。會提高自己\n的特攻", - }, - aquaStep: { - name: "流水旋舞", - effect: "以盈盈欲滴的輕快步伐戲耍\n對手並給予其傷害。會提高\n自己的速度", - }, - ragingBull: { - name: "怒牛", - effect: "狂怒暴牛的猛烈衝撞。招式\n的屬性隨形態改變,光牆和\n反射壁等招式也能破壞", - }, - makeItRain: { - name: "淘金潮", - effect: "扔出大量硬幣攻擊。自己的\n特攻會降低,戰鬥後還可以\n拿到錢", - }, - psyblade: { - name: "精神劍", - effect: "用無形的利刃劈開對手。處\n於電氣場地時,招式威力會\n變成1.5倍", - }, - hydroSteam: { - name: "水蒸氣", - effect: "將煮得翻滾的開水猛烈地噴\n向對手。日照強烈時,招式\n威力不但不會降低,還會變\n成1.5倍", - }, - ruination: { - name: "大災難", - effect: "引發毀滅性的災厄,使對手\n的HP減半", - }, - collisionCourse: { - name: "全開猛撞", - effect: "邊變形邊兇暴地落下,並引\n發起古老的大爆炸。若針對\n到弱點,威力會進一步", - }, - electroDrift: { - name: "閃電猛衝", - effect: "邊變形邊高速奔走,並以未\n知的電擊貫穿對手。若針對\n到弱點,威力會進一步", - }, - shedTail: { - name: "斷尾", - effect: "削減自己的HP,製造分身\n後會返回,並和後備寶可夢\n進行替換", - }, - chillyReception: { - name: "冷笑話", - effect: "留下冷場的冷笑話後,和後\n備寶可夢進行替換。在5回\n合內會下雪", - }, - tidyUp: { - name: "大掃除", - effect: "將撒菱、隱形巖、黏黏網、\n毒菱、替身全部掃除掉。自\n己的攻擊和速度會提高", - }, - snowscape: { - name: "雪景", - effect: "在5回合內會下雪。冰屬性\n的防禦會提高", - }, - pounce: { name: "蟲撲", effect: "飛撲向對手攻擊。會降低對\n手的速度" }, - trailblaze: { - name: "起草", - effect: "跳出草叢進行攻擊。通過輕\n快的步伐會提高自己的速度", - }, - chillingWater: { - name: "潑冷水", - effect: "潑灑冰冷得足以讓對手失去\n活力的水進行攻擊。會降低\n對手的攻擊", - }, - hyperDrill: { - name: "強力鑽", - effect: "急速旋轉尖銳的身體部位貫\n穿對手。可以無視守住和看\n穿等招式", - }, - twinBeam: { - name: "雙光束", - effect: "從兩眼發射出神奇的光線攻\n擊。連續2次給予傷害", - }, - rageFist: { - name: "憤怒之拳", - effect: "將憤怒化爲力量攻擊。受到\n攻擊的次數越多,招式的威\n力越高", - }, - armorCannon: { - name: "鎧農炮", - effect: "熊熊燃燒自己的鎧甲,將其\n做成炮彈射出攻擊。自己的\n防禦和特防會降低", - }, - bitterBlade: { - name: "悔念劍", - effect: "將對世間的留戀聚集於劍尖,\n並斬擊對手。可以回覆給\n予對手傷害的一半HP", - }, - doubleShock: { - name: "電光雙擊", - effect: "將全身所有的電力放出,給\n予對手大大的傷害。自己的\n電屬性將會消失", - }, - gigatonHammer: { - name: "巨力錘", - effect: "連同身體轉起巨大的錘子進\n行攻擊。這個招式無法連續\n使出2次", - }, - comeuppance: { - name: "復仇", - effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", - }, - aquaCutter: { - name: "水波刀", - effect: "如刀刃般噴射出加壓的水切\n開對手。容易擊中要害", - }, - blazingTorque: { - name: "灼熱暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n灼傷狀態。", - }, - wickedTorque: { - name: "黑暗暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n睡眠狀態。", - }, - noxiousTorque: { - name: "劇毒暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n中毒狀態。", - }, - combatTorque: { - name: "格鬥暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n麻痹狀態。此招式可以命中\n幽靈屬性的寶可夢。", - }, - magicalTorque: { - name: "魔法暴衝", - effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n混亂狀態。", - }, - bloodMoon: { - name: "血月", - effect: "從赤紅如血的滿月發射出全\n部的氣勢。這個招式無法連\n續使出2次", - }, - matchaGotcha: { - name: "刷刷茶炮", - effect: "發射經攪拌的茶的大炮,可\n以回覆給予對手傷害的一半\nHP,有時會讓對手陷入灼\n傷狀態", - }, - syrupBomb: { - name: "糖漿炸彈", - effect: "使粘稠的麥芽糖漿爆炸,讓\n對手陷入滿身糖狀態,在3\n回合內持續降低其速度", - }, - ivyCudgel: { - name: "棘藤棒", - effect: "用纏有藤蔓的棍棒毆打。屬\n性會隨所戴的面具而改變。\n容易擊中要害", - }, - electroShot: { - name: "電光束", - effect: "第1回合收集電力提高特攻,\n第2回合將高壓的電力發\n射出去。下雨天氣時能立刻\n發射", - }, - teraStarstorm: { - name: "晶光星羣", - effect: "照射出結晶的力量來驅逐敵\n人。太樂巴戈斯在星晶形態\n下使出時,能對所有對手造\n成傷害", - }, - fickleBeam: { - name: "隨機光", - effect: "發射光線進行攻擊。有時其\n他的頭也會合力發射鐳射,\n讓招式威力變成2倍", - }, - burningBulwark: { - name: "火焰守護", - effect: "用超高溫的體毛防住對手攻\n擊的同時,讓接觸到自己的\n對手灼傷", - }, - thunderclap: { - name: "迅雷", - effect: "可以比對手先使出電擊進行\n攻擊。對手使出的招式如果\n不是攻擊招式則會失敗", - }, - mightyCleave: { - name: "強刃攻擊", - effect: "用積蓄在頭部的光來斬切對\n手。可以無視守護進行攻擊", - }, - tachyonCutter: { - name: "迅子利刃", - effect: "接連發射出粒子的利刃,連\n續2次給予傷害。攻擊必定\n會命中", - }, - hardPress: { - name: "硬壓", - effect: "用手臂或鉗子壓迫對手。對\n手剩餘的HP越多,威力越\n大", - }, - dragonCheer: { - name: "龍聲鼓舞", - effect: "以龍之鼓舞提高士氣,讓我\n方的招式變得容易擊中要害。\n對龍屬性的鼓舞效果會更\n強", - }, - alluringVoice: { - name: "魅誘之聲", - effect: "用天使般的歌聲攻擊對手。\n會讓此回合內能力有提高的\n寶可夢陷入混亂狀態", - }, - temperFlare: { - name: "豁出去", - effect: "以自暴自棄的氣勢進行攻擊。\n如果上一回合招式沒有命\n中,威力就會翻倍", - }, - supercellSlam: { - name: "閃電強襲", - effect: "讓身體帶電後壓向對手。如\n果沒有命中則自己會受到傷\n害", - }, - psychicNoise: { - name: "精神噪音", - effect: "用令對手不舒服的音波進行\n攻擊。讓對手在2回合內無\n法通過招式、特性或攜帶的\n道具回覆HP", - }, - upperHand: { - name: "快手還擊", - effect: "察覺到對手的動作後用掌根\n攻擊,讓對手畏縮。如果對\n手使出的招式不是先制攻擊,\n則會失敗", - }, - malignantChain: { - name: "邪毒鎖鏈", - effect: "用由毒形成的鎖鏈纏住對手\n注入毒素加以侵蝕。有時會\n讓對手陷入劇毒狀態", - }, + pound: { name: "拍擊", effect: "使用長長的尾巴或手等拍打\n對手進行攻擊" }, + karateChop: { + name: "空手劈", + effect: "用鋒利的手刀劈向對手進行\n攻擊。容易擊中要害", + }, + doubleSlap: { + name: "連環巴掌", + effect: "用連環巴掌拍打對手進行攻\n擊。連續攻擊2~5次", + }, + cometPunch: { + name: "連續拳", + effect: "用拳頭怒濤般的毆打對手進\n行攻擊。連續攻擊2~5次", + }, + megaPunch: { name: "百萬噸重拳", effect: "用充滿力量的拳頭攻擊對手" }, + payDay: { + name: "聚寶功", + effect: "向對手的身體投擲小金幣進\n行攻擊。戰鬥後可以拿到錢", + }, + firePunch: { + name: "火焰拳", + effect: "用充滿火焰的拳頭攻擊對手。\n有時會讓對手陷入灼傷狀\n態", + }, + icePunch: { + name: "冰凍拳", + effect: "用充滿寒氣的拳頭攻擊對手。\n有時會讓對手陷入冰凍狀\n態", + }, + thunderPunch: { + name: "雷電拳", + effect: "用充滿電流的拳頭攻擊對手。\n有時會讓對手陷入麻痹狀\n態", + }, + scratch: { name: "抓", effect: "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" }, + viseGrip: { name: "夾住", effect: "將對手從兩側夾住,給予傷\n害" }, + guillotine: { + name: "極落鉗", + effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊昏厥", + }, + razorWind: { + name: "旋風刀", + effect: "製造風之刃,於第2回合攻\n擊對手。容易擊中要害", + }, + swordsDance: { + name: "劍舞", + effect: "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊", + }, + cut: { name: "居合劈", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" }, + gust: { name: "起風", effect: "用翅膀將颳起的狂風襲向對\n手進行攻擊" }, + wingAttack: { + name: "翅膀攻擊", + effect: "大大地展開美麗的翅膀,將\n其撞向對手進行攻擊", + }, + whirlwind: { + name: "吹飛", + effect: "吹飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", + }, + fly: { name: "飛翔", effect: "第1回合飛上天空,第2回\n合攻擊對手" }, + bind: { + name: "綁緊", + effect: "使用長長的身體或藤蔓等,\n在4~5回合內綁緊對手進\n行攻擊", + }, + slam: { name: "摔打", effect: "使用長長的尾巴或藤蔓等摔\n打對手進行攻擊" }, + vineWhip: { + name: "藤鞭", + effect: "用如同鞭子般彎曲而細長的\n藤蔓摔打對手進行攻擊", + }, + stomp: { + name: "踩踏", + effect: "用大腳踩踏對手進行攻擊。\n有時會使對手畏縮", + }, + doubleKick: { + name: "二連踢", + effect: "用2只腳踢飛對手進行攻擊。\n連續2次給予傷害", + }, + megaKick: { + name: "百萬噸重踢", + effect: "使出力大無窮的重踢踢飛對\n手進行攻擊", + }, + jumpKick: { + name: "飛踢", + effect: "使出高高的騰空踢攻擊對手。\n如果踢偏則自己會受到傷\n害", + }, + rollingKick: { + name: "迴旋踢", + effect: "一邊使身體快速旋轉,一邊\n踢飛對手進行攻擊。有時會\n使對手畏縮", + }, + sandAttack: { name: "潑沙", effect: "向對手臉上潑沙子,從而降\n低命中率" }, + headbutt: { + name: "頭錘", + effect: "將頭伸出,筆直地撲向對手\n進行攻擊。有時會使對手畏\n縮", + }, + hornAttack: { name: "角撞", effect: "用尖銳的角攻擊對手" }, + furyAttack: { + name: "亂擊", + effect: "用角或喙刺向對手進行攻擊。\n連續攻擊2~5次", + }, + hornDrill: { + name: "角鑽", + effect: "用旋轉的角刺入對手進行攻\n擊。只要命中就會一擊昏厥", + }, + tackle: { name: "撞擊", effect: "用整個身體撞向對手進行攻\n擊" }, + bodySlam: { + name: "泰山壓頂", + effect: "用整個身體壓住對手進行攻\n擊。有時會讓對手陷入麻痹\n狀態", + }, + wrap: { + name: "緊束", + effect: "使用長長的身體或藤蔓等,\n在4~5回合內緊束對手進\n行攻擊", + }, + takeDown: { + name: "猛撞", + effect: "以驚人的氣勢撞向對手進行\n攻擊。自己也會受到少許傷\n害", + }, + thrash: { + name: "大鬧一番", + effect: "在2~3回合內,亂打一氣\n地攻擊對手。大鬧一番後自\n己會陷入混亂", + }, + doubleEdge: { + name: "捨身衝撞", + effect: "拼命地猛撞向對手進行攻擊。\n自己也會受到不小的傷害", + }, + tailWhip: { + name: "搖尾巴", + effect: "可愛地左右搖晃尾巴,誘使\n對手疏忽大意。會降低對手\n的防禦", + }, + poisonSting: { + name: "毒針", + effect: "將有毒的針刺入對手進行攻\n擊。有時會讓對手陷入中毒\n狀態", + }, + twineedle: { + name: "雙針", + effect: "將2根針刺入對手,連續2\n次給予傷害。有時會讓對手\n陷入中毒狀態", + }, + pinMissile: { + name: "飛彈針", + effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", + }, + leer: { + name: "瞪眼", + effect: "用犀利的眼神使其害怕,從\n而降低對手的防禦", + }, + bite: { + name: "咬住", + effect: "用尖銳的牙咬住對手進行攻\n擊。有時會使對手畏縮", + }, + growl: { + name: "叫聲", + effect: "讓對手聽可愛的叫聲,引開\n注意力使其疏忽,從而降低\n對手的攻擊", + }, + roar: { + name: "吼叫", + effect: "放走對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", + }, + sing: { + name: "唱歌", + effect: "讓對手聽舒適、美妙的歌聲,\n從而陷入睡眠狀態", + }, + supersonic: { + name: "超音波", + effect: "從身體發出特殊的音波,從\n而使對手混亂", + }, + sonicBoom: { + name: "音爆", + effect: "將衝擊波撞向對手進行攻擊。\n必定會給予20的傷害", + }, + disable: { + name: "定身法", + effect: "阻礙對手行動,之前使出的\n招式將在4回合內無法使用", + }, + acid: { + name: "溶解液", + effect: "將強酸潑向對手進行攻擊。\n有時會降低對手的特防", + }, + ember: { + name: "火花", + effect: "向對手發射小型火焰進行攻\n擊。有時會讓對手陷入灼傷\n狀態", + }, + flamethrower: { + name: "噴射火焰", + effect: "向對手發射烈焰進行攻擊。\n有時會讓對手陷入灼傷狀態", + }, + mist: { + name: "白霧", + effect: "用白霧覆蓋身體。在5回合\n內不會讓對手降低自己的能\n力", + }, + waterGun: { name: "水槍", effect: "向對手猛烈地噴射水流進行\n攻擊" }, + hydroPump: { name: "水炮", effect: "向對手猛烈地噴射大量水流\n進行攻擊" }, + surf: { name: "衝浪", effect: "利用大浪攻擊自己周圍所有\n的寶可夢" }, + iceBeam: { + name: "冰凍光束", + effect: "向對手發射冰凍光束進行攻\n擊。有時會讓對手陷入冰凍\n狀態", + }, + blizzard: { + name: "暴風雪", + effect: "將猛烈的暴風雪刮向對手進\n行攻擊。有時會讓對手陷入\n冰凍狀態", + }, + psybeam: { + name: "幻象光線", + effect: "向對手發射神奇的光線進行\n攻擊。有時會使對手混亂", + }, + bubbleBeam: { + name: "泡沫光線", + effect: "向對手猛烈地噴射泡沫進行\n攻擊。有時會降低對手的速\n度", + }, + auroraBeam: { + name: "極光束", + effect: "向對手發射虹色光束進行攻\n擊。有時會降低對手的攻擊", + }, + hyperBeam: { + name: "破壞光線", + effect: "向對手發射強烈的光線進行\n攻擊。下一回合自己將無法\n動彈", + }, + peck: { name: "啄", effect: "用尖銳的喙或角刺向對手進\n行攻擊" }, + drillPeck: { + name: "啄鑽", + effect: "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊", + }, + submission: { + name: "深淵翻滾", + effect: "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害", + }, + lowKick: { + name: "踢倒", + effect: "用力踢對手的腳,使其摔倒\n進行攻擊。對手越重,威力\n越大", + }, + counter: { + name: "雙倍奉還", + effect: "從對手那裏受到物理攻擊的\n傷害將以2倍返還給同一個\n對手", + }, + seismicToss: { + name: "地球上投", + effect: "利用引力將對手甩飛出去。\n給予對手和自己等級相同的\n傷害", + }, + strength: { name: "怪力", effect: "使出渾身力氣毆打對手進行\n攻擊" }, + absorb: { + name: "吸取", + effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", + }, + megaDrain: { + name: "超級吸取", + effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", + }, + leechSeed: { + name: "寄生種子", + effect: "植入寄生種子後,將在每回\n合一點一點吸取對手的HP,\n從而用來回復自己的HP", + }, + growth: { name: "生長", effect: "讓身體一下子長大,從而提\n高攻擊和特攻" }, + razorLeaf: { + name: "飛葉快刀", + effect: "飛出葉片,切斬對手進行攻\n擊。容易擊中要害", + }, + solarBeam: { + name: "日光束", + effect: "第1回合收集滿滿的日光,\n第2回合發射光束進行攻擊", + }, + poisonPowder: { + name: "毒粉", + effect: "撒出毒粉,從而讓對手陷入\n中毒狀態", + }, + stunSpore: { + name: "麻痹粉", + effect: "撒出麻痹粉,從而讓對手陷\n入麻痹狀態", + }, + sleepPowder: { + name: "催眠粉", + effect: "撒出催眠粉,從而讓對手陷\n入睡眠狀態", + }, + petalDance: { + name: "花瓣舞", + effect: "在2~3回合內,散落花瓣\n攻擊對手。之後自己會陷入\n混亂", + }, + stringShot: { + name: "吐絲", + effect: "用口中吐出的絲纏繞對手,\n從而大幅降低對手的速度", + }, + dragonRage: { + name: "龍之怒", + effect: "將憤怒的衝擊波撞向對手進\n行攻擊。必定會給予40的\n傷害", + }, + fireSpin: { + name: "火焰旋渦", + effect: "將對手困在激烈的火焰旋渦\n中,在4~5回合內進行攻\n擊", + }, + thunderShock: { + name: "電擊", + effect: "發出電流刺激對手進行攻擊。\n有時會讓對手陷入麻痹狀\n態", + }, + thunderbolt: { + name: "十萬伏特", + effect: "向對手發出強力電擊進行攻\n擊。有時會讓對手陷入麻痹\n狀態", + }, + thunderWave: { + name: "電磁波", + effect: "向對手發出微弱的電擊,從\n而讓對手陷入麻痹狀態", + }, + thunder: { + name: "打雷", + effect: "向對手劈下暴雷進行攻擊。\n有時會讓對手陷入麻痹狀態", + }, + rockThrow: { name: "落石", effect: "拿起小岩石,投擲對手進行\n攻擊" }, + earthquake: { + name: "地震", + effect: "利用地震的衝擊,攻擊自己\n周圍所有的寶可夢", + }, + fissure: { + name: "地裂", + effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊昏厥", + }, + dig: { name: "挖洞", effect: "第1回合鑽入地底,第2回\n合攻擊對手" }, + toxic: { + name: "劇毒", + effect: "讓對手陷入劇毒狀態。隨着\n回合的推進,中毒傷害會增\n加", + }, + confusion: { + name: "念力", + effect: "向對手發送微弱的念力進行\n攻擊。有時會使對手混亂", + }, + psychic: { + name: "精神強念", + effect: "向對手發送強大的念力進行\n攻擊。有時會降低對手的特\n防", + }, + hypnosis: { + name: "催眠術", + effect: "施以誘導睡意的暗示,讓對\n手陷入睡眠狀態", + }, + meditate: { + name: "瑜伽姿勢", + effect: "喚醒身體深處沉睡的力量,\n從而提高自己的攻擊", + }, + agility: { + name: "高速移動", + effect: "讓身體放鬆變得輕盈,以便\n高速移動。大幅提高自己的\n速度", + }, + quickAttack: { + name: "電光一閃", + effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", + }, + rage: { + name: "憤怒", + effect: "如果在使出招式後受到攻擊\n的話,會因憤怒的力量而提\n高攻擊", + }, + teleport: { + name: "瞬間移動", + effect: "當有後備寶可夢時使用,就\n可以進行替換。野生的寶可\n夢使用則會逃走", + }, + nightShade: { + name: "黑夜魔影", + effect: "顯示恐怖幻影,只給予對手\n和自己等級相同的傷害", + }, + mimic: { + name: "模仿", + effect: "可以將對手最後使用的招式,\n在戰鬥內變成自己的招式", + }, + screech: { + name: "刺耳聲", + effect: "發出不由自主想要捂起耳朵\n的刺耳聲,從而大幅降低對\n手的防禦", + }, + doubleTeam: { + name: "影子分身", + effect: "通過快速移動來製造分身,\n擾亂對手,從而提高閃避率", + }, + recover: { + name: "自我再生", + effect: "讓細胞再生,從而回復自己\n最大HP的一半", + }, + harden: { + name: "變硬", + effect: "全身使勁,讓身體變硬,從\n而提高自己的防禦", + }, + minimize: { + name: "變小", + effect: "蜷縮身體顯得很小,從而大\n幅提高自己的閃避率", + }, + smokescreen: { + name: "煙幕", + effect: "向對手噴出煙或墨汁等,從\n而降低對手的命中率", + }, + confuseRay: { + name: "奇異之光", + effect: "顯示奇怪的光,擾亂對手。\n使對手混亂", + }, + withdraw: { + name: "縮入殼中", + effect: "縮入殼裏保護身體,從而提\n高自己的防禦", + }, + defenseCurl: { + name: "變圓", + effect: "將身體蜷曲變圓,從而提高\n自己的防禦", + }, + barrier: { + name: "屏障", + effect: "製造堅固的壁障,從而大幅\n提高自己的防禦", + }, + lightScreen: { + name: "光牆", + effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的特\n殊攻擊的傷害", + }, + haze: { + name: "黑霧", + effect: "升起黑霧,將正在場上戰鬥\n的全體寶可夢的能力變回原\n點", + }, + reflect: { + name: "反射壁", + effect: "利用神奇的牆壁,在5回合\n內減弱從對手那裏受到的物\n理攻擊的傷害", + }, + focusEnergy: { + name: "聚氣", + effect: "深深地吸口氣,集中精神。\n自己的攻擊會變得容易擊中\n要害", + }, + bide: { + name: "忍耐", + effect: "在2回合內忍受攻擊,受到\n的傷害會2倍返還給對手", + }, + metronome: { + name: "揮指", + effect: "揮動手指刺激自己的大腦,\n從許多的招式中隨機使出1\n個", + }, + mirrorMove: { + name: "鸚鵡學舌", + effect: "模仿對手使用的招式,自己\n也使用相同招式", + }, + selfDestruct: { + name: "玉石俱碎", + effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入昏\n厥", + }, + eggBomb: { name: "炸蛋", effect: "向對手用力投擲大大的蛋進\n行攻擊" }, + lick: { + name: "舌舔", + effect: "用長長的舌頭,舔遍對手進\n行攻擊。有時會讓對手陷入\n麻痹狀態", + }, + smog: { + name: "濁霧", + effect: "將骯髒的濃霧吹向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", + }, + sludge: { + name: "污泥攻擊", + effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", + }, + boneClub: { + name: "骨棒", + effect: "用手中的骨頭毆打對手進行\n攻擊。有時會使對手畏縮", + }, + fireBlast: { + name: "大字爆炎", + effect: "用大字形狀的火焰燒盡對手。\n有時會讓對手陷入灼傷狀\n態", + }, + waterfall: { + name: "攀瀑", + effect: "以驚人的氣勢撲向對手。有\n時會使對手畏縮", + }, + clamp: { + name: "貝殼夾擊", + effect: "用非常堅固且厚實的貝殼,\n在4~5回合內夾住對手進\n行攻擊", + }, + swift: { + name: "高速星星", + effect: "發射星形的光攻擊對手。攻\n擊必定會命中", + }, + skullBash: { + name: "火箭頭錘", + effect: "第1回合把頭縮進去,從而\n提高防禦。第2回合攻擊對\n手", + }, + spikeCannon: { + name: "尖刺加農炮", + effect: "向對手發射銳針進行攻擊。\n連續攻擊2~5次", + }, + constrict: { + name: "纏繞", + effect: "用觸手或青藤等纏繞進行攻\n擊。有時會降低對手的速度", + }, + amnesia: { + name: "瞬間失憶", + effect: "將頭腦清空,瞬間忘記某事,\n從而大幅提高自己的特防", + }, + kinesis: { + name: "折彎湯匙", + effect: "折彎湯匙引開注意,從而降\n低對手的命中率", + }, + softBoiled: { name: "生蛋", effect: "回覆自己最大HP的一半" }, + highJumpKick: { + name: "飛膝踢", + effect: "跳起後用膝蓋撞對手進行攻\n擊。如果撞偏則自己會受到\n傷害", + }, + glare: { + name: "大蛇瞪眼", + effect: "用腹部的花紋使對手害怕,\n從而讓其陷入麻痹狀態", + }, + dreamEater: { + name: "食夢", + effect: "喫掉正在睡覺的對手的夢進\n行攻擊。回覆對手所受到傷\n害的一半HP", + }, + poisonGas: { + name: "毒瓦斯", + effect: "將毒瓦斯吹到對手的臉上,\n從而讓對手陷入中毒狀態", + }, + barrage: { + name: "投球", + effect: "向對手投擲圓形物體進行攻\n擊。連續攻擊2~5次", + }, + leechLife: { + name: "吸血", + effect: "吸取血液攻擊對手。可以回\n復給予對手傷害的一半HP", + }, + lovelyKiss: { + name: "惡魔之吻", + effect: "用恐怖的臉強吻對手。讓對\n手陷入睡眠狀態", + }, + skyAttack: { + name: "神鳥猛擊", + effect: "第2回合攻擊對手。偶爾使\n對手畏縮。也容易擊中要害", + }, + transform: { + name: "變身", + effect: "變身成對手寶可夢的樣子,\n能夠使用和對手完全相同的\n招式", + }, + bubble: { + name: "泡沫", + effect: "向對手用力吹起無數泡泡進\n行攻擊。有時會降低對手的\n速度", + }, + dizzyPunch: { + name: "迷昏拳", + effect: "有節奏地出拳攻擊對手。有\n時會使對手混亂", + }, + spore: { + name: "蘑菇孢子", + effect: "沙沙沙地撒滿具有催眠效果\n的孢子,從而讓對手陷入睡\n眠狀態", + }, + flash: { + name: "閃光", + effect: "使出光芒,從而降低對手的\n命中率。也可在陰暗的洞窟\n裏照亮四周", + }, + psywave: { + name: "精神波", + effect: "向對手發射神奇的念波進行\n攻擊。每次使用,傷害都會\n改變", + }, + splash: { + name: "躍起", + effect: "也不攻擊只是一蹦一蹦地跳,\n什麼都不會發生…", + }, + acidArmor: { + name: "溶化", + effect: "通過細胞的變化進行液化,\n從而大幅提高自己的防禦", + }, + crabhammer: { + name: "蟹鉗錘", + effect: "用大鉗子敲打對手進行攻擊。\n容易擊中要害", + }, + explosion: { + name: "大爆炸", + effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入昏厥", + }, + furySwipes: { + name: "亂抓", + effect: "用爪子或鐮刀等抓對手進行\n攻擊。連續攻擊2~5次", + }, + bonemerang: { + name: "骨頭回力鏢", + effect: "用手中的骨頭投擲對手,來\n回連續2次給予傷害", + }, + rest: { + name: "睡覺", + effect: "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態", + }, + rockSlide: { + name: "巖崩", + effect: "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮", + }, + hyperFang: { + name: "終結門牙", + effect: "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮", + }, + sharpen: { + name: "棱角化", + effect: "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊", + }, + conversion: { + name: "紋理", + effect: "將自己的屬性轉換成和已學\n會的招式中第一個招式相同\n的屬性", + }, + triAttack: { + name: "三重攻擊", + effect: "用3種光線進行攻擊。有時\n會讓對手陷入麻痹、灼傷或\n冰凍的狀態", + }, + superFang: { + name: "憤怒門牙", + effect: "用鋒利的門牙猛烈地咬住對\n手進行攻擊。對手的HP減\n半", + }, + slash: { + name: "劈開", + effect: "用爪子或鐮刀等劈開對手進\n行攻擊。容易擊中要害", + }, + substitute: { + name: "替身", + effect: "削減少許自己的HP,製造\n分身。分身將成爲自己的替\n身", + }, + struggle: { + name: "掙扎", + effect: "當自己的PP耗盡時,努力\n掙扎攻擊對手。自己也會受\n到少許傷害", + }, + sketch: { + name: "寫生", + effect: "將對手使用的招式變成自己\n的招式。使用1次後寫生消\n失", + }, + tripleKick: { + name: "三連踢", + effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", + }, + thief: { + name: "小偷", + effect: "攻擊的同時盜取道具。當自\n己攜帶道具時,不會去盜取", + }, + spiderWeb: { + name: "蛛網", + effect: "將黏糊糊的細絲一層一層纏\n住對手,使其不能從戰鬥中\n逃走", + }, + mindReader: { + name: "心之眼", + effect: "用心感受對手的行動,下次\n攻擊必定會擊中對手", + }, + nightmare: { + name: "惡夢", + effect: "讓在睡眠狀態下的對手做惡\n夢,每回合會緩緩減少HP", + }, + flameWheel: { + name: "火焰輪", + effect: "讓火焰覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入灼傷狀態", + }, + snore: { + name: "打鼾", + effect: "在自己睡覺時,發出噪音進\n行攻擊。有時會使對手畏縮", + }, + curse: { + name: "詛咒", + effect: "使用該招式的寶可夢,其屬\n性是幽靈屬性或其他屬性時,\n效果會不一樣", + }, + flail: { + name: "抓狂", + effect: "抓狂般亂打進行攻擊。自己\n的HP越少,招式的威力越\n大", + }, + conversion2: { + name: "紋理2", + effect: "爲了可以抵抗對手最後使用\n的招式,從而使自己的屬性\n發生變化", + }, + aeroblast: { + name: "氣旋攻擊", + effect: "發射空氣旋渦進行攻擊。容\n易擊中要害", + }, + cottonSpore: { + name: "棉孢子", + effect: "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度", + }, + reversal: { + name: "絕處逢生", + effect: "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大", + }, + spite: { + name: "怨恨", + effect: "對對手最後使用的招式懷有\n怨恨,減少4PP該招式", + }, + powderSnow: { + name: "細雪", + effect: "將冰冷的細雪吹向對手進行\n攻擊。有時會讓對手陷入冰\n凍狀態", + }, + protect: { + name: "守住", + effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", + }, + machPunch: { + name: "音速拳", + effect: "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊", + }, + scaryFace: { + name: "可怕面孔", + effect: "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度", + }, + feintAttack: { + name: "出奇一擊", + effect: "悄悄地靠近對手,趁其不備\n進行毆打。攻擊必定會命中", + }, + sweetKiss: { + name: "天使之吻", + effect: "像天使般可愛地親吻對手,\n從而使對手混亂", + }, + bellyDrum: { + name: "腹鼓", + effect: "將自己的HP減少到最大\nHP的一半,從而最大限度提\n高自己的攻擊", + }, + sludgeBomb: { + name: "污泥炸彈", + effect: "用污泥投擲對手進行攻擊。\n有時會讓對手陷入中毒狀態", + }, + mudSlap: { + name: "擲泥", + effect: "向對手的臉等投擲泥塊進行\n攻擊。會降低對手的命中率", + }, + octazooka: { + name: "章魚桶炮", + effect: "向對手的臉等噴出墨汁進行\n攻擊。有時會降低對手的命\n中率", + }, + spikes: { + name: "撒菱", + effect: "在對手的腳下扔撒菱。對替\n換出場的對手的寶可夢給予\n傷害", + }, + zapCannon: { + name: "電磁炮", + effect: "發射大炮一樣的電流進行攻\n擊。讓對手陷入麻痹狀態", + }, + foresight: { + name: "識破", + effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", + }, + destinyBond: { + name: "同命", + effect: "使出招式後,當受到對手攻\n擊陷入昏厥時,對手也會一\n同昏厥。連續使出則會失敗", + }, + perishSong: { + name: "終焉之歌", + effect: "傾聽歌聲的寶可夢經過3回\n合陷入昏厥。替換後效果消\n失", + }, + icyWind: { + name: "冰凍之風", + effect: "將結冰的冷氣吹向對手進行\n攻擊。會降低對手的速度", + }, + detect: { + name: "看穿", + effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", + }, + boneRush: { + name: "骨棒亂打", + effect: "用堅硬的骨頭毆打對手進行\n攻擊。連續攻擊2~5次", + }, + lockOn: { name: "鎖定", effect: "緊緊瞄準對手,下次攻擊必\n定會打中" }, + outrage: { + name: "逆鱗", + effect: "在2~3回合內,亂打一氣\n地進行攻擊。大鬧一番後自\n己會陷入混亂", + }, + sandstorm: { + name: "沙暴", + effect: "在5回合內揚起沙暴,除巖\n石、地面和鋼屬性以外的寶\n可夢,都會受到傷害。岩石\n屬性的特防還會提高", + }, + gigaDrain: { + name: "終極吸取", + effect: "吸取對手的養分進行攻擊。\n可以回覆給予對手傷害的一\n半HP", + }, + endure: { + name: "挺住", + effect: "即使受到攻擊,也至少會留\n下1HP。連續使出則容易\n失敗", + }, + charm: { + name: "撒嬌", + effect: "可愛地凝視,誘使對手疏忽\n大意,從而大幅降低對手的\n攻擊", + }, + rollout: { + name: "滾動", + effect: "在5回合內連續滾動攻擊對\n手。招式每次擊中,威力就\n會提高", + }, + falseSwipe: { + name: "點到爲止", + effect: "對手的HP至少會留下1\nHP,如此般手下留情地攻擊", + }, + swagger: { + name: "虛張聲勢", + effect: "激怒對手,使其混亂。因爲\n憤怒,對手的攻擊會大幅提\n高", + }, + milkDrink: { name: "喝牛奶", effect: "回覆自己最大HP的一半" }, + spark: { + name: "電光", + effect: "讓電流覆蓋全身,猛撞向對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", + }, + furyCutter: { + name: "連斬", + effect: "用鐮刀或爪子等切斬對手進\n行攻擊。連續擊中,威力就\n會提高", + }, + steelWing: { + name: "鋼翼", + effect: "用堅硬的翅膀敲打對手進行\n攻擊。有時會提高自己的防\n御", + }, + meanLook: { + name: "黑色目光", + effect: "用好似要勾人心魂的黑色目\n光一動不動地凝視對手,使\n其不能從戰鬥中逃走", + }, + attract: { + name: "迷人", + effect: "♂誘惑♀或♀誘惑♂,讓對\n手着迷。對手將很難使出招\n式", + }, + sleepTalk: { + name: "夢話", + effect: "從自己已學會的招式中任意\n使出1個。只能在自己睡覺\n時使用", + }, + healBell: { + name: "治癒鈴聲", + effect: "讓同伴聽舒適的鈴音,從而\n治癒我方全員的異常狀態", + }, + return: { + name: "報恩", + effect: "爲了訓練家而全力攻擊對手。\n親密度越高,威力越大", + }, + present: { + name: "禮物", + effect: "遞給對手設有圈套的盒子進\n行攻擊。也有可能回覆對手\nHP", + }, + frustration: { + name: "遷怒", + effect: "爲了發泄不滿而全力攻擊對\n手。親密度越低,威力越大", + }, + safeguard: { + name: "神祕守護", + effect: "在5回合內被神奇的力量守\n護,從而不會陷入異常狀態", + }, + painSplit: { + name: "分擔痛楚", + effect: "將自己的HP和對手的HP\n相加,然後自己和對手友好\n地平分", + }, + sacredFire: { + name: "神聖之火", + effect: "用神祕的火焰燒盡對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", + }, + magnitude: { + name: "震級", + effect: "晃動地面,攻擊自己周圍所\n有的寶可夢。招式的威力會\n有各種變化", + }, + dynamicPunch: { + name: "爆裂拳", + effect: "使出渾身力氣出拳進行攻擊。\n必定會使對手混亂", + }, + megahorn: { + name: "超級角擊", + effect: "用堅硬且華麗的角狠狠地刺\n入對手進行攻擊", + }, + dragonBreath: { + name: "龍息", + effect: "將強烈的氣息吹向對手進行\n攻擊。有時會讓對手陷入麻\n痹狀態", + }, + batonPass: { + name: "接棒", + effect: "和後備寶可夢進行替換。換\n上的寶可夢能直接繼承其能\n力的變化", + }, + encore: { + name: "再來一次", + effect: "讓對手接受再來一次,連續\n3次使出最後使用的招式", + }, + pursuit: { + name: "追打", + effect: "當對手替換寶可夢上場時使\n出此招式的話,能夠以2倍\n的威力進行攻擊", + }, + rapidSpin: { + name: "高速旋轉", + effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能提高自己的速\n度", + }, + sweetScent: { name: "甜甜香氣", effect: "用香氣大幅降低對手的閃避\n率" }, + ironTail: { + name: "鐵尾", + effect: "使用堅硬的尾巴摔打對手進\n行攻擊。有時會降低對手的\n防禦", + }, + metalClaw: { + name: "金屬爪", + effect: "用鋼鐵之爪劈開對手進行攻\n擊。有時會提高自己的攻擊", + }, + vitalThrow: { + name: "借力摔", + effect: "會在對手之後進行攻擊。但\n是自己的攻擊必定會命中", + }, + morningSun: { + name: "晨光", + effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", + }, + synthesis: { + name: "光合作用", + effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", + }, + moonlight: { + name: "月光", + effect: "回覆自己的HP。根據天氣\n的不同,回覆量也會有所變\n化", + }, + hiddenPower: { + name: "覺醒力量", + effect: "招式的屬性會隨着使用此招\n式的寶可夢而改變", + }, + crossChop: { + name: "十字劈", + effect: "用兩手呈十字劈打對手進行\n攻擊。容易擊中要害", + }, + twister: { + name: "龍捲風", + effect: "興起龍捲風,將對手卷入進\n行攻擊。有時會使對手畏縮", + }, + rainDance: { + name: "求雨", + effect: "在5回合內一直降雨,從而\n提高水屬性的招式威力。火\n屬性的招式威力則降低", + }, + sunnyDay: { + name: "大晴天", + effect: "在5回合內讓日照變得強烈,\n從而提高火屬性的招式威\n力。水屬性的招式威力則降\n低", + }, + crunch: { + name: "咬碎", + effect: "用利牙咬碎對手進行攻擊。\n有時會降低對手的防禦", + }, + mirrorCoat: { + name: "鏡面反射", + effect: "從對手那裏受到特殊攻擊的\n傷害將以2倍返還給同一個\n對手", + }, + psychUp: { + name: "自我暗示", + effect: "向自己施以自我暗示,將能\n力變化的狀態變得和對手一\n樣", + }, + extremeSpeed: { + name: "神速", + effect: "以迅雷不及掩耳之勢猛撞向\n對手進行攻擊。必定能夠先\n制攻擊", + }, + ancientPower: { + name: "原始之力", + effect: "用原始之力進行攻擊。有時\n會提高自己所有的能力", + }, + shadowBall: { + name: "暗影球", + effect: "投擲一團黑影進行攻擊。有\n時會降低對手的特防", + }, + futureSight: { + name: "預知未來", + effect: "在使用招式2回合後,向對\n手發送一團念力進行攻擊", + }, + rockSmash: { + name: "碎巖", + effect: "用拳頭進行攻擊。有時會降\n低對手的防禦", + }, + whirlpool: { + name: "潮旋", + effect: "將對手困在激烈的水流旋渦\n中,在4~5回合內進行攻\n擊", + }, + beatUp: { + name: "圍攻", + effect: "我方全員進行攻擊。同行的\n寶可夢越多,招式的攻擊次\n數越多", + }, + fakeOut: { + name: "擊掌奇襲", + effect: "進行先制攻擊,使對手畏縮。\n要在出場後立刻使出才能\n成功", + }, + uproar: { + name: "吵鬧", + effect: "在3回合內大吵大鬧攻擊對\n手。在此期間誰都不能入眠", + }, + stockpile: { + name: "蓄力", + effect: "積蓄力量,提高自己的防禦\n和特防。最多積蓄3次", + }, + spitUp: { + name: "噴出", + effect: "將積蓄的力量撞向對手進行\n攻擊。積蓄得越多,威力越\n大", + }, + swallow: { + name: "吞下", + effect: "將積蓄的力量吞下,從而回\n復自己的HP。積蓄得越多,\n回覆越大", + }, + heatWave: { + name: "熱風", + effect: "將炎熱的氣息吹向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", + }, + hail: { + name: "冰雹", + effect: "在5回合內一直降冰雹,除\n冰屬性的寶可夢以外,給予\n全體寶可夢傷害", + }, + torment: { + name: "無理取鬧", + effect: "向對手無理取鬧,令其不能\n連續2次使出相同招式", + }, + flatter: { + name: "吹捧", + effect: "吹捧對手,使其混亂。同時\n還會提高對手的特攻", + }, + willOWisp: { + name: "磷火", + effect: "放出怪異的火焰,從而讓對\n手陷入灼傷狀態", + }, + memento: { + name: "臨別禮物", + effect: "雖然會使自己陷入昏厥,但\n是能夠大幅降低對手的攻擊\n和特攻", + }, + facade: { + name: "硬撐", + effect: "當自己處於中毒、麻痹、灼\n傷狀態時,向對手使出此招\n式的話,威力會變成2倍", + }, + focusPunch: { + name: "真氣拳", + effect: "集中精神出拳。在招式使出\n前若受到攻擊則會失敗", + }, + smellingSalts: { + name: "清醒", + effect: "對於麻痹狀態下的對手,威\n力會變成2倍。但相反對手\n的麻痹也會被治癒", + }, + followMe: { + name: "看我嘛", + effect: "引起對手的注意,將對手的\n攻擊全部轉移到自己身上", + }, + naturePower: { + name: "自然之力", + effect: "用自然之力進行攻擊。根據\n所使用場所的不同,使出的\n招式也會有所變化", + }, + charge: { + name: "充電", + effect: "變爲充電狀態,提高下次使\n出的電屬性的招式威力。自\n己的特防也會提高", + }, + taunt: { + name: "挑釁", + effect: "使對手憤怒。在3回合內讓\n對手只能使出給予傷害的招\n式", + }, + helpingHand: { + name: "幫助", + effect: "幫助夥伴。被幫助的寶可夢,\n其招式威力變得比平時大", + }, + trick: { name: "戲法", effect: "抓住對手的空隙,交換自己\n和對手的持有物" }, + rolePlay: { + name: "扮演", + effect: "扮演對手,讓自己的特性變\n得和對手相同", + }, + wish: { + name: "祈願", + effect: "在下一回合回覆自己或是替\n換出場的寶可夢最大HP的\n一半", + }, + assist: { + name: "藉助", + effect: "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個", + }, + ingrain: { + name: "紮根", + effect: "在大地上紮根,每回合回覆\n自己的HP。因爲紮根了,\n所以不能替換寶可夢", + }, + superpower: { + name: "蠻力", + effect: "發揮驚人的力量攻擊對手。\n自己的攻擊和防禦會降低", + }, + magicCoat: { + name: "魔法反射", + effect: "當對手使出會變成異常狀態\n的招式或寄生種子等時,會\n將對手的招式反射回去", + }, + recycle: { + name: "回收利用", + effect: "使戰鬥中已經消耗掉的自己\n的持有物再生,並可以再次\n使用", + }, + revenge: { + name: "報復", + effect: "如果受到對手的招式攻擊,\n就能給予對手2倍的傷害", + }, + brickBreak: { + name: "劈瓦", + effect: "將手刀猛烈地揮下攻擊對手。\n還可以破壞光牆和反射壁\n等", + }, + yawn: { + name: "哈欠", + effect: "打個大哈欠引起睡意。在下\n一回合讓對手陷入睡眠狀態", + }, + knockOff: { + name: "拍落", + effect: "拍落對手的持有物,直到戰\n鬥結束都不能使用。對手攜\n帶道具時會增加傷害", + }, + endeavor: { + name: "蠻幹", + effect: "給予傷害,使對手的HP變\n得和自己的HP一樣", + }, + eruption: { + name: "噴火", + effect: "爆發怒火攻擊對手。自己的\nHP越少,招式的威力越小", + }, + skillSwap: { name: "特性互換", effect: "利用超能力互換自己和對手\n的特性" }, + imprison: { + name: "封印", + effect: "如果對手有和自己相同的招\n式,那麼只有對手無法使用\n該招式", + }, + refresh: { + name: "煥然一新", + effect: "讓身體休息,治癒自己身上\n所中的毒、麻痹、灼傷的異\n常狀態", + }, + grudge: { + name: "怨念", + effect: "因對手的招式而陷入昏厥時\n給對手施加怨念,讓該招式\n的PP變成0", + }, + snatch: { + name: "搶奪", + effect: "將對手打算使用的回覆招式\n或能力變化招式奪爲己用", + }, + secretPower: { + name: "祕密之力", + effect: "根據使用場所不同,該招式\n的追加效果也會有所變化", + }, + dive: { + name: "潛水", + effect: "第1回合潛入水中,第2回\n合浮上來進行攻擊", + }, + armThrust: { + name: "猛推", + effect: "用張開着的雙手猛推對手進\n行攻擊。連續攻擊2~5次", + }, + camouflage: { + name: "保護色", + effect: "根據所在場所不同,如水邊\n、草叢和洞窟等,可以改變\n自己的屬性", + }, + tailGlow: { + name: "螢火", + effect: "凝視閃爍的光芒,集中自己\n的精神,從而巨幅提高特攻", + }, + lusterPurge: { + name: "潔淨光芒", + effect: "釋放耀眼的光芒進行攻擊。\n有時會降低對手的特防", + }, + mistBall: { + name: "薄霧球", + effect: "用圍繞着霧狀羽毛的球進行\n攻擊。有時會降低對手的特\n攻", + }, + featherDance: { + name: "羽毛舞", + effect: "撒出羽毛,籠罩在對手的周\n圍。大幅降低對手的攻擊", + }, + teeterDance: { + name: "搖晃舞", + effect: "搖搖晃晃地跳起舞蹈,讓自\n己周圍的寶可夢陷入混亂狀\n態", + }, + blazeKick: { + name: "火焰踢", + effect: "攻擊對手後,有時會使其陷\n入灼傷狀態。也容易擊中要\n害", + }, + mudSport: { + name: "玩泥巴", + effect: "一旦使用此招式,周圍就會\n弄得到處是泥。在5回合內\n減弱電屬性的招式", + }, + iceBall: { + name: "冰球", + effect: "在5回合內攻擊對手。招式\n每次擊中,威力就會提高", + }, + needleArm: { + name: "尖刺臂", + effect: "用帶刺的手臂猛烈地揮舞進\n行攻擊。有時會使對手畏縮", + }, + slackOff: { name: "偷懶", effect: "偷懶休息。回覆自己最大\nHP的一半" }, + hyperVoice: { + name: "巨聲", + effect: "給予對手又吵又響的巨大震\n動進行攻擊", + }, + poisonFang: { + name: "劇毒牙", + effect: "用有毒的牙齒咬住對手進行\n攻擊。有時會使對手中劇毒", + }, + crushClaw: { + name: "撕裂爪", + effect: "用堅硬的銳爪劈開對手進行\n攻擊。有時會降低對手的防\n御", + }, + blastBurn: { + name: "爆炸烈焰", + effect: "用爆炸的火焰燒盡對手進行\n攻擊。下一回合自己將無法\n動彈", + }, + hydroCannon: { + name: "加農水炮", + effect: "向對手噴射水炮進行攻擊。\n下一回合自己將無法動彈", + }, + meteorMash: { + name: "彗星拳", + effect: "使出彗星般的拳頭攻擊對手。\n有時會提高自己的攻擊", + }, + astonish: { + name: "驚嚇", + effect: "用尖叫聲等突然驚嚇對手進\n行攻擊。有時會使對手畏縮", + }, + weatherBall: { + name: "氣象球", + effect: "根據使用時的天氣,招式屬\n性和威力會改變", + }, + aromatherapy: { + name: "芳香治療", + effect: "讓同伴聞沁人心脾的香氣,\n從而治癒我方全員的異常狀\n態", + }, + fakeTears: { + name: "假哭", + effect: "裝哭流淚。使對手不知所措,\n從而大幅降低對手的特防", + }, + airCutter: { + name: "空氣利刃", + effect: "用銳利的風切斬對手進行攻\n擊。容易擊中要害", + }, + overheat: { + name: "過熱", + effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", + }, + odorSleuth: { + name: "氣味偵測", + effect: "使出後對幽靈屬性寶可夢沒\n有效果的招式以及閃避率高\n的對手,變得能夠打中", + }, + rockTomb: { + name: "岩石封鎖", + effect: "投擲岩石進行攻擊。封住對\n手的行動,從而降低速度", + }, + silverWind: { + name: "銀色旋風", + effect: "在風中摻入鱗粉攻擊對手。\n有時會提高自己的全部能力", + }, + metalSound: { + name: "金屬音", + effect: "讓對手聽摩擦金屬般討厭的\n聲音。大幅降低對手的特防", + }, + grassWhistle: { + name: "草笛", + effect: "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態", + }, + tickle: { + name: "撓癢", + effect: "給對手撓癢,使其發笑,從\n而降低對手的攻擊和防禦", + }, + cosmicPower: { + name: "宇宙力量", + effect: "汲取宇宙中神祕的力量,從\n而提高自己的防禦和特防", + }, + waterSpout: { + name: "噴水", + effect: "掀起潮水進行攻擊。自己的\nHP越少,招式的威力越小", + }, + signalBeam: { + name: "信號光束", + effect: "發射神奇的光線進行攻擊。\n有時會使對手混亂", + }, + shadowPunch: { name: "暗影拳", effect: "使出混影之拳。攻擊必定會\n命中" }, + extrasensory: { + name: "神通力", + effect: "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮", + }, + skyUppercut: { + name: "沖天拳", + effect: "用衝向天空般高高的上勾拳\n頂起對手進行攻擊", + }, + sandTomb: { + name: "流沙深淵", + effect: "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊", + }, + sheerCold: { + name: "絕對零度", + effect: "給對手一擊昏厥。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中", + }, + muddyWater: { + name: "濁流", + effect: "向對手噴射渾濁的水進行攻\n擊。有時會降低對手的命中\n率", + }, + bulletSeed: { + name: "種子機關槍", + effect: "向對手猛烈地發射種子進行\n攻擊。連續攻擊2~5次", + }, + aerialAce: { + name: "燕返", + effect: "以敏捷的動作戲弄對手後進\n行切斬。攻擊必定會命中", + }, + icicleSpear: { + name: "冰錐", + effect: "向對手發射鋒利的冰柱進行\n攻擊。連續攻擊2~5次", + }, + ironDefense: { + name: "鐵壁", + effect: "將皮膚變得堅硬如鐵,從而\n大幅提高自己的防禦", + }, + block: { + name: "擋路", + effect: "張開雙手進行阻擋,封住對\n手的退路,使其不能逃走", + }, + howl: { + name: "長嚎", + effect: "大聲吼叫提高氣勢,從而提\n高自己和同伴的攻擊", + }, + dragonClaw: { name: "龍爪", effect: "用尖銳的巨爪劈開對手進行\n攻擊" }, + frenzyPlant: { + name: "瘋狂植物", + effect: "用大樹摔打對手進行攻擊。\n下一回合自己將無法動彈", + }, + bulkUp: { + name: "健美", + effect: "使出全身力氣繃緊肌肉,從\n而提高自己的攻擊和防禦", + }, + bounce: { + name: "彈跳", + effect: "彈跳到高高的空中,第2回\n合攻擊對手。有時會讓對手\n陷入麻痹狀態", + }, + mudShot: { + name: "泥巴射擊", + effect: "向對手投擲泥塊進行攻擊。\n同時降低對手的速度", + }, + poisonTail: { + name: "毒尾", + effect: "用尾巴拍打。有時會讓對手\n陷入中毒狀態,也容易擊中\n要害", + }, + covet: { + name: "渴望", + effect: "一邊可愛地撒嬌,一邊靠近\n對手進行攻擊,還能奪取對\n手攜帶的道具", + }, + voltTackle: { + name: "伏特攻擊", + effect: "讓電流覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入麻痹狀\n態", + }, + magicalLeaf: { + name: "魔法葉", + effect: "散落可以追蹤對手的神奇葉\n片。攻擊必定會命中", + }, + waterSport: { + name: "玩水", + effect: "用水溼透周圍。在5回合內\n減弱火屬性的招式", + }, + calmMind: { name: "冥想", effect: "靜心凝神,從而提高自己的\n特攻和特防" }, + leafBlade: { + name: "葉刃", + effect: "像用劍一般操縱葉片切斬對\n手進行攻擊。容易擊中要害", + }, + dragonDance: { + name: "龍之舞", + effect: "激烈地跳起神祕且強有力的\n舞蹈。從而提高自己的攻擊\n和速度", + }, + rockBlast: { + name: "岩石爆擊", + effect: "向對手發射堅硬的岩石進行\n攻擊。連續攻擊2~5次", + }, + shockWave: { + name: "電擊波", + effect: "向對手快速發出電擊。攻擊\n必定會命中", + }, + waterPulse: { + name: "水之波動", + effect: "用水的震動攻擊對手。有時\n會使對手混亂", + }, + doomDesire: { + name: "破滅之願", + effect: "使用招式2回合後,會用無\n數道光束攻擊對手", + }, + psychoBoost: { + name: "精神突進", + effect: "使出全部力量攻擊對手。使\n用之後會因爲反作用力,自\n己的特攻大幅降低", + }, + roost: { + name: "羽棲", + effect: "降到地面,使身體休息。回\n復自己最大HP的一半", + }, + gravity: { + name: "重力", + effect: "在5回合內,飄浮特性和飛\n行屬性的寶可夢會被地面屬\n性的招式擊中。飛向空中的\n招式也將無法使用", + }, + miracleEye: { + name: "奇蹟之眼", + effect: "使出後對惡屬性寶可夢沒有\n效果的招式以及閃避率高的\n對手,變得能夠打中", + }, + wakeUpSlap: { + name: "喚醒巴掌", + effect: "給予睡眠狀態下的對手較大\n的傷害。但相反對手會從睡\n眠中醒過來", + }, + hammerArm: { + name: "臂錘", + effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", + }, + gyroBall: { + name: "陀螺球", + effect: "讓身體高速旋轉並撞擊對手。\n速度比對手越慢,威力越\n大", + }, + healingWish: { + name: "治癒之願", + effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP", + }, + brine: { + name: "鹽水", + effect: "當對手的HP負傷到一半左\n右時,招式威力會變成2倍", + }, + naturalGift: { + name: "自然之恩", + effect: "從樹果上獲得力量進行攻擊。\n根據攜帶的樹果,招式屬\n性和威力會改變", + }, + feint: { + name: "佯攻", + effect: "能夠攻擊正在使用守住或看\n穿等招式的對手。解除其守\n護效果", + }, + pluck: { + name: "啄食", + effect: "用喙進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", + }, + tailwind: { + name: "順風", + effect: "颳起猛烈的旋風,在4回合\n內提高我方全員的速度", + }, + acupressure: { + name: "點穴", + effect: "通過點穴讓身體舒筋活絡。\n大幅提高某1項能力", + }, + metalBurst: { + name: "金屬爆炸", + effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", + }, + uTurn: { + name: "急速折返", + effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", + }, + closeCombat: { + name: "近身戰", + effect: "放棄守護,向對手的懷裏突\n擊。自己的防禦和特防會降\n低", + }, + payback: { + name: "以牙還牙", + effect: "蓄力攻擊。如果能在對手之\n後攻擊,招式的威力會變成\n2倍", + }, + assurance: { + name: "惡意追擊", + effect: "如果此回合內對手已經受到\n傷害的話,招式威力會變成\n2倍", + }, + embargo: { + name: "查封", + effect: "讓對手在5回合內不能使用\n寶可夢攜帶的道具。訓練家\n也不能給那隻寶可夢使用道\n具", + }, + fling: { + name: "投擲", + effect: "快速投擲攜帶的道具進行攻\n擊。根據道具不同,威力和\n效果會改變", + }, + psychoShift: { + name: "精神轉移", + effect: "利用超能力施以暗示,從而\n將自己受到的異常狀態轉移\n給對手", + }, + trumpCard: { + name: "王牌", + effect: "王牌招式的剩餘PP越少,\n招式的威力越大", + }, + healBlock: { + name: "回覆封鎖", + effect: "在5回合內無法通過招式、\n特性或攜帶的道具來回復H\nP", + }, + wringOut: { + name: "絞緊", + effect: "用力勒緊對手進行攻擊。對\n手的HP越多,威力越大", + }, + powerTrick: { + name: "力量戲法", + effect: "利用超能力交換自己的攻擊\n和防禦的力量", + }, + gastroAcid: { + name: "胃液", + effect: "將胃液吐向對手的身體。沾\n上的胃液會消除對手的特性\n效果", + }, + luckyChant: { + name: "幸運咒語", + effect: "向天許願,從而在5回合內\n不會被對手的攻擊打中要害", + }, + meFirst: { + name: "搶先一步", + effect: "提高威力,搶先使出對手想\n要使出的招式。如果不先使\n出則會失敗", + }, + copycat: { + name: "仿效", + effect: "模仿對手剛纔使出的招式,\n並使出相同招式。如果對手\n還沒出招則會失敗", + }, + powerSwap: { + name: "力量互換", + effect: "利用超能力互換自己和對手\n的攻擊以及特攻的能力變化", + }, + guardSwap: { + name: "防守互換", + effect: "利用超能力互換自己和對手\n的防禦以及特防的能力變化", + }, + punishment: { + name: "懲罰", + effect: "根據能力變化,對手提高的\n力量越大,招式的威力越大", + }, + lastResort: { + name: "珍藏", + effect: "當戰鬥中已學會的招式全部\n使用過後,才能開始使出珍\n藏的招式", + }, + worrySeed: { + name: "煩惱種子", + effect: "種植心神不寧的種子。使對\n手不能入眠,並將特性變成\n不眠", + }, + suckerPunch: { + name: "突襲", + effect: "可以比對手先攻擊。對手使\n出的招式如果不是攻擊招式\n則會失敗", + }, + toxicSpikes: { + name: "毒菱", + effect: "在對手的腳下撒毒菱。使對\n手替換出場的寶可夢中毒", + }, + heartSwap: { + name: "心靈互換", + effect: "利用超能力互換自己和對手\n之間的能力變化", + }, + aquaRing: { + name: "水流環", + effect: "在自己身體的周圍覆蓋用水\n製造的幕。每回合回覆HP", + }, + magnetRise: { + name: "電磁飄浮", + effect: "利用電氣產生的磁力浮在空\n中。在5回合內可以飄浮", + }, + flareBlitz: { + name: "閃焰衝鋒", + effect: "讓火焰覆蓋全身猛撞向對手。\n自己也會受到不小的傷害。\n有時會讓對手陷入灼傷狀\n態", + }, + forcePalm: { + name: "發勁", + effect: "向對手的身體發出衝擊波進\n行攻擊。有時會讓對手陷入\n麻痹狀態", + }, + auraSphere: { + name: "波導彈", + effect: "從體內產生出波導之力,然\n後向對手發出。攻擊必定會\n命中", + }, + rockPolish: { + name: "岩石打磨", + effect: "打磨自己的身體,減少空氣\n阻力。可以大幅提高自己的\n速度", + }, + poisonJab: { + name: "毒擊", + effect: "用帶毒的觸手或手臂刺入對\n手。有時會讓對手陷入中毒\n狀態", + }, + darkPulse: { + name: "惡之波動", + effect: "從體內發出充滿惡意的恐怖\n氣場。有時會使對手畏縮", + }, + nightSlash: { + name: "暗襲要害", + effect: "抓住瞬間的空隙切斬對手。\n容易擊中要害", + }, + aquaTail: { + name: "水流尾", effect: "如驚濤駭浪般揮動大尾巴攻\n擊對手" + }, + seedBomb: { + name: "種子炸彈", + effect: "將外殼堅硬的大種子,從上\n方砸下攻擊對手", + }, + airSlash: { + name: "空氣之刃", + effect: "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮", + }, + xScissor: { + name: "十字剪", + effect: "將鐮刀或爪子像剪刀般地交\n叉,順勢劈開對手", + }, + bugBuzz: { + name: "蟲鳴", + effect: "利用振動發出音波進行攻擊。\n有時會降低對手的特防", + }, + dragonPulse: { + name: "龍之波動", + effect: "從大大的口中掀起衝擊波攻\n擊對手", + }, + dragonRush: { + name: "龍之俯衝", + effect: "釋放出駭人的殺氣,一邊威\n懾一邊撞擊對手。有時會使\n對手畏縮", + }, + powerGem: { + name: "力量寶石", effect: "發射如寶石般閃耀的光芒攻\n擊對手" + }, + drainPunch: { + name: "吸取拳", + effect: "用拳頭吸取對手的力量。可\n以回覆給予對手傷害的一半\nHP", + }, + vacuumWave: { + name: "真空波", + effect: "揮動拳頭,掀起真空波。必\n定能夠先制攻擊", + }, + focusBlast: { + name: "真氣彈", + effect: "提高氣勢,釋放出全部力量。\n有時會降低對手的特防", + }, + energyBall: { + name: "能量球", + effect: "發射從自然收集的生命力量。\n有時會降低對手的特防", + }, + braveBird: { + name: "勇鳥猛攻", + effect: "收攏翅膀,通過低空飛行突\n擊對手。自己也會受到不小\n的傷害", + }, + earthPower: { + name: "大地之力", + effect: "向對手腳下釋放出大地之力。\n有時會降低對手的特防", + }, + switcheroo: { + name: "掉包", + effect: "用一閃而過的速度交換自己\n和對手的持有物", + }, + gigaImpact: { + name: "終極衝擊", + effect: "使出自己渾身力量突擊對手。\n下一回合自己將無法動彈", + }, + nastyPlot: { + name: "詭計", + effect: "謀劃詭計,激活頭腦。大幅\n提高自己的特攻", + }, + bulletPunch: { + name: "子彈拳", + effect: "向對手使出如子彈般快速而\n堅硬的拳頭。必定能夠先制\n攻擊", + }, + avalanche: { + name: "雪崩", + effect: "如果受到對手的招式攻擊,\n就能給予該對手2倍威力的\n攻擊", + }, + iceShard: { + name: "冰礫", + effect: "瞬間製作冰塊,快速地扔向\n對手。必定能夠先制攻擊", + }, + shadowClaw: { + name: "暗影爪", + effect: "以影子做成的銳爪,劈開對\n手。容易擊中要害", + }, + thunderFang: { + name: "雷電牙", + effect: "用蓄滿電流的牙齒咬住對手。\n有時會使對手畏縮或陷入\n麻痹狀態", + }, + iceFang: { + name: "冰凍牙", + effect: "用藏有冷氣的牙齒咬住對手。\n有時會使對手畏縮或陷入\n冰凍狀態", + }, + fireFang: { + name: "火焰牙", + effect: "用覆蓋着火焰的牙齒咬住對\n手。有時會使對手畏縮或陷\n入灼傷狀態", + }, + shadowSneak: { + name: "影子偷襲", + effect: "伸長影子,從對手的背後進\n行攻擊。必定能夠先制攻擊", + }, + mudBomb: { + name: "泥巴炸彈", + effect: "向對手發射堅硬的泥彈進行\n攻擊。有時會降低對手的命\n中率", + }, + psychoCut: { + name: "精神利刃", + effect: "用實體化的心之利刃劈開對\n手。容易擊中要害", + }, + zenHeadbutt: { + name: "意念頭錘", + effect: "將思念的力量集中在前額進\n行攻擊。有時會使對手畏縮", + }, + mirrorShot: { + name: "鏡光射擊", + effect: "拋光自己的身體,向對手釋\n放出閃光之力。有時會降低\n對手的命中率", + }, + flashCannon: { + name: "加農光炮", + effect: "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防", + }, + rockClimb: { + name: "攀巖", + effect: "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一", + }, + defog: { + name: "清除濃霧", + effect: "用強風吹開對手的反射壁或\n光牆等。也會降低對手的閃\n避率", + }, + trickRoom: { + name: "戲法空間", + effect: "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動", + }, + dracoMeteor: { + name: "流星羣", + effect: "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低", + }, + discharge: { + name: "放電", + effect: "用耀眼的電擊攻擊自己周圍\n所有的寶可夢。有時會陷入\n麻痹狀態", + }, + lavaPlume: { + name: "噴煙", + effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", + }, + leafStorm: { + name: "飛葉風暴", + effect: "用尖尖的葉片向對手卷起風\n暴。使用之後因爲反作用力\n自己的特攻會大幅降低", + }, + powerWhip: { + name: "強力鞭打", + effect: "激烈地揮舞青藤或觸手摔打\n對手進行攻擊", + }, + rockWrecker: { + name: "岩石炮", + effect: "向對手發射巨大的岩石進行\n攻擊。下一回合自己將無法\n動彈", + }, + crossPoison: { + name: "十字毒刃", + effect: "用毒刃劈開對手。有時會讓\n對手陷入中毒狀態,也容易\n擊中要害", + }, + gunkShot: { + name: "垃圾射擊", + effect: "用骯髒的垃圾撞向對手進行\n攻擊。有時會讓對手陷入中\n毒狀態", + }, + ironHead: { + name: "鐵頭", + effect: "用鋼鐵般堅硬的頭部進行攻\n擊。有時會使對手畏縮", + }, + magnetBomb: { + name: "磁鐵炸彈", + effect: "發射吸住對手的鋼鐵炸彈。\n攻擊必定會命中", + }, + stoneEdge: { + name: "尖石攻擊", + effect: "用尖尖的岩石刺入對手進行\n攻擊。容易擊中要害", + }, + captivate: { + name: "誘惑", + effect: "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻", + }, + stealthRock: { + name: "隱形巖", + effect: "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害", + }, + grassKnot: { + name: "打草結", + effect: "用草纏住並絆倒對手。對手\n越重,威力越大", + }, + chatter: { + name: "喋喋不休", + effect: "用非常煩人的,喋喋不休的\n音波攻擊對手。使對手混亂", + }, + judgment: { + name: "制裁光礫", + effect: "向對手放出無數的光彈。屬\n性會根據自己攜帶的石板不\n同而改變", + }, + bugBite: { + name: "蟲咬", + effect: "咬住進行攻擊。當對手攜帶\n樹果時,可以食用並獲得其\n效果", + }, + chargeBeam: { + name: "充電光束", + effect: "向對手發射電擊光束。由於\n蓄滿電流,有時會提高自己\n的特攻", + }, + woodHammer: { + name: "木槌", + effect: "用堅硬的軀體撞擊對手進行\n攻擊。自己也會受到不小的\n傷害", + }, + aquaJet: { + name: "水流噴射", + effect: "以迅雷不及掩耳之勢撲向對\n手。必定能夠先制攻擊", + }, + attackOrder: { + name: "攻擊指令", + effect: "召喚手下,讓其朝對手發起\n攻擊。容易擊中要害", + }, + defendOrder: { + name: "防禦指令", + effect: "召喚手下,讓其附在自己的\n身體上。可以提高自己的防\n御和特防", + }, + healOrder: { + name: "回覆指令", + effect: "召喚手下療傷。回覆自己最\n大HP的一半", + }, + headSmash: { + name: "雙刃頭錘", + effect: "拼命使出渾身力氣,向對手\n進行頭錘攻擊。自己也會受\n到非常大的傷害", + }, + doubleHit: { + name: "二連擊", + effect: "使用尾巴等拍打對手進行攻\n擊。連續2次給予傷害", + }, + roarOfTime: { + name: "時光咆哮", + effect: "釋放出扭曲時間般的強大力\n量攻擊對手。下一回合自己\n將無法動彈", + }, + spacialRend: { + name: "亞空裂斬", + effect: "將對手連同周圍的空間一起\n撕裂並給予傷害。容易擊中\n要害", + }, + lunarDance: { + name: "新月舞", + effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的全\n部狀態", + }, + crushGrip: { + name: "捏碎", + effect: "用駭人的力量捏碎對手。對\n手剩餘的HP越多,威力越\n大", + }, + magmaStorm: { + name: "熔岩風暴", + effect: "將對手困在熊熊燃燒的火焰\n中,在4~5回合內進行攻\n擊", + }, + darkVoid: { + name: "暗黑洞", + effect: "將對手強制拖入黑暗的世界,\n從而讓對手陷入睡眠狀態", + }, + seedFlare: { + name: "種子閃光", + effect: "從身體裏產生衝擊波。有時\n會大幅降低對手的特防", + }, + ominousWind: { + name: "奇異之風", + effect: "突然颳起毛骨悚然的暴風攻\n擊對手。有時會提高自己的\n全部能力", + }, + shadowForce: { + name: "暗影潛襲", + effect: "第1回合消失蹤影,第2回\n合攻擊對手。即使對手正受\n保護,也能擊中", + }, + honeClaws: { + name: "磨爪", + effect: "將爪子磨得更加鋒利。提高\n自己的攻擊和命中率", + }, + wideGuard: { + name: "廣域防守", + effect: "在1回合內防住擊打我方全\n員的攻擊", + }, + guardSplit: { + name: "防守平分", + effect: "利用超能力將自己和對手的\n防禦和特防相加,再進行平\n分", + }, + powerSplit: { + name: "力量平分", + effect: "利用超能力將自己和對手的\n攻擊和特攻相加,再進行平\n分", + }, + wonderRoom: { + name: "奇妙空間", + effect: "製造出離奇的空間。在5回\n合內互換所有寶可夢的防禦\n和特防", + }, + psyshock: { + name: "精神衝擊", + effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", + }, + venoshock: { + name: "毒液衝擊", + effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,威力\n會變成2倍", + }, + autotomize: { + name: "身體輕量化", + effect: "削掉身體上沒用的部分。大\n幅提高自己的速度,同時體\n重也會變輕", + }, + ragePowder: { + name: "憤怒粉", + effect: "將令人煩躁的粉末撒在自己\n身上,用以吸引對手的注意。\n使對手的攻擊全部指向自\n己", + }, + telekinesis: { + name: "意念移物", + effect: "利用超能力使對手浮起來。\n在3回合內攻擊會變得容易\n打中對手", + }, + magicRoom: { + name: "魔法空間", + effect: "製造出離奇的空間。在5回\n合內所有寶可夢攜帶道具的\n效果都會消失", + }, + smackDown: { + name: "擊落", + effect: "扔石頭或炮彈,攻擊飛行的\n對手。對手會被擊落,掉到\n地面", + }, + stormThrow: { + name: "山嵐摔", + effect: "向對手使出強烈的一擊。攻\n擊必定會擊中要害", + }, + flameBurst: { + name: "烈焰濺射", + effect: "如果擊中,爆裂的火焰會攻\n擊到對手。爆裂出的火焰還\n會飛濺到旁邊的對手", + }, + sludgeWave: { + name: "污泥波", + effect: "用污泥波攻擊自己周圍所有\n的寶可夢。有時會陷入中毒\n狀態", + }, + quiverDance: { + name: "蝶舞", + effect: "輕巧地跳起神祕而又美麗的\n舞蹈。提高自己的特攻、特\n防和速度", + }, + heavySlam: { + name: "重磅衝撞", + effect: "用沉重的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", + }, + synchronoise: { + name: "同步干擾", + effect: "用神奇電波對周圍所有和自\n己屬性相同的寶可夢給予傷\n害", + }, + electroBall: { + name: "電球", + effect: "用電氣團撞向對手。自己比\n對手速度越快,威力越大", + }, + soak: { + name: "浸水", effect: "將大量的水潑向對手,從而\n使其變成水屬性" + }, + flameCharge: { + name: "蓄能焰襲", + effect: "讓火焰覆蓋全身,攻擊對手。\n積蓄力量來提高自己的速\n度", + }, + coil: { + name: "盤蜷", + effect: "盤蜷着集中精神。提高自己\n的攻擊、防禦和命中率", + }, + lowSweep: { + name: "下盤踢", + effect: "以敏捷的動作瞄準對手的腳\n進行攻擊。會降低對手的速\n度", + }, + acidSpray: { + name: "酸液炸彈", + effect: "噴出能溶化對手的液體進行\n攻擊。會大幅降低對手的特\n防", + }, + foulPlay: { + name: "欺詐", + effect: "利用對手的力量進行攻擊。\n正和自己戰鬥的對手,其攻\n擊越高,傷害越大", + }, + simpleBeam: { + name: "單純光束", + effect: "向對手發送謎之念波。接收\n到念波的對手,其特性會變\n爲單純", + }, + entrainment: { + name: "找夥伴", + effect: "用神奇的節奏跳舞。使對手\n模仿自己的動作,從而將特\n性變成一樣", + }, + afterYou: { + name: "您先請", + effect: "支援我方或對手的行動,使\n其緊接着此招式之後行動", + }, + round: { + name: "輪唱", + effect: "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高", + }, + echoedVoice: { + name: "回聲", + effect: "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高", + }, + chipAway: { + name: "逐步擊破", + effect: "看準機會穩步攻擊。無視對\n手的能力變化,直接給予傷\n害", + }, + clearSmog: { + name: "清除之煙", + effect: "向對手投擲特殊的泥塊進行\n攻擊。使其能力變回原點", + }, + storedPower: { + name: "輔助力量", + effect: "用蓄積起來的力量攻擊對手。\n自己的能力提高得越多,\n威力就越大", + }, + quickGuard: { + name: "快速防守", + effect: "守護自己和同伴,以防對手\n的先制攻擊", + }, + allySwitch: { + name: "交換場地", + effect: "用神奇的力量瞬間移動,互\n換自己和同伴所在的位置。\n連續使出則容易失敗", + }, + scald: { + name: "熱水", + effect: "向對手噴射煮得翻滾的開水\n進行攻擊。有時會讓對手陷\n入灼傷狀態", + }, + shellSmash: { + name: "破殼", + effect: "打破外殼,降低自己的防禦\n和特防,但大幅提高攻擊、\n特攻和速度", + }, + healPulse: { + name: "治癒波動", + effect: "放出治癒波動,從而回復對\n手最大HP的一半", + }, + hex: { + name: "禍不單行", + effect: "接二連三地進行攻擊。對處\n於異常狀態的對手給予較大\n的傷害", + }, + skyDrop: { + name: "自由落體", + effect: "第1回合將對手帶到空中,\n第2回合將其摔下進行攻擊。\n被帶到空中的對手不能動\n彈", + }, + shiftGear: { + name: "換檔", + effect: "轉動齒輪,不僅提高自己的\n攻擊,還會大幅提高速度", + }, + circleThrow: { + name: "巴投", + effect: "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", + }, + incinerate: { + name: "燒淨", + effect: "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用", + }, + quash: { + name: "延後", effect: "壓制對手,從而將其行動順\n序放到最後" + }, + acrobatics: { + name: "雜技", + effect: "輕巧地攻擊對手。自己沒有\n攜帶道具時,會給予較大的\n傷害", + }, + reflectType: { + name: "鏡面屬性", + effect: "反射對手的屬性,讓自己也\n變成一樣的屬性", + }, + retaliate: { + name: "報仇", + effect: "爲倒下的同伴報仇。如果上\n一回合有同伴倒下,威力就\n會提高", + }, + finalGambit: { + name: "搏命", + effect: "拼命攻擊對手。雖然自己陷\n入昏厥,但會給予對手和自\n己目前HP等量的傷害", + }, + bestow: { + name: "傳遞禮物", + effect: "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手", + }, + inferno: { + name: "烈火深淵", + effect: "用烈焰包裹住對手進行攻擊。\n讓對手陷入灼傷狀態", + }, + waterPledge: { + name: "水之誓約", + effect: "用水柱進行攻擊。如果和火\n組合,威力就會提高,天空\n中會掛上彩虹", + }, + firePledge: { + name: "火之誓約", + effect: "用火柱進行攻擊。如果和草\n組合,威力就會提高,周圍\n會變成火海", + }, + grassPledge: { + name: "草之誓約", + effect: "用草柱進行攻擊。如果和水\n組合,威力就會提高,周圍\n會變成溼地", + }, + voltSwitch: { + name: "伏特替換", + effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", + }, + struggleBug: { + name: "蟲之抵抗", + effect: "抵抗並攻擊對手。會降低對\n手的特攻", + }, + bulldoze: { + name: "重踏", + effect: "用力踩踏地面並攻擊自己周\n圍所有的寶可夢。會降低對\n方的速度", + }, + frostBreath: { + name: "冰息", + effect: "將冰冷的氣息吹向對手進行\n攻擊。必定會擊中要害", + }, + dragonTail: { + name: "龍尾", + effect: "彈飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", + }, + workUp: { + name: "自我激勵", effect: "激勵自己,從而提高攻擊和\n特攻" + }, + electroweb: { + name: "電網", + effect: "用電網捉住對手進行攻擊。\n會降低對手的速度", + }, + wildCharge: { + name: "瘋狂伏特", + effect: "讓電流覆蓋全身,撞向對手\n進行攻擊。自己也會受到少\n許傷害", + }, + drillRun: { + name: "直衝鑽", + effect: "像鋼鑽一樣,一邊旋轉身體\n一邊撞擊對手。容易擊中要\n害", + }, + dualChop: { + name: "二連劈", + effect: "用身體堅硬的部分拍打對手\n進行攻擊。連續2次給予傷\n害", + }, + heartStamp: { + name: "愛心印章", + effect: "以可愛的動作使對手疏忽,\n乘機給出強烈的一擊。有時\n會使對手畏縮", + }, + hornLeech: { + name: "木角", + effect: "將角刺入,吸取對手的養分。\n可以回覆給予對手傷害的\n一半HP", + }, + sacredSword: { + name: "聖劍", + effect: "用劍切斬對手進行攻擊。無\n視對手的能力變化,直接給\n予傷害", + }, + razorShell: { + name: "貝殼刃", + effect: "用鋒利的貝殼切斬對手進行\n攻擊。有時會降低對手的防\n御", + }, + heatCrash: { + name: "高溫重壓", + effect: "用燃燒的身體撞向對手進行\n攻擊。自己比對手越重,威\n力越大", + }, + leafTornado: { + name: "青草攪拌器", + effect: "用鋒利的葉片包裹住對手進\n行攻擊。有時會降低對手的\n命中率", + }, + steamroller: { + name: "瘋狂滾壓", + effect: "旋轉揉成團的身體壓扁對手。\n有時會使對手畏縮", + }, + cottonGuard: { + name: "棉花防守", + effect: "用軟綿綿的絨毛包裹住自己\n的身體進行守護。巨幅提高\n自己的防禦", + }, + nightDaze: { + name: "暗黑爆破", + effect: "放出黑暗的衝擊波攻擊對手。\n有時會降低對手的命中率", + }, + psystrike: { + name: "精神擊破", + effect: "將神奇的念波實體化攻擊對\n手。給予物理傷害", + }, + tailSlap: { + name: "掃尾拍打", + effect: "用堅硬的尾巴拍打對手進行\n攻擊。連續攻擊2~5次", + }, + hurricane: { + name: "暴風", + effect: "用強烈的風席捲對手進行攻\n擊。有時會使對手混亂", + }, + headCharge: { + name: "爆炸頭突擊", + effect: "用厲害的爆炸頭猛撞向對手\n進行攻擊。自己也會受到少\n許傷害", + }, + gearGrind: { + name: "齒輪飛盤", + effect: "向對手投擲鋼鐵齒輪進行攻\n擊。連續2次給予傷害", + }, + searingShot: { + name: "火焰彈", + effect: "用熊熊烈火攻擊自己周圍所\n有的寶可夢。有時會陷入灼\n傷狀態", + }, + technoBlast: { + name: "高科技光炮", + effect: "向對手放出光彈。屬性會根\n據自己攜帶的卡帶不同而改\n變", + }, + relicSong: { + name: "古老之歌", + effect: "讓對手聽古老之歌,打動對\n手的內心進行攻擊。有時會\n讓對手陷入睡眠狀態", + }, + secretSword: { + name: "神祕之劍", + effect: "用長角切斬對手進行攻擊。\n角上擁有的神奇力量將給予\n物理傷害", + }, + glaciate: { + name: "冰封世界", + effect: "將冰凍的冷氣吹向對手進行\n攻擊。會降低對手的速度", + }, + boltStrike: { + name: "雷擊", + effect: "讓強大的電流覆蓋全身,猛\n撞向對手進行攻擊。有時會\n讓對手陷入麻痹狀態", + }, + blueFlare: { + name: "青焰", + effect: "用美麗而激烈的青焰包裹住\n對手進行攻擊。有時會讓對\n手陷入灼傷狀態", + }, + fieryDance: { + name: "火之舞", + effect: "讓火焰覆蓋全身,振翅攻擊\n對手。有時會提高自己的特\n攻", + }, + freezeShock: { + name: "冰凍伏特", + effect: "用覆蓋着電流的冰塊,在第\n2回合撞向對手。有時會讓\n對手陷入麻痹狀態", + }, + iceBurn: { + name: "極寒冷焰", + effect: "用能夠凍結一切的強烈冷氣,\n在第2回合包裹住對手。\n有時會讓對手陷入灼傷狀態", + }, + snarl: { + name: "大聲咆哮", + effect: "沒完沒了地大聲斥責,從而\n降低對手的特攻", + }, + icicleCrash: { + name: "冰柱墜擊", + effect: "用大冰柱激烈地撞向對手進\n行攻擊。有時會使對手畏縮", + }, + vCreate: { + name: "V熱焰", + effect: "從前額產生灼熱的火焰,舍\n身撞擊對手。防禦、特防和\n速度會降低", + }, + fusionFlare: { + name: "交錯火焰", + effect: "釋放出巨大的火焰。受到巨\n大的閃電影響時,招式威力\n會提高", + }, + fusionBolt: { + name: "交錯閃電", + effect: "釋放出巨大的閃電。受到巨\n大的火焰影響時,招式威力\n會提高", + }, + flyingPress: { + name: "飛身重壓", + effect: "從空中俯衝向對手。此招式\n同時帶有格鬥屬性和飛行屬\n性", + }, + matBlock: { + name: "掀榻榻米", + effect: "將掀起來的榻榻米當作盾牌,\n防住自己和同伴免受招式\n傷害。變化招式無法防住", + }, + belch: { + name: "打嗝", + effect: "朝着對手打嗝,並給予傷害。\n如果不喫樹果則無法使出", + }, + rototiller: { + name: "耕地", + effect: "翻耕土地,使草木更容易成\n長。會提高草屬性寶可夢的\n攻擊和特攻", + }, + stickyWeb: { + name: "黏黏網", + effect: "在對手周圍圍上黏黏的網,\n降低替換出場的對手的速度", + }, + fellStinger: { + name: "致命針刺", + effect: "如果使用此招式打倒對手,\n攻擊會巨幅提高", + }, + phantomForce: { + name: "潛靈奇襲", + effect: "第1回合消失在某處,第2\n回合攻擊對手。可以無視守\n護進行攻擊", + }, + trickOrTreat: { + name: "萬聖夜", + effect: "邀請對手參加萬聖夜。使對\n手被追加幽靈屬性", + }, + nobleRoar: { + name: "戰吼", + effect: "發出戰吼威嚇對手,從而降\n低對手的攻擊和特攻", + }, + ionDeluge: { + name: "等離子浴", + effect: "將帶電粒子擴散開來,使一\n般屬性的招式變成電屬性", + }, + parabolicCharge: { + name: "拋物面充電", + effect: "給周圍全體寶可夢造成傷害。\n可以回覆給予傷害的一半\nHP", + }, + forestsCurse: { + name: "森林咒術", + effect: "向對手施加森林咒術。中了\n咒術的對手會被追加草屬性", + }, + petalBlizzard: { + name: "落英繽紛", + effect: "猛烈地颳起飛雪般的落花,\n攻擊周圍所有的寶可夢,並\n給予傷害", + }, + freezeDry: { + name: "冷凍乾燥", + effect: "急劇冷凍對手,有時會讓對\n手陷入冰凍狀態。對於水屬\n性寶可夢也是效果絕佳", + }, + disarmingVoice: { + name: "魅惑之聲", + effect: "發出魅惑的叫聲,給予對手\n精神上的傷害。攻擊必定會\n命中", + }, + partingShot: { + name: "拋下狠話", + effect: "拋下狠話威嚇對手,降低攻\n擊和特攻後,和後備寶可夢\n進行替換", + }, + topsyTurvy: { + name: "顛倒", + effect: "顛倒對手身上的所有能力變\n化,變成和原來相反的狀態", + }, + drainingKiss: { + name: "吸取之吻", + effect: "用一個吻吸取對手的HP。\n回覆給予對手傷害的一半以\n上的HP", + }, + craftyShield: { + name: "戲法防守", + effect: "使用神奇的力量防住攻擊我\n方的變化招式。但無法防住\n傷害招式的攻擊", + }, + flowerShield: { + name: "鮮花防守", + effect: "使用神奇的力量提高在場的\n所有草屬性寶可夢的防禦", + }, + grassyTerrain: { + name: "青草場地", + effect: "在5回合內變成青草場地。\n地面上的寶可夢每回合都能\n回覆。草屬性的招式威力還\n會提高", + }, + mistyTerrain: { + name: "薄霧場地", + effect: "在5回合內,地面上的寶可\n夢不會陷入異常狀態。龍屬\n性招式的傷害也會減半", + }, + electrify: { + name: "輸電", + effect: "對手使出招式前,如果輸電,\n則該回合對手的招式變成\n電屬性", + }, + playRough: { + name: "嬉鬧", + effect: "與對手嬉鬧並攻擊。有時會\n降低對手的攻擊", + }, + fairyWind: { + name: "妖精之風", effect: "颳起妖精之風,吹向對手進\n行攻擊" + }, + moonblast: { + name: "月亮之力", + effect: "借用月亮的力量攻擊對手。\n有時會降低對手的特攻", + }, + boomburst: { + name: "爆音波", + effect: "通過震耳欲聾的爆炸聲產生\n的破壞力,攻擊自己周圍所\n有的寶可夢", + }, + fairyLock: { + name: "妖精之鎖", + effect: "通過封鎖,下一回合所有的\n寶可夢都無法逃走", + }, + kingsShield: { + name: "王者盾牌", + effect: "防住對手攻擊的同時,自己\n變爲防禦姿態。能夠降低所\n接觸到的對手的攻擊", + }, + playNice: { + name: "和睦相處", + effect: "和對手和睦相處,使其失去\n戰鬥的氣力,從而降低對手\n的攻擊", + }, + confide: { + name: "密語", + effect: "和對手進行密語,使其失去\n集中力,從而降低對手的特\n攻", + }, + diamondStorm: { + name: "鑽石風暴", + effect: "掀起鑽石風暴給予傷害。有\n時會大幅提高自己的防禦", + }, + steamEruption: { + name: "蒸汽爆炸", + effect: "將滾燙的蒸汽噴向對手。有\n時會讓對手灼傷", + }, + hyperspaceHole: { + name: "異次元洞", + effect: "通過異次元洞,突然出現在\n對手的側面進行攻擊。還可\n以無視守住和看穿等招式", + }, + waterShuriken: { + name: "飛水手裏劍", + effect: "用粘液製成的手裏劍,連續\n攻擊2~5次。必定能夠先\n制攻擊", + }, + mysticalFire: { + name: "魔法火焰", + effect: "從口中噴出特別灼熱的火焰\n進行攻擊。降低對手的特攻", + }, + spikyShield: { + name: "尖刺防守", + effect: "防住對手攻擊的同時,削減\n接觸到自己的對手的體力", + }, + aromaticMist: { + name: "芳香薄霧", + effect: "通過神奇的芳香,提高我方\n寶可夢的特防", + }, + eerieImpulse: { + name: "怪異電波", + effect: "從身體放射出怪異電波,讓\n對手沐浴其中,從而大幅降\n低其特攻", + }, + venomDrench: { + name: "毒液陷阱", + effect: "將特殊的毒液潑向對手。對\n處於中毒狀態的對手,其攻\n擊、特攻和速度都會降低", + }, + powder: { + name: "粉塵", + effect: "如果被撒到粉塵的對手使用\n火招式,則會爆炸並給予傷\n害", + }, + geomancy: { + name: "大地掌控", + effect: "第1回合吸收能量,第2回\n合大幅提高特攻、特防和速\n度", + }, + magneticFlux: { + name: "磁場操控", + effect: "通過操控磁場,會提高特性\n爲正電和負電的寶可夢的防\n御和特防", + }, + happyHour: { + name: "歡樂時光", + effect: "如果使用歡樂時光,戰鬥後\n得到的錢會翻倍", + }, + electricTerrain: { + name: "電氣場地", + effect: "在5回合內變成電氣場地。\n地面上的寶可夢將無法入眠。\n電屬性的招式威力還會提\n高", + }, + dazzlingGleam: { name: "魔法閃耀", effect: "向對手發射強光,並給予傷\n害" }, + celebrate: { name: "慶祝", effect: "寶可夢爲十分開心的你慶祝" }, + holdHands: { + name: "牽手", + effect: "我方寶可夢之間牽手。能帶\n來非常幸福的心情", + }, + babyDollEyes: { + name: "圓瞳", + effect: "用圓瞳凝視對手,從而降低\n其攻擊。必定能夠先制攻擊", + }, + nuzzle: { + name: "蹭蹭臉頰", + effect: "將帶電的臉頰蹭蹭對手進行\n攻擊。讓對手陷入麻痹狀態", + }, + holdBack: { + name: "手下留情", + effect: "在攻擊的時候手下留情,從\n而使對手的HP至少會留下\n1HP", + }, + infestation: { + name: "糾纏不休", + effect: "在4~5回合內死纏爛打地\n進行攻擊。在此期間對手將\n無法逃走", + }, + powerUpPunch: { + name: "增強拳", + effect: "通過反覆擊打對手,使自己\n的拳頭慢慢變硬。打中對手\n攻擊就會提高", + }, + oblivionWing: { + name: "歸天之翼", + effect: "從鎖定的對手身上吸取HP。\n回覆給予對手傷害的一半\n以上的HP", + }, + thousandArrows: { + name: "千箭齊發", + effect: "可以擊中浮在空中的寶可夢。\n空中的對手被擊落後,會\n掉到地面", + }, + thousandWaves: { + name: "千波激盪", + effect: "從地面掀起波浪進行攻擊。\n被掀入波浪中的對手,將無\n法從戰鬥中逃走", + }, + landsWrath: { + name: "大地神力", + effect: "聚集大地的力量,將此力量\n集中攻擊對手,並給予傷害", + }, + lightOfRuin: { + name: "破滅之光", + effect: "借用永恆之花的力量,發射\n出強力光線。自己也會受到\n非常大的傷害", + }, + originPulse: { + name: "根源波動", + effect: "用無數青白色且閃耀的光線\n攻擊對手", + }, + precipiceBlades: { + name: "斷崖之劍", + effect: "將大地的力量變化爲利刃攻\n擊對手", + }, + dragonAscent: { + name: "畫龍點睛", + effect: "從天空中急速下降攻擊對手。\n自己的防禦和特防會降低", + }, + hyperspaceFury: { + name: "異次元猛攻", + effect: "用許多手臂,無視對手的守\n住或看穿等招式進行連續攻\n擊,自己的防禦會降低", + }, + breakneckBlitzPhysical: { + name: "一般Z究極無敵大沖撞", + effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", + }, + breakneckBlitzSpecial: { + name: "一般Z究極無敵大沖撞", + effect: "通過Z力量氣勢猛烈地全力\n撞上對手。威力會根據原來\n的招式而改變", + }, + allOutPummelingPhysical: { + name: "格鬥Z全力無雙激烈拳", + effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", + }, + allOutPummelingSpecial: { + name: "格鬥Z全力無雙激烈拳", + effect: "通過Z力量製造出能量彈,\n全力撞向對手。威力會根據\n原來的招式而改變", + }, + supersonicSkystrikePhysical: { + name: "飛行Z極速俯衝轟烈撞", + effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", + }, + supersonicSkystrikeSpecial: { + name: "飛行Z極速俯衝轟烈撞", + effect: "通過Z力量猛烈地飛向天空,\n朝對手全力落下。威力會\n根據原來的招式而改變", + }, + acidDownpourPhysical: { + name: "毒Z強酸劇毒滅絕雨", + effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", + }, + acidDownpourSpecial: { + name: "毒Z強酸劇毒滅絕雨", + effect: "通過Z力量使毒沼湧起,全\n力讓對手沉下去。威力會根\n據原來的招式而改變", + }, + tectonicRagePhysical: { + name: "地面Z地隆嘯天大終結", + effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", + }, + tectonicRageSpecial: { + name: "地面Z地隆嘯天大終結", + effect: "通過Z力量潛入地裏最深處,\n全力撞上對手。威力會根\n據原來的招式而改變", + }, + continentalCrushPhysical: { + name: "岩石Z毀天滅地巨巖墜", + effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", + }, + continentalCrushSpecial: { + name: "岩石Z毀天滅地巨巖墜", + effect: "通過Z力量召喚大大的巖山,\n全力撞向對手。威力會根\n據原來的招式而改變", + }, + savageSpinOutPhysical: { + name: "蟲Z絕對捕食迴旋斬", + effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", + }, + savageSpinOutSpecial: { + name: "蟲Z絕對捕食迴旋斬", + effect: "通過Z力量將吐出的絲線全\n力束縛對手。威力會根據原\n來的招式而改變", + }, + neverEndingNightmarePhysical: { + name: "幽靈Z無盡暗夜之誘惑", + effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", + }, + neverEndingNightmareSpecial: { + name: "幽靈Z無盡暗夜之誘惑", + effect: "通過Z力量召喚強烈的怨念,\n全力降臨到對手身上。威\n力會根據原來的招式而改變", + }, + corkscrewCrashPhysical: { + name: "鋼Z超絕螺旋連擊", + effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", + }, + corkscrewCrashSpecial: { + name: "鋼Z超絕螺旋連擊", + effect: "通過Z力量進行高速旋轉,\n全力撞上對手。威力會根據\n原來的招式而改變", + }, + infernoOverdrivePhysical: { + name: "火Z超強極限爆焰彈", + effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", + }, + infernoOverdriveSpecial: { + name: "火Z超強極限爆焰彈", + effect: "通過Z力量噴出熊熊烈火,\n全力撞向對手。威力會根據\n原來的招式而改變", + }, + hydroVortexPhysical: { + name: "水Z超級水流大漩渦", + effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", + }, + hydroVortexSpecial: { + name: "水Z超級水流大漩渦", + effect: "通過Z力量製造大大的潮旋,\n全力吞沒對手。威力會根\n據原來的招式而改變", + }, + bloomDoomPhysical: { + name: "草Z絢爛繽紛花怒放", + effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", + }, + bloomDoomSpecial: { + name: "草Z絢爛繽紛花怒放", + effect: "通過Z力量藉助花草的能量,\n全力攻擊對手。威力會根\n據原來的招式而改變", + }, + gigavoltHavocPhysical: { + name: "電Z終極伏特狂雷閃", + effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", + }, + gigavoltHavocSpecial: { + name: "電Z終極伏特狂雷閃", + effect: "通過Z力量將蓄積的強大電\n流全力撞向對手。威力會根\n據原來的招式而改變", + }, + shatteredPsychePhysical: { + name: "超能力Z至高精神破壞波", + effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", + }, + shatteredPsycheSpecial: { + name: "超能力Z至高精神破壞波", + effect: "通過Z力量操縱對手,全力\n使其感受到痛苦。威力會根\n據原來的招式而改變", + }, + subzeroSlammerPhysical: { + name: "冰Z激狂大地萬里冰", + effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", + }, + subzeroSlammerSpecial: { + name: "冰Z激狂大地萬里冰", + effect: "通過Z力量急劇降低氣溫,\n全力冰凍對手。威力會根據\n原來的招式而改變", + }, + devastatingDrakePhysical: { + name: "龍Z究極巨龍震天地", + effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", + }, + devastatingDrakeSpecial: { + name: "龍Z究極巨龍震天地", + effect: "通過Z力量將氣場實體化,\n向對手全力發動襲擊。威力\n會根據原來的招式而改變", + }, + blackHoleEclipsePhysical: { + name: "惡Z黑洞吞噬萬物滅", + effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", + }, + blackHoleEclipseSpecial: { + name: "惡Z黑洞吞噬萬物滅", + effect: "通過Z力量收集惡能量,全\n力將對手吸入。威力會根據\n原來的招式而改變", + }, + twinkleTacklePhysical: { + name: "妖精Z可愛星星飛天撞", + effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", + }, + twinkleTackleSpecial: { + name: "妖精Z可愛星星飛天撞", + effect: "通過Z力量製造魅惑空間,\n全力捉弄對手。威力會根據\n原來的招式而改變", + }, + catastropika: { + name: "皮卡丘Z皮卡皮卡必殺擊", + effect: "通過Z力量,皮卡丘全身覆\n蓋最強電力,全力猛撲對手", + }, + shoreUp: { + name: "集沙", + effect: "回覆自己最大HP的一半。\n在沙暴中回覆得更多", + }, + firstImpression: { + name: "迎頭一擊", + effect: "威力很高的招式,但只有在\n出場戰鬥時,立刻使出才能\n成功", + }, + banefulBunker: { + name: "碉堡", + effect: "防住對手攻擊的同時,讓接\n觸到自己的對手中毒", + }, + spiritShackle: { + name: "縫影", + effect: "攻擊的同時,縫住對手的影\n子,使其無法逃走", + }, + darkestLariat: { + name: "DD金勾臂", + effect: "旋轉雙臂打向對手。無視對\n手的能力變化,直接給予傷\n害", + }, + sparklingAria: { + name: "泡影的詠歎調", + effect: "隨着唱歌會放出很多氣球。\n受到此招式攻擊時,灼傷會\n被治癒", + }, + iceHammer: { + name: "冰錘", + effect: "揮舞強力而沉重的拳頭,給\n予對手傷害。自己的速度會\n降低", + }, + floralHealing: { + name: "花療", + effect: "回覆對手最大HP的一半。\n在青草場地時,效果會提高", + }, + highHorsepower: { name: "十萬馬力", effect: "使出全身力量,猛攻對手" }, + strengthSap: { + name: "吸取力量", + effect: "給自己回覆和對手攻擊力相\n同數值的HP,然後降低對\n手的攻擊", + }, + solarBlade: { + name: "日光刃", + effect: "第1回合收集滿滿的日光,\n第2回合將此力量集中在劍\n上進行攻擊", + }, + leafage: { name: "樹葉", effect: "將葉片打向對手,進行攻擊" }, + spotlight: { + name: "聚光燈", + effect: "給寶可夢打上聚光燈,該回\n合只能瞄準該寶可夢", + }, + toxicThread: { + name: "毒絲", + effect: "將混有毒的絲吐向對手。使\n其中毒,從而降低對手的速\n度", + }, + laserFocus: { name: "磨礪", effect: "集中精神,下次攻擊必定會\n擊中要害" }, + gearUp: { + name: "輔助齒輪", + effect: "啓動齒輪,提高特性爲正電\n和負電的寶可夢的攻擊和特\n攻", + }, + throatChop: { + name: "深淵突刺", + effect: "受到此招式攻擊的對手,會\n因爲地獄般的痛苦,在2回\n合內,變得無法使出聲音類\n招式", + }, + pollenPuff: { + name: "花粉團", + effect: "對敵人使用是會爆炸的糰子。\n對我方使用則是給予回覆\n的糰子", + }, + anchorShot: { + name: "擲錨", + effect: "將錨纏住對手進行攻擊。使\n對手無法逃走", + }, + psychicTerrain: { + name: "精神場地", + effect: "在5回合內,地面上的寶可\n夢不會受到先制招式的攻擊。\n超能力屬性的招式威力會\n提高", + }, + lunge: { + name: "猛撲", + effect: "全力猛撲對手進行攻擊。從\n而降低對手的攻擊", + }, + fireLash: { + name: "火焰鞭", + effect: "用燃燒的鞭子抽打對手。受\n到攻擊的對手防禦會降低", + }, + powerTrip: { + name: "囂張", + effect: "耀武揚威地攻擊對手,自己\n的能力提高得越多,威力就\n越大", + }, + burnUp: { + name: "燃盡", + effect: "將自己全身燃燒起火焰來,\n給予對手大大的傷害。自己\n的火屬性將會消失", + }, + speedSwap: { name: "速度互換", effect: "將對手和自己的速度進行互\n換" }, + smartStrike: { + name: "修長之角", + effect: "用尖尖的角刺入對手進行攻\n擊。攻擊必定會命中", + }, + purify: { + name: "淨化", + effect: "治癒對手的異常狀態。治癒\n後可以回覆自己的HP", + }, + revelationDance: { + name: "覺醒之舞", + effect: "全力跳舞進行攻擊。此招式\n的屬性將變得和自己的屬性\n相同", + }, + coreEnforcer: { + name: "核心懲罰者", + effect: "如果給予過傷害的對手已經\n結束行動,其特性就會被消\n除", + }, + tropKick: { + name: "熱帶踢", + effect: "向對手使出來自南國的火熱\n腳踢。從而降低對手的攻擊", + }, + instruct: { + name: "號令", + effect: "向對手下達指示,讓其再次\n使出剛纔的招式", + }, + beakBlast: { + name: "鳥嘴加農炮", + effect: "先加熱鳥嘴後再進行攻擊。\n鳥嘴在加熱時對手觸碰的話,\n就會使其灼傷", + }, + clangingScales: { + name: "鱗片噪音", + effect: "摩擦全身鱗片,發出響亮的\n聲音進行攻擊。攻擊後自己\n的防禦會降低", + }, + dragonHammer: { + name: "龍錘", + effect: "將身體當作錘子,向對手發\n動襲擊,給予傷害", + }, + brutalSwing: { + name: "狂舞揮打", + effect: "用自己的身體狂舞揮打,給\n予對手傷害", + }, + auroraVeil: { + name: "極光幕", + effect: "在5回合內減弱物理和特殊\n的傷害。只有下雪時才能使\n出", + }, + sinisterArrowRaid: { + name: "狙射樹梟Z遮天蔽日暗影箭", + effect: "通過Z力量製造出無數箭的\n狙射樹梟將全力射穿對手進\n行攻擊", + }, + maliciousMoonsault: { + name: "熾焰咆哮虎Z極惡飛躍粉碎擊", + effect: "通過Z力量得到強壯肉體的\n熾焰咆哮虎將全力撞向對手\n進行攻擊", + }, + oceanicOperetta: { + name: "西獅海壬Z海神莊嚴交響樂", + effect: "通過Z力量召喚大量水的西\n獅海壬將全力攻擊對手", + }, + guardianOfAlola: { + name: "卡璞Z巨人衛士・阿羅拉", + effect: "通過Z力量得到阿羅拉之力\n的土地神寶可夢將全力進行\n攻擊。對手的剩餘HP會減\n少很多", + }, + soulStealing7StarStrike: { + name: "瑪夏多Z七星奪魂腿", + effect: "得到Z力量的瑪夏多將全力\n使出拳頭和腳踢的連續招式\n叩打對手", + }, + stokedSparksurfer: { + name: "阿羅雷Z駕雷馭電戲衝浪", + effect: "得到Z力量的阿羅拉地區的\n雷丘將全力進行攻擊。從而\n讓對手陷入麻痹狀態", + }, + pulverizingPancake: { + name: "卡比獸Z認真起來大爆擊", + effect: "通過Z力量使得認真起來的\n卡比獸躍動巨大身軀,全力\n向對手發動襲擊", + }, + extremeEvoboost: { + name: "伊布Z九彩昇華齊聚頂", + effect: "得到Z力量的伊布將藉助進\n化後夥伴們的力量,大幅提\n高能力", + }, + genesisSupernova: { + name: "夢幻Z起源超新星大爆炸", + effect: "得到Z力量的夢幻將全力攻\n擊對手。腳下會變成精神場\n地", + }, + shellTrap: { + name: "陷阱甲殼", + effect: "設下甲殼陷阱。如果對手使\n出物理招式,陷阱就會爆炸\n並給予對手傷害", + }, + fleurCannon: { + name: "花朵加農炮", + effect: "放出強力光束後,自己的特\n攻會大幅降低", + }, + psychicFangs: { + name: "精神之牙", + effect: "利用精神力量咬住對手進行\n攻擊。還可以破壞光牆和反\n射壁等", + }, + stompingTantrum: { + name: "跺腳", + effect: "化悔恨爲力量進行攻擊。如\n果上一回合招式沒有打中,\n威力就會翻倍", + }, + shadowBone: { + name: "暗影之骨", + effect: "用附有靈魂的骨頭毆打對手\n進行攻擊。有時會降低對手\n的防禦", + }, + accelerock: { + name: "衝巖", + effect: "迅速撞向對手進行攻擊。必\n定能夠先制攻擊", + }, + liquidation: { + name: "水流裂破", + effect: "用水之力量撞向對手進行攻\n擊。有時會降低對手的防禦", + }, + prismaticLaser: { + name: "棱鏡鐳射", + effect: "用棱鏡的力量發射強烈光線。\n下一回合自己將無法動彈", + }, + spectralThief: { + name: "暗影偷盜", + effect: "潛入對手的影子進行攻擊。\n會奪取對手的能力提升", + }, + sunsteelStrike: { + name: "流星閃衝", + effect: "以流星般的氣勢猛撞對手。\n可以無視對手的特性進行攻\n擊", + }, + moongeistBeam: { + name: "暗影之光", + effect: "放出奇怪的光線攻擊對手。\n可以無視對手的特性進行攻\n擊", + }, + tearfulLook: { + name: "淚眼汪汪", + effect: "變得淚眼汪汪,讓對手喪失\n鬥志。從而降低對手的攻擊\n和特攻", + }, + zingZap: { + name: "麻麻刺刺", + effect: "撞向對手,併發出強電,使\n其感到麻麻刺刺的。有時會\n使對手畏縮", + }, + naturesMadness: { + name: "自然之怒", + effect: "向對手釋放自然之怒。對手\n的HP會減半", + }, + multiAttack: { + name: "多屬性攻擊", + effect: "一邊覆蓋高能量,一邊撞向\n對手進行攻擊。根據存儲碟\n不同,屬性會改變", + }, + tenMillionVoltThunderbolt: { + name: "智皮卡Z千萬伏特", + effect: "戴着帽子的皮卡丘將通過Z\n力量增強的電擊全力釋放給\n對手。容易擊中要害", + }, + mindBlown: { + name: "驚爆大頭", + effect: "讓自己的頭爆炸,來攻擊周\n圍的一切。自己也會受到傷\n害", + }, + plasmaFists: { + name: "等離子閃電拳", + effect: "用覆蓋着電流的拳頭進行攻\n擊。使一般屬性的招式變成\n電屬性", + }, + photonGeyser: { + name: "光子噴湧", + effect: "用光柱來進行攻擊。比較自\n己的攻擊和特攻,用數值相\n對較高的一項給予對方傷害", + }, + lightThatBurnsTheSky: { + name: "究極奈克洛Z焚天滅世熾光爆", + effect: "奈克洛茲瑪會無視對手的特\n性效果,在攻擊和特攻之間,\n用數值相對較高的一項給\n予對方傷害", + }, + searingSunrazeSmash: { + name: "索爾迦雷歐Z日光迴旋下蒼穹", + effect: "得到Z力量的索爾迦雷歐將\n全力進行攻擊。可以無視對\n手的特性效果", + }, + menacingMoonrazeMaelstrom: { + name: "露奈雅拉Z月華飛濺落靈霄", + effect: "得到Z力量的露奈雅拉將全\n力進行攻擊。可以無視對手\n的特性效果", + }, + letsSnuggleForever: { + name: "謎擬丘Z親密無間大亂揍", + effect: "得到Z力量的謎擬Q將全力\n進行亂揍攻擊", + }, + splinteredStormshards: { + name: "鬃巖狼人Z狼嘯石牙颶風暴", + effect: "得到Z力量的鬃巖狼人將全\n力進行攻擊。而且會消除場\n地狀態", + }, + clangorousSoulblaze: { + name: "杖尾鱗甲龍Z熾魂熱舞烈音爆", + effect: "得到Z力量的杖尾鱗甲龍將\n全力攻擊對手。並且自己的\n能力會提高", + }, + zippyZap: { + name: "電電加速", + effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", + }, + splishySplash: { + name: "滔滔衝浪", + effect: "往巨浪中注入電能後衝撞對\n手進行攻擊。有時會讓對手\n陷入麻痹狀態", + }, + floatyFall: { + name: "飄飄墜落", + effect: "輕飄飄地浮起來後,再猛地\n俯衝下去進行攻擊。有時會\n使對手畏縮", + }, + pikaPapow: { + name: "閃閃雷光", + effect: "皮卡丘越喜歡訓練家,電擊\n的威力就越強。攻擊必定會\n命中", + }, + bouncyBubble: { + name: "活活氣泡", + effect: "投擲水球進行攻擊。吸水後\n能回覆等同於造成的傷害一\n半的HP", + }, + buzzyBuzz: { + name: "麻麻電擊", + effect: "放出電擊攻擊對手。讓對手\n陷入麻痹狀態", + }, + sizzlySlide: { + name: "熊熊火爆", + effect: "用燃起大火的身體猛烈地衝\n撞對手。讓對手陷入灼傷狀\n態", + }, + glitzyGlow: { + name: "嘩嘩氣場", + effect: "利用念力強攻,粉碎對方信\n心。製造一道能減弱對手特\n殊攻擊的神奇牆壁", + }, + baddyBad: { + name: "壞壞領域", + effect: "惡行惡相地進行攻擊。製造\n一道能減弱對手物理攻擊的\n神奇牆壁", + }, + sappySeed: { + name: "茁茁炸彈", + effect: "長出巨大的藤蔓,播撒種子\n進行攻擊。種子每回合都會\n吸取對手的HP", + }, + freezyFrost: { + name: "冰冰霜凍", + effect: "利用冰冷的黑霧結晶進行攻\n擊。使全體寶可夢的能力變\n回原點", + }, + sparklySwirl: { + name: "亮亮風暴", + effect: "利用芬芳刺鼻的龍捲風吞噬\n對方。能治癒我方寶可夢的\n異常狀態", + }, + veeveeVolley: { + name: "砰砰擊破", + effect: "伊布越喜歡訓練家,衝撞的\n威力就越強。攻擊必定會命\n中", + }, + doubleIronBash: { + name: "鋼拳雙擊", + effect: "以胸口的螺帽爲中心旋轉,\n並連續2次揮動手臂打擊對\n手。有時會使對手畏縮", + }, + maxGuard: { + name: "極巨防壁", + effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗", + }, + dynamaxCannon: { + name: "極巨炮", + effect: "將凝縮在體內的能量從核心\n放出進行攻擊", + }, + snipeShot: { + name: "狙擊", + effect: "能無視具有吸引對手招式效\n果的特性或招式的影響。可\n以向選定的對手進行攻擊", + }, + jawLock: { + name: "緊咬不放", + effect: "使雙方直到一方昏厥爲止無\n法替換寶可夢。其中一方退\n場則可以解除效果", + }, + stuffCheeks: { name: "大快朵頤", effect: "喫掉攜帶的樹果,大幅提高\n防禦" }, + noRetreat: { + name: "背水一戰", + effect: "提高自己的所有能力,但無\n法替換或逃走", + }, + tarShot: { + name: "瀝青射擊", + effect: "潑灑黏糊糊的瀝青,降低對\n手的速度。火屬性會變成對\n手的弱點", + }, + magicPowder: { + name: "魔法粉", + effect: "向對手噴灑魔法粉,使對手\n變爲超能力屬性", + }, + dragonDarts: { + name: "龍箭", + effect: "讓多龍梅西亞進行2次攻擊。\n如果對手有2只寶可夢,\n則對它們各進行1次攻擊", + }, + teatime: { + name: "茶會", + effect: "舉辦一場茶會,場上的所有\n寶可夢都會喫掉自己攜帶的\n樹果", + }, + octolock: { + name: "蛸固", + effect: "讓對手無法逃走。對手被固\n定後,每回合都會降低防禦\n和特防", + }, + boltBeak: { + name: "電喙", + effect: "用帶電的喙啄刺對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", + }, + fishiousRend: { + name: "鰓咬", + effect: "用堅硬的腮咬住對手。如果\n比對手先出手攻擊,招式的\n威力會變成2倍", + }, + courtChange: { name: "換場", effect: "用神奇的力量交換雙方的場\n地效果" }, + maxFlare: { + name: "極巨火爆", + effect: "極巨化寶可夢使出的火屬性\n攻擊。可在5回合內讓日照\n變得強烈", + }, + maxFlutterby: { + name: "極巨蟲蠱", + effect: "極巨化寶可夢使出的蟲屬性\n攻擊。會降低對手的特攻", + }, + maxLightning: { + name: "極巨閃電", + effect: "極巨化寶可夢使出的電屬性\n攻擊。可在5回合內將腳下\n變成電氣場地", + }, + maxStrike: { + name: "極巨攻擊", + effect: "極巨化寶可夢使出的一般屬\n性攻擊。會降低對手的速度", + }, + maxKnuckle: { + name: "極巨拳鬥", + effect: "極巨化寶可夢使出的格鬥屬\n性攻擊。會提高我方的攻擊", + }, + maxPhantasm: { + name: "極巨幽魂", + effect: "極巨化寶可夢使出的幽靈屬\n性攻擊。會降低對手的防禦", + }, + maxHailstorm: { + name: "極巨寒冰", + effect: "極巨化寶可夢使出的冰屬性\n攻擊。在5回合內會下雪", + }, + maxOoze: { + name: "極巨酸毒", + effect: "極巨化寶可夢使出的毒屬性\n攻擊。會提高我方的特攻", + }, + maxGeyser: { + name: "極巨水流", + effect: "極巨化寶可夢使出的水屬性\n攻擊。可在5回合內降下大\n雨", + }, + maxAirstream: { + name: "極巨飛衝", + effect: "極巨化寶可夢使出的飛行屬\n性攻擊。會提高我方的速度", + }, + maxStarfall: { + name: "極巨妖精", + effect: "極巨化寶可夢使出的妖精屬\n性攻擊。可在5回合內將腳\n下變成薄霧場地", + }, + maxWyrmwind: { + name: "極巨龍騎", + effect: "極巨化寶可夢使出的龍屬性\n攻擊。會降低對手的攻擊", + }, + maxMindstorm: { + name: "極巨超能", + effect: "極巨化寶可夢使出的超能力\n屬性攻擊。可在5回合內將\n腳下變成精神場地", + }, + maxRockfall: { + name: "極巨岩石", + effect: "極巨化寶可夢使出的岩石屬\n性攻擊。可在5回合內捲起\n沙暴", + }, + maxQuake: { + name: "極巨大地", + effect: "極巨化寶可夢使出的地面屬\n性攻擊。會提高我方的特防", + }, + maxDarkness: { + name: "極巨惡霸", + effect: "極巨化寶可夢使出的惡屬性\n攻擊。會降低對手的特防", + }, + maxOvergrowth: { + name: "極巨草原", + effect: "極巨化寶可夢使出的草屬性\n攻擊。可在5回合內將腳下\n變成青草場地", + }, + maxSteelspike: { + name: "極巨鋼鐵", + effect: "極巨化寶可夢使出的鋼屬性\n攻擊。會提高我方的防禦", + }, + clangorousSoul: { + name: "魂舞烈音爆", + effect: "削減少許自己的HP,使所\n有能力都提高", + }, + bodyPress: { + name: "撲擊", + effect: "用身體撞向對手進行攻擊。\n防禦越高,給予的傷害就越\n高", + }, + decorate: { name: "裝飾", effect: "通過裝飾,大幅提高對方的\n攻擊和特攻" }, + drumBeating: { + name: "鼓擊", + effect: "用鼓點來控制鼓的根部進行\n攻擊,從而降低對手的速度", + }, + snapTrap: { + name: "捕獸夾", + effect: "使用捕獸夾,在4~5回合\n內,夾住對手進行攻擊", + }, + pyroBall: { + name: "火焰球", + effect: "點燃小石子,形成火球攻擊\n對手。有時會使對手陷入灼\n傷狀態", + }, + behemothBlade: { + name: "巨獸斬", + effect: "以全身力氣舉起強大的劍,\n猛烈地劈向對手進行攻擊", + }, + behemothBash: { + name: "巨獸彈", + effect: "將全身變化爲堅固的盾,猛\n烈地撞向對手進行攻擊", + }, + auraWheel: { + name: "氣場輪", + effect: "用儲存在頰囊裏的能量進行\n攻擊,並提高自己的速度。\n其屬性會隨着莫魯貝可的樣\n子而改變", + }, + breakingSwipe: { + name: "廣域破壞", + effect: "用堅韌的尾巴猛掃對手進行\n攻擊,從而降低對手的攻擊", + }, + branchPoke: { + name: "木枝突刺", + effect: "使用尖銳的樹枝刺向對手進\n行攻擊", + }, + overdrive: { + name: "破音", + effect: "奏響吉他和貝斯,釋放出發\n出巨響的劇烈震動攻擊對手", + }, + appleAcid: { + name: "蘋果酸", + effect: "使用從酸蘋果中提取出來的\n酸性液體進行攻擊。降低對\n手的特防", + }, + gravApple: { + name: "萬有引力", + effect: "從高處落下蘋果,給予對手\n傷害。可降低對手的防禦", + }, + spiritBreak: { + name: "靈魂衝擊", + effect: "用足以讓對手一蹶不振的氣\n勢進行攻擊。會降低對手的\n特攻", + }, + strangeSteam: { + name: "神奇蒸汽", + effect: "噴出煙霧攻擊對手。有時會\n使對手混亂", + }, + lifeDew: { + name: "生命水滴", + effect: "噴灑出神奇的水,回覆自己\n和場上同伴的HP", + }, + obstruct: { + name: "攔堵", + effect: "完全抵擋對手的攻擊。連續\n使出則容易失敗。一旦觸碰,\n防禦就會大幅降低", + }, + falseSurrender: { + name: "假跪真撞", + effect: "裝作低頭認錯的樣子,用凌\n亂的頭髮進行突刺。攻擊必\n定會命中", + }, + meteorAssault: { + name: "流星突擊", + effect: "大力揮舞粗壯的莖進行攻擊。\n但同時自己也會被晃暈,\n下一回合自己將無法動彈", + }, + eternabeam: { + name: "無極光束", + effect: "無極汰那變回原來的樣子後,\n發動的最強攻擊。下一回\n合自己將無法動彈", + }, + steelBeam: { + name: "鐵蹄光線", + effect: "將從全身聚集的鋼鐵化爲光\n束,激烈地發射出去。自己\n也會受到傷害", + }, + expandingForce: { + name: "廣域戰力", + effect: "利用精神力量攻擊對手。在\n精神場地上威力會有所提高,\n能對所有對手造成傷害", + }, + steelRoller: { + name: "鐵滾輪", + effect: "在破壞場地的同時攻擊對手。\n如果腳下沒有任何場地狀\n態存在,使出此招式時便會\n失敗", + }, + scaleShot: { + name: "鱗射", + effect: "發射鱗片進行攻擊。連續攻\n擊2~5次。速度會提高但\n防禦會降低", + }, + meteorBeam: { + name: "流星光束", + effect: "第1回合聚集宇宙之力提高\n特攻,第2回合攻擊對手", + }, + shellSideArm: { + name: "臂貝武器", + effect: "從物理攻擊和特殊攻擊中選\n擇可造成較多傷害的方式進\n行攻擊。有時會讓對手陷入\n中毒狀態", + }, + mistyExplosion: { + name: "薄霧炸裂", + effect: "對自己周圍的所有寶可夢進\n行攻擊,但使出後,自己會\n陷入昏厥。在薄霧場地上,\n招式威力會提高", + }, + grassyGlide: { + name: "青草滑梯", + effect: "彷彿在地面上滑行般地攻擊\n對手。在青草場地上,必定\n能夠先制攻擊", + }, + risingVoltage: { + name: "電力上升", + effect: "用從地面升騰而起的電擊進\n行攻擊。當對手處於電氣場\n地上時,招式威力會變成2\n倍", + }, + terrainPulse: { + name: "大地波動", + effect: "藉助場地的力量進行攻擊。\n視使出招式時場地狀態不同,\n招式的屬性和威力會有所\n變化", + }, + skitterSmack: { + name: "爬擊", + effect: "從對手背後爬近後進行攻擊。\n會降低對手的特攻", + }, + burningJealousy: { + name: "妒火", + effect: "用嫉妒的能量攻擊對手。會\n讓在該回合內能力有所提高\n的寶可夢陷入灼傷狀態", + }, + lashOut: { + name: "泄憤", + effect: "攻擊對手以發泄對其感到的\n惱怒情緒。如果在該回合內\n自身能力遭到降低,招式的\n威力會變成2倍", + }, + poltergeist: { + name: "靈騷", + effect: "操縱對手的持有物進行攻擊。\n當對手沒有攜帶道具時,\n使出此招式時便會失敗", + }, + corrosiveGas: { + name: "腐蝕氣體", + effect: "用具有強酸性的氣體包裹住\n自己周圍所有的寶可夢,並\n融化其所攜帶的道具", + }, + coaching: { + name: "指導", + effect: "通過進行正確合理的指導,\n提高我方全員的攻擊和防禦", + }, + flipTurn: { + name: "快速折返", + effect: "在攻擊之後急速返回,和後\n備寶可夢進行替換", + }, + tripleAxel: { + name: "三旋擊", + effect: "連續3次踢對手進行攻擊。\n每踢中一次,威力就會提高", + }, + dualWingbeat: { + name: "雙翼", + effect: "將翅膀撞向對手進行攻擊。\n連續2次給予傷害", + }, + scorchingSands: { + name: "熱沙大地", + effect: "將滾燙的沙子砸向對手進行\n攻擊。有時會讓對手陷入灼\n傷狀態", + }, + jungleHealing: { + name: "叢林治療", + effect: "與叢林融爲一體,回覆自己\n和場上同伴的HP和狀態", + }, + wickedBlow: { + name: "闇冥強擊", + effect: "將惡之流派修煉至大成的猛\n烈一擊。必定會擊中要害", + }, + surgingStrikes: { + name: "水流連打", + effect: "將水之流派修煉至大成的仿\n若行雲流水般的3次連擊。\n必定會擊中要害", + }, + thunderCage: { + name: "雷電囚籠", + effect: "將對手困在電流四濺的囚籠\n中,在4~5回合內進行攻\n擊", + }, + dragonEnergy: { + name: "巨龍威能", + effect: "把生命力轉換爲力量攻擊對\n手。自己的HP越少,招式\n的威力越小", + }, + freezingGlare: { + name: "冰冷視線", + effect: "從雙眼發射精神力量進行攻\n擊。有時會讓對手陷入冰凍\n狀態", + }, + fieryWrath: { + name: "怒火中燒", + effect: "將憤怒轉化爲火焰般的氣場\n進行攻擊。有時會使對手畏\n縮", + }, + thunderousKick: { + name: "雷鳴蹴擊", + effect: "以雷電般的動作戲耍對手的\n同時使出腳踢。可降低對手\n的防禦", + }, + glacialLance: { + name: "雪矛", + effect: "向對手投擲掀起暴風雪的冰\n矛進行攻擊", + }, + astralBarrage: { name: "星碎", effect: "用大量的小靈體向對手發起\n攻擊" }, + eerieSpell: { + name: "詭異咒語", + effect: "用強大的精神力量攻擊。讓\n對手最後使用的招式減少3\nPP", + }, + direClaw: { + name: "克命爪", + effect: "以破滅之爪進行攻擊。有時\n還會讓對手陷入中毒、麻痹\n、睡眠之中的一種狀態", + }, + psyshieldBash: { + name: "屏障猛攻", + effect: "讓意念的能量覆蓋全身,撞\n向對手進行攻擊。會提高自\n己的防禦", + }, + powerShift: { name: "力量轉換", effect: "將自己的攻擊與防禦互相交\n換" }, + stoneAxe: { + name: "巖斧", + effect: "用岩石之斧進行攻擊。散落\n的岩石碎片會飄浮在對手周\n圍", + }, + springtideStorm: { + name: "陽春風暴", + effect: "用交織着愛與恨的烈風席捲\n對手進行攻擊。有時會降低\n對手的攻擊", + }, + mysticalPower: { + name: "神祕之力", + effect: "放出不可思議的力量攻擊。\n會提高自己的特攻", + }, + ragingFury: { + name: "大憤慨", + effect: "在2~3回合內,一邊放出\n火焰,一邊瘋狂亂打。大鬧\n一番後自己會陷入混亂", + }, + waveCrash: { + name: "波動衝", + effect: "讓水覆蓋全身後撞向對手。\n自己也會受到不少傷害", + }, + chloroblast: { + name: "葉綠爆震", + effect: "將自己的葉綠素凝聚起來後\n放出去進行攻擊。自己也會\n受到傷害", + }, + mountainGale: { + name: "冰山風", + effect: "將冰山般巨大的冰塊砸向對\n手進行攻擊。有時會使對手\n畏縮", + }, + victoryDance: { + name: "勝利之舞", + effect: "激烈地跳起喚來勝利的舞蹈,\n提高自己的攻擊、防禦和\n速度", + }, + headlongRush: { + name: "突飛猛撲", + effect: "向對手使出灌注了全心全力\n的撞擊。自己的防禦和特防\n會降低", + }, + barbBarrage: { + name: "毒千針", + effect: "用無數的毒針進行攻擊。有\n時還會讓對手陷入中毒狀態。\n攻擊處於中毒狀態的對手\n時,威力會變成2倍", + }, + esperWing: { + name: "氣場之翼", + effect: "用經過氣場強化的翅膀撕裂\n對手。容易擊中要害。會提\n高自己的速度", + }, + bitterMalice: { + name: "冤冤相報", + effect: "用令人毛骨悚然的怨念進行\n攻擊。會降低對手的攻擊", + }, + shelter: { + name: "閉關", + effect: "將皮膚變得堅硬如鐵盾,從\n而大幅提高自己的防禦", + }, + tripleArrows: { + name: "三連箭", + effect: "使出一記腿技後同時發射3\n箭。有時會降低對手的防禦\n或使對手畏縮。容易擊中要\n害", + }, + infernalParade: { + name: "羣魔亂舞", + effect: "用無數的火球進行攻擊。有\n時會讓對手陷入灼傷狀態。\n攻擊處於異常狀態的對手時,\n威力會變成2倍", + }, + ceaselessEdge: { + name: "祕劍・千重濤", + effect: "用貝殼之劍進行攻擊。散落\n的貝殼碎片會散落在對手腳\n下成爲撒菱", + }, + bleakwindStorm: { + name: "枯葉風暴", + effect: "用足以讓身心都止不住顫抖\n的冰冷狂風進行攻擊。有時\n會降低對手的速度", + }, + wildboltStorm: { + name: "鳴雷風暴", + effect: "呼喚雷雲引起風暴,用雷與\n風進行激烈的攻擊。有時會\n讓對手陷入麻痹狀態", + }, + sandsearStorm: { + name: "熱沙風暴", + effect: "用灼熱的沙子和強烈的風席\n卷對手進行攻擊。有時會讓\n對手陷入灼傷狀態", + }, + lunarBlessing: { + name: "新月祈禱", + effect: "向新月獻上祈禱,回覆自己\n和場上同伴的HP和狀態", + }, + takeHeart: { + name: "勇氣填充", + effect: "鼓起衝勁,治癒自己的異常\n狀態,同時提高自己的特攻\n和特防", + }, + gMaxWildfire: { + name: "超極巨深淵滅焰", + effect: "超極巨化的噴火龍使出的火\n屬性攻擊。可在4回合內給\n予對手傷害", + }, + gMaxBefuddle: { + name: "超極巨蝶影蠱惑", + effect: "超極巨化的巴大蝶使出的蟲\n屬性攻擊。會讓對手陷入中\n毒、麻痹或睡眠狀態", + }, + gMaxVoltCrash: { + name: "超極鉅萬雷轟頂", + effect: "超極巨化的皮卡丘使出的電\n屬性攻擊。會讓對手陷入麻\n痹狀態", + }, + gMaxGoldRush: { + name: "超極巨特大金幣", + effect: "超極巨化的喵喵使出的一般\n屬性攻擊。會讓對手陷入混\n亂狀態,並可獲得金錢", + }, + gMaxChiStrike: { + name: "超極巨會心一擊", + effect: "超極巨化的怪力使出的格鬥\n屬性攻擊。會變得容易擊中\n要害", + }, + gMaxTerror: { + name: "超極巨幻影幽魂", + effect: "超極巨化的耿鬼使出的幽靈\n屬性攻擊。會踩住對手的影\n子,讓其無法被替換", + }, + gMaxResonance: { + name: "超極巨極光旋律", + effect: "超極巨化的拉普拉斯使出的\n冰屬性攻擊。可在5回合內\n減弱受到的傷害", + }, + gMaxCuddle: { + name: "超極巨熱情擁抱", + effect: "超極巨化的伊布使出的一般\n屬性攻擊。會讓對手陷入着\n迷狀態", + }, + gMaxReplenish: { + name: "超極巨資源再生", + effect: "超極巨化的卡比獸使出的一\n般屬性攻擊。會讓喫掉的樹\n果再生", + }, + gMaxMalodor: { + name: "超極巨臭氣沖天", + effect: "超極巨化的灰塵山使出的毒\n屬性攻擊。會讓對手陷入中\n毒狀態", + }, + gMaxStonesurge: { + name: "超極巨巖陣以待", + effect: "超極巨化的暴噬龜使出的水\n屬性攻擊。會發射無數銳利\n的岩石", + }, + gMaxWindRage: { + name: "超極巨旋風襲捲", + effect: "超極巨化的鋼鎧鴉使出的飛\n行屬性攻擊。可消除反射壁\n和光牆", + }, + gMaxStunShock: { + name: "超極巨異毒電場", + effect: "超極巨化的顫弦蠑螈使出的\n電屬性攻擊。會讓對手陷入\n中毒或麻痹狀態", + }, + gMaxFinale: { + name: "超極巨幸福圓滿", + effect: "超極巨化的霜奶仙使出的妖\n精屬性攻擊。可回覆我方的\nHP", + }, + gMaxDepletion: { + name: "超極巨劣化衰變", + effect: "超極巨化的鋁鋼龍使出的龍\n屬性攻擊。可減少對手最後\n使用的招式的PP", + }, + gMaxGravitas: { + name: "超極巨天道七星", + effect: "超極巨化的以歐路普使出的\n超能力屬性攻擊。在5回合\n內重力會產生變化", + }, + gMaxVolcalith: { + name: "超極巨炎石噴發", + effect: "超極巨化的巨炭山使出的巖\n石屬性攻擊。可在4回合內\n給予對手傷害", + }, + gMaxSandblast: { + name: "超極巨沙塵漫天", + effect: "超極巨化的沙螺蟒使出的地\n面屬性攻擊。在4~5回合\n內會狂刮沙暴", + }, + gMaxSnooze: { + name: "超極巨睡魔降臨", + effect: "超極巨化的長毛巨魔使出的\n惡屬性攻擊。會通過打大哈\n欠讓對手產生睡意", + }, + gMaxTartness: { + name: "超極巨酸不溜丟", + effect: "超極巨化的蘋裹龍使出的草\n屬性攻擊。會降低對手的閃\n避率", + }, + gMaxSweetness: { + name: "超極巨瓊漿玉液", + effect: "超極巨化的豐蜜龍使出的草\n屬性攻擊。會治癒我方的異\n常狀態", + }, + gMaxSmite: { + name: "超極巨天譴雷誅", + effect: "超極巨化的布莉姆溫使出的\n妖精屬性攻擊。會讓對手陷\n入混亂狀態", + }, + gMaxSteelsurge: { + name: "超極巨鋼鐵陣法", + effect: "超極巨化的大王銅象使出的\n鋼屬性攻擊。會發射無數銳\n利的刺", + }, + gMaxMeltdown: { + name: "超極巨液金熔擊", + effect: "超極巨化的美錄梅塔使出的\n鋼屬性攻擊。會讓對手無法\n連續使出相同的招式", + }, + gMaxFoamBurst: { + name: "超極巨激漩泡渦", + effect: "超極巨化的巨鉗蟹使出的水\n屬性攻擊。會大幅降低對手\n的速度", + }, + gMaxCentiferno: { + name: "超極巨百火焚野", + effect: "超極巨化的焚焰蚣使出的火\n屬性攻擊。可在4~5回合\n內將對手困在火焰中", + }, + gMaxVineLash: { + name: "超極巨灰飛鞭滅", + effect: "超極巨化的妙蛙花使出的草\n屬性攻擊。可在4回合內給\n予對手傷害", + }, + gMaxCannonade: { + name: "超極巨水炮轟滅", + effect: "超極巨化的水箭龜使出的水\n屬性攻擊。可在4回合內給\n予對手傷害", + }, + gMaxDrumSolo: { + name: "超極巨狂擂亂打", + effect: "超極巨化的轟擂金剛猩使出\n的草屬性攻擊。不會受到對\n手特性的干擾", + }, + gMaxFireball: { + name: "超極巨破陣火球", + effect: "超極巨化的閃焰王牌使出的\n火屬性攻擊。不會受到對手\n特性的干擾", + }, + gMaxHydrosnipe: { + name: "超極巨狙擊神射", + effect: "超極巨化的千面避役使出的\n水屬性攻擊。不會受到對手\n特性的干擾", + }, + gMaxOneBlow: { + name: "超極巨奪命一擊", + effect: "超極巨化的武道熊師使出的\n惡屬性攻擊。是可以無視極\n巨防壁的一擊", + }, + gMaxRapidFlow: { + name: "超極巨流水連擊", + effect: "超極巨化的武道熊師使出的\n水屬性攻擊。是可以無視極\n巨防壁的連擊", + }, + teraBlast: { + name: "太晶爆發", + effect: "太晶化時,會放出太晶屬性\n的能量攻擊。比較自己的攻\n擊和特攻,用數值相對較高\n的一項給予對方傷害。(其\n他屬性)/用攻擊和特攻數\n值較高的一項給予傷害。對\n正處於太晶化的對手效果絕\n佳。自己的攻擊和特攻會降\n低。(星晶", + }, + silkTrap: { + name: "線阱", + effect: "用絲設置陷阱。防住對方攻\n擊的同時,能夠降低所接觸\n到的對手的速度", + }, + axeKick: { + name: "下壓踢", + effect: "將踢起的腳跟往下劈向對手\n進行攻擊。有時會使對手混\n亂。如果劈偏則自己會受到\n傷害", + }, + lastRespects: { + name: "掃墓", + effect: "爲了化解夥伴的悔恨而進行\n攻擊。被打倒的我方寶可夢\n越多,招式的威力越高", + }, + luminaCrash: { + name: "琉光衝激", + effect: "放出連精神都能影響到的奇\n妙怪光進行攻擊。會大幅降\n低對方的特防", + }, + orderUp: { + name: "上菜", + effect: "以瀟灑的身手進行攻擊。若\n口中有米立龍,會按其樣子\n提高能力", + }, + jetPunch: { + name: "噴射拳", + effect: "將激流覆蓋於拳頭,以肉眼\n無法辨識的速度打出拳擊。\n必定能夠先制攻擊", + }, + spicyExtract: { + name: "辣椒精華", + effect: "放出極爲辛辣的精華。對手\n的攻擊會大幅提高,防禦會\n大幅降低", + }, + spinOut: { + name: "疾速轉輪", + effect: "通過往腿上增加負荷,以激\n烈的旋轉給予對手傷害。自\n己的速度會大幅降低", + }, + populationBomb: { + name: "鼠數兒", + effect: "夥伴們會紛紛趕來集合,以\n羣體行動給予對手攻擊。連\n續命中1~10次", + }, + iceSpinner: { + name: "冰旋", + effect: "腳上覆蓋薄冰,旋轉着撞擊\n對手。通過旋轉的動作破壞\n場地", + }, + glaiveRush: { + name: "巨劍突擊", + effect: "有勇無謀的捨身突擊。使出\n招式後,對手的攻擊必定會\n命中,且傷害會變成2倍", + }, + revivalBlessing: { + name: "復生祈禱", + effect: "通過以慈愛之心祈禱,讓陷\n入昏厥的後備寶可夢以回覆\n一半HP的狀態復活", + }, + saltCure: { + name: "鹽醃", + effect: "使對手陷入鹽醃狀態,每回\n合給予對手傷害。對手爲鋼\n或水屬性時會更痛苦", + }, + tripleDive: { + name: "三連鑽", + effect: "以默契的跳躍濺起水花擊向\n對手。連續3次給予傷害", + }, + mortalSpin: { + name: "晶光轉轉", + effect: "通過旋轉來攻擊對手。可以\n擺脫綁緊、緊束、寄生種子\n等招式。還能讓對手陷入中\n毒狀態", + }, + doodle: { + name: "描繪", + effect: "把握並映射出對手的本質,\n讓自己和同伴寶可夢的特性\n變得和對手相同", + }, + filletAway: { + name: "甩肉", + effect: "削減自己的HP,大幅提高\n攻擊和特攻以及速度", + }, + kowtowCleave: { + name: "僕刀", + effect: "下跪讓對手大意後發起襲擊\n劈向對手。攻擊必定會命中", + }, + flowerTrick: { + name: "千變萬花", + effect: "將做了手腳的花束扔向對手\n進行攻擊。必定會命中,且\n會擊中要害", + }, + torchSong: { + name: "閃焰高歌", + effect: "如唱歌一樣噴出熊熊燃燒的\n火焰燒焦對手。會提高自己\n的特攻", + }, + aquaStep: { + name: "流水旋舞", + effect: "以盈盈欲滴的輕快步伐戲耍\n對手並給予其傷害。會提高\n自己的速度", + }, + ragingBull: { + name: "怒牛", + effect: "狂怒暴牛的猛烈衝撞。招式\n的屬性隨形態改變,光牆和\n反射壁等招式也能破壞", + }, + makeItRain: { + name: "淘金潮", + effect: "扔出大量硬幣攻擊。自己的\n特攻會降低,戰鬥後還可以\n拿到錢", + }, + psyblade: { + name: "精神劍", + effect: "用無形的利刃劈開對手。處\n於電氣場地時,招式威力會\n變成1.5倍", + }, + hydroSteam: { + name: "水蒸氣", + effect: "將煮得翻滾的開水猛烈地噴\n向對手。日照強烈時,招式\n威力不但不會降低,還會變\n成1.5倍", + }, + ruination: { + name: "大災難", + effect: "引發毀滅性的災厄,使對手\n的HP減半", + }, + collisionCourse: { + name: "全開猛撞", + effect: "邊變形邊兇暴地落下,並引\n發起古老的大爆炸。若針對\n到弱點,威力會進一步", + }, + electroDrift: { + name: "閃電猛衝", + effect: "邊變形邊高速奔走,並以未\n知的電擊貫穿對手。若針對\n到弱點,威力會進一步", + }, + shedTail: { + name: "斷尾", + effect: "削減自己的HP,製造分身\n後會返回,並和後備寶可夢\n進行替換", + }, + chillyReception: { + name: "冷笑話", + effect: "留下冷場的冷笑話後,和後\n備寶可夢進行替換。在5回\n合內會下雪", + }, + tidyUp: { + name: "大掃除", + effect: "將撒菱、隱形巖、黏黏網、\n毒菱、替身全部掃除掉。自\n己的攻擊和速度會提高", + }, + snowscape: { + name: "雪景", + effect: "在5回合內會下雪。冰屬性\n的防禦會提高", + }, + pounce: { name: "蟲撲", effect: "飛撲向對手攻擊。會降低對\n手的速度" }, + trailblaze: { + name: "起草", + effect: "跳出草叢進行攻擊。通過輕\n快的步伐會提高自己的速度", + }, + chillingWater: { + name: "潑冷水", + effect: "潑灑冰冷得足以讓對手失去\n活力的水進行攻擊。會降低\n對手的攻擊", + }, + hyperDrill: { + name: "強力鑽", + effect: "急速旋轉尖銳的身體部位貫\n穿對手。可以無視守住和看\n穿等招式", + }, + twinBeam: { + name: "雙光束", + effect: "從兩眼發射出神奇的光線攻\n擊。連續2次給予傷害", + }, + rageFist: { + name: "憤怒之拳", + effect: "將憤怒化爲力量攻擊。受到\n攻擊的次數越多,招式的威\n力越高", + }, + armorCannon: { + name: "鎧農炮", + effect: "熊熊燃燒自己的鎧甲,將其\n做成炮彈射出攻擊。自己的\n防禦和特防會降低", + }, + bitterBlade: { + name: "悔念劍", + effect: "將對世間的留戀聚集於劍尖,\n並斬擊對手。可以回覆給\n予對手傷害的一半HP", + }, + doubleShock: { + name: "電光雙擊", + effect: "將全身所有的電力放出,給\n予對手大大的傷害。自己的\n電屬性將會消失", + }, + gigatonHammer: { + name: "巨力錘", + effect: "連同身體轉起巨大的錘子進\n行攻擊。這個招式無法連續\n使出2次", + }, + comeuppance: { + name: "復仇", + effect: "使出招式前,將最後受到的\n招式的傷害大力返還給對手", + }, + aquaCutter: { + name: "水波刀", + effect: "如刀刃般噴射出加壓的水切\n開對手。容易擊中要害", + }, + blazingTorque: { + name: "灼熱暴衝", + effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n灼傷狀態。", + }, + wickedTorque: { + name: "黑暗暴衝", + effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n睡眠狀態。", + }, + noxiousTorque: { + name: "劇毒暴衝", + effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n中毒狀態。", + }, + combatTorque: { + name: "格鬥暴衝", + effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n麻痹狀態。此招式可以命中\n幽靈屬性的寶可夢。", + }, + magicalTorque: { + name: "魔法暴衝", + effect: "攻擊目標造成傷害,\n有30%的幾率使目標陷入\n混亂狀態。", + }, + bloodMoon: { + name: "血月", + effect: "從赤紅如血的滿月發射出全\n部的氣勢。這個招式無法連\n續使出2次", + }, + matchaGotcha: { + name: "刷刷茶炮", + effect: "發射經攪拌的茶的大炮,可\n以回覆給予對手傷害的一半\nHP,有時會讓對手陷入灼\n傷狀態", + }, + syrupBomb: { + name: "糖漿炸彈", + effect: "使粘稠的麥芽糖漿爆炸,讓\n對手陷入滿身糖狀態,在3\n回合內持續降低其速度", + }, + ivyCudgel: { + name: "棘藤棒", + effect: "用纏有藤蔓的棍棒毆打。屬\n性會隨所戴的面具而改變。\n容易擊中要害", + }, + electroShot: { + name: "電光束", + effect: "第1回合收集電力提高特攻,\n第2回合將高壓的電力發\n射出去。下雨天氣時能立刻\n發射", + }, + teraStarstorm: { + name: "晶光星羣", + effect: "照射出結晶的力量來驅逐敵\n人。太樂巴戈斯在星晶形態\n下使出時,能對所有對手造\n成傷害", + }, + fickleBeam: { + name: "隨機光", + effect: "發射光線進行攻擊。有時其\n他的頭也會合力發射鐳射,\n讓招式威力變成2倍", + }, + burningBulwark: { + name: "火焰守護", + effect: "用超高溫的體毛防住對手攻\n擊的同時,讓接觸到自己的\n對手灼傷", + }, + thunderclap: { + name: "迅雷", + effect: "可以比對手先使出電擊進行\n攻擊。對手使出的招式如果\n不是攻擊招式則會失敗", + }, + mightyCleave: { + name: "強刃攻擊", + effect: "用積蓄在頭部的光來斬切對\n手。可以無視守護進行攻擊", + }, + tachyonCutter: { + name: "迅子利刃", + effect: "接連發射出粒子的利刃,連\n續2次給予傷害。攻擊必定\n會命中", + }, + hardPress: { + name: "硬壓", + effect: "用手臂或鉗子壓迫對手。對\n手剩餘的HP越多,威力越\n大", + }, + dragonCheer: { + name: "龍聲鼓舞", + effect: "以龍之鼓舞提高士氣,讓我\n方的招式變得容易擊中要害。\n對龍屬性的鼓舞效果會更\n強", + }, + alluringVoice: { + name: "魅誘之聲", + effect: "用天使般的歌聲攻擊對手。\n會讓此回合內能力有提高的\n寶可夢陷入混亂狀態", + }, + temperFlare: { + name: "豁出去", + effect: "以自暴自棄的氣勢進行攻擊。\n如果上一回合招式沒有命\n中,威力就會翻倍", + }, + supercellSlam: { + name: "閃電強襲", + effect: "讓身體帶電後壓向對手。如\n果沒有命中則自己會受到傷\n害", + }, + psychicNoise: { + name: "精神噪音", + effect: "用令對手不舒服的音波進行\n攻擊。讓對手在2回合內無\n法通過招式、特性或攜帶的\n道具回覆HP", + }, + upperHand: { + name: "快手還擊", + effect: "察覺到對手的動作後用掌根\n攻擊,讓對手畏縮。如果對\n手使出的招式不是先制攻擊,\n則會失敗", + }, + malignantChain: { + name: "邪毒鎖鏈", + effect: "用由毒形成的鎖鏈纏住對手\n注入毒素加以侵蝕。有時會\n讓對手陷入劇毒狀態", + }, } as const; diff --git a/src/locales/zh_TW/nature.ts b/src/locales/zh_TW/nature.ts index c12388b22d67..10ca9c71939d 100644 --- a/src/locales/zh_TW/nature.ts +++ b/src/locales/zh_TW/nature.ts @@ -1,29 +1,29 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const nature: SimpleTranslationEntries = { - "Hardy": "勤奮", - "Lonely": "怕寂寞", - "Brave": "勇敢", - "Adamant": "固執", - "Naughty": "頑皮", - "Bold": "大膽", - "Docile": "坦率", - "Relaxed": "悠閒", - "Impish": "淘氣", - "Lax": "樂天", - "Timid": "膽小", - "Hasty": "急躁", - "Serious": "認真", - "Jolly": "爽朗", - "Naive": "天真", - "Modest": "內斂", - "Mild": "慢吞吞", - "Quiet": "冷靜", - "Bashful": "害羞", - "Rash": "馬虎", - "Calm": "溫和", - "Gentle": "溫順", - "Sassy": "自大", - "Careful": "慎重", - "Quirky": "浮躁" -} as const; \ No newline at end of file + "Hardy": "勤奮", + "Lonely": "怕寂寞", + "Brave": "勇敢", + "Adamant": "固執", + "Naughty": "頑皮", + "Bold": "大膽", + "Docile": "坦率", + "Relaxed": "悠閒", + "Impish": "淘氣", + "Lax": "樂天", + "Timid": "膽小", + "Hasty": "急躁", + "Serious": "認真", + "Jolly": "爽朗", + "Naive": "天真", + "Modest": "內斂", + "Mild": "慢吞吞", + "Quiet": "冷靜", + "Bashful": "害羞", + "Rash": "馬虎", + "Calm": "溫和", + "Gentle": "溫順", + "Sassy": "自大", + "Careful": "慎重", + "Quirky": "浮躁" +} as const; diff --git a/src/locales/zh_TW/pokeball.ts b/src/locales/zh_TW/pokeball.ts index 161d208f7675..ce3d7a7a860e 100644 --- a/src/locales/zh_TW/pokeball.ts +++ b/src/locales/zh_TW/pokeball.ts @@ -1,10 +1,10 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokeball: SimpleTranslationEntries = { - "pokeBall": "精靈球", - "greatBall": "超級球", - "ultraBall": "高級球", - "rogueBall": "肉鴿球", - "masterBall": "大師球", - "luxuryBall": "豪華球", -} as const; \ No newline at end of file + "pokeBall": "精靈球", + "greatBall": "超級球", + "ultraBall": "高級球", + "rogueBall": "肉鴿球", + "masterBall": "大師球", + "luxuryBall": "豪華球", +} as const; diff --git a/src/locales/zh_TW/pokemon-info.ts b/src/locales/zh_TW/pokemon-info.ts index 309185eae973..0229525b75ad 100644 --- a/src/locales/zh_TW/pokemon-info.ts +++ b/src/locales/zh_TW/pokemon-info.ts @@ -1,41 +1,41 @@ import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; export const pokemonInfo: PokemonInfoTranslationEntries = { - Stat: { - "HP": "最大生命", - "HPshortened": "生命", - "ATK": "物理攻擊", - "ATKshortened": "物攻", - "DEF": "物理防禦", - "DEFshortened": "物防", - "SPATK": "特殊攻擊", - "SPATKshortened": "特攻", - "SPDEF": "特殊防禦", - "SPDEFshortened": "特防", - "SPD": "速度", - "SPDshortened": "速度" - }, + Stat: { + "HP": "最大生命", + "HPshortened": "生命", + "ATK": "物理攻擊", + "ATKshortened": "物攻", + "DEF": "物理防禦", + "DEFshortened": "物防", + "SPATK": "特殊攻擊", + "SPATKshortened": "特攻", + "SPDEF": "特殊防禦", + "SPDEFshortened": "特防", + "SPD": "速度", + "SPDshortened": "速度" + }, - Type: { - "UNKNOWN": "未知", - "NORMAL": "一般", - "FIGHTING": "格鬥", - "FLYING": "飛行", - "POISON": "毒", - "GROUND": "地面", - "ROCK": "岩石", - "BUG": "蟲", - "GHOST": "幽靈", - "STEEL": "鋼", - "FIRE": "火", - "WATER": "水", - "GRASS": "草", - "ELECTRIC": "電", - "PSYCHIC": "超能力", - "ICE": "冰", - "DRAGON": "龍", - "DARK": "惡", - "FAIRY": "妖精", - "STELLAR": "星晶" - }, -} as const; \ No newline at end of file + Type: { + "UNKNOWN": "未知", + "NORMAL": "一般", + "FIGHTING": "格鬥", + "FLYING": "飛行", + "POISON": "毒", + "GROUND": "地面", + "ROCK": "岩石", + "BUG": "蟲", + "GHOST": "幽靈", + "STEEL": "鋼", + "FIRE": "火", + "WATER": "水", + "GRASS": "草", + "ELECTRIC": "電", + "PSYCHIC": "超能力", + "ICE": "冰", + "DRAGON": "龍", + "DARK": "惡", + "FAIRY": "妖精", + "STELLAR": "星晶" + }, +} as const; diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.ts index 88edb71afa37..6a0ee4f319e0 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.ts @@ -1,1086 +1,1086 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const pokemon: SimpleTranslationEntries = { - "bulbasaur": "妙蛙種子", - "ivysaur": "妙蛙草", - "venusaur": "妙蛙花", - "charmander": "小火龍", - "charmeleon": "火恐龍", - "charizard": "噴火龍", - "squirtle": "傑尼龜", - "wartortle": "卡咪龜", - "blastoise": "水箭龜", - "caterpie": "綠毛蟲", - "metapod": "鐵甲蛹", - "butterfree": "巴大蝶", - "weedle": "獨角蟲", - "kakuna": "鐵殼蛹", - "beedrill": "大針蜂", - "pidgey": "波波", - "pidgeotto": "比比鳥", - "pidgeot": "大比鳥", - "rattata": "小拉達", - "raticate": "拉達", - "spearow": "烈雀", - "fearow": "大嘴雀", - "ekans": "阿柏蛇", - "arbok": "阿柏怪", - "pikachu": "皮卡丘", - "raichu": "雷丘", - "sandshrew": "穿山鼠", - "sandslash": "穿山王", - "nidoran_f": "尼多蘭", - "nidorina": "尼多娜", - "nidoqueen": "尼多後", - "nidoran_m": "尼多朗", - "nidorino": "尼多力諾", - "nidoking": "尼多王", - "clefairy": "皮皮", - "clefable": "皮可西", - "vulpix": "六尾", - "ninetales": "九尾", - "jigglypuff": "胖丁", - "wigglytuff": "胖可丁", - "zubat": "超音蝠", - "golbat": "大嘴蝠", - "oddish": "走路草", - "gloom": "臭臭花", - "vileplume": "霸王花", - "paras": "派拉斯", - "parasect": "派拉斯特", - "venonat": "毛球", - "venomoth": "摩魯蛾", - "diglett": "地鼠", - "dugtrio": "三地鼠", - "meowth": "喵喵", - "persian": "貓老大", - "psyduck": "可達鴨", - "golduck": "哥達鴨", - "mankey": "猴怪", - "primeape": "火暴猴", - "growlithe": "卡蒂狗", - "arcanine": "風速狗", - "poliwag": "蚊香蝌蚪", - "poliwhirl": "蚊香君", - "poliwrath": "蚊香泳士", - "abra": "凱西", - "kadabra": "勇基拉", - "alakazam": "胡地", - "machop": "腕力", - "machoke": "豪力", - "machamp": "怪力", - "bellsprout": "喇叭芽", - "weepinbell": "口呆花", - "victreebel": "大食花", - "tentacool": "瑪瑙水母", - "tentacruel": "毒刺水母", - "geodude": "小拳石", - "graveler": "隆隆石", - "golem": "隆隆巖", - "ponyta": "小火馬", - "rapidash": "烈焰馬", - "slowpoke": "呆呆獸", - "slowbro": "呆殼獸", - "magnemite": "小磁怪", - "magneton": "三合一磁怪", - "farfetchd": "大蔥鴨", - "doduo": "嘟嘟", - "dodrio": "嘟嘟利", - "seel": "小海獅", - "dewgong": "白海獅", - "grimer": "臭泥", - "muk": "臭臭泥", - "shellder": "大舌貝", - "cloyster": "刺甲貝", - "gastly": "鬼斯", - "haunter": "鬼斯通", - "gengar": "耿鬼", - "onix": "大巖蛇", - "drowzee": "催眠貘", - "hypno": "引夢貘人", - "krabby": "大鉗蟹", - "kingler": "巨鉗蟹", - "voltorb": "霹靂電球", - "electrode": "頑皮雷彈", - "exeggcute": "蛋蛋", - "exeggutor": "椰蛋樹", - "cubone": "卡拉卡拉", - "marowak": "嘎啦嘎啦", - "hitmonlee": "飛腿郎", - "hitmonchan": "快拳郎", - "lickitung": "大舌頭", - "koffing": "瓦斯彈", - "weezing": "雙彈瓦斯", - "rhyhorn": "獨角犀牛", - "rhydon": "鑽角犀獸", - "chansey": "吉利蛋", - "tangela": "蔓藤怪", - "kangaskhan": "袋獸", - "horsea": "墨海馬", - "seadra": "海刺龍", - "goldeen": "角金魚", - "seaking": "金魚王", - "staryu": "海星星", - "starmie": "寶石海星", - "mr_mime": "魔牆人偶", - "scyther": "飛天螳螂", - "jynx": "迷脣姐", - "electabuzz": "電擊獸", - "magmar": "鴨嘴火獸", - "pinsir": "凱羅斯", - "tauros": "肯泰羅", - "magikarp": "鯉魚王", - "gyarados": "暴鯉龍", - "lapras": "拉普拉斯", - "ditto": "百變怪", - "eevee": "伊布", - "vaporeon": "水伊布", - "jolteon": "雷伊布", - "flareon": "火伊布", - "porygon": "多邊獸", - "omanyte": "菊石獸", - "omastar": "多刺菊石獸", - "kabuto": "化石盔", - "kabutops": "鐮刀盔", - "aerodactyl": "化石翼龍", - "snorlax": "卡比獸", - "articuno": "急凍鳥", - "zapdos": "閃電鳥", - "moltres": "火焰鳥", - "dratini": "迷你龍", - "dragonair": "哈克龍", - "dragonite": "快龍", - "mewtwo": "超夢", - "mew": "夢幻", - "chikorita": "菊草葉", - "bayleef": "月桂葉", - "meganium": "大竺葵", - "cyndaquil": "火球鼠", - "quilava": "火巖鼠", - "typhlosion": "火暴獸", - "totodile": "小鋸鱷", - "croconaw": "藍鱷", - "feraligatr": "大力鱷", - "sentret": "尾立", - "furret": "大尾立", - "hoothoot": "咕咕", - "noctowl": "貓頭夜鷹", - "ledyba": "芭瓢蟲", - "ledian": "安瓢蟲", - "spinarak": "圓絲蛛", - "ariados": "阿利多斯", - "crobat": "叉字蝠", - "chinchou": "燈籠魚", - "lanturn": "電燈怪", - "pichu": "皮丘", - "cleffa": "皮寶寶", - "igglybuff": "寶寶丁", - "togepi": "波克比", - "togetic": "波克基古", - "natu": "天然雀", - "xatu": "天然鳥", - "mareep": "咩利羊", - "flaaffy": "茸茸羊", - "ampharos": "電龍", - "bellossom": "美麗花", - "marill": "瑪力露", - "azumarill": "瑪力露麗", - "sudowoodo": "樹纔怪", - "politoed": "蚊香蛙皇", - "hoppip": "毽子草", - "skiploom": "毽子花", - "jumpluff": "毽子棉", - "aipom": "長尾怪手", - "sunkern": "向日種子", - "sunflora": "向日花怪", - "yanma": "蜻蜻蜓", - "wooper": "烏波", - "quagsire": "沼王", - "espeon": "太陽伊布", - "umbreon": "月亮伊布", - "murkrow": "黑暗鴉", - "slowking": "呆呆王", - "misdreavus": "夢妖", - "unown": "未知圖騰", - "wobbuffet": "果然翁", - "girafarig": "麒麟奇", - "pineco": "榛果球", - "forretress": "佛烈託斯", - "dunsparce": "土龍弟弟", - "gligar": "天蠍", - "steelix": "大鋼蛇", - "snubbull": "布魯", - "granbull": "布魯皇", - "qwilfish": "千針魚", - "scizor": "巨鉗螳螂", - "shuckle": "壺壺", - "heracross": "赫拉克羅斯", - "sneasel": "狃拉", - "teddiursa": "熊寶寶", - "ursaring": "圈圈熊", - "slugma": "熔岩蟲", - "magcargo": "熔岩蝸牛", - "swinub": "小山豬", - "piloswine": "長毛豬", - "corsola": "太陽珊瑚", - "remoraid": "鐵炮魚", - "octillery": "章魚桶", - "delibird": "信使鳥", - "mantine": "巨翅飛魚", - "skarmory": "盔甲鳥", - "houndour": "戴魯比", - "houndoom": "黑魯加", - "kingdra": "刺龍王", - "phanpy": "小小象", - "donphan": "頓甲", - "porygon2": "多邊獸2型", - "stantler": "驚角鹿", - "smeargle": "圖圖犬", - "tyrogue": "無畏小子", - "hitmontop": "戰舞郎", - "smoochum": "迷脣娃", - "elekid": "電擊怪", - "magby": "鴨嘴寶寶", - "miltank": "大奶罐", - "blissey": "幸福蛋", - "raikou": "雷公", - "entei": "炎帝", - "suicune": "水君", - "larvitar": "幼基拉斯", - "pupitar": "沙基拉斯", - "tyranitar": "班基拉斯", - "lugia": "洛奇亞", - "ho_oh": "鳳王", - "celebi": "時拉比", - "treecko": "木守宮", - "grovyle": "森林蜥蜴", - "sceptile": "蜥蜴王", - "torchic": "火稚雞", - "combusken": "力壯雞", - "blaziken": "火焰雞", - "mudkip": "水躍魚", - "marshtomp": "沼躍魚", - "swampert": "巨沼怪", - "poochyena": "土狼犬", - "mightyena": "大狼犬", - "zigzagoon": "蛇紋熊", - "linoone": "直衝熊", - "wurmple": "刺尾蟲", - "silcoon": "甲殼繭", - "beautifly": "狩獵鳳蝶", - "cascoon": "盾甲繭", - "dustox": "毒粉蛾", - "lotad": "蓮葉童子", - "lombre": "蓮帽小童", - "ludicolo": "樂天河童", - "seedot": "橡實果", - "nuzleaf": "長鼻葉", - "shiftry": "狡猾天狗", - "taillow": "傲骨燕", - "swellow": "大王燕", - "wingull": "長翅鷗", - "pelipper": "大嘴鷗", - "ralts": "拉魯拉絲", - "kirlia": "奇魯莉安", - "gardevoir": "沙奈朵", - "surskit": "溜溜糖球", - "masquerain": "雨翅蛾", - "shroomish": "蘑蘑菇", - "breloom": "斗笠菇", - "slakoth": "懶人獺", - "vigoroth": "過動猿", - "slaking": "請假王", - "nincada": "土居忍士", - "ninjask": "鐵面忍者", - "shedinja": "脫殼忍者", - "whismur": "咕妞妞", - "loudred": "吼爆彈", - "exploud": "爆音怪", - "makuhita": "幕下力士", - "hariyama": "鐵掌力士", - "azurill": "露力麗", - "nosepass": "朝北鼻", - "skitty": "向尾喵", - "delcatty": "優雅貓", - "sableye": "勾魂眼", - "mawile": "大嘴娃", - "aron": "可可多拉", - "lairon": "可多拉", - "aggron": "波士可多拉", - "meditite": "瑪沙那", - "medicham": "恰雷姆", - "electrike": "落雷獸", - "manectric": "雷電獸", - "plusle": "正電拍拍", - "minun": "負電拍拍", - "volbeat": "電螢蟲", - "illumise": "甜甜螢", - "roselia": "毒薔薇", - "gulpin": "溶食獸", - "swalot": "吞食獸", - "carvanha": "利牙魚", - "sharpedo": "巨牙鯊", - "wailmer": "吼吼鯨", - "wailord": "吼鯨王", - "numel": "呆火駝", - "camerupt": "噴火駝", - "torkoal": "煤炭龜", - "spoink": "跳跳豬", - "grumpig": "噗噗豬", - "spinda": "晃晃斑", - "trapinch": "大顎蟻", - "vibrava": "超音波幼蟲", - "flygon": "沙漠蜻蜓", - "cacnea": "刺球仙人掌", - "cacturne": "夢歌仙人掌", - "swablu": "青綿鳥", - "altaria": "七夕青鳥", - "zangoose": "貓鼬斬", - "seviper": "飯匙蛇", - "lunatone": "月石", - "solrock": "太陽巖", - "barboach": "泥泥鰍", - "whiscash": "鯰魚王", - "corphish": "龍蝦小兵", - "crawdaunt": "鐵螯龍蝦", - "baltoy": "天秤偶", - "claydol": "念力土偶", - "lileep": "觸手百合", - "cradily": "搖籃百合", - "anorith": "太古羽蟲", - "armaldo": "太古盔甲", - "feebas": "醜醜魚", - "milotic": "美納斯", - "castform": "飄浮泡泡", - "kecleon": "變隱龍", - "shuppet": "怨影娃娃", - "banette": "詛咒娃娃", - "duskull": "夜巡靈", - "dusclops": "彷徨夜靈", - "tropius": "熱帶龍", - "chimecho": "風鈴鈴", - "absol": "阿勃梭魯", - "wynaut": "小果然", - "snorunt": "雪童子", - "glalie": "冰鬼護", - "spheal": "海豹球", - "sealeo": "海魔獅", - "walrein": "帝牙海獅", - "clamperl": "珍珠貝", - "huntail": "獵斑魚", - "gorebyss": "櫻花魚", - "relicanth": "古空棘魚", - "luvdisc": "愛心魚", - "bagon": "寶貝龍", - "shelgon": "甲殼龍", - "salamence": "暴飛龍", - "beldum": "鐵啞鈴", - "metang": "金屬怪", - "metagross": "巨金怪", - "regirock": "雷吉洛克", - "regice": "雷吉艾斯", - "registeel": "雷吉斯奇魯", - "latias": "拉帝亞斯", - "latios": "拉帝歐斯", - "kyogre": "蓋歐卡", - "groudon": "固拉多", - "rayquaza": "烈空坐", - "jirachi": "基拉祈", - "deoxys": "代歐奇希斯", - "turtwig": "草苗龜", - "grotle": "樹林龜", - "torterra": "土臺龜", - "chimchar": "小火焰猴", - "monferno": "猛火猴", - "infernape": "烈焰猴", - "piplup": "波加曼", - "prinplup": "波皇子", - "empoleon": "帝王拿波", - "starly": "姆克兒", - "staravia": "姆克鳥", - "staraptor": "姆克鷹", - "bidoof": "大牙狸", - "bibarel": "大尾狸", - "kricketot": "圓法師", - "kricketune": "音箱蟀", - "shinx": "小貓怪", - "luxio": "勒克貓", - "luxray": "倫琴貓", - "budew": "含羞苞", - "roserade": "羅絲雷朵", - "cranidos": "頭蓋龍", - "rampardos": "戰槌龍", - "shieldon": "盾甲龍", - "bastiodon": "護城龍", - "burmy": "結草兒", - "wormadam": "結草貴婦", - "mothim": "紳士蛾", - "combee": "三蜜蜂", - "vespiquen": "蜂女王", - "pachirisu": "帕奇利茲", - "buizel": "泳圈鼬", - "floatzel": "浮潛鼬", - "cherubi": "櫻花寶", - "cherrim": "櫻花兒", - "shellos": "無殼海兔", - "gastrodon": "海兔獸", - "ambipom": "雙尾怪手", - "drifloon": "飄飄球", - "drifblim": "隨風球", - "buneary": "卷卷耳", - "lopunny": "長耳兔", - "mismagius": "夢妖魔", - "honchkrow": "烏鴉頭頭", - "glameow": "魅力喵", - "purugly": "東施喵", - "chingling": "鈴鐺響", - "stunky": "臭鼬噗", - "skuntank": "坦克臭鼬", - "bronzor": "銅鏡怪", - "bronzong": "青銅鐘", - "bonsly": "盆纔怪", - "mime_jr": "魔尼尼", - "happiny": "小福蛋", - "chatot": "聒噪鳥", - "spiritomb": "花巖怪", - "gible": "圓陸鯊", - "gabite": "尖牙陸鯊", - "garchomp": "烈咬陸鯊", - "munchlax": "小卡比獸", - "riolu": "利歐路", - "lucario": "路卡利歐", - "hippopotas": "沙河馬", - "hippowdon": "河馬獸", - "skorupi": "鉗尾蠍", - "drapion": "龍王蠍", - "croagunk": "不良蛙", - "toxicroak": "毒骷蛙", - "carnivine": "尖牙籠", - "finneon": "熒光魚", - "lumineon": "霓虹魚", - "mantyke": "小球飛魚", - "snover": "雪笠怪", - "abomasnow": "暴雪王", - "weavile": "瑪狃拉", - "magnezone": "自爆磁怪", - "lickilicky": "大舌舔", - "rhyperior": "超甲狂犀", - "tangrowth": "巨蔓藤", - "electivire": "電擊魔獸", - "magmortar": "鴨嘴炎獸", - "togekiss": "波克基斯", - "yanmega": "遠古巨蜓", - "leafeon": "葉伊布", - "glaceon": "冰伊布", - "gliscor": "天蠍王", - "mamoswine": "象牙豬", - "porygon_z": "多邊獸乙型", - "gallade": "艾路雷朵", - "probopass": "大朝北鼻", - "dusknoir": "黑夜魔靈", - "froslass": "雪妖女", - "rotom": "洛託姆", - "uxie": "由克希", - "mesprit": "艾姆利多", - "azelf": "亞克諾姆", - "dialga": "帝牙盧卡", - "palkia": "帕路奇亞", - "heatran": "席多藍恩", - "regigigas": "雷吉奇卡斯", - "giratina": "騎拉帝納", - "cresselia": "克雷色利亞", - "phione": "霏歐納", - "manaphy": "瑪納霏", - "darkrai": "達克萊伊", - "shaymin": "謝米", - "arceus": "阿爾宙斯", - "victini": "比克提尼", - "snivy": "藤藤蛇", - "servine": "青藤蛇", - "serperior": "君主蛇", - "tepig": "暖暖豬", - "pignite": "炒炒豬", - "emboar": "炎武王", - "oshawott": "水水獺", - "dewott": "雙刃丸", - "samurott": "大劍鬼", - "patrat": "探探鼠", - "watchog": "步哨鼠", - "lillipup": "小約克", - "herdier": "哈約克", - "stoutland": "長毛狗", - "purrloin": "扒手貓", - "liepard": "酷豹", - "pansage": "花椰猴", - "simisage": "花椰猿", - "pansear": "爆香猴", - "simisear": "爆香猿", - "panpour": "冷水猴", - "simipour": "冷水猿", - "munna": "食夢夢", - "musharna": "夢夢蝕", - "pidove": "豆豆鴿", - "tranquill": "咕咕鴿", - "unfezant": "高傲雉雞", - "blitzle": "斑斑馬", - "zebstrika": "雷電斑馬", - "roggenrola": "石丸子", - "boldore": "地幔巖", - "gigalith": "龐巖怪", - "woobat": "滾滾蝙蝠", - "swoobat": "心蝙蝠", - "drilbur": "螺釘地鼠", - "excadrill": "龍頭地鼠", - "audino": "差不多娃娃", - "timburr": "搬運小匠", - "gurdurr": "鐵骨土人", - "conkeldurr": "修建老匠", - "tympole": "圓蝌蚪", - "palpitoad": "藍蟾蜍", - "seismitoad": "蟾蜍王", - "throh": "投摔鬼", - "sawk": "打擊鬼", - "sewaddle": "蟲寶包", - "swadloon": "寶包繭", - "leavanny": "保姆蟲", - "venipede": "百足蜈蚣", - "whirlipede": "車輪球", - "scolipede": "蜈蚣王", - "cottonee": "木棉球", - "whimsicott": "風妖精", - "petilil": "百合根娃娃", - "lilligant": "裙兒小姐", - "basculin": "野蠻鱸魚", - "sandile": "黑眼鱷", - "krokorok": "混混鱷", - "krookodile": "流氓鱷", - "darumaka": "火紅不倒翁", - "darmanitan": "達摩狒狒", - "maractus": "沙鈴仙人掌", - "dwebble": "石居蟹", - "crustle": "巖殿居蟹", - "scraggy": "滑滑小子", - "scrafty": "頭巾混混", - "sigilyph": "象徵鳥", - "yamask": "哭哭面具", - "cofagrigus": "迭失棺", - "tirtouga": "原蓋海龜", - "carracosta": "肋骨海龜", - "archen": "始祖小鳥", - "archeops": "始祖大鳥", - "trubbish": "破破袋", - "garbodor": "灰塵山", - "zorua": "索羅亞", - "zoroark": "索羅亞克", - "minccino": "泡沫栗鼠", - "cinccino": "奇諾栗鼠", - "gothita": "哥德寶寶", - "gothorita": "哥德小童", - "gothitelle": "哥德小姐", - "solosis": "單卵細胞球", - "duosion": "雙卵細胞球", - "reuniclus": "人造細胞卵", - "ducklett": "鴨寶寶", - "swanna": "舞天鵝", - "vanillite": "迷你冰", - "vanillish": "多多冰", - "vanilluxe": "雙倍多多冰", - "deerling": "四季鹿", - "sawsbuck": "萌芽鹿", - "emolga": "電飛鼠", - "karrablast": "蓋蓋蟲", - "escavalier": "騎士蝸牛", - "foongus": "哎呀球菇", - "amoonguss": "敗露球菇", - "frillish": "輕飄飄", - "jellicent": "胖嘟嘟", - "alomomola": "保姆曼波", - "joltik": "電電蟲", - "galvantula": "電蜘蛛", - "ferroseed": "種子鐵球", - "ferrothorn": "堅果啞鈴", - "klink": "齒輪兒", - "klang": "齒輪組", - "klinklang": "齒輪怪", - "tynamo": "麻麻小魚", - "eelektrik": "麻麻鰻", - "eelektross": "麻麻鰻魚王", - "elgyem": "小灰怪", - "beheeyem": "大宇怪", - "litwick": "燭光靈", - "lampent": "燈火幽靈", - "chandelure": "水晶燈火靈", - "axew": "牙牙", - "fraxure": "斧牙龍", - "haxorus": "雙斧戰龍", - "cubchoo": "噴嚏熊", - "beartic": "凍原熊", - "cryogonal": "幾何雪花", - "shelmet": "小嘴蝸", - "accelgor": "敏捷蟲", - "stunfisk": "泥巴魚", - "mienfoo": "功夫鼬", - "mienshao": "師父鼬", - "druddigon": "赤面龍", - "golett": "泥偶小人", - "golurk": "泥偶巨人", - "pawniard": "駒刀小兵", - "bisharp": "劈斬司令", - "bouffalant": "爆炸頭水牛", - "rufflet": "毛頭小鷹", - "braviary": "勇士雄鷹", - "vullaby": "禿鷹丫頭", - "mandibuzz": "禿鷹娜", - "heatmor": "熔蟻獸", - "durant": "鐵蟻", - "deino": "單首龍", - "zweilous": "雙首暴龍", - "hydreigon": "三首惡龍", - "larvesta": "燃燒蟲", - "volcarona": "火神蛾", - "cobalion": "勾帕路翁", - "terrakion": "代拉基翁", - "virizion": "畢力吉翁", - "tornadus": "龍捲雲", - "thundurus": "雷電雲", - "reshiram": "萊希拉姆", - "zekrom": "捷克羅姆", - "landorus": "土地雲", - "kyurem": "酋雷姆", - "keldeo": "凱路迪歐", - "meloetta": "美洛耶塔", - "genesect": "蓋諾賽克特", - "chespin": "哈力慄", - "quilladin": "胖胖哈力", - "chesnaught": "布里卡隆", - "fennekin": "火狐狸", - "braixen": "長尾火狐", - "delphox": "妖火紅狐", - "froakie": "呱呱泡蛙", - "frogadier": "呱頭蛙", - "greninja": "甲賀忍蛙", - "bunnelby": "掘掘兔", - "diggersby": "掘地兔", - "fletchling": "小箭雀", - "fletchinder": "火箭雀", - "talonflame": "烈箭鷹", - "scatterbug": "粉蝶蟲", - "spewpa": "粉蝶蛹", - "vivillon": "彩粉蝶", - "litleo": "小獅獅", - "pyroar": "火炎獅", - "flabebe": "花蓓蓓", - "floette": "花葉蒂", - "florges": "花潔夫人", - "skiddo": "坐騎小羊", - "gogoat": "坐騎山羊", - "pancham": "頑皮熊貓", - "pangoro": "霸道熊貓", - "furfrou": "多麗米亞", - "espurr": "妙喵", - "meowstic": "超能妙喵", - "honedge": "獨劍鞘", - "doublade": "雙劍鞘", - "aegislash": "堅盾劍怪", - "spritzee": "粉香香", - "aromatisse": "芳香精", - "swirlix": "綿綿泡芙", - "slurpuff": "胖甜妮", - "inkay": "好啦魷", - "malamar": "烏賊王", - "binacle": "龜腳腳", - "barbaracle": "龜足巨鎧", - "skrelp": "垃垃藻", - "dragalge": "毒藻龍", - "clauncher": "鐵臂槍蝦", - "clawitzer": "鋼炮臂蝦", - "helioptile": "傘電蜥", - "heliolisk": "光電傘蜥", - "tyrunt": "寶寶暴龍", - "tyrantrum": "怪顎龍", - "amaura": "冰雪龍", - "aurorus": "冰雪巨龍", - "sylveon": "仙子伊布", - "hawlucha": "摔角鷹人", - "dedenne": "咚咚鼠", - "carbink": "小碎鑽", - "goomy": "黏黏寶", - "sliggoo": "黏美兒", - "goodra": "黏美龍", - "klefki": "鑰圈兒", - "phantump": "小木靈", - "trevenant": "朽木妖", - "pumpkaboo": "南瓜精", - "gourgeist": "南瓜怪人", - "bergmite": "冰寶", - "avalugg": "冰岩怪", - "noibat": "嗡蝠", - "noivern": "音波龍", - "xerneas": "哲爾尼亞斯", - "yveltal": "伊裴爾塔爾", - "zygarde": "基格爾德", - "diancie": "蒂安希", - "hoopa": "胡帕", - "volcanion": "波爾凱尼恩", - "rowlet": "木木梟", - "dartrix": "投羽梟", - "decidueye": "狙射樹梟", - "litten": "火斑喵", - "torracat": "炎熱喵", - "incineroar": "熾焰咆哮虎", - "popplio": "球球海獅", - "brionne": "花漾海獅", - "primarina": "西獅海壬", - "pikipek": "小篤兒", - "trumbeak": "喇叭啄鳥", - "toucannon": "銃嘴大鳥", - "yungoos": "貓鼬少", - "gumshoos": "貓鼬探長", - "grubbin": "強顎雞母蟲", - "charjabug": "蟲電寶", - "vikavolt": "鍬農炮蟲", - "crabrawler": "好勝蟹", - "crabominable": "好勝毛蟹", - "oricorio": "花舞鳥", - "cutiefly": "萌虻", - "ribombee": "蝶結萌虻", - "rockruff": "巖狗狗", - "lycanroc": "鬃巖狼人", - "wishiwashi": "弱丁魚", - "mareanie": "好壞星", - "toxapex": "超壞星", - "mudbray": "泥驢仔", - "mudsdale": "重泥挽馬", - "dewpider": "滴蛛", - "araquanid": "滴蛛霸", - "fomantis": "僞螳草", - "lurantis": "蘭螳花", - "morelull": "睡睡菇", - "shiinotic": "燈罩夜菇", - "salandit": "夜盜火蜥", - "salazzle": "焰後蜥", - "stufful": "童偶熊", - "bewear": "穿着熊", - "bounsweet": "甜竹竹", - "steenee": "甜舞妮", - "tsareena": "甜冷美后", - "comfey": "花療環環", - "oranguru": "智揮猩", - "passimian": "投擲猴", - "wimpod": "膽小蟲", - "golisopod": "具甲武者", - "sandygast": "沙丘娃", - "palossand": "噬沙堡爺", - "pyukumuku": "拳海蔘", - "type_null": "屬性:空", - "silvally": "銀伴戰獸", - "minior": "小隕星", - "komala": "樹枕尾熊", - "turtonator": "爆焰龜獸", - "togedemaru": "託戈德瑪爾", - "mimikyu": "謎擬丘", - "bruxish": "磨牙彩皮魚", - "drampa": "老翁龍", - "dhelmise": "破破舵輪", - "jangmo_o": "心鱗寶", - "hakamo_o": "鱗甲龍", - "kommo_o": "杖尾鱗甲龍", - "tapu_koko": "卡璞・鳴鳴", - "tapu_lele": "卡璞・蝶蝶", - "tapu_bulu": "卡璞・哞哞", - "tapu_fini": "卡璞・鰭鰭", - "cosmog": "科斯莫古", - "cosmoem": "科斯莫姆", - "solgaleo": "索爾迦雷歐", - "lunala": "露奈雅拉", - "nihilego": "虛吾伊德", - "buzzwole": "爆肌蚊", - "pheromosa": "費洛美螂", - "xurkitree": "電束木", - "celesteela": "鐵火輝夜", - "kartana": "紙御劍", - "guzzlord": "惡食大王", - "necrozma": "奈克洛茲瑪", - "magearna": "瑪機雅娜", - "marshadow": "瑪夏多", - "poipole": "毒貝比", - "naganadel": "四顎針龍", - "stakataka": "壘磊石", - "blacephalon": "砰頭小丑", - "zeraora": "捷拉奧拉", - "meltan": "美錄坦", - "melmetal": "美錄梅塔", - "grookey": "敲音猴", - "thwackey": "啪咚猴", - "rillaboom": "轟擂金剛猩", - "scorbunny": "炎兔兒", - "raboot": "騰蹴小將", - "cinderace": "閃焰王牌", - "sobble": "淚眼蜥", - "drizzile": "變澀蜥", - "inteleon": "千面避役", - "skwovet": "貪心栗鼠", - "greedent": "藏飽栗鼠", - "rookidee": "稚山雀", - "corvisquire": "藍鴉", - "corviknight": "鋼鎧鴉", - "blipbug": "索偵蟲", - "dottler": "天罩蟲", - "orbeetle": "以歐路普", - "nickit": "狡小狐", - "thievul": "猾大狐", - "gossifleur": "幼棉棉", - "eldegoss": "白蓬蓬", - "wooloo": "毛辮羊", - "dubwool": "毛毛角羊", - "chewtle": "咬咬龜", - "drednaw": "暴噬龜", - "yamper": "來電汪", - "boltund": "逐電犬", - "rolycoly": "小炭仔", - "carkol": "大炭車", - "coalossal": "巨炭山", - "applin": "啃果蟲", - "flapple": "蘋裹龍", - "appletun": "豐蜜龍", - "silicobra": "沙包蛇", - "sandaconda": "沙螺蟒", - "cramorant": "古月鳥", - "arrokuda": "刺梭魚", - "barraskewda": "戽斗尖梭", - "toxel": "電音嬰", - "toxtricity": "顫弦蠑螈", - "sizzlipede": "燒火蚣", - "centiskorch": "焚焰蚣", - "clobbopus": "拳拳蛸", - "grapploct": "八爪武師", - "sinistea": "來悲茶", - "polteageist": "怖思壺", - "hatenna": "迷布莉姆", - "hattrem": "提布莉姆", - "hatterene": "布莉姆溫", - "impidimp": "搗蛋小妖", - "morgrem": "詐唬魔", - "grimmsnarl": "長毛巨魔", - "obstagoon": "堵攔熊", - "perrserker": "喵頭目", - "cursola": "魔靈珊瑚", - "sirfetchd": "蔥遊兵", - "mr_rime": "踏冰人偶", - "runerigus": "迭失板", - "milcery": "小仙奶", - "alcremie": "霜奶仙", - "falinks": "列陣兵", - "pincurchin": "啪嚓海膽", - "snom": "雪吞蟲", - "frosmoth": "雪絨蛾", - "stonjourner": "巨石丁", - "eiscue": "冰砌鵝", - "indeedee": "愛管侍", - "morpeko": "莫魯貝可", - "cufant": "銅象", - "copperajah": "大王銅象", - "dracozolt": "雷鳥龍", - "arctozolt": "雷鳥海獸", - "dracovish": "鰓魚龍", - "arctovish": "鰓魚海獸", - "duraludon": "鋁鋼龍", - "dreepy": "多龍梅西亞", - "drakloak": "多龍奇", - "dragapult": "多龍巴魯託", - "zacian": "蒼響", - "zamazenta": "藏瑪然特", - "eternatus": "無極汰那", - "kubfu": "熊徒弟", - "urshifu": "武道熊師", - "zarude": "薩戮德", - "regieleki": "雷吉艾勒奇", - "regidrago": "雷吉鐸拉戈", - "glastrier": "雪暴馬", - "spectrier": "靈幽馬", - "calyrex": "蕾冠王", - "wyrdeer": "詭角鹿", - "kleavor": "劈斧螳螂", - "ursaluna": "月月熊", - "basculegion": "幽尾玄魚", - "sneasler": "大狃拉", - "overqwil": "萬針魚", - "enamorus": "眷戀雲", - "sprigatito": "新葉喵", - "floragato": "蒂蕾喵", - "meowscarada": "魔幻假面喵", - "fuecoco": "呆火鱷", - "crocalor": "炙燙鱷", - "skeledirge": "骨紋巨聲鱷", - "quaxly": "潤水鴨", - "quaxwell": "湧躍鴨", - "quaquaval": "狂歡浪舞鴨", - "lechonk": "愛喫豚", - "oinkologne": "飄香豚", - "tarountula": "團珠蛛", - "spidops": "操陷蛛", - "nymble": "豆蟋蟀", - "lokix": "烈腿蝗", - "pawmi": "布撥", - "pawmo": "布土撥", - "pawmot": "巴布土撥", - "tandemaus": "一對鼠", - "maushold": "一家鼠", - "fidough": "狗仔包", - "dachsbun": "麻花犬", - "smoliv": "迷你芙", - "dolliv": "奧利紐", - "arboliva": "奧利瓦", - "squawkabilly": "怒鸚哥", - "nacli": "鹽石寶", - "naclstack": "鹽石壘", - "garganacl": "鹽石巨靈", - "charcadet": "炭小侍", - "armarouge": "紅蓮鎧騎", - "ceruledge": "蒼炎刃鬼", - "tadbulb": "光蚪仔", - "bellibolt": "電肚蛙", - "wattrel": "電海燕", - "kilowattrel": "大電海燕", - "maschiff": "偶叫獒", - "mabosstiff": "獒教父", - "shroodle": "滋汁鼴", - "grafaiai": "塗標客", - "bramblin": "納噬草", - "brambleghast": "怖納噬草", - "toedscool": "原野水母", - "toedscruel": "陸地水母", - "klawf": "毛崖蟹", - "capsakid": "熱辣娃", - "scovillain": "狠辣椒", - "rellor": "蟲滾泥", - "rabsca": "蟲甲聖", - "flittle": "飄飄雛", - "espathra": "超能豔鴕", - "tinkatink": "小鍛匠", - "tinkatuff": "巧鍛匠", - "tinkaton": "巨鍛匠", - "wiglett": "海地鼠", - "wugtrio": "三海地鼠", - "bombirdier": "下石鳥", - "finizen": "波普海豚", - "palafin": "海豚俠", - "varoom": "噗隆隆", - "revavroom": "普隆隆姆", - "cyclizar": "摩托蜥", - "orthworm": "拖拖蚓", - "glimmet": "晶光芽", - "glimmora": "晶光花", - "greavard": "墓仔狗", - "houndstone": "墓揚犬", - "flamigo": "纏紅鶴", - "cetoddle": "走鯨", - "cetitan": "浩大鯨", - "veluza": "輕身鱈", - "dondozo": "喫吼霸", - "tatsugiri": "米立龍", - "annihilape": "棄世猴", - "clodsire": "土王", - "farigiraf": "奇麒麟", - "dudunsparce": "土龍節節", - "kingambit": "僕刀將軍", - "great_tusk": "雄偉牙", - "scream_tail": "吼叫尾", - "brute_bonnet": "猛惡菇", - "flutter_mane": "振翼發", - "slither_wing": "爬地翅", - "sandy_shocks": "沙鐵皮", - "iron_treads": "鐵轍跡", - "iron_bundle": "鐵包袱", - "iron_hands": "鐵臂膀", - "iron_jugulis": "鐵脖頸", - "iron_moth": "鐵毒蛾", - "iron_thorns": "鐵荊棘", - "frigibax": "涼脊龍", - "arctibax": "凍脊龍", - "baxcalibur": "戟脊龍", - "gimmighoul": "索財靈", - "gholdengo": "賽富豪", - "wo_chien": "古簡蝸", - "chien_pao": "古劍豹", - "ting_lu": "古鼎鹿", - "chi_yu": "古玉魚", - "roaring_moon": "轟鳴月", - "iron_valiant": "鐵武者", - "koraidon": "故勒頓", - "miraidon": "密勒頓", - "walking_wake": "波盪水", - "iron_leaves": "鐵斑葉", - "dipplin": "裹蜜蟲", - "poltchageist": "斯魔茶", - "sinistcha": "來悲粗茶", - "okidogi": "夠贊狗", - "munkidori": "願增猿", - "fezandipiti": "吉雉雞", - "ogerpon": "厄詭椪", - "archaludon": "鋁鋼橋龍", - "hydrapple": "蜜集大蛇", - "gouging_fire": "破空焰", - "raging_bolt": "猛雷鼓", - "iron_boulder": "鐵磐巖", - "iron_crown": "鐵頭殼", - "terapagos": "太樂巴戈斯", - "pecharunt": "桃歹郎", - "alola_rattata": "小拉達", - "alola_raticate": "拉達", - "alola_raichu": "雷丘", - "alola_sandshrew": "穿山鼠", - "alola_sandslash": "穿山王", - "alola_vulpix": "六尾", - "alola_ninetales": "九尾", - "alola_diglett": "地鼠", - "alola_dugtrio": "三地鼠", - "alola_meowth": "喵喵", - "alola_persian": "貓老大", - "alola_geodude": "小拳石", - "alola_graveler": "隆隆石", - "alola_golem": "隆隆巖", - "alola_grimer": "臭泥", - "alola_muk": "臭臭泥", - "alola_exeggutor": "椰蛋樹", - "alola_marowak": "嘎啦嘎啦", - "eternal_floette": "花葉蒂", - "galar_meowth": "喵喵", - "galar_ponyta": "小火馬", - "galar_rapidash": "烈焰馬", - "galar_slowpoke": "呆呆獸", - "galar_slowbro": "呆殼獸", - "galar_farfetchd": "大蔥鴨", - "galar_weezing": "雙彈瓦斯", - "galar_mr_mime": "魔牆人偶", - "galar_articuno": "急凍鳥", - "galar_zapdos": "閃電鳥", - "galar_moltres": "火焰鳥", - "galar_slowking": "呆呆王", - "galar_corsola": "太陽珊瑚", - "galar_zigzagoon": "蛇紋熊", - "galar_linoone": "直衝熊", - "galar_darumaka": "火紅不倒翁", - "galar_darmanitan": "達摩狒狒", - "galar_yamask": "哭哭面具", - "galar_stunfisk": "泥巴魚", - "hisui_growlithe": "卡蒂狗", - "hisui_arcanine": "風速狗", - "hisui_voltorb": "霹靂電球", - "hisui_electrode": "頑皮雷彈", - "hisui_typhlosion": "火暴獸", - "hisui_qwilfish": "千針魚", - "hisui_sneasel": "狃拉", - "hisui_samurott": "大劍鬼", - "hisui_lilligant": "裙兒小姐", - "hisui_zorua": "索羅亞", - "hisui_zoroark": "索羅亞克", - "hisui_braviary": "勇士雄鷹", - "hisui_sliggoo": "黏美兒", - "hisui_goodra": "黏美龍", - "hisui_avalugg": "冰岩怪", - "hisui_decidueye": "狙射樹梟", - "paldea_tauros": "肯泰羅", - "paldea_wooper": "烏波", - "bloodmoon_ursaluna": "月月熊", -} as const; \ No newline at end of file + "bulbasaur": "妙蛙種子", + "ivysaur": "妙蛙草", + "venusaur": "妙蛙花", + "charmander": "小火龍", + "charmeleon": "火恐龍", + "charizard": "噴火龍", + "squirtle": "傑尼龜", + "wartortle": "卡咪龜", + "blastoise": "水箭龜", + "caterpie": "綠毛蟲", + "metapod": "鐵甲蛹", + "butterfree": "巴大蝶", + "weedle": "獨角蟲", + "kakuna": "鐵殼蛹", + "beedrill": "大針蜂", + "pidgey": "波波", + "pidgeotto": "比比鳥", + "pidgeot": "大比鳥", + "rattata": "小拉達", + "raticate": "拉達", + "spearow": "烈雀", + "fearow": "大嘴雀", + "ekans": "阿柏蛇", + "arbok": "阿柏怪", + "pikachu": "皮卡丘", + "raichu": "雷丘", + "sandshrew": "穿山鼠", + "sandslash": "穿山王", + "nidoran_f": "尼多蘭", + "nidorina": "尼多娜", + "nidoqueen": "尼多後", + "nidoran_m": "尼多朗", + "nidorino": "尼多力諾", + "nidoking": "尼多王", + "clefairy": "皮皮", + "clefable": "皮可西", + "vulpix": "六尾", + "ninetales": "九尾", + "jigglypuff": "胖丁", + "wigglytuff": "胖可丁", + "zubat": "超音蝠", + "golbat": "大嘴蝠", + "oddish": "走路草", + "gloom": "臭臭花", + "vileplume": "霸王花", + "paras": "派拉斯", + "parasect": "派拉斯特", + "venonat": "毛球", + "venomoth": "摩魯蛾", + "diglett": "地鼠", + "dugtrio": "三地鼠", + "meowth": "喵喵", + "persian": "貓老大", + "psyduck": "可達鴨", + "golduck": "哥達鴨", + "mankey": "猴怪", + "primeape": "火暴猴", + "growlithe": "卡蒂狗", + "arcanine": "風速狗", + "poliwag": "蚊香蝌蚪", + "poliwhirl": "蚊香君", + "poliwrath": "蚊香泳士", + "abra": "凱西", + "kadabra": "勇基拉", + "alakazam": "胡地", + "machop": "腕力", + "machoke": "豪力", + "machamp": "怪力", + "bellsprout": "喇叭芽", + "weepinbell": "口呆花", + "victreebel": "大食花", + "tentacool": "瑪瑙水母", + "tentacruel": "毒刺水母", + "geodude": "小拳石", + "graveler": "隆隆石", + "golem": "隆隆巖", + "ponyta": "小火馬", + "rapidash": "烈焰馬", + "slowpoke": "呆呆獸", + "slowbro": "呆殼獸", + "magnemite": "小磁怪", + "magneton": "三合一磁怪", + "farfetchd": "大蔥鴨", + "doduo": "嘟嘟", + "dodrio": "嘟嘟利", + "seel": "小海獅", + "dewgong": "白海獅", + "grimer": "臭泥", + "muk": "臭臭泥", + "shellder": "大舌貝", + "cloyster": "刺甲貝", + "gastly": "鬼斯", + "haunter": "鬼斯通", + "gengar": "耿鬼", + "onix": "大巖蛇", + "drowzee": "催眠貘", + "hypno": "引夢貘人", + "krabby": "大鉗蟹", + "kingler": "巨鉗蟹", + "voltorb": "霹靂電球", + "electrode": "頑皮雷彈", + "exeggcute": "蛋蛋", + "exeggutor": "椰蛋樹", + "cubone": "卡拉卡拉", + "marowak": "嘎啦嘎啦", + "hitmonlee": "飛腿郎", + "hitmonchan": "快拳郎", + "lickitung": "大舌頭", + "koffing": "瓦斯彈", + "weezing": "雙彈瓦斯", + "rhyhorn": "獨角犀牛", + "rhydon": "鑽角犀獸", + "chansey": "吉利蛋", + "tangela": "蔓藤怪", + "kangaskhan": "袋獸", + "horsea": "墨海馬", + "seadra": "海刺龍", + "goldeen": "角金魚", + "seaking": "金魚王", + "staryu": "海星星", + "starmie": "寶石海星", + "mr_mime": "魔牆人偶", + "scyther": "飛天螳螂", + "jynx": "迷脣姐", + "electabuzz": "電擊獸", + "magmar": "鴨嘴火獸", + "pinsir": "凱羅斯", + "tauros": "肯泰羅", + "magikarp": "鯉魚王", + "gyarados": "暴鯉龍", + "lapras": "拉普拉斯", + "ditto": "百變怪", + "eevee": "伊布", + "vaporeon": "水伊布", + "jolteon": "雷伊布", + "flareon": "火伊布", + "porygon": "多邊獸", + "omanyte": "菊石獸", + "omastar": "多刺菊石獸", + "kabuto": "化石盔", + "kabutops": "鐮刀盔", + "aerodactyl": "化石翼龍", + "snorlax": "卡比獸", + "articuno": "急凍鳥", + "zapdos": "閃電鳥", + "moltres": "火焰鳥", + "dratini": "迷你龍", + "dragonair": "哈克龍", + "dragonite": "快龍", + "mewtwo": "超夢", + "mew": "夢幻", + "chikorita": "菊草葉", + "bayleef": "月桂葉", + "meganium": "大竺葵", + "cyndaquil": "火球鼠", + "quilava": "火巖鼠", + "typhlosion": "火暴獸", + "totodile": "小鋸鱷", + "croconaw": "藍鱷", + "feraligatr": "大力鱷", + "sentret": "尾立", + "furret": "大尾立", + "hoothoot": "咕咕", + "noctowl": "貓頭夜鷹", + "ledyba": "芭瓢蟲", + "ledian": "安瓢蟲", + "spinarak": "圓絲蛛", + "ariados": "阿利多斯", + "crobat": "叉字蝠", + "chinchou": "燈籠魚", + "lanturn": "電燈怪", + "pichu": "皮丘", + "cleffa": "皮寶寶", + "igglybuff": "寶寶丁", + "togepi": "波克比", + "togetic": "波克基古", + "natu": "天然雀", + "xatu": "天然鳥", + "mareep": "咩利羊", + "flaaffy": "茸茸羊", + "ampharos": "電龍", + "bellossom": "美麗花", + "marill": "瑪力露", + "azumarill": "瑪力露麗", + "sudowoodo": "樹纔怪", + "politoed": "蚊香蛙皇", + "hoppip": "毽子草", + "skiploom": "毽子花", + "jumpluff": "毽子棉", + "aipom": "長尾怪手", + "sunkern": "向日種子", + "sunflora": "向日花怪", + "yanma": "蜻蜻蜓", + "wooper": "烏波", + "quagsire": "沼王", + "espeon": "太陽伊布", + "umbreon": "月亮伊布", + "murkrow": "黑暗鴉", + "slowking": "呆呆王", + "misdreavus": "夢妖", + "unown": "未知圖騰", + "wobbuffet": "果然翁", + "girafarig": "麒麟奇", + "pineco": "榛果球", + "forretress": "佛烈託斯", + "dunsparce": "土龍弟弟", + "gligar": "天蠍", + "steelix": "大鋼蛇", + "snubbull": "布魯", + "granbull": "布魯皇", + "qwilfish": "千針魚", + "scizor": "巨鉗螳螂", + "shuckle": "壺壺", + "heracross": "赫拉克羅斯", + "sneasel": "狃拉", + "teddiursa": "熊寶寶", + "ursaring": "圈圈熊", + "slugma": "熔岩蟲", + "magcargo": "熔岩蝸牛", + "swinub": "小山豬", + "piloswine": "長毛豬", + "corsola": "太陽珊瑚", + "remoraid": "鐵炮魚", + "octillery": "章魚桶", + "delibird": "信使鳥", + "mantine": "巨翅飛魚", + "skarmory": "盔甲鳥", + "houndour": "戴魯比", + "houndoom": "黑魯加", + "kingdra": "刺龍王", + "phanpy": "小小象", + "donphan": "頓甲", + "porygon2": "多邊獸2型", + "stantler": "驚角鹿", + "smeargle": "圖圖犬", + "tyrogue": "無畏小子", + "hitmontop": "戰舞郎", + "smoochum": "迷脣娃", + "elekid": "電擊怪", + "magby": "鴨嘴寶寶", + "miltank": "大奶罐", + "blissey": "幸福蛋", + "raikou": "雷公", + "entei": "炎帝", + "suicune": "水君", + "larvitar": "幼基拉斯", + "pupitar": "沙基拉斯", + "tyranitar": "班基拉斯", + "lugia": "洛奇亞", + "ho_oh": "鳳王", + "celebi": "時拉比", + "treecko": "木守宮", + "grovyle": "森林蜥蜴", + "sceptile": "蜥蜴王", + "torchic": "火稚雞", + "combusken": "力壯雞", + "blaziken": "火焰雞", + "mudkip": "水躍魚", + "marshtomp": "沼躍魚", + "swampert": "巨沼怪", + "poochyena": "土狼犬", + "mightyena": "大狼犬", + "zigzagoon": "蛇紋熊", + "linoone": "直衝熊", + "wurmple": "刺尾蟲", + "silcoon": "甲殼繭", + "beautifly": "狩獵鳳蝶", + "cascoon": "盾甲繭", + "dustox": "毒粉蛾", + "lotad": "蓮葉童子", + "lombre": "蓮帽小童", + "ludicolo": "樂天河童", + "seedot": "橡實果", + "nuzleaf": "長鼻葉", + "shiftry": "狡猾天狗", + "taillow": "傲骨燕", + "swellow": "大王燕", + "wingull": "長翅鷗", + "pelipper": "大嘴鷗", + "ralts": "拉魯拉絲", + "kirlia": "奇魯莉安", + "gardevoir": "沙奈朵", + "surskit": "溜溜糖球", + "masquerain": "雨翅蛾", + "shroomish": "蘑蘑菇", + "breloom": "斗笠菇", + "slakoth": "懶人獺", + "vigoroth": "過動猿", + "slaking": "請假王", + "nincada": "土居忍士", + "ninjask": "鐵面忍者", + "shedinja": "脫殼忍者", + "whismur": "咕妞妞", + "loudred": "吼爆彈", + "exploud": "爆音怪", + "makuhita": "幕下力士", + "hariyama": "鐵掌力士", + "azurill": "露力麗", + "nosepass": "朝北鼻", + "skitty": "向尾喵", + "delcatty": "優雅貓", + "sableye": "勾魂眼", + "mawile": "大嘴娃", + "aron": "可可多拉", + "lairon": "可多拉", + "aggron": "波士可多拉", + "meditite": "瑪沙那", + "medicham": "恰雷姆", + "electrike": "落雷獸", + "manectric": "雷電獸", + "plusle": "正電拍拍", + "minun": "負電拍拍", + "volbeat": "電螢蟲", + "illumise": "甜甜螢", + "roselia": "毒薔薇", + "gulpin": "溶食獸", + "swalot": "吞食獸", + "carvanha": "利牙魚", + "sharpedo": "巨牙鯊", + "wailmer": "吼吼鯨", + "wailord": "吼鯨王", + "numel": "呆火駝", + "camerupt": "噴火駝", + "torkoal": "煤炭龜", + "spoink": "跳跳豬", + "grumpig": "噗噗豬", + "spinda": "晃晃斑", + "trapinch": "大顎蟻", + "vibrava": "超音波幼蟲", + "flygon": "沙漠蜻蜓", + "cacnea": "刺球仙人掌", + "cacturne": "夢歌仙人掌", + "swablu": "青綿鳥", + "altaria": "七夕青鳥", + "zangoose": "貓鼬斬", + "seviper": "飯匙蛇", + "lunatone": "月石", + "solrock": "太陽巖", + "barboach": "泥泥鰍", + "whiscash": "鯰魚王", + "corphish": "龍蝦小兵", + "crawdaunt": "鐵螯龍蝦", + "baltoy": "天秤偶", + "claydol": "念力土偶", + "lileep": "觸手百合", + "cradily": "搖籃百合", + "anorith": "太古羽蟲", + "armaldo": "太古盔甲", + "feebas": "醜醜魚", + "milotic": "美納斯", + "castform": "飄浮泡泡", + "kecleon": "變隱龍", + "shuppet": "怨影娃娃", + "banette": "詛咒娃娃", + "duskull": "夜巡靈", + "dusclops": "彷徨夜靈", + "tropius": "熱帶龍", + "chimecho": "風鈴鈴", + "absol": "阿勃梭魯", + "wynaut": "小果然", + "snorunt": "雪童子", + "glalie": "冰鬼護", + "spheal": "海豹球", + "sealeo": "海魔獅", + "walrein": "帝牙海獅", + "clamperl": "珍珠貝", + "huntail": "獵斑魚", + "gorebyss": "櫻花魚", + "relicanth": "古空棘魚", + "luvdisc": "愛心魚", + "bagon": "寶貝龍", + "shelgon": "甲殼龍", + "salamence": "暴飛龍", + "beldum": "鐵啞鈴", + "metang": "金屬怪", + "metagross": "巨金怪", + "regirock": "雷吉洛克", + "regice": "雷吉艾斯", + "registeel": "雷吉斯奇魯", + "latias": "拉帝亞斯", + "latios": "拉帝歐斯", + "kyogre": "蓋歐卡", + "groudon": "固拉多", + "rayquaza": "烈空坐", + "jirachi": "基拉祈", + "deoxys": "代歐奇希斯", + "turtwig": "草苗龜", + "grotle": "樹林龜", + "torterra": "土臺龜", + "chimchar": "小火焰猴", + "monferno": "猛火猴", + "infernape": "烈焰猴", + "piplup": "波加曼", + "prinplup": "波皇子", + "empoleon": "帝王拿波", + "starly": "姆克兒", + "staravia": "姆克鳥", + "staraptor": "姆克鷹", + "bidoof": "大牙狸", + "bibarel": "大尾狸", + "kricketot": "圓法師", + "kricketune": "音箱蟀", + "shinx": "小貓怪", + "luxio": "勒克貓", + "luxray": "倫琴貓", + "budew": "含羞苞", + "roserade": "羅絲雷朵", + "cranidos": "頭蓋龍", + "rampardos": "戰槌龍", + "shieldon": "盾甲龍", + "bastiodon": "護城龍", + "burmy": "結草兒", + "wormadam": "結草貴婦", + "mothim": "紳士蛾", + "combee": "三蜜蜂", + "vespiquen": "蜂女王", + "pachirisu": "帕奇利茲", + "buizel": "泳圈鼬", + "floatzel": "浮潛鼬", + "cherubi": "櫻花寶", + "cherrim": "櫻花兒", + "shellos": "無殼海兔", + "gastrodon": "海兔獸", + "ambipom": "雙尾怪手", + "drifloon": "飄飄球", + "drifblim": "隨風球", + "buneary": "卷卷耳", + "lopunny": "長耳兔", + "mismagius": "夢妖魔", + "honchkrow": "烏鴉頭頭", + "glameow": "魅力喵", + "purugly": "東施喵", + "chingling": "鈴鐺響", + "stunky": "臭鼬噗", + "skuntank": "坦克臭鼬", + "bronzor": "銅鏡怪", + "bronzong": "青銅鐘", + "bonsly": "盆纔怪", + "mime_jr": "魔尼尼", + "happiny": "小福蛋", + "chatot": "聒噪鳥", + "spiritomb": "花巖怪", + "gible": "圓陸鯊", + "gabite": "尖牙陸鯊", + "garchomp": "烈咬陸鯊", + "munchlax": "小卡比獸", + "riolu": "利歐路", + "lucario": "路卡利歐", + "hippopotas": "沙河馬", + "hippowdon": "河馬獸", + "skorupi": "鉗尾蠍", + "drapion": "龍王蠍", + "croagunk": "不良蛙", + "toxicroak": "毒骷蛙", + "carnivine": "尖牙籠", + "finneon": "熒光魚", + "lumineon": "霓虹魚", + "mantyke": "小球飛魚", + "snover": "雪笠怪", + "abomasnow": "暴雪王", + "weavile": "瑪狃拉", + "magnezone": "自爆磁怪", + "lickilicky": "大舌舔", + "rhyperior": "超甲狂犀", + "tangrowth": "巨蔓藤", + "electivire": "電擊魔獸", + "magmortar": "鴨嘴炎獸", + "togekiss": "波克基斯", + "yanmega": "遠古巨蜓", + "leafeon": "葉伊布", + "glaceon": "冰伊布", + "gliscor": "天蠍王", + "mamoswine": "象牙豬", + "porygon_z": "多邊獸乙型", + "gallade": "艾路雷朵", + "probopass": "大朝北鼻", + "dusknoir": "黑夜魔靈", + "froslass": "雪妖女", + "rotom": "洛託姆", + "uxie": "由克希", + "mesprit": "艾姆利多", + "azelf": "亞克諾姆", + "dialga": "帝牙盧卡", + "palkia": "帕路奇亞", + "heatran": "席多藍恩", + "regigigas": "雷吉奇卡斯", + "giratina": "騎拉帝納", + "cresselia": "克雷色利亞", + "phione": "霏歐納", + "manaphy": "瑪納霏", + "darkrai": "達克萊伊", + "shaymin": "謝米", + "arceus": "阿爾宙斯", + "victini": "比克提尼", + "snivy": "藤藤蛇", + "servine": "青藤蛇", + "serperior": "君主蛇", + "tepig": "暖暖豬", + "pignite": "炒炒豬", + "emboar": "炎武王", + "oshawott": "水水獺", + "dewott": "雙刃丸", + "samurott": "大劍鬼", + "patrat": "探探鼠", + "watchog": "步哨鼠", + "lillipup": "小約克", + "herdier": "哈約克", + "stoutland": "長毛狗", + "purrloin": "扒手貓", + "liepard": "酷豹", + "pansage": "花椰猴", + "simisage": "花椰猿", + "pansear": "爆香猴", + "simisear": "爆香猿", + "panpour": "冷水猴", + "simipour": "冷水猿", + "munna": "食夢夢", + "musharna": "夢夢蝕", + "pidove": "豆豆鴿", + "tranquill": "咕咕鴿", + "unfezant": "高傲雉雞", + "blitzle": "斑斑馬", + "zebstrika": "雷電斑馬", + "roggenrola": "石丸子", + "boldore": "地幔巖", + "gigalith": "龐巖怪", + "woobat": "滾滾蝙蝠", + "swoobat": "心蝙蝠", + "drilbur": "螺釘地鼠", + "excadrill": "龍頭地鼠", + "audino": "差不多娃娃", + "timburr": "搬運小匠", + "gurdurr": "鐵骨土人", + "conkeldurr": "修建老匠", + "tympole": "圓蝌蚪", + "palpitoad": "藍蟾蜍", + "seismitoad": "蟾蜍王", + "throh": "投摔鬼", + "sawk": "打擊鬼", + "sewaddle": "蟲寶包", + "swadloon": "寶包繭", + "leavanny": "保姆蟲", + "venipede": "百足蜈蚣", + "whirlipede": "車輪球", + "scolipede": "蜈蚣王", + "cottonee": "木棉球", + "whimsicott": "風妖精", + "petilil": "百合根娃娃", + "lilligant": "裙兒小姐", + "basculin": "野蠻鱸魚", + "sandile": "黑眼鱷", + "krokorok": "混混鱷", + "krookodile": "流氓鱷", + "darumaka": "火紅不倒翁", + "darmanitan": "達摩狒狒", + "maractus": "沙鈴仙人掌", + "dwebble": "石居蟹", + "crustle": "巖殿居蟹", + "scraggy": "滑滑小子", + "scrafty": "頭巾混混", + "sigilyph": "象徵鳥", + "yamask": "哭哭面具", + "cofagrigus": "迭失棺", + "tirtouga": "原蓋海龜", + "carracosta": "肋骨海龜", + "archen": "始祖小鳥", + "archeops": "始祖大鳥", + "trubbish": "破破袋", + "garbodor": "灰塵山", + "zorua": "索羅亞", + "zoroark": "索羅亞克", + "minccino": "泡沫栗鼠", + "cinccino": "奇諾栗鼠", + "gothita": "哥德寶寶", + "gothorita": "哥德小童", + "gothitelle": "哥德小姐", + "solosis": "單卵細胞球", + "duosion": "雙卵細胞球", + "reuniclus": "人造細胞卵", + "ducklett": "鴨寶寶", + "swanna": "舞天鵝", + "vanillite": "迷你冰", + "vanillish": "多多冰", + "vanilluxe": "雙倍多多冰", + "deerling": "四季鹿", + "sawsbuck": "萌芽鹿", + "emolga": "電飛鼠", + "karrablast": "蓋蓋蟲", + "escavalier": "騎士蝸牛", + "foongus": "哎呀球菇", + "amoonguss": "敗露球菇", + "frillish": "輕飄飄", + "jellicent": "胖嘟嘟", + "alomomola": "保姆曼波", + "joltik": "電電蟲", + "galvantula": "電蜘蛛", + "ferroseed": "種子鐵球", + "ferrothorn": "堅果啞鈴", + "klink": "齒輪兒", + "klang": "齒輪組", + "klinklang": "齒輪怪", + "tynamo": "麻麻小魚", + "eelektrik": "麻麻鰻", + "eelektross": "麻麻鰻魚王", + "elgyem": "小灰怪", + "beheeyem": "大宇怪", + "litwick": "燭光靈", + "lampent": "燈火幽靈", + "chandelure": "水晶燈火靈", + "axew": "牙牙", + "fraxure": "斧牙龍", + "haxorus": "雙斧戰龍", + "cubchoo": "噴嚏熊", + "beartic": "凍原熊", + "cryogonal": "幾何雪花", + "shelmet": "小嘴蝸", + "accelgor": "敏捷蟲", + "stunfisk": "泥巴魚", + "mienfoo": "功夫鼬", + "mienshao": "師父鼬", + "druddigon": "赤面龍", + "golett": "泥偶小人", + "golurk": "泥偶巨人", + "pawniard": "駒刀小兵", + "bisharp": "劈斬司令", + "bouffalant": "爆炸頭水牛", + "rufflet": "毛頭小鷹", + "braviary": "勇士雄鷹", + "vullaby": "禿鷹丫頭", + "mandibuzz": "禿鷹娜", + "heatmor": "熔蟻獸", + "durant": "鐵蟻", + "deino": "單首龍", + "zweilous": "雙首暴龍", + "hydreigon": "三首惡龍", + "larvesta": "燃燒蟲", + "volcarona": "火神蛾", + "cobalion": "勾帕路翁", + "terrakion": "代拉基翁", + "virizion": "畢力吉翁", + "tornadus": "龍捲雲", + "thundurus": "雷電雲", + "reshiram": "萊希拉姆", + "zekrom": "捷克羅姆", + "landorus": "土地雲", + "kyurem": "酋雷姆", + "keldeo": "凱路迪歐", + "meloetta": "美洛耶塔", + "genesect": "蓋諾賽克特", + "chespin": "哈力慄", + "quilladin": "胖胖哈力", + "chesnaught": "布里卡隆", + "fennekin": "火狐狸", + "braixen": "長尾火狐", + "delphox": "妖火紅狐", + "froakie": "呱呱泡蛙", + "frogadier": "呱頭蛙", + "greninja": "甲賀忍蛙", + "bunnelby": "掘掘兔", + "diggersby": "掘地兔", + "fletchling": "小箭雀", + "fletchinder": "火箭雀", + "talonflame": "烈箭鷹", + "scatterbug": "粉蝶蟲", + "spewpa": "粉蝶蛹", + "vivillon": "彩粉蝶", + "litleo": "小獅獅", + "pyroar": "火炎獅", + "flabebe": "花蓓蓓", + "floette": "花葉蒂", + "florges": "花潔夫人", + "skiddo": "坐騎小羊", + "gogoat": "坐騎山羊", + "pancham": "頑皮熊貓", + "pangoro": "霸道熊貓", + "furfrou": "多麗米亞", + "espurr": "妙喵", + "meowstic": "超能妙喵", + "honedge": "獨劍鞘", + "doublade": "雙劍鞘", + "aegislash": "堅盾劍怪", + "spritzee": "粉香香", + "aromatisse": "芳香精", + "swirlix": "綿綿泡芙", + "slurpuff": "胖甜妮", + "inkay": "好啦魷", + "malamar": "烏賊王", + "binacle": "龜腳腳", + "barbaracle": "龜足巨鎧", + "skrelp": "垃垃藻", + "dragalge": "毒藻龍", + "clauncher": "鐵臂槍蝦", + "clawitzer": "鋼炮臂蝦", + "helioptile": "傘電蜥", + "heliolisk": "光電傘蜥", + "tyrunt": "寶寶暴龍", + "tyrantrum": "怪顎龍", + "amaura": "冰雪龍", + "aurorus": "冰雪巨龍", + "sylveon": "仙子伊布", + "hawlucha": "摔角鷹人", + "dedenne": "咚咚鼠", + "carbink": "小碎鑽", + "goomy": "黏黏寶", + "sliggoo": "黏美兒", + "goodra": "黏美龍", + "klefki": "鑰圈兒", + "phantump": "小木靈", + "trevenant": "朽木妖", + "pumpkaboo": "南瓜精", + "gourgeist": "南瓜怪人", + "bergmite": "冰寶", + "avalugg": "冰岩怪", + "noibat": "嗡蝠", + "noivern": "音波龍", + "xerneas": "哲爾尼亞斯", + "yveltal": "伊裴爾塔爾", + "zygarde": "基格爾德", + "diancie": "蒂安希", + "hoopa": "胡帕", + "volcanion": "波爾凱尼恩", + "rowlet": "木木梟", + "dartrix": "投羽梟", + "decidueye": "狙射樹梟", + "litten": "火斑喵", + "torracat": "炎熱喵", + "incineroar": "熾焰咆哮虎", + "popplio": "球球海獅", + "brionne": "花漾海獅", + "primarina": "西獅海壬", + "pikipek": "小篤兒", + "trumbeak": "喇叭啄鳥", + "toucannon": "銃嘴大鳥", + "yungoos": "貓鼬少", + "gumshoos": "貓鼬探長", + "grubbin": "強顎雞母蟲", + "charjabug": "蟲電寶", + "vikavolt": "鍬農炮蟲", + "crabrawler": "好勝蟹", + "crabominable": "好勝毛蟹", + "oricorio": "花舞鳥", + "cutiefly": "萌虻", + "ribombee": "蝶結萌虻", + "rockruff": "巖狗狗", + "lycanroc": "鬃巖狼人", + "wishiwashi": "弱丁魚", + "mareanie": "好壞星", + "toxapex": "超壞星", + "mudbray": "泥驢仔", + "mudsdale": "重泥挽馬", + "dewpider": "滴蛛", + "araquanid": "滴蛛霸", + "fomantis": "僞螳草", + "lurantis": "蘭螳花", + "morelull": "睡睡菇", + "shiinotic": "燈罩夜菇", + "salandit": "夜盜火蜥", + "salazzle": "焰後蜥", + "stufful": "童偶熊", + "bewear": "穿着熊", + "bounsweet": "甜竹竹", + "steenee": "甜舞妮", + "tsareena": "甜冷美后", + "comfey": "花療環環", + "oranguru": "智揮猩", + "passimian": "投擲猴", + "wimpod": "膽小蟲", + "golisopod": "具甲武者", + "sandygast": "沙丘娃", + "palossand": "噬沙堡爺", + "pyukumuku": "拳海蔘", + "type_null": "屬性:空", + "silvally": "銀伴戰獸", + "minior": "小隕星", + "komala": "樹枕尾熊", + "turtonator": "爆焰龜獸", + "togedemaru": "託戈德瑪爾", + "mimikyu": "謎擬丘", + "bruxish": "磨牙彩皮魚", + "drampa": "老翁龍", + "dhelmise": "破破舵輪", + "jangmo_o": "心鱗寶", + "hakamo_o": "鱗甲龍", + "kommo_o": "杖尾鱗甲龍", + "tapu_koko": "卡璞・鳴鳴", + "tapu_lele": "卡璞・蝶蝶", + "tapu_bulu": "卡璞・哞哞", + "tapu_fini": "卡璞・鰭鰭", + "cosmog": "科斯莫古", + "cosmoem": "科斯莫姆", + "solgaleo": "索爾迦雷歐", + "lunala": "露奈雅拉", + "nihilego": "虛吾伊德", + "buzzwole": "爆肌蚊", + "pheromosa": "費洛美螂", + "xurkitree": "電束木", + "celesteela": "鐵火輝夜", + "kartana": "紙御劍", + "guzzlord": "惡食大王", + "necrozma": "奈克洛茲瑪", + "magearna": "瑪機雅娜", + "marshadow": "瑪夏多", + "poipole": "毒貝比", + "naganadel": "四顎針龍", + "stakataka": "壘磊石", + "blacephalon": "砰頭小丑", + "zeraora": "捷拉奧拉", + "meltan": "美錄坦", + "melmetal": "美錄梅塔", + "grookey": "敲音猴", + "thwackey": "啪咚猴", + "rillaboom": "轟擂金剛猩", + "scorbunny": "炎兔兒", + "raboot": "騰蹴小將", + "cinderace": "閃焰王牌", + "sobble": "淚眼蜥", + "drizzile": "變澀蜥", + "inteleon": "千面避役", + "skwovet": "貪心栗鼠", + "greedent": "藏飽栗鼠", + "rookidee": "稚山雀", + "corvisquire": "藍鴉", + "corviknight": "鋼鎧鴉", + "blipbug": "索偵蟲", + "dottler": "天罩蟲", + "orbeetle": "以歐路普", + "nickit": "狡小狐", + "thievul": "猾大狐", + "gossifleur": "幼棉棉", + "eldegoss": "白蓬蓬", + "wooloo": "毛辮羊", + "dubwool": "毛毛角羊", + "chewtle": "咬咬龜", + "drednaw": "暴噬龜", + "yamper": "來電汪", + "boltund": "逐電犬", + "rolycoly": "小炭仔", + "carkol": "大炭車", + "coalossal": "巨炭山", + "applin": "啃果蟲", + "flapple": "蘋裹龍", + "appletun": "豐蜜龍", + "silicobra": "沙包蛇", + "sandaconda": "沙螺蟒", + "cramorant": "古月鳥", + "arrokuda": "刺梭魚", + "barraskewda": "戽斗尖梭", + "toxel": "電音嬰", + "toxtricity": "顫弦蠑螈", + "sizzlipede": "燒火蚣", + "centiskorch": "焚焰蚣", + "clobbopus": "拳拳蛸", + "grapploct": "八爪武師", + "sinistea": "來悲茶", + "polteageist": "怖思壺", + "hatenna": "迷布莉姆", + "hattrem": "提布莉姆", + "hatterene": "布莉姆溫", + "impidimp": "搗蛋小妖", + "morgrem": "詐唬魔", + "grimmsnarl": "長毛巨魔", + "obstagoon": "堵攔熊", + "perrserker": "喵頭目", + "cursola": "魔靈珊瑚", + "sirfetchd": "蔥遊兵", + "mr_rime": "踏冰人偶", + "runerigus": "迭失板", + "milcery": "小仙奶", + "alcremie": "霜奶仙", + "falinks": "列陣兵", + "pincurchin": "啪嚓海膽", + "snom": "雪吞蟲", + "frosmoth": "雪絨蛾", + "stonjourner": "巨石丁", + "eiscue": "冰砌鵝", + "indeedee": "愛管侍", + "morpeko": "莫魯貝可", + "cufant": "銅象", + "copperajah": "大王銅象", + "dracozolt": "雷鳥龍", + "arctozolt": "雷鳥海獸", + "dracovish": "鰓魚龍", + "arctovish": "鰓魚海獸", + "duraludon": "鋁鋼龍", + "dreepy": "多龍梅西亞", + "drakloak": "多龍奇", + "dragapult": "多龍巴魯託", + "zacian": "蒼響", + "zamazenta": "藏瑪然特", + "eternatus": "無極汰那", + "kubfu": "熊徒弟", + "urshifu": "武道熊師", + "zarude": "薩戮德", + "regieleki": "雷吉艾勒奇", + "regidrago": "雷吉鐸拉戈", + "glastrier": "雪暴馬", + "spectrier": "靈幽馬", + "calyrex": "蕾冠王", + "wyrdeer": "詭角鹿", + "kleavor": "劈斧螳螂", + "ursaluna": "月月熊", + "basculegion": "幽尾玄魚", + "sneasler": "大狃拉", + "overqwil": "萬針魚", + "enamorus": "眷戀雲", + "sprigatito": "新葉喵", + "floragato": "蒂蕾喵", + "meowscarada": "魔幻假面喵", + "fuecoco": "呆火鱷", + "crocalor": "炙燙鱷", + "skeledirge": "骨紋巨聲鱷", + "quaxly": "潤水鴨", + "quaxwell": "湧躍鴨", + "quaquaval": "狂歡浪舞鴨", + "lechonk": "愛喫豚", + "oinkologne": "飄香豚", + "tarountula": "團珠蛛", + "spidops": "操陷蛛", + "nymble": "豆蟋蟀", + "lokix": "烈腿蝗", + "pawmi": "布撥", + "pawmo": "布土撥", + "pawmot": "巴布土撥", + "tandemaus": "一對鼠", + "maushold": "一家鼠", + "fidough": "狗仔包", + "dachsbun": "麻花犬", + "smoliv": "迷你芙", + "dolliv": "奧利紐", + "arboliva": "奧利瓦", + "squawkabilly": "怒鸚哥", + "nacli": "鹽石寶", + "naclstack": "鹽石壘", + "garganacl": "鹽石巨靈", + "charcadet": "炭小侍", + "armarouge": "紅蓮鎧騎", + "ceruledge": "蒼炎刃鬼", + "tadbulb": "光蚪仔", + "bellibolt": "電肚蛙", + "wattrel": "電海燕", + "kilowattrel": "大電海燕", + "maschiff": "偶叫獒", + "mabosstiff": "獒教父", + "shroodle": "滋汁鼴", + "grafaiai": "塗標客", + "bramblin": "納噬草", + "brambleghast": "怖納噬草", + "toedscool": "原野水母", + "toedscruel": "陸地水母", + "klawf": "毛崖蟹", + "capsakid": "熱辣娃", + "scovillain": "狠辣椒", + "rellor": "蟲滾泥", + "rabsca": "蟲甲聖", + "flittle": "飄飄雛", + "espathra": "超能豔鴕", + "tinkatink": "小鍛匠", + "tinkatuff": "巧鍛匠", + "tinkaton": "巨鍛匠", + "wiglett": "海地鼠", + "wugtrio": "三海地鼠", + "bombirdier": "下石鳥", + "finizen": "波普海豚", + "palafin": "海豚俠", + "varoom": "噗隆隆", + "revavroom": "普隆隆姆", + "cyclizar": "摩托蜥", + "orthworm": "拖拖蚓", + "glimmet": "晶光芽", + "glimmora": "晶光花", + "greavard": "墓仔狗", + "houndstone": "墓揚犬", + "flamigo": "纏紅鶴", + "cetoddle": "走鯨", + "cetitan": "浩大鯨", + "veluza": "輕身鱈", + "dondozo": "喫吼霸", + "tatsugiri": "米立龍", + "annihilape": "棄世猴", + "clodsire": "土王", + "farigiraf": "奇麒麟", + "dudunsparce": "土龍節節", + "kingambit": "僕刀將軍", + "great_tusk": "雄偉牙", + "scream_tail": "吼叫尾", + "brute_bonnet": "猛惡菇", + "flutter_mane": "振翼發", + "slither_wing": "爬地翅", + "sandy_shocks": "沙鐵皮", + "iron_treads": "鐵轍跡", + "iron_bundle": "鐵包袱", + "iron_hands": "鐵臂膀", + "iron_jugulis": "鐵脖頸", + "iron_moth": "鐵毒蛾", + "iron_thorns": "鐵荊棘", + "frigibax": "涼脊龍", + "arctibax": "凍脊龍", + "baxcalibur": "戟脊龍", + "gimmighoul": "索財靈", + "gholdengo": "賽富豪", + "wo_chien": "古簡蝸", + "chien_pao": "古劍豹", + "ting_lu": "古鼎鹿", + "chi_yu": "古玉魚", + "roaring_moon": "轟鳴月", + "iron_valiant": "鐵武者", + "koraidon": "故勒頓", + "miraidon": "密勒頓", + "walking_wake": "波盪水", + "iron_leaves": "鐵斑葉", + "dipplin": "裹蜜蟲", + "poltchageist": "斯魔茶", + "sinistcha": "來悲粗茶", + "okidogi": "夠贊狗", + "munkidori": "願增猿", + "fezandipiti": "吉雉雞", + "ogerpon": "厄詭椪", + "archaludon": "鋁鋼橋龍", + "hydrapple": "蜜集大蛇", + "gouging_fire": "破空焰", + "raging_bolt": "猛雷鼓", + "iron_boulder": "鐵磐巖", + "iron_crown": "鐵頭殼", + "terapagos": "太樂巴戈斯", + "pecharunt": "桃歹郎", + "alola_rattata": "小拉達", + "alola_raticate": "拉達", + "alola_raichu": "雷丘", + "alola_sandshrew": "穿山鼠", + "alola_sandslash": "穿山王", + "alola_vulpix": "六尾", + "alola_ninetales": "九尾", + "alola_diglett": "地鼠", + "alola_dugtrio": "三地鼠", + "alola_meowth": "喵喵", + "alola_persian": "貓老大", + "alola_geodude": "小拳石", + "alola_graveler": "隆隆石", + "alola_golem": "隆隆巖", + "alola_grimer": "臭泥", + "alola_muk": "臭臭泥", + "alola_exeggutor": "椰蛋樹", + "alola_marowak": "嘎啦嘎啦", + "eternal_floette": "花葉蒂", + "galar_meowth": "喵喵", + "galar_ponyta": "小火馬", + "galar_rapidash": "烈焰馬", + "galar_slowpoke": "呆呆獸", + "galar_slowbro": "呆殼獸", + "galar_farfetchd": "大蔥鴨", + "galar_weezing": "雙彈瓦斯", + "galar_mr_mime": "魔牆人偶", + "galar_articuno": "急凍鳥", + "galar_zapdos": "閃電鳥", + "galar_moltres": "火焰鳥", + "galar_slowking": "呆呆王", + "galar_corsola": "太陽珊瑚", + "galar_zigzagoon": "蛇紋熊", + "galar_linoone": "直衝熊", + "galar_darumaka": "火紅不倒翁", + "galar_darmanitan": "達摩狒狒", + "galar_yamask": "哭哭面具", + "galar_stunfisk": "泥巴魚", + "hisui_growlithe": "卡蒂狗", + "hisui_arcanine": "風速狗", + "hisui_voltorb": "霹靂電球", + "hisui_electrode": "頑皮雷彈", + "hisui_typhlosion": "火暴獸", + "hisui_qwilfish": "千針魚", + "hisui_sneasel": "狃拉", + "hisui_samurott": "大劍鬼", + "hisui_lilligant": "裙兒小姐", + "hisui_zorua": "索羅亞", + "hisui_zoroark": "索羅亞克", + "hisui_braviary": "勇士雄鷹", + "hisui_sliggoo": "黏美兒", + "hisui_goodra": "黏美龍", + "hisui_avalugg": "冰岩怪", + "hisui_decidueye": "狙射樹梟", + "paldea_tauros": "肯泰羅", + "paldea_wooper": "烏波", + "bloodmoon_ursaluna": "月月熊", +} as const; diff --git a/src/locales/zh_TW/splash-messages.ts b/src/locales/zh_TW/splash-messages.ts index 26f7d8815574..496f3c39dc41 100644 --- a/src/locales/zh_TW/splash-messages.ts +++ b/src/locales/zh_TW/splash-messages.ts @@ -1,37 +1,37 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const splashMessages: SimpleTranslationEntries = { - "battlesWon": "勝利場數!", - "joinTheDiscord": "加入Discord!", - "infiniteLevels": "無限等級!", - "everythingStacks": "所有效果都能疊加!", - "optionalSaveScumming": "可選的存檔重刷!", - "biomes": "35種生態區!", - "openSource": "開源!", - "playWithSpeed": "以5倍速度遊玩!", - "liveBugTesting": "即時漏洞測試!", - "heavyInfluence": "深受RoR2影響!", - "pokemonRiskAndPokemonRain": "寶可夢風險與寶可夢雨!", - "nowWithMoreSalt": "現在多33%的鹽分!", - "infiniteFusionAtHome": "在家無限融合!", - "brokenEggMoves": "破損的蛋招式!", - "magnificent": "壯麗!", - "mubstitute": "替補!", - "thatsCrazy": "真是瘋狂!", - "oranceJuice": "橙汁!", - "questionableBalancing": "值得質疑的平衡性!", - "coolShaders": "酷炫的著色器!", - "aiFree": "無AI!", - "suddenDifficultySpikes": "突然的難度提升!", - "basedOnAnUnfinishedFlashGame": "基於未完成的Flash遊戲!", - "moreAddictiveThanIntended": "比預期更上癮!", - "mostlyConsistentSeeds": "大多數情況下一致的種子!", - "achievementPointsDontDoAnything": "成就點數沒有任何用處!", - "youDoNotStartAtLevel": "你不會從2000級開始!", - "dontTalkAboutTheManaphyEggIncident": "別提那個瑪納霏蛋事件!", - "alsoTryPokengine": "也試試Pokéngine!", - "alsoTryEmeraldRogue": "也試試翡翠流氓!", - "alsoTryRadicalRed": "也試試激進紅!", - "eeveeExpo": "伊布博覽會!", - "ynoproject": "YNO專案!" -} as const; \ No newline at end of file + "battlesWon": "勝利場數!", + "joinTheDiscord": "加入Discord!", + "infiniteLevels": "無限等級!", + "everythingStacks": "所有效果都能疊加!", + "optionalSaveScumming": "可選的存檔重刷!", + "biomes": "35種生態區!", + "openSource": "開源!", + "playWithSpeed": "以5倍速度遊玩!", + "liveBugTesting": "即時漏洞測試!", + "heavyInfluence": "深受RoR2影響!", + "pokemonRiskAndPokemonRain": "寶可夢風險與寶可夢雨!", + "nowWithMoreSalt": "現在多33%的鹽分!", + "infiniteFusionAtHome": "在家無限融合!", + "brokenEggMoves": "破損的蛋招式!", + "magnificent": "壯麗!", + "mubstitute": "替補!", + "thatsCrazy": "真是瘋狂!", + "oranceJuice": "橙汁!", + "questionableBalancing": "值得質疑的平衡性!", + "coolShaders": "酷炫的著色器!", + "aiFree": "無AI!", + "suddenDifficultySpikes": "突然的難度提升!", + "basedOnAnUnfinishedFlashGame": "基於未完成的Flash遊戲!", + "moreAddictiveThanIntended": "比預期更上癮!", + "mostlyConsistentSeeds": "大多數情況下一致的種子!", + "achievementPointsDontDoAnything": "成就點數沒有任何用處!", + "youDoNotStartAtLevel": "你不會從2000級開始!", + "dontTalkAboutTheManaphyEggIncident": "別提那個瑪納霏蛋事件!", + "alsoTryPokengine": "也試試Pokéngine!", + "alsoTryEmeraldRogue": "也試試翡翠流氓!", + "alsoTryRadicalRed": "也試試激進紅!", + "eeveeExpo": "伊布博覽會!", + "ynoproject": "YNO專案!" +} as const; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index be688e4e1190..f9fa9ef53333 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -6,39 +6,39 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":'使用這些寶可夢開始嗎?', - "gen1": "I", - "gen2": "II", - "gen3": "III", - "gen4": "IV", - "gen5": "V", - "gen6": "VI", - "gen7": "VII", - "gen8": "VIII", - "gen9": "IX", - "growthRate": "成長速度:", - "ability": "特性:", - "passive": "被動:", - "nature": "性格:", - "eggMoves": '孵化招式', - "start": "開始", - "addToParty": "加入隊伍", - "toggleIVs": '查看個體值', - "manageMoves": '管理技能', - "useCandies": '使用糖果', - "selectMoveSwapOut": "選擇想要替換走的招式", - "selectMoveSwapWith": "選擇想要替換成的招式", - "unlockPassive": "解鎖被動", - "reduceCost": "降低花費", - "cycleShiny": "R: 切換閃光", - "cycleForm": 'F: 切換形態', - "cycleGender": 'G: 切換性別', - "cycleAbility": 'E: 切換特性', - "cycleNature": 'N: 切換性格', - "cycleVariant": 'V: 切換變種', - "enablePassive": "啟用被動", - "disablePassive": "禁用被動", - "locked": "未解鎖", - "disabled": "已禁用", - "uncaught": "未捕獲" -} \ No newline at end of file + "confirmStartTeam":"使用這些寶可夢開始嗎?", + "gen1": "I", + "gen2": "II", + "gen3": "III", + "gen4": "IV", + "gen5": "V", + "gen6": "VI", + "gen7": "VII", + "gen8": "VIII", + "gen9": "IX", + "growthRate": "成長速度:", + "ability": "特性:", + "passive": "被動:", + "nature": "性格:", + "eggMoves": "孵化招式", + "start": "開始", + "addToParty": "加入隊伍", + "toggleIVs": "查看個體值", + "manageMoves": "管理技能", + "useCandies": "使用糖果", + "selectMoveSwapOut": "選擇想要替換走的招式", + "selectMoveSwapWith": "選擇想要替換成的招式", + "unlockPassive": "解鎖被動", + "reduceCost": "降低花費", + "cycleShiny": "R: 切換閃光", + "cycleForm": "F: 切換形態", + "cycleGender": "G: 切換性別", + "cycleAbility": "E: 切換特性", + "cycleNature": "N: 切換性格", + "cycleVariant": "V: 切換變種", + "enablePassive": "啟用被動", + "disablePassive": "禁用被動", + "locked": "未解鎖", + "disabled": "已禁用", + "uncaught": "未捕獲" +}; diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index cbcde2c2809d..03b98a97e24f 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -2,299 +2,299 @@ import {SimpleTranslationEntries} from "#app/plugins/i18n"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { - "elite_four": "四天王", - "gym_leader": "道館館主", - "gym_leader_female": "道館館主", - "champion": "冠軍", - "rival": "勁敵", - "professor": "博士", - "frontier_brain": "開拓頭腦", - // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. + "elite_four": "四天王", + "gym_leader": "道館館主", + "gym_leader_female": "道館館主", + "champion": "冠軍", + "rival": "勁敵", + "professor": "博士", + "frontier_brain": "開拓頭腦", + // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; // Titles of trainers like "Youngster" or "Lass" export const trainerClasses: SimpleTranslationEntries = { - "ace_trainer": "精英訓練家", - "ace_trainer_female": "精英訓練家", - "ace_duo": "精英組合", - "artist": "藝術家", - "artist_female": "藝術家", - "backers": "啦啦隊", - "backpacker": "背包客", - "backpacker_female": "背包客", - "backpackers": "背包客組合", - "baker": "麵包師", - "battle_girl": "對戰少女", - "beauty": "大姐姐", - "beginners": "新人訓練家組合", - "biker": "飆車族", - "black_belt": "空手道王", - "breeder": "寶可夢培育家", - "breeder_female": "寶可夢培育家", - "breeders": "寶可夢培育家組合", - "clerk": "商務人士", - "clerk_female": "職場OL", - "colleagues": "商務夥伴", - "crush_kin": "格鬥姐弟", - "cyclist": "自行車手", - "cyclist_female": "自行車手", - "cyclists": "自行車手組合", - "dancer": "舞者", - "dancer_female": "舞者", - "depot_agent": "鐵路員工", - "doctor": "醫生", - "doctor_female": "醫生", - "fisherman": "垂釣者", - "fisherman_female": "垂釣者", - "gentleman": "紳士", - "guitarist": "吉他手", - "guitarist_female": "吉他手", - "harlequin": "滑稽演員", - "hiker": "登山男", - "hooligans": "壞組合", - "hoopster": "籃球選手", - "infielder": "棒球選手", - "janitor": "清潔員", - "lady": "千金小姐", - "lass": "迷你裙", - "linebacker": "美式橄欖球選手", - "maid": "女僕", - "madame": "女士", - "medical_team": "醫療團隊", - "musician": "音樂家", - "hex_maniac": "靈異迷", - "nurse": "護士", - "nursery_aide": "幼兒園老師", - "officer": "警察", - "parasol_lady": "陽傘姐姐", - "pilot": "飛行員", - "pokéfan": "發燒友俱樂部", - "pokéfan_female": "發燒友俱樂部", - "pokéfan_family": "同好夫婦", - "preschooler": "幼兒園小朋友", - "preschooler_female": "幼兒園小朋友", - "preschoolers": "幼兒園小朋友組合", - "psychic": "超能力者", - "psychic_female": "超能力者", - "psychics": "超能力者組合", - "pokémon_ranger": "寶可夢巡護員", - "pokémon_ranger_female": "寶可夢巡護員", - "pokémon_rangers": "寶可夢巡護員組合", - "ranger": "巡護員", - "restaurant_staff": "服務生組合", - "rich": "富有", - "rich_female": "富有", - "rich_boy": "富家少爺", - "rich_couple": "富豪夫婦", - "rich_kid": "富家孩子", - "rich_kid_female": "富家孩子", - "rich_kids": "富二代組合", - "roughneck": "光頭男", - "scientist": "研究員", - "scientist_female": "研究員", - "scientists": "研究員組合", - "smasher": "網球選手", - "snow_worker": "雪地工人", - "snow_worker_female": "雪地工人", - "striker": "足球選手", - "school_kid": "補習班學生", - "school_kid_female": "補習班學生", - "school_kids": "補習班學生組合", - "swimmer": "泳褲小伙子", - "swimmer_female": "比基尼大姐姐", - "swimmers": "泳裝情侶", - "twins": "雙胞胎", - "veteran": "資深訓練家", - "veteran_female": "資深訓練家", - "veteran_duo": "資深組合", - "waiter": "服務生", - "waitress": "女服務生", - "worker": "工人", - "worker_female": "工人", - "workers": "工人組合", - "youngster": "短褲小子" + "ace_trainer": "精英訓練家", + "ace_trainer_female": "精英訓練家", + "ace_duo": "精英組合", + "artist": "藝術家", + "artist_female": "藝術家", + "backers": "啦啦隊", + "backpacker": "背包客", + "backpacker_female": "背包客", + "backpackers": "背包客組合", + "baker": "麵包師", + "battle_girl": "對戰少女", + "beauty": "大姐姐", + "beginners": "新人訓練家組合", + "biker": "飆車族", + "black_belt": "空手道王", + "breeder": "寶可夢培育家", + "breeder_female": "寶可夢培育家", + "breeders": "寶可夢培育家組合", + "clerk": "商務人士", + "clerk_female": "職場OL", + "colleagues": "商務夥伴", + "crush_kin": "格鬥姐弟", + "cyclist": "自行車手", + "cyclist_female": "自行車手", + "cyclists": "自行車手組合", + "dancer": "舞者", + "dancer_female": "舞者", + "depot_agent": "鐵路員工", + "doctor": "醫生", + "doctor_female": "醫生", + "fisherman": "垂釣者", + "fisherman_female": "垂釣者", + "gentleman": "紳士", + "guitarist": "吉他手", + "guitarist_female": "吉他手", + "harlequin": "滑稽演員", + "hiker": "登山男", + "hooligans": "壞組合", + "hoopster": "籃球選手", + "infielder": "棒球選手", + "janitor": "清潔員", + "lady": "千金小姐", + "lass": "迷你裙", + "linebacker": "美式橄欖球選手", + "maid": "女僕", + "madame": "女士", + "medical_team": "醫療團隊", + "musician": "音樂家", + "hex_maniac": "靈異迷", + "nurse": "護士", + "nursery_aide": "幼兒園老師", + "officer": "警察", + "parasol_lady": "陽傘姐姐", + "pilot": "飛行員", + "pokéfan": "發燒友俱樂部", + "pokéfan_female": "發燒友俱樂部", + "pokéfan_family": "同好夫婦", + "preschooler": "幼兒園小朋友", + "preschooler_female": "幼兒園小朋友", + "preschoolers": "幼兒園小朋友組合", + "psychic": "超能力者", + "psychic_female": "超能力者", + "psychics": "超能力者組合", + "pokémon_ranger": "寶可夢巡護員", + "pokémon_ranger_female": "寶可夢巡護員", + "pokémon_rangers": "寶可夢巡護員組合", + "ranger": "巡護員", + "restaurant_staff": "服務生組合", + "rich": "富有", + "rich_female": "富有", + "rich_boy": "富家少爺", + "rich_couple": "富豪夫婦", + "rich_kid": "富家孩子", + "rich_kid_female": "富家孩子", + "rich_kids": "富二代組合", + "roughneck": "光頭男", + "scientist": "研究員", + "scientist_female": "研究員", + "scientists": "研究員組合", + "smasher": "網球選手", + "snow_worker": "雪地工人", + "snow_worker_female": "雪地工人", + "striker": "足球選手", + "school_kid": "補習班學生", + "school_kid_female": "補習班學生", + "school_kids": "補習班學生組合", + "swimmer": "泳褲小伙子", + "swimmer_female": "比基尼大姐姐", + "swimmers": "泳裝情侶", + "twins": "雙胞胎", + "veteran": "資深訓練家", + "veteran_female": "資深訓練家", + "veteran_duo": "資深組合", + "waiter": "服務生", + "waitress": "女服務生", + "worker": "工人", + "worker_female": "工人", + "workers": "工人組合", + "youngster": "短褲小子" } as const; // Names of special trainers like gym leaders, elite four, and the champion export const trainerNames: SimpleTranslationEntries = { - // ---- 館主 Gym leader ---- - // 關都地區 Kanto Region - "brock": "小剛", - "misty": "小霞", - "lt_surge": "馬志士", - "erika": "莉佳", - "janine": "阿杏", - "sabrina": "娜姿", - "blaine": "夏伯", - "giovanni": "坂木", + // ---- 館主 Gym leader ---- + // 關都地區 Kanto Region + "brock": "小剛", + "misty": "小霞", + "lt_surge": "馬志士", + "erika": "莉佳", + "janine": "阿杏", + "sabrina": "娜姿", + "blaine": "夏伯", + "giovanni": "坂木", - // 城都地區 Johto Region - "falkner": "阿速", - "bugsy": "阿筆", - "whitney": "小茜", - "morty": "松葉", - "chuck": "阿四", - "jasmine": "阿蜜", - "pryce": "柳伯", - "clair": "小椿", + // 城都地區 Johto Region + "falkner": "阿速", + "bugsy": "阿筆", + "whitney": "小茜", + "morty": "松葉", + "chuck": "阿四", + "jasmine": "阿蜜", + "pryce": "柳伯", + "clair": "小椿", - // 豐緣地區 Hoenn Region - "roxanne": "杜鵑", - "brawly": "藤樹", - "wattson": "鐵旋", - "flannery": "亞莎", - "norman": "千里", - "winona": "娜琪", - "tate": "小楓", - "liza": "小南", - "juan": "亞當", + // 豐緣地區 Hoenn Region + "roxanne": "杜鵑", + "brawly": "藤樹", + "wattson": "鐵旋", + "flannery": "亞莎", + "norman": "千里", + "winona": "娜琪", + "tate": "小楓", + "liza": "小南", + "juan": "亞當", - // 神奧地區 Sinnoh Region - "roark": "瓢太", - "gardenia": "菜種", - "maylene": "阿李", - "crasher_wake": "吉憲", - "fantina": "梅麗莎", - "byron": "東瓜", - "candice": "小菘", - "volkner": "電次", + // 神奧地區 Sinnoh Region + "roark": "瓢太", + "gardenia": "菜種", + "maylene": "阿李", + "crasher_wake": "吉憲", + "fantina": "梅麗莎", + "byron": "東瓜", + "candice": "小菘", + "volkner": "電次", - // 合眾地區 Unova Region - "cilan": "天桐", - "chili": "伯特", - "cress": "寇恩", - "cheren": "黑連", - "lenora": "蘆薈", - "roxie": "霍米加", - "burgh": "亞堤", - "elesa": "小菊兒", - "clay": "菊老大", - "skyla": "風露", - "brycen": "哈奇庫", - "drayden": "夏卡", - "marlon": "西子伊", + // 合眾地區 Unova Region + "cilan": "天桐", + "chili": "伯特", + "cress": "寇恩", + "cheren": "黑連", + "lenora": "蘆薈", + "roxie": "霍米加", + "burgh": "亞堤", + "elesa": "小菊兒", + "clay": "菊老大", + "skyla": "風露", + "brycen": "哈奇庫", + "drayden": "夏卡", + "marlon": "西子伊", - // 卡洛斯地區 Kalos Region - "viola": "紫羅蘭", - "grant": "查克洛", - "korrina": "可爾妮", - "ramos": "福爺", - "clemont": "希特隆", - "valerie": "瑪綉", - "olympia": "葛吉花", - "wulfric": "得撫", + // 卡洛斯地區 Kalos Region + "viola": "紫羅蘭", + "grant": "查克洛", + "korrina": "可爾妮", + "ramos": "福爺", + "clemont": "希特隆", + "valerie": "瑪綉", + "olympia": "葛吉花", + "wulfric": "得撫", - // 伽勒爾地區 Galar Region - "milo": "亞洛", - "nessa": "露璃娜", - "kabu": "卡芜", - "bea": "彩豆", - "allister": "歐尼奧", - "opal": "波普菈", - "bede": "彼特", - "gordie": "瑪瓜", - "melony": "美蓉", - "piers": "聶梓", - "marnie": "瑪俐", - "raihan": "奇巴納", + // 伽勒爾地區 Galar Region + "milo": "亞洛", + "nessa": "露璃娜", + "kabu": "卡芜", + "bea": "彩豆", + "allister": "歐尼奧", + "opal": "波普菈", + "bede": "彼特", + "gordie": "瑪瓜", + "melony": "美蓉", + "piers": "聶梓", + "marnie": "瑪俐", + "raihan": "奇巴納", - // 帕底亞地區 Paldea Region - "katy": "阿楓", - "brassius": "寇沙", - "iono": "奇樹", - "kofu": "海岱", - "larry": "青木", - "ryme": "萊姆", - "tulip": "莉普", - "grusha": "古魯夏", + // 帕底亞地區 Paldea Region + "katy": "阿楓", + "brassius": "寇沙", + "iono": "奇樹", + "kofu": "海岱", + "larry": "青木", + "ryme": "萊姆", + "tulip": "莉普", + "grusha": "古魯夏", - // ---- 四天王 Elite Four ---- - // 關都地區 Kanto Region - "lorelei": "科拿", - "bruno": "希巴", - "agatha": "菊子", - "lance": "阿渡", + // ---- 四天王 Elite Four ---- + // 關都地區 Kanto Region + "lorelei": "科拿", + "bruno": "希巴", + "agatha": "菊子", + "lance": "阿渡", - // 城都地區 Johto Region - "will": "一樹", - "koga": "阿桔", - "karen": "梨花", + // 城都地區 Johto Region + "will": "一樹", + "koga": "阿桔", + "karen": "梨花", - // 豐都地區 Hoenn Region - "sidney": "花月", - "phoebe": "芙蓉", - "glacia": "波妮", - "drake": "源治", + // 豐都地區 Hoenn Region + "sidney": "花月", + "phoebe": "芙蓉", + "glacia": "波妮", + "drake": "源治", - // 神奧地區 Sinnoh Region - "aaron": "阿柳", - "bertha": "菊野", - "flint": "大葉", - "lucian": "悟松", + // 神奧地區 Sinnoh Region + "aaron": "阿柳", + "bertha": "菊野", + "flint": "大葉", + "lucian": "悟松", - // 合眾地區 Unova Region - "shauntal": "婉龍", - "marshal": "連武", - "grimsley": "越橘", - "caitlin": "嘉德麗雅", + // 合眾地區 Unova Region + "shauntal": "婉龍", + "marshal": "連武", + "grimsley": "越橘", + "caitlin": "嘉德麗雅", - // 卡洛斯地區 Kalos Region - "malva": "帕琦拉", - "siebold": "志米", - "wikstrom": "雁鎧", - "drasna": "朵拉塞娜", + // 卡洛斯地區 Kalos Region + "malva": "帕琦拉", + "siebold": "志米", + "wikstrom": "雁鎧", + "drasna": "朵拉塞娜", - // 阿羅拉地區 Alola Region - "hala": "哈拉", - "molayne": "馬睿因", - "olivia": "麗姿", - "acerola": "阿塞蘿拉", - "kahili": "卡希麗", + // 阿羅拉地區 Alola Region + "hala": "哈拉", + "molayne": "馬睿因", + "olivia": "麗姿", + "acerola": "阿塞蘿拉", + "kahili": "卡希麗", - // 帕底亞地區 Paldea Region - "rika": "辛俐", - "poppy": "波琵", - "hassel": "八朔", + // 帕底亞地區 Paldea Region + "rika": "辛俐", + "poppy": "波琵", + "hassel": "八朔", - // 藍莓學院 Blueberry Academy - "crispin": "赤松", - "amarys": "納莉", - "lacey": "紫竽", - "drayton": "杜若", + // 藍莓學院 Blueberry Academy + "crispin": "赤松", + "amarys": "納莉", + "lacey": "紫竽", + "drayton": "杜若", - // ---- 冠軍 Champion ---- - // 關都地區 Kanto Region - "blue": "青綠", - "red": "赤紅", + // ---- 冠軍 Champion ---- + // 關都地區 Kanto Region + "blue": "青綠", + "red": "赤紅", - // 豐緣地區 Hoenn Region - "steven": "大吾", - "wallace": "米可利", + // 豐緣地區 Hoenn Region + "steven": "大吾", + "wallace": "米可利", - // 神奧地區 Sinnoh Region - "cynthia": "竹蘭", + // 神奧地區 Sinnoh Region + "cynthia": "竹蘭", - // 合眾地區 Unova Region - "alder": "阿戴克", - "iris": "艾莉絲", + // 合眾地區 Unova Region + "alder": "阿戴克", + "iris": "艾莉絲", - // 卡洛斯地區 Kalos Region - "diantha": "卡露妮", + // 卡洛斯地區 Kalos Region + "diantha": "卡露妮", - // 阿羅拉地區 Alola Region - "hau": "哈烏", + // 阿羅拉地區 Alola Region + "hau": "哈烏", - // 伽勒爾地區 Galar Region - "leon": "丹帝", + // 伽勒爾地區 Galar Region + "leon": "丹帝", - // 帕底亞地區 Paldea Region - "geeta": "也慈", - "nemona": "妮莫", + // 帕底亞地區 Paldea Region + "geeta": "也慈", + "nemona": "妮莫", - // 藍莓學院 Blueberry Academy - "kieran": "烏栗", + // 藍莓學院 Blueberry Academy + "kieran": "烏栗", - // 勁敵 Rival - "rival": "芬恩", - "rival_female": "艾薇" + // 勁敵 Rival + "rival": "芬恩", + "rival_female": "艾薇" } as const; diff --git a/src/locales/zh_TW/tutorial.ts b/src/locales/zh_TW/tutorial.ts index 13c1540ff8a5..7f2cb43801a2 100644 --- a/src/locales/zh_TW/tutorial.ts +++ b/src/locales/zh_TW/tutorial.ts @@ -1,32 +1,32 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const tutorial: SimpleTranslationEntries = { - "intro": `歡迎來到PokéRogue!這是一款以戰鬥爲核心的融合了roguelite元素的寶可夢同人遊戲。 + "intro": `歡迎來到PokéRogue!這是一款以戰鬥爲核心的融合了roguelite元素的寶可夢同人遊戲。 $本遊戲未進行商業化,我們沒有\nPokémon或Pokémon使用的版 $權資產的所有權。 $遊戲仍在開發中,但已可完整遊玩。如需報\n告錯誤,請使用 Discord 社區。 $如果遊戲運行緩慢,請確保在瀏覽器設置中\n打開了“硬件加速”。`, - "accessMenu": `在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。`, + "accessMenu": "在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。", - "menu": `在此菜單中,您可以訪問設置。 + "menu": `在此菜單中,您可以訪問設置。 $在設置中,您可以更改遊戲速度、窗口樣式\n和其他選項。 $這裏還有各種其他功能,請務必全部查看!`, - "starterSelect": `在此頁面中,您可以選擇您的初始寶可夢。\n這些是您最初的隊伍成員。 + "starterSelect": `在此頁面中,您可以選擇您的初始寶可夢。\n這些是您最初的隊伍成員。 $每個初始寶可夢都有一個費用值。您的隊伍\n最多可以擁有6名成員,只要總費用不超過10。 $您還可以根據您捕獲或孵化的變種選擇性別\n、特性和形態。 $一個物種個體值是您捕獲或孵化的所有寶可\n夢中最好的,所以儘量獲得更多同種寶可夢!`, - "pokerus": `每天隨機3個可選的初始寶可夢會有紫色邊\n框。 + "pokerus": `每天隨機3個可選的初始寶可夢會有紫色邊\n框。 $如果您看到您擁有的初始寶可夢帶有紫色邊\n框,請嘗試將其添加到您的隊伍中。請務必 $查看其概況!`, - "statChange": `只要您的寶可夢沒有被召回,屬性變化就會\n在戰鬥中持續存在。 + "statChange": `只要您的寶可夢沒有被召回,屬性變化就會\n在戰鬥中持續存在。 $在訓練家戰鬥之前和進入新的寶可夢羣落之\n前,您的寶可夢會被召回。 $您還可以通過按住C或Shift鍵來查看\n場上寶可夢的能力變化。`, - "selectItem": `每次戰鬥後,您都可以選擇 3 個隨機物品。\n您只能選擇其中一個。 + "selectItem": `每次戰鬥後,您都可以選擇 3 個隨機物品。\n您只能選擇其中一個。 $這些物品包括消耗品、寶可夢攜帶物品和永\n久被動道具。 $大多數非消耗品的效果會以各種方式疊加。 $某些物品只有在可以使用時纔會出現,例如\n進化物品。 @@ -35,10 +35,10 @@ export const tutorial: SimpleTranslationEntries = { $您可以用金錢購買消耗品,並且隨着您遊戲\n的深入,將會有更多種類的消耗品可供選擇。 $請務必在選擇隨機物品之前購買這些消耗品\n因爲一旦您選擇,遊戲就會進入下一場戰鬥。`, - "eggGacha": `在此頁面中,您可以使用您的兌換券兌換寶\n可夢蛋。 + "eggGacha": `在此頁面中,您可以使用您的兌換券兌換寶\n可夢蛋。 $蛋需要孵化,並且在每場戰鬥後都會減少孵\n化週期。稀有蛋需要更長時間才能孵化。 $孵化的寶可夢不會被添加到您的隊伍中,它\n們將被添加到您的初始寶可夢中。 $從蛋中孵化的寶可夢通常比野生寶可夢具有\n更好的個體值。 $有些寶可夢只能從蛋中獲得。 $有 3 種不同的扭蛋機可供選擇,每種扭蛋機\n都有不同的獎勵,請選擇最適合您的!` -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_TW/voucher.ts b/src/locales/zh_TW/voucher.ts index c72786a0c09d..dd2d4a7891a2 100644 --- a/src/locales/zh_TW/voucher.ts +++ b/src/locales/zh_TW/voucher.ts @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "黃金扭蛋券", "locked": "鎖定", "defeatTrainer": "你打敗了{{trainerName}}" -} as const; \ No newline at end of file +} as const; diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index ad29db0427dd..144f333874e8 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -4,41 +4,41 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "日照變強了!", - "sunnyLapseMessage": "日照很強。", - "sunnyClearMessage": "日照復原了。", - - "rainStartMessage": "下大雨了!", - "rainLapseMessage": "雨繼續下。", - "rainClearMessage": "雨停了。", - - "sandstormStartMessage": "開始刮沙暴了!", - "sandstormLapseMessage": "沙暴肆虐。", - "sandstormClearMessage": "沙暴停止了。", - "sandstormDamageMessage": "沙暴襲擊了{{pokemonPrefix}}{{pokemonName}}!", - - "hailStartMessage": "開始下冰雹了!", - "hailLapseMessage": "冰雹繼續肆虐。", - "hailClearMessage": "冰雹不再下了。", - "hailDamageMessage": "冰雹襲擊了{{pokemonPrefix}}{{pokemonName}}!", - - "snowStartMessage": "開始下雪了!", - "snowLapseMessage": "雪繼續下。", - "snowClearMessage": "雪停了。", - - "fogStartMessage": "起霧了!", - "fogLapseMessage": "霧很濃。", - "fogClearMessage": "霧散了。", - - "heavyRainStartMessage": "開始下起了暴雨!", - "heavyRainLapseMessage": "暴雨勢頭不減。", - "heavyRainClearMessage": "暴雨停了。", + "sunnyStartMessage": "日照變強了!", + "sunnyLapseMessage": "日照很強。", + "sunnyClearMessage": "日照復原了。", + + "rainStartMessage": "下大雨了!", + "rainLapseMessage": "雨繼續下。", + "rainClearMessage": "雨停了。", + + "sandstormStartMessage": "開始刮沙暴了!", + "sandstormLapseMessage": "沙暴肆虐。", + "sandstormClearMessage": "沙暴停止了。", + "sandstormDamageMessage": "沙暴襲擊了{{pokemonPrefix}}{{pokemonName}}!", + + "hailStartMessage": "開始下冰雹了!", + "hailLapseMessage": "冰雹繼續肆虐。", + "hailClearMessage": "冰雹不再下了。", + "hailDamageMessage": "冰雹襲擊了{{pokemonPrefix}}{{pokemonName}}!", + + "snowStartMessage": "開始下雪了!", + "snowLapseMessage": "雪繼續下。", + "snowClearMessage": "雪停了。", + + "fogStartMessage": "起霧了!", + "fogLapseMessage": "霧很濃。", + "fogClearMessage": "霧散了。", + + "heavyRainStartMessage": "開始下起了暴雨!", + "heavyRainLapseMessage": "暴雨勢頭不減。", + "heavyRainClearMessage": "暴雨停了。", - "harshSunStartMessage": "日照變得非常強了!", - "harshSunLapseMessage": "強日照勢頭不減。", - "harshSunClearMessage": "日照復原了。", - - "strongWindsStartMessage": "吹起了神秘的亂流!", - "strongWindsLapseMessage": "神秘的亂流勢頭不減。", - "strongWindsClearMessage": "神秘的亂流停止了。" -} \ No newline at end of file + "harshSunStartMessage": "日照變得非常強了!", + "harshSunLapseMessage": "強日照勢頭不減。", + "harshSunClearMessage": "日照復原了。", + + "strongWindsStartMessage": "吹起了神秘的亂流!", + "strongWindsLapseMessage": "神秘的亂流勢頭不減。", + "strongWindsClearMessage": "神秘的亂流停止了。" +}; diff --git a/src/main.ts b/src/main.ts index b3b4d5f3cc6f..e9b911b0e053 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,86 +1,86 @@ -import Phaser from 'phaser'; -import BattleScene from './battle-scene'; -import InvertPostFX from './pipelines/invert'; -import { version } from '../package.json'; -import UIPlugin from 'phaser3-rex-plugins/templates/ui/ui-plugin'; -import BBCodeTextPlugin from 'phaser3-rex-plugins/plugins/bbcodetext-plugin'; -import InputTextPlugin from 'phaser3-rex-plugins/plugins/inputtext-plugin.js'; -import BBCodeText from 'phaser3-rex-plugins/plugins/bbcodetext'; -import TransitionImagePackPlugin from 'phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js'; -import { LoadingScene } from './loading-scene'; +import Phaser from "phaser"; +import BattleScene from "./battle-scene"; +import InvertPostFX from "./pipelines/invert"; +import { version } from "../package.json"; +import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; +import BBCodeTextPlugin from "phaser3-rex-plugins/plugins/bbcodetext-plugin"; +import InputTextPlugin from "phaser3-rex-plugins/plugins/inputtext-plugin.js"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import TransitionImagePackPlugin from "phaser3-rex-plugins/templates/transitionimagepack/transitionimagepack-plugin.js"; +import { LoadingScene } from "./loading-scene"; // Catch global errors and display them in an alert so users can report the issue. window.onerror = function (message, source, lineno, colno, error) { - console.error(error); - let errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`; - //alert(errorString); - // Avoids logging the error a second time. - return true; + console.error(error); + // const errorString = `Received unhandled error. Open browser console and click OK to see details.\nError: ${message}\nSource: ${source}\nLine: ${lineno}\nColumn: ${colno}\nStack: ${error.stack}`; + //alert(errorString); + // Avoids logging the error a second time. + return true; }; // Catch global promise rejections and display them in an alert so users can report the issue. -window.addEventListener('unhandledrejection', (event) => { - let errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`; - console.error(event.reason); - //alert(errorString); +window.addEventListener("unhandledrejection", (event) => { + // const errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`; + console.error(event.reason); + //alert(errorString); }); const config: Phaser.Types.Core.GameConfig = { - type: Phaser.WEBGL, - parent: 'app', - scale: { - width: 1920, - height: 1080, - mode: Phaser.Scale.FIT - }, - plugins: { - global: [{ - key: 'rexInputTextPlugin', - plugin: InputTextPlugin, - start: true - }, { - key: 'rexBBCodeTextPlugin', - plugin: BBCodeTextPlugin, - start: true - }, { - key: 'rexTransitionImagePackPlugin', - plugin: TransitionImagePackPlugin, - start: true - }], - scene: [{ - key: 'rexUI', - plugin: UIPlugin, - mapping: 'rexUI' - }] - }, - input: { - mouse: { - target: 'app' - }, - touch: { - target: 'app' - }, - gamepad: true - }, - dom: { - createContainer: true - }, - pixelArt: true, - pipeline: [ InvertPostFX ] as unknown as Phaser.Types.Core.PipelineConfig, - scene: [ LoadingScene, BattleScene ], - version: version + type: Phaser.WEBGL, + parent: "app", + scale: { + width: 1920, + height: 1080, + mode: Phaser.Scale.FIT + }, + plugins: { + global: [{ + key: "rexInputTextPlugin", + plugin: InputTextPlugin, + start: true + }, { + key: "rexBBCodeTextPlugin", + plugin: BBCodeTextPlugin, + start: true + }, { + key: "rexTransitionImagePackPlugin", + plugin: TransitionImagePackPlugin, + start: true + }], + scene: [{ + key: "rexUI", + plugin: UIPlugin, + mapping: "rexUI" + }] + }, + input: { + mouse: { + target: "app" + }, + touch: { + target: "app" + }, + gamepad: true + }, + dom: { + createContainer: true + }, + pixelArt: true, + pipeline: [ InvertPostFX ] as unknown as Phaser.Types.Core.PipelineConfig, + scene: [ LoadingScene, BattleScene ], + version: version }; const setPositionRelative = function (guideObject: any, x: number, y: number) { - if (guideObject && guideObject instanceof Phaser.GameObjects.GameObject) { - const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); - const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); - this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); - return; - } + if (guideObject && guideObject instanceof Phaser.GameObjects.GameObject) { + const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); + const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); + this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); + return; + } - this.setPosition(x, y); + this.setPosition(x, y); }; Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; @@ -91,23 +91,23 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; BBCodeText.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; -document.fonts.load('16px emerald').then(() => document.fonts.load('10px pkmnems')); +document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); let game; const startGame = () => { - game = new Phaser.Game(config); - game.sound.pauseOnBlur = false; + game = new Phaser.Game(config); + game.sound.pauseOnBlur = false; }; -fetch('/manifest.json') - .then(res => res.json()) - .then(jsonResponse => { - startGame(); - game['manifest'] = jsonResponse.manifest; - }).catch(() => { - // Manifest not found (likely local build) - startGame(); - }); +fetch("/manifest.json") + .then(res => res.json()) + .then(jsonResponse => { + startGame(); + game["manifest"] = jsonResponse.manifest; + }).catch(() => { + // Manifest not found (likely local build) + startGame(); + }); export default game; diff --git a/src/messages.ts b/src/messages.ts index ffd9aa6efea9..a8549c7356b8 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -8,12 +8,12 @@ export function getPokemonMessage(pokemon: Pokemon, content: string): string { export function getPokemonPrefix(pokemon: Pokemon): string { let prefix: string; switch (pokemon.scene.currentBattle.battleSpec) { - case BattleSpec.DEFAULT: - prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? 'Foe ' : 'Wild ' : ''; - break; - case BattleSpec.FINAL_BOSS: - prefix = !pokemon.isPlayer() ? 'Foe ' : ''; - break; + case BattleSpec.DEFAULT: + prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? "Foe " : "Wild " : ""; + break; + case BattleSpec.FINAL_BOSS: + prefix = !pokemon.isPlayer() ? "Foe " : ""; + break; } return prefix; -} \ No newline at end of file +} diff --git a/src/modifier/modifier-tier.ts b/src/modifier/modifier-tier.ts index ab9ae99898e4..81bb1ad8ae54 100644 --- a/src/modifier/modifier-tier.ts +++ b/src/modifier/modifier-tier.ts @@ -5,4 +5,4 @@ export enum ModifierTier { ROGUE, MASTER, LUXURY -} \ No newline at end of file +} diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 278de2f18e8a..51e6c25122c1 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,26 +1,26 @@ -import * as Modifiers from './modifier'; -import { AttackMove, allMoves } from '../data/move'; +import * as Modifiers from "./modifier"; +import { AttackMove, allMoves } from "../data/move"; import { Moves } from "../data/enums/moves"; -import { PokeballType, getPokeballCatchMultiplier, getPokeballName } from '../data/pokeball'; -import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from '../field/pokemon'; -import { EvolutionItem, pokemonEvolutions } from '../data/pokemon-evolutions'; -import { Stat, getStatName } from '../data/pokemon-stat'; -import { tmPoolTiers, tmSpecies } from '../data/tms'; -import { Type } from '../data/type'; -import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from '../ui/party-ui-handler'; -import * as Utils from '../utils'; -import { TempBattleStat, getTempBattleStatBoosterItemName, getTempBattleStatName } from '../data/temp-battle-stat'; -import { BerryType, getBerryEffectDescription, getBerryName } from '../data/berry'; -import { Unlockables } from '../system/unlockables'; -import { StatusEffect, getStatusEffectDescriptor } from '../data/status-effect'; -import { SpeciesFormKey } from '../data/pokemon-species'; -import BattleScene from '../battle-scene'; -import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher'; -import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms'; -import { ModifierTier } from './modifier-tier'; -import { Nature, getNatureName, getNatureStatMultiplier } from '#app/data/nature'; -import i18next from '#app/plugins/i18n'; -import { getModifierTierTextTint } from '#app/ui/text'; +import { PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; +import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; +import { Stat, getStatName } from "../data/pokemon-stat"; +import { tmPoolTiers, tmSpecies } from "../data/tms"; +import { Type } from "../data/type"; +import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "../ui/party-ui-handler"; +import * as Utils from "../utils"; +import { TempBattleStat, getTempBattleStatBoosterItemName, getTempBattleStatName } from "../data/temp-battle-stat"; +import { BerryType, getBerryEffectDescription, getBerryName } from "../data/berry"; +import { Unlockables } from "../system/unlockables"; +import { StatusEffect, getStatusEffectDescriptor } from "../data/status-effect"; +import { SpeciesFormKey } from "../data/pokemon-species"; +import BattleScene from "../battle-scene"; +import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from "../system/voucher"; +import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; +import { ModifierTier } from "./modifier-tier"; +import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; +import i18next from "#app/plugins/i18n"; +import { getModifierTierTextTint } from "#app/ui/text"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -50,8 +50,8 @@ export class ModifierType { constructor(localeKey: string, iconImage: string, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { this.localeKey = localeKey; this.iconImage = iconImage; - this.group = group || ''; - this.soundName = soundName || 'restore'; + this.group = group || ""; + this.soundName = soundName || "restore"; this.newModifierFunc = newModifierFunc; } @@ -68,33 +68,37 @@ export class ModifierType { } getOrInferTier(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierTier { - if (this.tier) + if (this.tier) { return this.tier; - if (!this.id) + } + if (!this.id) { return null; + } let poolTypes: ModifierPoolType[]; switch (poolType) { - case ModifierPoolType.PLAYER: - poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; - break; - case ModifierPoolType.WILD: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; - break; - case ModifierPoolType.TRAINER: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; - break; - default: - poolTypes = [ poolType ]; - break; + case ModifierPoolType.PLAYER: + poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; + break; + case ModifierPoolType.WILD: + poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; + break; + case ModifierPoolType.TRAINER: + poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; + break; + default: + poolTypes = [ poolType ]; + break; } // Try multiple pool types in case of stolen items - for (let type of poolTypes) { + for (const type of poolTypes) { const pool = getModifierPoolForType(type); - for (let tier of Utils.getEnumValues(ModifierTier)) { - if (!pool.hasOwnProperty(tier)) + for (const tier of Utils.getEnumValues(ModifierTier)) { + if (!pool.hasOwnProperty(tier)) { continue; - if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === (this.generatorId || this.id))) + } + if (pool[tier].find(m => (m as WeightedModifierType).modifierType.id === (this.generatorId || this.id))) { return (this.tier = tier); + } } } return null; @@ -140,24 +144,24 @@ class AddPokeballModifierType extends ModifierType { private count: integer; constructor(iconImage: string, pokeballType: PokeballType, count: integer) { - super('', iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), 'pb', 'pb_bounce_1'); + super("", iconImage, (_type, _args) => new Modifiers.AddPokeballModifier(this, pokeballType, count), "pb", "pb_bounce_1"); this.pokeballType = pokeballType; this.count = count; } get name(): string { - return i18next.t(`modifierType:ModifierType.AddPokeballModifierType.name`, { - 'modifierCount': this.count, - 'pokeballName': getPokeballName(this.pokeballType), + return i18next.t("modifierType:ModifierType.AddPokeballModifierType.name", { + "modifierCount": this.count, + "pokeballName": getPokeballName(this.pokeballType), }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.AddPokeballModifierType.description`, { - 'modifierCount': this.count, - 'pokeballName': getPokeballName(this.pokeballType), - 'catchRate': getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : '100%', - 'pokeballAmount': `${scene.pokeballCounts[this.pokeballType]}`, + return i18next.t("modifierType:ModifierType.AddPokeballModifierType.description", { + "modifierCount": this.count, + "pokeballName": getPokeballName(this.pokeballType), + "catchRate": getPokeballCatchMultiplier(this.pokeballType) > -1 ? `${getPokeballCatchMultiplier(this.pokeballType)}x` : "100%", + "pokeballAmount": `${scene.pokeballCounts[this.pokeballType]}`, }); } } @@ -167,22 +171,22 @@ class AddVoucherModifierType extends ModifierType { private count: integer; constructor(voucherType: VoucherType, count: integer) { - super('', getVoucherTypeIcon(voucherType), (_type, _args) => new Modifiers.AddVoucherModifier(this, voucherType, count), 'voucher'); + super("", getVoucherTypeIcon(voucherType), (_type, _args) => new Modifiers.AddVoucherModifier(this, voucherType, count), "voucher"); this.count = count; this.voucherType = voucherType; } get name(): string { - return i18next.t(`modifierType:ModifierType.AddVoucherModifierType.name`, { - 'modifierCount': this.count, - 'voucherTypeName': getVoucherTypeName(this.voucherType), + return i18next.t("modifierType:ModifierType.AddVoucherModifierType.name", { + "modifierCount": this.count, + "voucherTypeName": getVoucherTypeName(this.voucherType), }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.AddVoucherModifierType.description`, { - 'modifierCount': this.count, - 'voucherTypeName': getVoucherTypeName(this.voucherType), + return i18next.t("modifierType:ModifierType.AddVoucherModifierType.description", { + "modifierCount": this.count, + "voucherTypeName": getVoucherTypeName(this.voucherType), }); } } @@ -203,10 +207,12 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { const dummyModifier = this.newModifier(pokemon); const matchingModifier = pokemon.scene.findModifier(m => m instanceof Modifiers.PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier)) as Modifiers.PokemonHeldItemModifier; const maxStackCount = dummyModifier.getMaxStackCount(pokemon.scene); - if (!maxStackCount) - return i18next.t(`modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable`, { 'pokemonName': pokemon.name }); - if (matchingModifier && matchingModifier.stackCount === maxStackCount) - return i18next.t(`modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany`, { 'pokemonName': pokemon.name }); + if (!maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": pokemon.name }); + } + if (matchingModifier && matchingModifier.stackCount === maxStackCount) { + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": pokemon.name }); + } return null; }, group, soundName); } @@ -223,11 +229,12 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, restorePoints: integer, restorePercent: integer, healStatus: boolean = false, newModifierFunc?: NewModifierFunc, selectFilter?: PokemonSelectFilter, group?: string) { super(localeKey, iconImage, newModifierFunc || ((_type, args) => new Modifiers.PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.restorePercent, this.healStatus, false)), - selectFilter || ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || (pokemon.hp >= pokemon.getMaxHp() && (!this.healStatus || !pokemon.status))) - return PartyUiHandler.NoEffectMessage; - return null; - }), group || 'potion'); + selectFilter || ((pokemon: PlayerPokemon) => { + if (!pokemon.hp || (pokemon.hp >= pokemon.getMaxHp() && (!this.healStatus || !pokemon.status))) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }), group || "potion"); this.restorePoints = restorePoints; this.restorePercent = restorePercent; @@ -236,13 +243,13 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { getDescription(scene: BattleScene): string { return this.restorePoints - ? i18next.t(`modifierType:ModifierType.PokemonHpRestoreModifierType.description`, { + ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.description", { restorePoints: this.restorePoints, restorePercent: this.restorePercent, }) : this.healStatus - ? i18next.t(`modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fullyWithStatus`) - : i18next.t(`modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fully`); + ? i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fullyWithStatus") + : i18next.t("modifierType:ModifierType.PokemonHpRestoreModifierType.extra.fully"); } } @@ -250,20 +257,22 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { constructor(localeKey: string, iconImage: string, restorePercent: integer) { super(localeKey, iconImage, 0, restorePercent, false, (_type, args) => new Modifiers.PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, 0, this.restorePercent, false, true), ((pokemon: PlayerPokemon) => { - if (!pokemon.isFainted()) + if (!pokemon.isFainted()) { return PartyUiHandler.NoEffectMessage; + } return null; - }), 'revive'); + }), "revive"); this.selectFilter = (pokemon: PlayerPokemon) => { - if (pokemon.hp) + if (pokemon.hp) { return PartyUiHandler.NoEffectMessage; + } return null; }; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonReviveModifierType.description`, { restorePercent: this.restorePercent }); + return i18next.t("modifierType:ModifierType.PokemonReviveModifierType.description", { restorePercent: this.restorePercent }); } } @@ -271,14 +280,15 @@ export class PokemonStatusHealModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { super(localeKey, iconImage, ((_type, args) => new Modifiers.PokemonStatusHealModifier(this, (args[0] as PlayerPokemon).id)), ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || !pokemon.status) + if (!pokemon.hp || !pokemon.status) { return PartyUiHandler.NoEffectMessage; + } return null; })); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonStatusHealModifierType.description`); + return i18next.t("modifierType:ModifierType.PokemonStatusHealModifierType.description"); } } @@ -298,21 +308,22 @@ export class PokemonPpRestoreModifierType extends PokemonMoveModifierType { constructor(localeKey: string, iconImage: string, restorePoints: integer) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonPpRestoreModifier(this, (args[0] as PlayerPokemon).id, (args[1] as integer), this.restorePoints), (_pokemon: PlayerPokemon) => { - return null; - }, (pokemonMove: PokemonMove) => { - if (!pokemonMove.ppUsed) - return PartyUiHandler.NoEffectMessage; - return null; - }, 'ether'); + return null; + }, (pokemonMove: PokemonMove) => { + if (!pokemonMove.ppUsed) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }, "ether"); this.restorePoints = restorePoints; } getDescription(scene: BattleScene): string { return this.restorePoints > -1 - ? i18next.t(`modifierType:ModifierType.PokemonPpRestoreModifierType.description`, { restorePoints: this.restorePoints }) - : i18next.t(`modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully`) - ; + ? i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.description", { restorePoints: this.restorePoints }) + : i18next.t("modifierType:ModifierType.PokemonPpRestoreModifierType.extra.fully") + ; } } @@ -322,19 +333,20 @@ export class PokemonAllMovePpRestoreModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, restorePoints: integer) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonAllMovePpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints), (pokemon: PlayerPokemon) => { - if (!pokemon.getMoveset().filter(m => m.ppUsed).length) + if (!pokemon.getMoveset().filter(m => m.ppUsed).length) { return PartyUiHandler.NoEffectMessage; + } return null; - }, 'elixir'); + }, "elixir"); this.restorePoints = restorePoints; } getDescription(scene: BattleScene): string { return this.restorePoints > -1 - ? i18next.t(`modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description`, { restorePoints: this.restorePoints }) - : i18next.t(`modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully`) - ; + ? i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.description", { restorePoints: this.restorePoints }) + : i18next.t("modifierType:ModifierType.PokemonAllMovePpRestoreModifierType.extra.fully") + ; } } @@ -344,18 +356,19 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType { constructor(localeKey: string, iconImage: string, upPoints: integer) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonPpUpModifier(this, (args[0] as PlayerPokemon).id, (args[1] as integer), this.upPoints), (_pokemon: PlayerPokemon) => { - return null; - }, (pokemonMove: PokemonMove) => { - if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) - return PartyUiHandler.NoEffectMessage; - return null; - }, 'ppUp'); + return null; + }, (pokemonMove: PokemonMove) => { + if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) { + return PartyUiHandler.NoEffectMessage; + } + return null; + }, "ppUp"); this.upPoints = upPoints; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonPpUpModifierType.description`, { upPoints: this.upPoints }); + return i18next.t("modifierType:ModifierType.PokemonPpUpModifierType.description", { upPoints: this.upPoints }); } } @@ -363,22 +376,23 @@ export class PokemonNatureChangeModifierType extends PokemonModifierType { protected nature: Nature; constructor(nature: Nature) { - super('', `mint_${Utils.getEnumKeys(Stat).find(s => getNatureStatMultiplier(nature, Stat[s]) > 1)?.toLowerCase() || 'neutral' }`, ((_type, args) => new Modifiers.PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)), + super("", `mint_${Utils.getEnumKeys(Stat).find(s => getNatureStatMultiplier(nature, Stat[s]) > 1)?.toLowerCase() || "neutral" }`, ((_type, args) => new Modifiers.PokemonNatureChangeModifier(this, (args[0] as PlayerPokemon).id, this.nature)), ((pokemon: PlayerPokemon) => { - if (pokemon.getNature() === this.nature) + if (pokemon.getNature() === this.nature) { return PartyUiHandler.NoEffectMessage; + } return null; - }), 'mint'); + }), "mint"); this.nature = nature; } get name(): string { - return i18next.t(`modifierType:ModifierType.PokemonNatureChangeModifierType.name`, { natureName: getNatureName(this.nature) }); + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.name", { natureName: getNatureName(this.nature) }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonNatureChangeModifierType.description`, { natureName: getNatureName(this.nature, true, true, true) }); + return i18next.t("modifierType:ModifierType.PokemonNatureChangeModifierType.description", { natureName: getNatureName(this.nature, true, true, true) }); } } @@ -386,8 +400,9 @@ export class RememberMoveModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string, group?: string) { super(localeKey, iconImage, (type, args) => new Modifiers.RememberMoveModifier(type, (args[0] as PlayerPokemon).id, (args[1] as integer)), (pokemon: PlayerPokemon) => { - if (!pokemon.getLearnableLevelMoves().length) + if (!pokemon.getLearnableLevelMoves().length) { return PartyUiHandler.NoEffectMessage; + } return null; }, group); } @@ -397,13 +412,13 @@ export class DoubleBattleChanceBoosterModifierType extends ModifierType { public battleCount: integer; constructor(localeKey: string, iconImage: string, battleCount: integer) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, this.battleCount), 'lure'); + super(localeKey, iconImage, (_type, _args) => new Modifiers.DoubleBattleChanceBoosterModifier(this, this.battleCount), "lure"); this.battleCount = battleCount; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description`, { battleCount: this.battleCount }); + return i18next.t("modifierType:ModifierType.DoubleBattleChanceBoosterModifierType.description", { battleCount: this.battleCount }); } } @@ -411,18 +426,18 @@ export class TempBattleStatBoosterModifierType extends ModifierType implements G public tempBattleStat: TempBattleStat; constructor(tempBattleStat: TempBattleStat) { - super('', getTempBattleStatBoosterItemName(tempBattleStat).replace(/\./g, '').replace(/[ ]/g, '_').toLowerCase(), + super("", getTempBattleStatBoosterItemName(tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase(), (_type, _args) => new Modifiers.TempBattleStatBoosterModifier(this, this.tempBattleStat)); this.tempBattleStat = tempBattleStat; } get name(): string { - return i18next.t(`modifierType:TempBattleStatBoosterItem.${getTempBattleStatBoosterItemName(this.tempBattleStat).replace(/\./g, '').replace(/[ ]/g, '_').toLowerCase()}`); + return i18next.t(`modifierType:TempBattleStatBoosterItem.${getTempBattleStatBoosterItemName(this.tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase()}`); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.TempBattleStatBoosterModifierType.description`, { tempBattleStatName: getTempBattleStatName(this.tempBattleStat) }); + return i18next.t("modifierType:ModifierType.TempBattleStatBoosterModifierType.description", { tempBattleStatName: getTempBattleStatName(this.tempBattleStat) }); } getPregenArgs(): any[] { @@ -434,7 +449,7 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge private berryType: BerryType; constructor(berryType: BerryType) { - super('', `${BerryType[berryType].toLowerCase()}_berry`, (type, args) => new Modifiers.BerryModifier(type, (args[0] as Pokemon).id, berryType), 'berry'); + super("", `${BerryType[berryType].toLowerCase()}_berry`, (type, args) => new Modifiers.BerryModifier(type, (args[0] as Pokemon).id, berryType), "berry"); this.berryType = berryType; } @@ -454,42 +469,42 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge function getAttackTypeBoosterItemName(type: Type) { switch (type) { - case Type.NORMAL: - return 'Silk Scarf'; - case Type.FIGHTING: - return 'Black Belt'; - case Type.FLYING: - return 'Sharp Beak'; - case Type.POISON: - return 'Poison Barb'; - case Type.GROUND: - return 'Soft Sand'; - case Type.ROCK: - return 'Hard Stone'; - case Type.BUG: - return 'Silver Powder'; - case Type.GHOST: - return 'Spell Tag'; - case Type.STEEL: - return 'Metal Coat'; - case Type.FIRE: - return 'Charcoal'; - case Type.WATER: - return 'Mystic Water'; - case Type.GRASS: - return 'Miracle Seed'; - case Type.ELECTRIC: - return 'Magnet'; - case Type.PSYCHIC: - return 'Twisted Spoon'; - case Type.ICE: - return 'Never-Melt Ice' - case Type.DRAGON: - return 'Dragon Fang'; - case Type.DARK: - return 'Black Glasses'; - case Type.FAIRY: - return 'Fairy Feather'; + case Type.NORMAL: + return "Silk Scarf"; + case Type.FIGHTING: + return "Black Belt"; + case Type.FLYING: + return "Sharp Beak"; + case Type.POISON: + return "Poison Barb"; + case Type.GROUND: + return "Soft Sand"; + case Type.ROCK: + return "Hard Stone"; + case Type.BUG: + return "Silver Powder"; + case Type.GHOST: + return "Spell Tag"; + case Type.STEEL: + return "Metal Coat"; + case Type.FIRE: + return "Charcoal"; + case Type.WATER: + return "Mystic Water"; + case Type.GRASS: + return "Miracle Seed"; + case Type.ELECTRIC: + return "Magnet"; + case Type.PSYCHIC: + return "Twisted Spoon"; + case Type.ICE: + return "Never-Melt Ice"; + case Type.DRAGON: + return "Dragon Fang"; + case Type.DARK: + return "Black Glasses"; + case Type.FAIRY: + return "Fairy Feather"; } } @@ -498,7 +513,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i public boostPercent: integer; constructor(moveType: Type, boostPercent: integer) { - super('', `${getAttackTypeBoosterItemName(moveType).replace(/[ \-]/g, '_').toLowerCase()}`, + super("", `${getAttackTypeBoosterItemName(moveType).replace(/[ \-]/g, "_").toLowerCase()}`, (_type, args) => new Modifiers.AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); this.moveType = moveType; @@ -506,12 +521,12 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i } get name(): string { - return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType).replace(/[ \-]/g, '_').toLowerCase()}`); + return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType).replace(/[ \-]/g, "_").toLowerCase()}`); } getDescription(scene: BattleScene): string { // TODO: Need getTypeName? - return i18next.t(`modifierType:ModifierType.AttackTypeBoosterModifierType.description`, { moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`) }); + return i18next.t("modifierType:ModifierType.AttackTypeBoosterModifierType.description", { moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`) }); } getPregenArgs(): any[] { @@ -525,7 +540,7 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonLevelIncrementModifierType.description`); + return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description"); } } @@ -535,24 +550,24 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description`); + return i18next.t("modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description"); } } function getBaseStatBoosterItemName(stat: Stat) { switch (stat) { - case Stat.HP: - return 'HP Up'; - case Stat.ATK: - return 'Protein'; - case Stat.DEF: - return 'Iron'; - case Stat.SPATK: - return 'Calcium'; - case Stat.SPDEF: - return 'Zinc'; - case Stat.SPD: - return 'Carbos'; + case Stat.HP: + return "HP Up"; + case Stat.ATK: + return "Protein"; + case Stat.DEF: + return "Iron"; + case Stat.SPATK: + return "Calcium"; + case Stat.SPDEF: + return "Zinc"; + case Stat.SPD: + return "Carbos"; } } @@ -561,18 +576,18 @@ export class PokemonBaseStatBoosterModifierType extends PokemonHeldItemModifierT private stat: Stat; constructor(localeName: string, stat: Stat) { - super('', localeName.replace(/[ \-]/g, '_').toLowerCase(), (_type, args) => new Modifiers.PokemonBaseStatModifier(this, (args[0] as Pokemon).id, this.stat)); + super("", localeName.replace(/[ \-]/g, "_").toLowerCase(), (_type, args) => new Modifiers.PokemonBaseStatModifier(this, (args[0] as Pokemon).id, this.stat)); this.localeName = localeName; this.stat = stat; } get name(): string { - return i18next.t(`modifierType:BaseStatBoosterItem.${this.localeName.replace(/[ \-]/g, '_').toLowerCase()}`); + return i18next.t(`modifierType:BaseStatBoosterItem.${this.localeName.replace(/[ \-]/g, "_").toLowerCase()}`); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonBaseStatBoosterModifierType.description`, { statName: getStatName(this.stat) }); + return i18next.t("modifierType:ModifierType.PokemonBaseStatBoosterModifierType.description", { statName: getStatName(this.stat) }); } getPregenArgs(): any[] { @@ -590,13 +605,13 @@ class AllPokemonFullHpRestoreModifierType extends ModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`${this.descriptionKey || `modifierType:ModifierType.AllPokemonFullHpRestoreModifierType`}.description` as any); + return i18next.t(`${this.descriptionKey || "modifierType:ModifierType.AllPokemonFullHpRestoreModifierType"}.description` as any); } } class AllPokemonFullReviveModifierType extends AllPokemonFullHpRestoreModifierType { constructor(localeKey: string, iconImage: string) { - super(localeKey, iconImage, `modifierType:ModifierType.AllPokemonFullReviveModifierType`, (_type, _args) => new Modifiers.PokemonHpRestoreModifier(this, -1, 0, 100, false, true)); + super(localeKey, iconImage, "modifierType:ModifierType.AllPokemonFullReviveModifierType", (_type, _args) => new Modifiers.PokemonHpRestoreModifier(this, -1, 0, 100, false, true)); } } @@ -605,16 +620,16 @@ export class MoneyRewardModifierType extends ModifierType { private moneyMultiplierDescriptorKey: string; constructor(localeKey: string, iconImage: string, moneyMultiplier: number, moneyMultiplierDescriptorKey: string) { - super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), 'money', 'buy'); + super(localeKey, iconImage, (_type, _args) => new Modifiers.MoneyRewardModifier(this, moneyMultiplier), "money", "buy"); this.moneyMultiplier = moneyMultiplier; this.moneyMultiplierDescriptorKey = moneyMultiplierDescriptorKey; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.MoneyRewardModifierType.description`, { + return i18next.t("modifierType:ModifierType.MoneyRewardModifierType.description", { moneyMultiplier: i18next.t(this.moneyMultiplierDescriptorKey as any), - moneyAmount: scene.getWaveMoneyAmount(this.moneyMultiplier).toLocaleString('en-US'), + moneyAmount: scene.getWaveMoneyAmount(this.moneyMultiplier).toLocaleString("en-US"), }); } } @@ -629,7 +644,7 @@ export class ExpBoosterModifierType extends ModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.ExpBoosterModifierType.description`, { boostPercent: this.boostPercent }); + return i18next.t("modifierType:ModifierType.ExpBoosterModifierType.description", { boostPercent: this.boostPercent }); } } @@ -643,7 +658,7 @@ export class PokemonExpBoosterModifierType extends PokemonHeldItemModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonExpBoosterModifierType.description`, { boostPercent: this.boostPercent }); + return i18next.t("modifierType:ModifierType.PokemonExpBoosterModifierType.description", { boostPercent: this.boostPercent }); } } @@ -653,7 +668,7 @@ export class PokemonFriendshipBoosterModifierType extends PokemonHeldItemModifie } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonFriendshipBoosterModifierType.description`); + return i18next.t("modifierType:ModifierType.PokemonFriendshipBoosterModifierType.description"); } } @@ -667,7 +682,7 @@ export class PokemonMoveAccuracyBoosterModifierType extends PokemonHeldItemModif } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description`, { accuracyAmount: this.amount }); + return i18next.t("modifierType:ModifierType.PokemonMoveAccuracyBoosterModifierType.description", { accuracyAmount: this.amount }); } } @@ -677,7 +692,7 @@ export class PokemonMultiHitModifierType extends PokemonHeldItemModifierType { } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.PokemonMultiHitModifierType.description`); + return i18next.t("modifierType:ModifierType.PokemonMultiHitModifierType.description"); } } @@ -685,25 +700,26 @@ export class TmModifierType extends PokemonModifierType { public moveId: Moves; constructor(moveId: Moves) { - super('', `tm_${Type[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new Modifiers.TmModifier(this, (args[0] as PlayerPokemon).id), + super("", `tm_${Type[allMoves[moveId].type].toLowerCase()}`, (_type, args) => new Modifiers.TmModifier(this, (args[0] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.getMoveset().filter(m => m?.moveId === moveId).length) + if (pokemon.compatibleTms.indexOf(moveId) === -1 || pokemon.getMoveset().filter(m => m?.moveId === moveId).length) { return PartyUiHandler.NoEffectMessage; + } return null; - }, 'tm'); + }, "tm"); this.moveId = moveId; } get name(): string { - return i18next.t(`modifierType:ModifierType.TmModifierType.name`, { + return i18next.t("modifierType:ModifierType.TmModifierType.name", { moveId: Utils.padInt(Object.keys(tmSpecies).indexOf(this.moveId.toString()) + 1, 3), moveName: allMoves[this.moveId].name, }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.TmModifierType.description`, { moveName: allMoves[this.moveId].name }); + return i18next.t("modifierType:ModifierType.TmModifierType.description", { moveName: allMoves[this.moveId].name }); } } @@ -711,17 +727,18 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge public evolutionItem: EvolutionItem; constructor(evolutionItem: EvolutionItem) { - super('', EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new Modifiers.EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), - (pokemon: PlayerPokemon) => { - if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) - return null; - else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) - return null; + super("", EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new Modifiers.EvolutionItemModifier(this, (args[0] as PlayerPokemon).id), + (pokemon: PlayerPokemon) => { + if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem + && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + return null; + } else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem + && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + return null; + } - return PartyUiHandler.NoEffectMessage; - }); + return PartyUiHandler.NoEffectMessage; + }); this.evolutionItem = evolutionItem; } @@ -731,7 +748,7 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.EvolutionItemModifierType.description`); + return i18next.t("modifierType:ModifierType.EvolutionItemModifierType.description"); } getPregenArgs(): any[] { @@ -743,14 +760,15 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G public formChangeItem: FormChangeItem; constructor(formChangeItem: FormChangeItem) { - super('', FormChangeItem[formChangeItem].toLowerCase(), (_type, args) => new Modifiers.PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), - (pokemon: PlayerPokemon) => { - if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && !!pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) - && (fc.trigger as SpeciesFormChangeItemTrigger).item === this.formChangeItem)) - return null; + super("", FormChangeItem[formChangeItem].toLowerCase(), (_type, args) => new Modifiers.PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), + (pokemon: PlayerPokemon) => { + if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && !!pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger) + && (fc.trigger as SpeciesFormChangeItemTrigger).item === this.formChangeItem)) { + return null; + } - return PartyUiHandler.NoEffectMessage; - }); + return PartyUiHandler.NoEffectMessage; + }); this.formChangeItem = formChangeItem; } @@ -760,7 +778,7 @@ export class FormChangeItemModifierType extends PokemonModifierType implements G } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.FormChangeItemModifierType.description`); + return i18next.t("modifierType:ModifierType.FormChangeItemModifierType.description"); } getPregenArgs(): any[] { @@ -772,49 +790,55 @@ export class FusePokemonModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { super(localeKey, iconImage, (_type, args) => new Modifiers.FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemon.isFusion()) + if (pokemon.isFusion()) { return PartyUiHandler.NoEffectMessage; + } return null; }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.FusePokemonModifierType.description`); + return i18next.t("modifierType:ModifierType.FusePokemonModifierType.description"); } } class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new AttackTypeBoosterModifierType(pregenArgs[0] as Type, 20); + } const attackMoveTypes = party.map(p => p.getMoveset().map(m => m.getMove()).filter(m => m instanceof AttackMove).map(m => m.type)).flat(); - if (!attackMoveTypes.length) + if (!attackMoveTypes.length) { return null; + } const attackMoveTypeWeights = new Map(); let totalWeight = 0; - for (let t of attackMoveTypes) { + for (const t of attackMoveTypes) { if (attackMoveTypeWeights.has(t)) { - if (attackMoveTypeWeights.get(t) < 3) + if (attackMoveTypeWeights.get(t) < 3) { attackMoveTypeWeights.set(t, attackMoveTypeWeights.get(t) + 1); - else + } else { continue; - } else + } + } else { attackMoveTypeWeights.set(t, 1); + } totalWeight++; } - if (!totalWeight) + if (!totalWeight) { return null; + } let type: Type; const randInt = Utils.randSeedInt(totalWeight); let weight = 0; - for (let t of attackMoveTypeWeights.keys()) { + for (const t of attackMoveTypeWeights.keys()) { const typeWeight = attackMoveTypeWeights.get(t); if (randInt <= weight + typeWeight) { type = t; @@ -832,9 +856,10 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { super((party: Pokemon[]) => { const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m.moveId === tm))); - const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(' (N)')).filter((tm, i, array) => array.indexOf(tm) === i); - if (!tierUniqueCompatibleTms.length) + const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i); + if (!tierUniqueCompatibleTms.length) { return null; + } const randTmIndex = Utils.randSeedInt(tierUniqueCompatibleTms.length); return new TmModifierType(tierUniqueCompatibleTms[randTmIndex]); }); @@ -844,22 +869,24 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { constructor(rare: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); + } const evolutionItemPool = [ party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => { const evolutions = pokemonEvolutions[p.species.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || '') === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); + return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat(), party.filter(p => p.isFusion() && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId)).map(p => { const evolutions = pokemonEvolutions[p.fusionSpecies.speciesId]; - return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || '') === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); + return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat() ].flat().flatMap(e => e.item).filter(i => (i > 50) === rare); - if (!evolutionItemPool.length) + if (!evolutionItemPool.length) { return null; + } return new EvolutionItemModifierType(evolutionItemPool[Utils.randSeedInt(evolutionItemPool.length)]); }); @@ -869,8 +896,9 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); + } const formChangeItemPool = party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { const formChanges = pokemonFormChanges[p.species.speciesId]; @@ -880,8 +908,9 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { .filter(t => t && t.active && !p.scene.findModifier(m => m instanceof Modifiers.PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); }).flat().flatMap(fc => fc.item); - if (!formChangeItemPool.length) + if (!formChangeItemPool.length) { return null; + } return new FormChangeItemModifierType(formChangeItemPool[Utils.randSeedInt(formChangeItemPool.length)]); }); @@ -892,17 +921,17 @@ export class TerastallizeModifierType extends PokemonHeldItemModifierType implem private teraType: Type; constructor(teraType: Type) { - super('', `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new Modifiers.TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), 'tera_shard'); + super("", `${Type[teraType].toLowerCase()}_tera_shard`, (type, args) => new Modifiers.TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), "tera_shard"); this.teraType = teraType; } get name(): string { - return i18next.t(`modifierType:ModifierType.TerastallizeModifierType.name`, { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.name", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.TerastallizeModifierType.description`, { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); + return i18next.t("modifierType:ModifierType.TerastallizeModifierType.description", { teraType: i18next.t(`pokemonInfo:Type.${Type[this.teraType]}`) }); } getPregenArgs(): any[] { @@ -920,7 +949,7 @@ export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemMo } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description`, { chancePercent: this.chancePercent }); + return i18next.t("modifierType:ModifierType.ContactHeldItemTransferChanceModifierType.description", { chancePercent: this.chancePercent }); } } @@ -930,7 +959,7 @@ export class TurnHeldItemTransferModifierType extends PokemonHeldItemModifierTyp } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.TurnHeldItemTransferModifierType.description`); + return i18next.t("modifierType:ModifierType.TurnHeldItemTransferModifierType.description"); } } @@ -939,14 +968,14 @@ export class EnemyAttackStatusEffectChanceModifierType extends ModifierType { private effect: StatusEffect; constructor(localeKey: string, iconImage: string, chancePercent: integer, effect: StatusEffect) { - super(localeKey, iconImage, (type, args) => new Modifiers.EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent), 'enemy_status_chance') + super(localeKey, iconImage, (type, args) => new Modifiers.EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent), "enemy_status_chance"); this.chancePercent = chancePercent; this.effect = effect; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.EnemyAttackStatusEffectChanceModifierType.description`, { + return i18next.t("modifierType:ModifierType.EnemyAttackStatusEffectChanceModifierType.description", { chancePercent: this.chancePercent, statusEffect: getStatusEffectDescriptor(this.effect), }); @@ -957,13 +986,13 @@ export class EnemyEndureChanceModifierType extends ModifierType { private chancePercent: number; constructor(localeKey: string, iconImage: string, chancePercent: number) { - super(localeKey, iconImage, (type, _args) => new Modifiers.EnemyEndureChanceModifier(type, chancePercent), 'enemy_endure'); + super(localeKey, iconImage, (type, _args) => new Modifiers.EnemyEndureChanceModifier(type, chancePercent), "enemy_endure"); this.chancePercent = chancePercent; } getDescription(scene: BattleScene): string { - return i18next.t(`modifierType:ModifierType.EnemyEndureChanceModifierType.description`, { chancePercent: this.chancePercent }); + return i18next.t("modifierType:ModifierType.EnemyEndureChanceModifierType.description", { chancePercent: this.chancePercent }); } } @@ -988,60 +1017,61 @@ class WeightedModifierType { } export const modifierTypes = { - POKEBALL: () => new AddPokeballModifierType('pb', PokeballType.POKEBALL, 5), - GREAT_BALL: () => new AddPokeballModifierType('gb', PokeballType.GREAT_BALL, 5), - ULTRA_BALL: () => new AddPokeballModifierType('ub', PokeballType.ULTRA_BALL, 5), - ROGUE_BALL: () => new AddPokeballModifierType('rb', PokeballType.ROGUE_BALL, 5), - MASTER_BALL: () => new AddPokeballModifierType('mb', PokeballType.MASTER_BALL, 1), + POKEBALL: () => new AddPokeballModifierType("pb", PokeballType.POKEBALL, 5), + GREAT_BALL: () => new AddPokeballModifierType("gb", PokeballType.GREAT_BALL, 5), + ULTRA_BALL: () => new AddPokeballModifierType("ub", PokeballType.ULTRA_BALL, 5), + ROGUE_BALL: () => new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5), + MASTER_BALL: () => new AddPokeballModifierType("mb", PokeballType.MASTER_BALL, 1), - RARE_CANDY: () => new PokemonLevelIncrementModifierType(`modifierType:ModifierType.RARE_CANDY`, 'rare_candy'), - RARER_CANDY: () => new AllPokemonLevelIncrementModifierType(`modifierType:ModifierType.RARER_CANDY`, 'rarer_candy'), + RARE_CANDY: () => new PokemonLevelIncrementModifierType("modifierType:ModifierType.RARE_CANDY", "rare_candy"), + RARER_CANDY: () => new AllPokemonLevelIncrementModifierType("modifierType:ModifierType.RARER_CANDY", "rarer_candy"), EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false), RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true), FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(), - MEGA_BRACELET: () => new ModifierType(`modifierType:ModifierType.MEGA_BRACELET`, 'mega_bracelet', (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)), - DYNAMAX_BAND: () => new ModifierType(`modifierType:ModifierType.DYNAMAX_BAND`, 'dynamax_band', (type, _args) => new Modifiers.GigantamaxAccessModifier(type)), - TERA_ORB: () => new ModifierType(`modifierType:ModifierType.TERA_ORB`, 'tera_orb', (type, _args) => new Modifiers.TerastallizeAccessModifier(type)), + MEGA_BRACELET: () => new ModifierType("modifierType:ModifierType.MEGA_BRACELET", "mega_bracelet", (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)), + DYNAMAX_BAND: () => new ModifierType("modifierType:ModifierType.DYNAMAX_BAND", "dynamax_band", (type, _args) => new Modifiers.GigantamaxAccessModifier(type)), + TERA_ORB: () => new ModifierType("modifierType:ModifierType.TERA_ORB", "tera_orb", (type, _args) => new Modifiers.TerastallizeAccessModifier(type)), - MAP: () => new ModifierType(`modifierType:ModifierType.MAP`, 'map', (type, _args) => new Modifiers.MapModifier(type)), + MAP: () => new ModifierType("modifierType:ModifierType.MAP", "map", (type, _args) => new Modifiers.MapModifier(type)), - POTION: () => new PokemonHpRestoreModifierType(`modifierType:ModifierType.POTION`, 'potion', 20, 10), - SUPER_POTION: () => new PokemonHpRestoreModifierType(`modifierType:ModifierType.SUPER_POTION`, 'super_potion', 50, 25), - HYPER_POTION: () => new PokemonHpRestoreModifierType(`modifierType:ModifierType.HYPER_POTION`, 'hyper_potion', 200, 50), - MAX_POTION: () => new PokemonHpRestoreModifierType(`modifierType:ModifierType.MAX_POTION`, 'max_potion', 0, 100), - FULL_RESTORE: () => new PokemonHpRestoreModifierType(`modifierType:ModifierType.FULL_RESTORE`, 'full_restore', 0, 100, true), + POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.POTION", "potion", 20, 10), + SUPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.SUPER_POTION", "super_potion", 50, 25), + HYPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), + MAX_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.MAX_POTION", "max_potion", 0, 100), + FULL_RESTORE: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), - REVIVE: () => new PokemonReviveModifierType(`modifierType:ModifierType.REVIVE`, 'revive', 50), - MAX_REVIVE: () => new PokemonReviveModifierType(`modifierType:ModifierType.MAX_REVIVE`, 'max_revive', 100), + REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.REVIVE", "revive", 50), + MAX_REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.MAX_REVIVE", "max_revive", 100), - FULL_HEAL: () => new PokemonStatusHealModifierType(`modifierType:ModifierType.FULL_HEAL`, 'full_heal'), + FULL_HEAL: () => new PokemonStatusHealModifierType("modifierType:ModifierType.FULL_HEAL", "full_heal"), - SACRED_ASH: () => new AllPokemonFullReviveModifierType(`modifierType:ModifierType.SACRED_ASH`, 'sacred_ash'), + SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"), - REVIVER_SEED: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.REVIVER_SEED`, 'reviver_seed', (type, args) => new Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), + REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), - ETHER: () => new PokemonPpRestoreModifierType(`modifierType:ModifierType.ETHER`, 'ether', 10), - MAX_ETHER: () => new PokemonPpRestoreModifierType(`modifierType:ModifierType.MAX_ETHER`, 'max_ether', -1), + ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10), + MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1), - ELIXIR: () => new PokemonAllMovePpRestoreModifierType(`modifierType:ModifierType.ELIXIR`, 'elixir', 10), - MAX_ELIXIR: () => new PokemonAllMovePpRestoreModifierType(`modifierType:ModifierType.MAX_ELIXIR`, 'max_elixir', -1), + ELIXIR: () => new PokemonAllMovePpRestoreModifierType("modifierType:ModifierType.ELIXIR", "elixir", 10), + MAX_ELIXIR: () => new PokemonAllMovePpRestoreModifierType("modifierType:ModifierType.MAX_ELIXIR", "max_elixir", -1), - PP_UP: () => new PokemonPpUpModifierType(`modifierType:ModifierType.PP_UP`, 'pp_up', 1), - PP_MAX: () => new PokemonPpUpModifierType(`modifierType:ModifierType.PP_MAX`, 'pp_max', 3), + PP_UP: () => new PokemonPpUpModifierType("modifierType:ModifierType.PP_UP", "pp_up", 1), + PP_MAX: () => new PokemonPpUpModifierType("modifierType:ModifierType.PP_MAX", "pp_max", 3), /*REPEL: () => new DoubleBattleChanceBoosterModifierType('Repel', 5), SUPER_REPEL: () => new DoubleBattleChanceBoosterModifierType('Super Repel', 10), MAX_REPEL: () => new DoubleBattleChanceBoosterModifierType('Max Repel', 25),*/ - LURE: () => new DoubleBattleChanceBoosterModifierType(`modifierType:ModifierType.LURE`, 'lure', 5), - SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType(`modifierType:ModifierType.SUPER_LURE`, 'super_lure', 10), - MAX_LURE: () => new DoubleBattleChanceBoosterModifierType(`modifierType:ModifierType.MAX_LURE`, 'max_lure', 25), + LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.LURE", "lure", 5), + SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 10), + MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 25), TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat); + } const randTempBattleStat = Utils.randSeedInt(6) as TempBattleStat; return new TempBattleStatBoosterModifierType(randTempBattleStat); }), @@ -1059,39 +1089,45 @@ export const modifierTypes = { ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(), MINT: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new PokemonNatureChangeModifierType(pregenArgs[0] as Nature); + } return new PokemonNatureChangeModifierType(Utils.randSeedInt(Utils.getEnumValues(Nature).length) as Nature); }), TERA_SHARD: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new TerastallizeModifierType(pregenArgs[0] as Type); - if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) + } + if (!party[0].scene.getModifiers(Modifiers.TerastallizeAccessModifier).length) { return null; + } let type: Type; if (!Utils.randSeedInt(3)) { const partyMemberTypes = party.map(p => p.getTypes(false, false, true)).flat(); type = Utils.randSeedItem(partyMemberTypes); - } else + } else { type = Utils.randSeedInt(64) ? Utils.randSeedInt(18) as Type : Type.STELLAR; + } return new TerastallizeModifierType(type); }), BERRY: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { - if (pregenArgs) + if (pregenArgs) { return new BerryModifierType(pregenArgs[0] as BerryType); + } const berryTypes = Utils.getEnumValues(BerryType); let randBerryType: BerryType; - let rand = Utils.randSeedInt(12); - if (rand < 2) + const rand = Utils.randSeedInt(12); + if (rand < 2) { randBerryType = BerryType.SITRUS; - else if (rand < 4) + } else if (rand < 4) { randBerryType = BerryType.LUM; - else if (rand < 6) + } else if (rand < 6) { randBerryType = BerryType.LEPPA; - else + } else { randBerryType = berryTypes[Utils.randSeedInt(berryTypes.length - 3) + 2]; + } return new BerryModifierType(randBerryType); }), @@ -1099,82 +1135,82 @@ export const modifierTypes = { TM_GREAT: () => new TmModifierTypeGenerator(ModifierTier.GREAT), TM_ULTRA: () => new TmModifierTypeGenerator(ModifierTier.ULTRA), - MEMORY_MUSHROOM: () => new RememberMoveModifierType(`modifierType:ModifierType.MEMORY_MUSHROOM`, 'big_mushroom'), + MEMORY_MUSHROOM: () => new RememberMoveModifierType("modifierType:ModifierType.MEMORY_MUSHROOM", "big_mushroom"), - EXP_SHARE: () => new ModifierType(`modifierType:ModifierType.EXP_SHARE`, 'exp_share', (type, _args) => new Modifiers.ExpShareModifier(type)), - EXP_BALANCE: () => new ModifierType(`modifierType:ModifierType.EXP_BALANCE`, 'exp_balance', (type, _args) => new Modifiers.ExpBalanceModifier(type)), + EXP_SHARE: () => new ModifierType("modifierType:ModifierType.EXP_SHARE", "exp_share", (type, _args) => new Modifiers.ExpShareModifier(type)), + EXP_BALANCE: () => new ModifierType("modifierType:ModifierType.EXP_BALANCE", "exp_balance", (type, _args) => new Modifiers.ExpBalanceModifier(type)), - OVAL_CHARM: () => new ModifierType(`modifierType:ModifierType.OVAL_CHARM`, 'oval_charm', (type, _args) => new Modifiers.MultipleParticipantExpBonusModifier(type)), + OVAL_CHARM: () => new ModifierType("modifierType:ModifierType.OVAL_CHARM", "oval_charm", (type, _args) => new Modifiers.MultipleParticipantExpBonusModifier(type)), - EXP_CHARM: () => new ExpBoosterModifierType(`modifierType:ModifierType.EXP_CHARM`, 'exp_charm', 25), - SUPER_EXP_CHARM: () => new ExpBoosterModifierType(`modifierType:ModifierType.SUPER_EXP_CHARM`, 'super_exp_charm', 60), - GOLDEN_EXP_CHARM: () => new ExpBoosterModifierType(`modifierType:ModifierType.GOLDEN_EXP_CHARM`, 'golden_exp_charm', 100), + EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.EXP_CHARM", "exp_charm", 25), + SUPER_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.SUPER_EXP_CHARM", "super_exp_charm", 60), + GOLDEN_EXP_CHARM: () => new ExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EXP_CHARM", "golden_exp_charm", 100), - LUCKY_EGG: () => new PokemonExpBoosterModifierType(`modifierType:ModifierType.LUCKY_EGG`, 'lucky_egg', 40), - GOLDEN_EGG: () => new PokemonExpBoosterModifierType(`modifierType:ModifierType.GOLDEN_EGG`, 'golden_egg', 100), + LUCKY_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.LUCKY_EGG", "lucky_egg", 40), + GOLDEN_EGG: () => new PokemonExpBoosterModifierType("modifierType:ModifierType.GOLDEN_EGG", "golden_egg", 100), - SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType(`modifierType:ModifierType.SOOTHE_BELL`, 'soothe_bell'), + SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), - SOUL_DEW: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.SOUL_DEW`, 'soul_dew', (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), + SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), - NUGGET: () => new MoneyRewardModifierType(`modifierType:ModifierType.NUGGET`, 'nugget', 1, `modifierType:ModifierType.MoneyRewardModifierType.extra.small`), - BIG_NUGGET: () => new MoneyRewardModifierType(`modifierType:ModifierType.BIG_NUGGET`, 'big_nugget', 2.5, `modifierType:ModifierType.MoneyRewardModifierType.extra.moderate`), - RELIC_GOLD: () => new MoneyRewardModifierType(`modifierType:ModifierType.RELIC_GOLD`, 'relic_gold', 10, `modifierType:ModifierType.MoneyRewardModifierType.extra.large`), + NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), + BIG_NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.BIG_NUGGET", "big_nugget", 2.5, "modifierType:ModifierType.MoneyRewardModifierType.extra.moderate"), + RELIC_GOLD: () => new MoneyRewardModifierType("modifierType:ModifierType.RELIC_GOLD", "relic_gold", 10, "modifierType:ModifierType.MoneyRewardModifierType.extra.large"), - AMULET_COIN: () => new ModifierType(`modifierType:ModifierType.AMULET_COIN`, 'amulet_coin', (type, _args) => new Modifiers.MoneyMultiplierModifier(type)), - GOLDEN_PUNCH: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.GOLDEN_PUNCH`, 'golden_punch', (type, args) => new Modifiers.DamageMoneyRewardModifier(type, (args[0] as Pokemon).id)), - COIN_CASE: () => new ModifierType(`modifierType:ModifierType.COIN_CASE`, 'coin_case', (type, _args) => new Modifiers.MoneyInterestModifier(type)), + AMULET_COIN: () => new ModifierType("modifierType:ModifierType.AMULET_COIN", "amulet_coin", (type, _args) => new Modifiers.MoneyMultiplierModifier(type)), + GOLDEN_PUNCH: () => new PokemonHeldItemModifierType("modifierType:ModifierType.GOLDEN_PUNCH", "golden_punch", (type, args) => new Modifiers.DamageMoneyRewardModifier(type, (args[0] as Pokemon).id)), + COIN_CASE: () => new ModifierType("modifierType:ModifierType.COIN_CASE", "coin_case", (type, _args) => new Modifiers.MoneyInterestModifier(type)), - LOCK_CAPSULE: () => new ModifierType(`modifierType:ModifierType.LOCK_CAPSULE`, 'lock_capsule', (type, _args) => new Modifiers.LockModifierTiersModifier(type)), + LOCK_CAPSULE: () => new ModifierType("modifierType:ModifierType.LOCK_CAPSULE", "lock_capsule", (type, _args) => new Modifiers.LockModifierTiersModifier(type)), - GRIP_CLAW: () => new ContactHeldItemTransferChanceModifierType(`modifierType:ModifierType.GRIP_CLAW`, 'grip_claw', 10), - WIDE_LENS: () => new PokemonMoveAccuracyBoosterModifierType(`modifierType:ModifierType.WIDE_LENS`, 'wide_lens', 5), + GRIP_CLAW: () => new ContactHeldItemTransferChanceModifierType("modifierType:ModifierType.GRIP_CLAW", "grip_claw", 10), + WIDE_LENS: () => new PokemonMoveAccuracyBoosterModifierType("modifierType:ModifierType.WIDE_LENS", "wide_lens", 5), - MULTI_LENS: () => new PokemonMultiHitModifierType(`modifierType:ModifierType.MULTI_LENS`, 'zoom_lens'), + MULTI_LENS: () => new PokemonMultiHitModifierType("modifierType:ModifierType.MULTI_LENS", "zoom_lens"), - HEALING_CHARM: () => new ModifierType(`modifierType:ModifierType.HEALING_CHARM`, 'healing_charm', (type, _args) => new Modifiers.HealingBoosterModifier(type, 1.1)), - CANDY_JAR: () => new ModifierType(`modifierType:ModifierType.CANDY_JAR`, 'candy_jar', (type, _args) => new Modifiers.LevelIncrementBoosterModifier(type)), + HEALING_CHARM: () => new ModifierType("modifierType:ModifierType.HEALING_CHARM", "healing_charm", (type, _args) => new Modifiers.HealingBoosterModifier(type, 1.1)), + CANDY_JAR: () => new ModifierType("modifierType:ModifierType.CANDY_JAR", "candy_jar", (type, _args) => new Modifiers.LevelIncrementBoosterModifier(type)), - BERRY_POUCH: () => new ModifierType(`modifierType:ModifierType.BERRY_POUCH`, 'berry_pouch', (type, _args) => new Modifiers.PreserveBerryModifier(type)), + BERRY_POUCH: () => new ModifierType("modifierType:ModifierType.BERRY_POUCH", "berry_pouch", (type, _args) => new Modifiers.PreserveBerryModifier(type)), - FOCUS_BAND: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.FOCUS_BAND`, 'focus_band', (type, args) => new Modifiers.SurviveDamageModifier(type, (args[0] as Pokemon).id)), + FOCUS_BAND: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FOCUS_BAND", "focus_band", (type, args) => new Modifiers.SurviveDamageModifier(type, (args[0] as Pokemon).id)), - QUICK_CLAW: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.QUICK_CLAW`, 'quick_claw', (type, args) => new Modifiers.BypassSpeedChanceModifier(type, (args[0] as Pokemon).id)), + QUICK_CLAW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.QUICK_CLAW", "quick_claw", (type, args) => new Modifiers.BypassSpeedChanceModifier(type, (args[0] as Pokemon).id)), - KINGS_ROCK: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.KINGS_ROCK`, 'kings_rock', (type, args) => new Modifiers.FlinchChanceModifier(type, (args[0] as Pokemon).id)), + KINGS_ROCK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.KINGS_ROCK", "kings_rock", (type, args) => new Modifiers.FlinchChanceModifier(type, (args[0] as Pokemon).id)), - LEFTOVERS: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.LEFTOVERS`, 'leftovers', (type, args) => new Modifiers.TurnHealModifier(type, (args[0] as Pokemon).id)), - SHELL_BELL: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.SHELL_BELL`, 'shell_bell', (type, args) => new Modifiers.HitHealModifier(type, (args[0] as Pokemon).id)), + LEFTOVERS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEFTOVERS", "leftovers", (type, args) => new Modifiers.TurnHealModifier(type, (args[0] as Pokemon).id)), + SHELL_BELL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SHELL_BELL", "shell_bell", (type, args) => new Modifiers.HitHealModifier(type, (args[0] as Pokemon).id)), - BATON: () => new PokemonHeldItemModifierType(`modifierType:ModifierType.BATON`, 'stick', (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), + BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "stick", (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), - SHINY_CHARM: () => new ModifierType(`modifierType:ModifierType.SHINY_CHARM`, 'shiny_charm', (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)), - ABILITY_CHARM: () => new ModifierType(`modifierType:ModifierType.ABILITY_CHARM`, 'ability_charm', (type, _args) => new Modifiers.HiddenAbilityRateBoosterModifier(type)), + SHINY_CHARM: () => new ModifierType("modifierType:ModifierType.SHINY_CHARM", "shiny_charm", (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)), + ABILITY_CHARM: () => new ModifierType("modifierType:ModifierType.ABILITY_CHARM", "ability_charm", (type, _args) => new Modifiers.HiddenAbilityRateBoosterModifier(type)), - IV_SCANNER: () => new ModifierType(`modifierType:ModifierType.IV_SCANNER`, 'scanner', (type, _args) => new Modifiers.IvScannerModifier(type)), + IV_SCANNER: () => new ModifierType("modifierType:ModifierType.IV_SCANNER", "scanner", (type, _args) => new Modifiers.IvScannerModifier(type)), - DNA_SPLICERS: () => new FusePokemonModifierType(`modifierType:ModifierType.DNA_SPLICERS`, 'dna_splicers'), + DNA_SPLICERS: () => new FusePokemonModifierType("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"), - MINI_BLACK_HOLE: () => new TurnHeldItemTransferModifierType(`modifierType:ModifierType.MINI_BLACK_HOLE`, 'mini_black_hole'), + MINI_BLACK_HOLE: () => new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), VOUCHER: () => new AddVoucherModifierType(VoucherType.REGULAR, 1), VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), - GOLDEN_POKEBALL: () => new ModifierType(`modifierType:ModifierType.GOLDEN_POKEBALL`, 'pb_gold', (type, _args) => new Modifiers.ExtraModifierModifier(type), null, 'pb_bounce_1'), + GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new Modifiers.ExtraModifierModifier(type), null, "pb_bounce_1"), - ENEMY_DAMAGE_BOOSTER: () => new ModifierType(`modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER`, 'wl_item_drop', (type, _args) => new Modifiers.EnemyDamageBoosterModifier(type, 5)), - ENEMY_DAMAGE_REDUCTION: () => new ModifierType(`modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION`, 'wl_guard_spec', (type, _args) => new Modifiers.EnemyDamageReducerModifier(type, 2.5)), + ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new Modifiers.EnemyDamageBoosterModifier(type, 5)), + ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new Modifiers.EnemyDamageReducerModifier(type, 2.5)), //ENEMY_SUPER_EFFECT_BOOSTER: () => new ModifierType('Type Advantage Token', 'Increases damage of super effective attacks by 30%', (type, _args) => new Modifiers.EnemySuperEffectiveDamageBoosterModifier(type, 30), 'wl_custom_super_effective'), - ENEMY_HEAL: () => new ModifierType(`modifierType:ModifierType.ENEMY_HEAL`, 'wl_potion', (type, _args) => new Modifiers.EnemyTurnHealModifier(type, 2)), - ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType(`modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE`, 'wl_antidote', 10, StatusEffect.POISON), - ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType(`modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE`, 'wl_paralyze_heal', 10, StatusEffect.PARALYSIS), - ENEMY_ATTACK_SLEEP_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType(`modifierType:ModifierType.ENEMY_ATTACK_SLEEP_CHANCE`, 'wl_awakening', 10, StatusEffect.SLEEP), - ENEMY_ATTACK_FREEZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType(`modifierType:ModifierType.ENEMY_ATTACK_FREEZE_CHANCE`, 'wl_ice_heal', 10, StatusEffect.FREEZE), - ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType(`modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE`, 'wl_burn_heal', 10, StatusEffect.BURN), - ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType(`modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE`, 'wl_full_heal', (type, _args) => new Modifiers.EnemyStatusEffectHealChanceModifier(type, 10)), - ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType(`modifierType:ModifierType.ENEMY_ENDURE_CHANCE`, 'wl_reset_urge', 2.5), - ENEMY_FUSED_CHANCE: () => new ModifierType(`modifierType:ModifierType.ENEMY_FUSED_CHANCE`, 'wl_custom_spliced', (type, _args) => new Modifiers.EnemyFusionChanceModifier(type, 1)), + ENEMY_HEAL: () => new ModifierType("modifierType:ModifierType.ENEMY_HEAL", "wl_potion", (type, _args) => new Modifiers.EnemyTurnHealModifier(type, 2)), + ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", "wl_antidote", 10, StatusEffect.POISON), + ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", "wl_paralyze_heal", 10, StatusEffect.PARALYSIS), + ENEMY_ATTACK_SLEEP_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_SLEEP_CHANCE", "wl_awakening", 10, StatusEffect.SLEEP), + ENEMY_ATTACK_FREEZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_FREEZE_CHANCE", "wl_ice_heal", 10, StatusEffect.FREEZE), + ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", "wl_burn_heal", 10, StatusEffect.BURN), + ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new Modifiers.EnemyStatusEffectHealChanceModifier(type, 10)), + ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2.5), + ENEMY_FUSED_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_FUSED_CHANCE", "wl_custom_spliced", (type, _args) => new Modifiers.EnemyFusionChanceModifier(type, 1)), }; interface ModifierPool { @@ -1205,7 +1241,9 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.TEMP_STAT_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 1), - ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), + ].map(m => { + m.setTier(ModifierTier.COMMON); return m; + }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.GREAT_BALL, 6), new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { @@ -1253,15 +1291,18 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MAP, (party: Pokemon[]) => party[0].scene.gameMode.isClassic ? 1 : 0, 1), new WeightedModifierType(modifierTypes.TM_GREAT, 2), new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { - if (!party.find(p => p.getLearnableLevelMoves().length)) + if (!party.find(p => p.getLearnableLevelMoves().length)) { return 0; + } const highestPartyLevel = party.map(p => p.level).reduce((highestLevel: integer, level: integer) => Math.max(highestLevel, level), 1); return Math.min(Math.ceil(highestPartyLevel / 20), 4); }, 4), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), - ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), + ].map(m => { + m.setTier(ModifierTier.GREAT); return m; + }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ULTRA_BALL, 24), new WeightedModifierType(modifierTypes.MAX_LURE, 4), @@ -1283,7 +1324,9 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.EXP_BALANCE, 4), new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount, 0) : 0, 3), - ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), + ].map(m => { + m.setTier(ModifierTier.ULTRA); return m; + }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.ROGUE_BALL, 24), new WeightedModifierType(modifierTypes.RELIC_GOLD, 2), @@ -1305,7 +1348,9 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, 18), new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), - ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), + ].map(m => { + m.setTier(ModifierTier.ROGUE); return m; + }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.MASTER_BALL, 24), new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), @@ -1314,38 +1359,56 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(9 - rerollCount * 3, 0) : 0, 9), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), - ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) + ].map(m => { + m.setTier(ModifierTier.MASTER); return m; + }) }; const wildModifierPool: ModifierPool = { [ModifierTier.COMMON]: [ new WeightedModifierType(modifierTypes.BERRY, 1) - ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), + ].map(m => { + m.setTier(ModifierTier.COMMON); return m; + }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1) - ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), + ].map(m => { + m.setTier(ModifierTier.GREAT); return m; + }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), + ].map(m => { + m.setTier(ModifierTier.ULTRA); return m; + }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), - ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), + ].map(m => { + m.setTier(ModifierTier.ROGUE); return m; + }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1) - ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) + ].map(m => { + m.setTier(ModifierTier.MASTER); return m; + }) }; const trainerModifierPool: ModifierPool = { [ModifierTier.COMMON]: [ new WeightedModifierType(modifierTypes.BERRY, 8), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3) - ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), + ].map(m => { + m.setTier(ModifierTier.COMMON); return m; + }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), - ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), + ].map(m => { + m.setTier(ModifierTier.GREAT); return m; + }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 1), - ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), + ].map(m => { + m.setTier(ModifierTier.ULTRA); return m; + }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 2), @@ -1353,12 +1416,16 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.QUICK_CLAW, 1), new WeightedModifierType(modifierTypes.GRIP_CLAW, 1), new WeightedModifierType(modifierTypes.WIDE_LENS, 1), - ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), + ].map(m => { + m.setTier(ModifierTier.ROGUE); return m; + }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), - ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) + ].map(m => { + m.setTier(ModifierTier.MASTER); return m; + }) }; const enemyBuffModifierPool: ModifierPool = { @@ -1373,14 +1440,18 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) - ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), + ].map(m => { + m.setTier(ModifierTier.COMMON); return m; + }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 5), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 5), new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) - ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), + ].map(m => { + m.setTier(ModifierTier.GREAT); return m; + }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10), new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 10), @@ -1388,42 +1459,59 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5) - ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), - [ModifierTier.ROGUE]: [ ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), - [ModifierTier.MASTER]: [ ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) + ].map(m => { + m.setTier(ModifierTier.ULTRA); return m; + }), + [ModifierTier.ROGUE]: [ ].map(m => { + m.setTier(ModifierTier.ROGUE); return m; + }), + [ModifierTier.MASTER]: [ ].map(m => { + m.setTier(ModifierTier.MASTER); return m; + }) }; const dailyStarterModifierPool: ModifierPool = { [ModifierTier.COMMON]: [ new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1), new WeightedModifierType(modifierTypes.BERRY, 3), - ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), + ].map(m => { + m.setTier(ModifierTier.COMMON); return m; + }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), - ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), + ].map(m => { + m.setTier(ModifierTier.GREAT); return m; + }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 1), new WeightedModifierType(modifierTypes.SOUL_DEW, 1), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 1), - ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), + ].map(m => { + m.setTier(ModifierTier.ULTRA); return m; + }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), - ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), + ].map(m => { + m.setTier(ModifierTier.ROGUE); return m; + }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), - ].map(m => { m.setTier(ModifierTier.MASTER); return m; }) + ].map(m => { + m.setTier(ModifierTier.MASTER); return m; + }) }; export function getModifierType(modifierTypeFunc: ModifierTypeFunc): ModifierType { const modifierType = modifierTypeFunc(); - if (!modifierType.id) + if (!modifierType.id) { modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc); + } return modifierType; } @@ -1431,32 +1519,32 @@ let modifierPoolThresholds = {}; let ignoredPoolIndexes = {}; let dailyStarterModifierPoolThresholds = {}; -let ignoredDailyStarterPoolIndexes = {}; +let ignoredDailyStarterPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars let enemyModifierPoolThresholds = {}; -let enemyIgnoredPoolIndexes = {}; +let enemyIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars let enemyBuffModifierPoolThresholds = {}; -let enemyBuffIgnoredPoolIndexes = {}; +let enemyBuffIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/no-unused-vars export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool { let pool: ModifierPool; switch (poolType) { - case ModifierPoolType.PLAYER: - pool = modifierPool; - break; - case ModifierPoolType.WILD: - pool = wildModifierPool; - break; - case ModifierPoolType.TRAINER: - pool = trainerModifierPool; - break; - case ModifierPoolType.ENEMY_BUFF: - pool = enemyBuffModifierPool; - break; - case ModifierPoolType.DAILY_STARTER: - pool = dailyStarterModifierPool; - break; + case ModifierPoolType.PLAYER: + pool = modifierPool; + break; + case ModifierPoolType.WILD: + pool = wildModifierPool; + break; + case ModifierPoolType.TRAINER: + pool = trainerModifierPool; + break; + case ModifierPoolType.ENEMY_BUFF: + pool = enemyBuffModifierPool; + break; + case ModifierPoolType.DAILY_STARTER: + pool = dailyStarterModifierPool; + break; } return pool; } @@ -1495,43 +1583,45 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; tierMaxWeight += outputWeight; } - if (weight) + if (weight) { total += weight; - else { + } else { ignoredIndexes[t].push(i++); return total; } thresholds.set(total, i++); return total; }, 0); - for (let id of tierModifierIds) + for (const id of tierModifierIds) { modifierTableData[id].tierPercent = Math.floor((modifierTableData[id].weight / tierMaxWeight) * 10000) / 100; + } return [ t, Object.fromEntries(thresholds) ]; }))); - for (let id of Object.keys(modifierTableData)) { + for (const id of Object.keys(modifierTableData)) { modifierTableData[id].totalPercent = Math.floor(modifierTableData[id].tierPercent * tierWeights[modifierTableData[id].tier] * 100) / 100; modifierTableData[id].tier = ModifierTier[modifierTableData[id].tier]; } - if (outputModifierData) + if (outputModifierData) { console.table(modifierTableData); + } switch (poolType) { - case ModifierPoolType.PLAYER: - modifierPoolThresholds = thresholds; - ignoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.WILD: - case ModifierPoolType.TRAINER: - enemyModifierPoolThresholds = thresholds; - enemyIgnoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.ENEMY_BUFF: - enemyBuffModifierPoolThresholds = thresholds; - enemyBuffIgnoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.DAILY_STARTER: - dailyStarterModifierPoolThresholds = thresholds; - ignoredDailyStarterPoolIndexes = ignoredIndexes; - break; + case ModifierPoolType.PLAYER: + modifierPoolThresholds = thresholds; + ignoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.WILD: + case ModifierPoolType.TRAINER: + enemyModifierPoolThresholds = thresholds; + enemyIgnoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.ENEMY_BUFF: + enemyBuffModifierPoolThresholds = thresholds; + enemyBuffIgnoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.DAILY_STARTER: + dailyStarterModifierPoolThresholds = thresholds; + ignoredDailyStarterPoolIndexes = ignoredIndexes; + break; } } @@ -1545,16 +1635,18 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo new Array(count).fill(0).map((_, i) => { let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers?.length > i ? modifierTiers[i] : undefined); let r = 0; - while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) + while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); + } options.push(candidate); }); return options; } export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] { - if (!(waveIndex % 10)) + if (!(waveIndex % 10)) { return []; + } const options = [ [ @@ -1594,8 +1686,9 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: let candidate = getNewModifierTypeOption(null, ModifierPoolType.ENEMY_BUFF, tier); let r = 0; let matchingModifier: Modifiers.PersistentModifier; - while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate.type.id)) && matchingModifier.getMaxStackCount(scene) < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) + while (++r < retryCount && (matchingModifier = enemyModifiers.find(m => m.type.id === candidate.type.id)) && matchingModifier.getMaxStackCount(scene) < matchingModifier.stackCount + (r < 10 ? tierStackCount : 1)) { candidate = getNewModifierTypeOption(null, ModifierPoolType.ENEMY_BUFF, tier); + } const modifier = candidate.type.newModifier() as Modifiers.EnemyPersistentModifier; modifier.stackCount = tierStackCount; @@ -1605,14 +1698,15 @@ export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: export function getEnemyModifierTypesForWave(waveIndex: integer, count: integer, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance: integer = 0): PokemonHeldItemModifierType[] { const ret = new Array(count).fill(0).map(() => getNewModifierTypeOption(party, poolType, undefined, upgradeChance && !Utils.randSeedInt(upgradeChance) ? 1 : 0).type as PokemonHeldItemModifierType); - if (!(waveIndex % 1000)) + if (!(waveIndex % 1000)) { ret.push(getModifierType(modifierTypes.MINI_BLACK_HOLE) as PokemonHeldItemModifierType); + } return ret; } export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.PokemonHeldItemModifier[] { const ret: Modifiers.PokemonHeldItemModifier[] = []; - for (let p of party) { + for (const p of party) { for (let m = 0; m < 3; m++) { const tierValue = Utils.randSeedInt(64); const tier = tierValue > 25 ? ModifierTier.COMMON : tierValue > 12 ? ModifierTier.GREAT : tierValue > 4 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER; @@ -1629,45 +1723,49 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, const pool = getModifierPoolForType(poolType); let thresholds: object; switch (poolType) { - case ModifierPoolType.PLAYER: - thresholds = modifierPoolThresholds; - break; - case ModifierPoolType.WILD: - thresholds = enemyModifierPoolThresholds; - break; - case ModifierPoolType.TRAINER: - thresholds = enemyModifierPoolThresholds; - break; - case ModifierPoolType.ENEMY_BUFF: - thresholds = enemyBuffModifierPoolThresholds; - break; - case ModifierPoolType.DAILY_STARTER: - thresholds = dailyStarterModifierPoolThresholds; - break; + case ModifierPoolType.PLAYER: + thresholds = modifierPoolThresholds; + break; + case ModifierPoolType.WILD: + thresholds = enemyModifierPoolThresholds; + break; + case ModifierPoolType.TRAINER: + thresholds = enemyModifierPoolThresholds; + break; + case ModifierPoolType.ENEMY_BUFF: + thresholds = enemyBuffModifierPoolThresholds; + break; + case ModifierPoolType.DAILY_STARTER: + thresholds = dailyStarterModifierPoolThresholds; + break; } if (tier === undefined) { const tierValue = Utils.randSeedInt(1024); - if (!upgradeCount) + if (!upgradeCount) { upgradeCount = 0; + } if (player && tierValue) { const partyLuckValue = getPartyLuckValue(party); const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4)); let upgraded = false; do { upgraded = Utils.randSeedInt(upgradeOdds) < 4; - if (upgraded) + if (upgraded) { upgradeCount++; + } } while (upgraded); } tier = tierValue > 255 ? ModifierTier.COMMON : tierValue > 60 ? ModifierTier.GREAT : tierValue > 12 ? ModifierTier.ULTRA : tierValue ? ModifierTier.ROGUE : ModifierTier.MASTER; // Does this actually do anything? - if (!upgradeCount) + if (!upgradeCount) { upgradeCount = Math.min(upgradeCount, ModifierTier.MASTER - tier); + } tier += upgradeCount; while (tier && (!modifierPool.hasOwnProperty(tier) || !modifierPool[tier].length)) { tier--; - if (upgradeCount) + if (upgradeCount) { upgradeCount--; + } } } else if (upgradeCount === undefined && player) { upgradeCount = 0; @@ -1675,10 +1773,11 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, const partyShinyCount = party.filter(p => p.isShiny() && !p.isFainted()).length; const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2)); while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) { - if (!Utils.randSeedInt(upgradeOdds)) + if (!Utils.randSeedInt(upgradeOdds)) { upgradeCount++; - else + } else { break; + } } tier += upgradeCount; } @@ -1691,38 +1790,42 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, const totalWeight = parseInt(tierThresholds[tierThresholds.length - 1]); const value = Utils.randSeedInt(totalWeight); let index: integer; - for (let t of tierThresholds) { - let threshold = parseInt(t); + for (const t of tierThresholds) { + const threshold = parseInt(t); if (value < threshold) { index = thresholds[tier][threshold]; break; } } - if (index === undefined) + if (index === undefined) { return null; + } - if (player) - console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]) + if (player) { + console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); + } let modifierType: ModifierType = (pool[tier][index]).modifierType; if (modifierType instanceof ModifierTypeGenerator) { modifierType = (modifierType as ModifierTypeGenerator).generateType(party); if (modifierType === null) { - if (player) + if (player) { console.log(ModifierTier[tier], upgradeCount); + } return getNewModifierTypeOption(party, poolType, tier, upgradeCount, ++retryCount); } } - console.log(modifierType, !player ? '(enemy)' : ''); + console.log(modifierType, !player ? "(enemy)" : ""); return new ModifierTypeOption(modifierType as ModifierType, upgradeCount); } export function getDefaultModifierTypeForTier(tier: ModifierTier): ModifierType { let modifierType: ModifierType | WeightedModifierType = modifierPool[tier || ModifierTier.COMMON][0]; - if (modifierType instanceof WeightedModifierType) + if (modifierType instanceof WeightedModifierType) { modifierType = (modifierType as WeightedModifierType).modifierType; + } return modifierType; } @@ -1744,10 +1847,10 @@ export function getPartyLuckValue(party: Pokemon[]): integer { } export function getLuckString(luckValue: integer): string { - return [ 'D', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+', 'A++', 'S', 'S+', 'SS', 'SS+', 'SSS' ][luckValue]; + return [ "D", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", "A++", "S", "S+", "SS", "SS+", "SSS" ][luckValue]; } export function getLuckTextTint(luckValue: integer): integer { const modifierTier = luckValue ? luckValue > 2 ? luckValue > 5 ? luckValue > 9 ? luckValue > 11 ? ModifierTier.LUXURY : ModifierTier.MASTER : ModifierTier.ROGUE : ModifierTier.ULTRA : ModifierTier.GREAT : ModifierTier.COMMON; return getModifierTierTextTint(modifierTier); -} \ No newline at end of file +} diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 75f54296a20a..b49a3a11a12b 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1,4 +1,4 @@ -import * as ModifierTypes from './modifier-type'; +import * as ModifierTypes from "./modifier-type"; import { LearnMovePhase, LevelUpPhase, PokemonHealPhase } from "../phases"; import BattleScene from "../battle-scene"; import { getLevelTotalExp } from "../data/exp"; @@ -6,21 +6,21 @@ import { PokeballType } from "../data/pokeball"; import Pokemon, { PlayerPokemon } from "../field/pokemon"; import { Stat } from "../data/pokemon-stat"; import { addTextObject, TextStyle } from "../ui/text"; -import { Type } from '../data/type'; -import { EvolutionPhase } from '../evolution-phase'; -import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from '../data/pokemon-evolutions'; -import { getPokemonMessage } from '../messages'; +import { Type } from "../data/type"; +import { EvolutionPhase } from "../evolution-phase"; +import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; +import { getPokemonMessage } from "../messages"; import * as Utils from "../utils"; -import { TempBattleStat } from '../data/temp-battle-stat'; -import { BerryType, getBerryEffectFunc, getBerryPredicate } from '../data/berry'; -import { StatusEffect, getStatusEffectHealText } from '../data/status-effect'; -import { achvs } from '../system/achv'; -import { VoucherType } from '../system/voucher'; -import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms'; -import { Nature } from '#app/data/nature'; -import { BattlerTagType } from '#app/data/enums/battler-tag-type'; -import * as Overrides from '../overrides'; -import { ModifierType, modifierTypes } from './modifier-type'; +import { TempBattleStat } from "../data/temp-battle-stat"; +import { BerryType, getBerryEffectFunc, getBerryPredicate } from "../data/berry"; +import { StatusEffect, getStatusEffectHealText } from "../data/status-effect"; +import { achvs } from "../system/achv"; +import { VoucherType } from "../system/voucher"; +import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; +import { Nature } from "#app/data/nature"; +import { BattlerTagType } from "#app/data/enums/battler-tag-type"; +import * as Overrides from "../overrides"; +import { ModifierType, modifierTypes } from "./modifier-type"; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -55,37 +55,42 @@ export class ModifierBar extends Phaser.GameObjects.Container { visibleIconModifiers.forEach((modifier: PersistentModifier, i: integer) => { const icon = modifier.getIcon(this.scene as BattleScene); - if (i >= iconOverflowIndex) + if (i >= iconOverflowIndex) { icon.setVisible(false); + } this.add(icon); this.setModifierIconPosition(icon, visibleIconModifiers.length); icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 24), Phaser.Geom.Rectangle.Contains); - icon.on('pointerover', () => { + icon.on("pointerover", () => { (this.scene as BattleScene).ui.showTooltip(modifier.type.name, modifier.type.getDescription(this.scene as BattleScene)); - if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) + if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { thisArg.updateModifierOverflowVisibility(true); + } }); - icon.on('pointerout', () => { + icon.on("pointerout", () => { (this.scene as BattleScene).ui.hideTooltip(); - if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) + if (this.modifierCache && this.modifierCache.length > iconOverflowIndex) { thisArg.updateModifierOverflowVisibility(false); + } }); }); - for (let icon of this.getAll()) + for (const icon of this.getAll()) { this.sendToBack(icon); + } this.modifierCache = modifiers; } updateModifierOverflowVisibility(ignoreLimit: boolean) { const modifierIcons = this.getAll().reverse(); - for (let modifier of modifierIcons.map(m => m as Phaser.GameObjects.Container).slice(iconOverflowIndex)) + for (const modifier of modifierIcons.map(m => m as Phaser.GameObjects.Container).slice(iconOverflowIndex)) { modifier.setVisible(ignoreLimit); + } } setModifierIconPosition(icon: Phaser.GameObjects.Container, modifierCount: integer) { - let rowIcons: integer = 12 + 6 * Math.max((Math.ceil(Math.min(modifierCount, 24) / 12) - 2), 0); + const rowIcons: integer = 12 + 6 * Math.max((Math.ceil(Math.min(modifierCount, 24) / 12) - 2), 0); const x = (this.getIndex(icon) % rowIcons) * 26 / (rowIcons / 12); const y = Math.floor(this.getIndex(icon) / rowIcons) * 20; @@ -123,9 +128,10 @@ export abstract class PersistentModifier extends Modifier { } add(modifiers: PersistentModifier[], virtual: boolean, scene: BattleScene): boolean { - for (let modifier of modifiers) { - if (this.match(modifier)) + for (const modifier of modifiers) { + if (this.match(modifier)) { return modifier.incrementStack(scene, this.stackCount, virtual); + } } if (virtual) { @@ -144,10 +150,11 @@ export abstract class PersistentModifier extends Modifier { incrementStack(scene: BattleScene, amount: integer, virtual: boolean): boolean { if (this.getStackCount() + amount <= this.getMaxStackCount(scene)) { - if (!virtual) + if (!virtual) { this.stackCount += amount; - else + } else { this.virtualStackCount += amount; + } return true; } @@ -158,7 +165,7 @@ export abstract class PersistentModifier extends Modifier { return this.stackCount + this.virtualStackCount; } - abstract getMaxStackCount(scene: BattleScene, forThreshold?: boolean): integer + abstract getMaxStackCount(scene: BattleScene, forThreshold?: boolean): integer; isIconVisible(scene: BattleScene): boolean { return true; @@ -167,30 +174,34 @@ export abstract class PersistentModifier extends Modifier { getIcon(scene: BattleScene, forSummary?: boolean): Phaser.GameObjects.Container { const container = scene.add.container(0, 0); - const item = scene.add.sprite(0, 12, 'items'); + const item = scene.add.sprite(0, 12, "items"); item.setFrame(this.type.iconImage); item.setOrigin(0, 0.5); container.add(item); const stackText = this.getIconStackText(scene); - if (stackText) + if (stackText) { container.add(stackText); + } const virtualStackText = this.getIconStackText(scene, true); - if (virtualStackText) + if (virtualStackText) { container.add(virtualStackText); + } return container; } getIconStackText(scene: BattleScene, virtual?: boolean): Phaser.GameObjects.BitmapText { - if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) + if (this.getMaxStackCount(scene) === 1 || (virtual && !this.virtualStackCount)) { return null; + } - const text = scene.add.bitmapText(10, 15, 'item-count', this.stackCount.toString(), 11); + const text = scene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); text.letterSpacing = -0.5; - if (this.getStackCount() >= this.getMaxStackCount(scene)) - text.setTint(0xf89890) + if (this.getStackCount() >= this.getMaxStackCount(scene)) { + text.setTint(0xf89890); + } text.setOrigin(0, 0); return text; @@ -265,9 +276,9 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { getIcon(scene: BattleScene): Phaser.GameObjects.Container { const container = super.getIcon(scene); - const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: '66px', color: '#f89890' }); + const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: "#f89890" }); battleCountText.setShadow(0, 0, null); - battleCountText.setStroke('#984038', 16) + battleCountText.setStroke("#984038", 16); battleCountText.setOrigin(1, 0); container.add(battleCountText); @@ -289,8 +300,9 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier } match(modifier: Modifier): boolean { - if (modifier instanceof DoubleBattleChanceBoosterModifier) + if (modifier instanceof DoubleBattleChanceBoosterModifier) { return (modifier as DoubleBattleChanceBoosterModifier).battlesLeft === this.battlesLeft; + } return false; } @@ -320,9 +332,10 @@ export class TempBattleStatBoosterModifier extends LapsingPersistentModifier { } match(modifier: Modifier): boolean { - if (modifier instanceof TempBattleStatBoosterModifier) + if (modifier instanceof TempBattleStatBoosterModifier) { return (modifier as TempBattleStatBoosterModifier).tempBattleStat === this.tempBattleStat && (modifier as TempBattleStatBoosterModifier).battlesLeft === this.battlesLeft; + } return false; } @@ -459,21 +472,24 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { container.add(pokemonIcon); - const item = scene.add.sprite(16, this.virtualStackCount ? 8 : 16, 'items'); + const item = scene.add.sprite(16, this.virtualStackCount ? 8 : 16, "items"); item.setScale(0.5); item.setOrigin(0, 0.5); - item.setTexture('items', this.type.iconImage); + item.setTexture("items", this.type.iconImage); container.add(item); const stackText = this.getIconStackText(scene); - if (stackText) + if (stackText) { container.add(stackText); + } const virtualStackText = this.getIconStackText(scene, true); - if (virtualStackText) + if (virtualStackText) { container.add(virtualStackText); - } else + } + } else { container.setScale(0.5); + } return container; } @@ -488,14 +504,16 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { getMaxStackCount(scene: BattleScene, forThreshold?: boolean): integer { const pokemon = this.getPokemon(scene); - if (!pokemon) + if (!pokemon) { return 0; - if (pokemon.isPlayer() && forThreshold) + } + if (pokemon.isPlayer() && forThreshold) { return scene.getParty().map(p => this.getMaxHeldItemCount(p)).reduce((stackCount: integer, maxStackCount: integer) => Math.max(stackCount, maxStackCount), 0); + } return this.getMaxHeldItemCount(pokemon); } - abstract getMaxHeldItemCount(pokemon: Pokemon): integer + abstract getMaxHeldItemCount(pokemon: Pokemon): integer; } export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { @@ -515,9 +533,9 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi const container = super.getIcon(scene, forSummary); if (this.getPokemon(scene).isPlayer()) { - const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: '66px', color: '#f89890' }); + const battleCountText = addTextObject(scene, 27, 0, this.battlesLeft.toString(), TextStyle.PARTY, { fontSize: "66px", color: "#f89890" }); battleCountText.setShadow(0, 0, null); - battleCountText.setStroke('#984038', 16) + battleCountText.setStroke("#984038", 16); battleCountText.setOrigin(1, 0); container.add(battleCountText); } @@ -544,8 +562,9 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { } matchType(modifier: Modifier): boolean { - if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) + if (modifier instanceof TerastallizeModifier && modifier.teraType === this.teraType) { return true; + } return false; } @@ -561,8 +580,9 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { const pokemon = args[0] as Pokemon; if (pokemon.isPlayer()) { pokemon.scene.validateAchv(achvs.TERASTALLIZE); - if (this.teraType === Type.STELLAR) + if (this.teraType === Type.STELLAR) { pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE); + } } pokemon.updateSpritePipelineData(); return true; @@ -599,8 +619,9 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } matchType(modifier: Modifier): boolean { - if (modifier instanceof PokemonBaseStatModifier) + if (modifier instanceof PokemonBaseStatModifier) { return (modifier as PokemonBaseStatModifier).stat === this.stat; + } return false; } @@ -635,7 +656,7 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } - /** +/** * Applies Specific Type item boosts (e.g., Magnet) */ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { @@ -667,7 +688,7 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { } shouldApply(args: any[]): boolean { - return super.shouldApply(args) && args.length === 3 && typeof args[1] === 'number' && args[2] instanceof Utils.NumberHolder; + return super.shouldApply(args) && args.length === 3 && typeof args[1] === "number" && args[2] instanceof Utils.NumberHolder; } /** @@ -922,8 +943,9 @@ export class BerryModifier extends PokemonHeldItemModifier { pokemon.scene.applyModifiers(PreserveBerryModifier, pokemon.isPlayer(), pokemon, preserve); getBerryEffectFunc(this.berryType)(pokemon); - if (!preserve.value) + if (!preserve.value) { this.consumed = true; + } return true; } @@ -951,8 +973,9 @@ export class PreserveBerryModifier extends PersistentModifier { } apply(args: any[]): boolean { - if (!(args[1] as Utils.BooleanHolder).value) + if (!(args[1] as Utils.BooleanHolder).value) { (args[1] as Utils.BooleanHolder).value = (args[0] as Pokemon).randSeedInt(this.getMaxStackCount(null)) < this.getStackCount(); + } return true; } @@ -1025,17 +1048,19 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { } shouldApply(args: any[]): boolean { - return super.shouldApply(args) && (this.fainted || (args.length > 1 && typeof(args[1]) === 'number')); + return super.shouldApply(args) && (this.fainted || (args.length > 1 && typeof(args[1]) === "number")); } apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; if (!pokemon.hp === this.fainted) { let restorePoints = this.restorePoints; - if (!this.fainted) + if (!this.fainted) { restorePoints = Math.floor(restorePoints * (args[1] as number)); - if (this.fainted || this.healStatus) + } + if (this.fainted || this.healStatus) { pokemon.resetStatus(); + } pokemon.hp = Math.min(pokemon.hp + Math.max(Math.ceil(Math.max(Math.floor((this.restorePercent * 0.01) * pokemon.getMaxHp()), restorePoints)), 1), pokemon.getMaxHp()); return true; @@ -1097,8 +1122,9 @@ export class PokemonAllMovePpRestoreModifier extends ConsumablePokemonModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - for (let move of pokemon.getMoveset()) + for (const move of pokemon.getMoveset()) { move.ppUsed = this.restorePoints > -1 ? Math.max(move.ppUsed - this.restorePoints, 0) : 0; + } return true; } @@ -1212,16 +1238,17 @@ export class EvolutionItemModifier extends ConsumablePokemonModifier { let matchingEvolution = pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) ? pokemonEvolutions[pokemon.species.speciesId].find(e => e.item === (this.type as ModifierTypes.EvolutionItemModifierType).evolutionItem - && (e.evoFormKey === null || (e.preFormKey || '') === pokemon.getFormKey()) + && (e.evoFormKey === null || (e.preFormKey || "") === pokemon.getFormKey()) && (!e.condition || e.condition.predicate(pokemon))) : null; if (!matchingEvolution && pokemon.isFusion()) { matchingEvolution = pokemonEvolutions[pokemon.fusionSpecies.speciesId].find(e => e.item === (this.type as ModifierTypes.EvolutionItemModifierType).evolutionItem - && (e.evoFormKey === null || (e.preFormKey || '') === pokemon.getFusionFormKey()) + && (e.evoFormKey === null || (e.preFormKey || "") === pokemon.getFusionFormKey()) && (!e.condition || e.condition.predicate(pokemon))); - if (matchingEvolution) + if (matchingEvolution) { matchingEvolution = new FusionSpeciesFormEvolution(pokemon.species.speciesId, matchingEvolution); + } } if (matchingEvolution) { @@ -1538,15 +1565,15 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { const power = args[2] as Utils.NumberHolder; switch (this.getStackCount()) { - case 1: - power.value *= 0.4; - break; - case 2: - power.value *= 0.25; - break; - case 3: - power.value *= 0.175; - break; + case 1: + power.value *= 0.4; + break; + case 2: + power.value *= 0.25; + break; + case 3: + power.value *= 0.175; + break; } return true; @@ -1583,15 +1610,17 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { const pokemon = args[0] as Pokemon; const active = args[1] as boolean; - let switchActive = this.active && !active; + const switchActive = this.active && !active; - if (switchActive) + if (switchActive) { this.active = false; + } const ret = pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); - if (switchActive) + if (switchActive) { this.active = true; + } return ret; } @@ -1691,7 +1720,7 @@ export class MoneyInterestModifier extends PersistentModifier { const interestAmount = Math.floor(scene.money * 0.1 * this.getStackCount()); scene.addMoney(interestAmount); - scene.queueMessage(`You received interest of ₽${interestAmount.toLocaleString('en-US')}\nfrom the ${this.type.name}!`, null, true); + scene.queueMessage(`You received interest of ₽${interestAmount.toLocaleString("en-US")}\nfrom the ${this.type.name}!`, null, true); return true; } @@ -1806,14 +1835,16 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { const pokemon = args[0] as Pokemon; const opponents = pokemon.getOpponents(); - if (!opponents.length) + if (!opponents.length) { return false; + } const targetPokemon = opponents[pokemon.randSeedInt(opponents.length)]; const transferredItemCount = this.getTransferredItemCount(); - if (!transferredItemCount) + if (!transferredItemCount) { return false; + } const withinParty = pokemon.isPlayer() === targetPokemon.isPlayer(); const poolType = pokemon.isPlayer() ? ModifierTypes.ModifierPoolType.PLAYER : pokemon.hasTrainer() ? ModifierTypes.ModifierPoolType.TRAINER : ModifierTypes.ModifierPoolType.WILD; @@ -1824,14 +1855,16 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier, highestTier), 0); let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - let heldItemTransferPromises: Promise[] = []; + const heldItemTransferPromises: Promise[] = []; for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { - while (highestItemTier-- && !tierItemModifiers.length) + while (highestItemTier-- && !tierItemModifiers.length) { tierItemModifiers = itemModifiers.filter(m => m.type.tier === highestItemTier); - if (!tierItemModifiers.length) + } + if (!tierItemModifiers.length) { break; + } } const randItemIndex = pokemon.randSeedInt(itemModifiers.length); const randItem = itemModifiers[randItemIndex]; @@ -1844,16 +1877,17 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { } Promise.all(heldItemTransferPromises).then(() => { - for (let mt of transferredModifierTypes) + for (const mt of transferredModifierTypes) { pokemon.scene.queueMessage(this.getTransferMessage(pokemon, targetPokemon, mt)); + } }); return !!transferredModifierTypes.length; } - abstract getTransferredItemCount(): integer + abstract getTransferredItemCount(): integer; - abstract getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string + abstract getTransferMessage(pokemon: Pokemon, targetPokemon: Pokemon, item: ModifierTypes.ModifierType): string; } export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { @@ -2070,7 +2104,7 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { if (pokemon.getHpRatio() < 1) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), getPokemonMessage(pokemon, `\nrestored some HP!`), true, false, false, false, true)); + Math.max(Math.floor(pokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), getPokemonMessage(pokemon, "\nrestored some HP!"), true, false, false, false, true)); return true; } @@ -2107,8 +2141,9 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi apply(args: any[]): boolean { const target = (args[0] as Pokemon); - if (Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) + if (Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { return target.trySetStatus(this.effect, true); + } return false; } @@ -2172,8 +2207,9 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier { apply(args: any[]): boolean { const target = (args[0] as Pokemon); - if (target.battleData.endured || Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) + if (target.battleData.endured || Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { return false; + } target.addTag(BattlerTagType.ENDURING, 1); @@ -2209,8 +2245,9 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { } apply(args: any[]): boolean { - if (Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) + if (Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { return false; + } (args[0] as Utils.BooleanHolder).value = true; @@ -2229,7 +2266,9 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier { */ export function overrideModifiers(scene: BattleScene, player: boolean = true): void { const modifierOverride = player ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE; - if (!modifierOverride || modifierOverride.length === 0 || !scene) return; // if no override, do nothing + if (!modifierOverride || modifierOverride.length === 0 || !scene) { + return; + } // if no override, do nothing // if it's the opponent, we clear all his current modifiers to avoid stacking if (!player) { scene.clearEnemyModifiers(); @@ -2238,14 +2277,16 @@ export function overrideModifiers(scene: BattleScene, player: boolean = true): v modifierOverride.forEach(item => { const modifierName = item.name; const qty = item.count || 1; - if (!modifierTypes.hasOwnProperty(modifierName)) return; // if the modifier does not exist, we skip it + if (!modifierTypes.hasOwnProperty(modifierName)) { + return; + } // if the modifier does not exist, we skip it const modifierType: ModifierType = modifierTypes[modifierName](); const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier; modifier.stackCount = qty; if (player) { - scene.addModifier(modifier, true, false, false, true); + scene.addModifier(modifier, true, false, false, true); } else { - scene.addEnemyModifier(modifier, true, true); + scene.addEnemyModifier(modifier, true, true); } }); } @@ -2257,26 +2298,30 @@ export function overrideModifiers(scene: BattleScene, player: boolean = true): v */ export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, player: boolean = true): void { const heldItemsOverride = player ? Overrides.STARTING_HELD_ITEMS_OVERRIDE : Overrides.OPP_HELD_ITEMS_OVERRIDE; - if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) return; // if no override, do nothing + if (!heldItemsOverride || heldItemsOverride.length === 0 || !scene) { + return; + } // if no override, do nothing // we loop through all the itemName given in the override file heldItemsOverride.forEach(item => { - const itemName = item.name; - const qty = item.count || 1; - if (!modifierTypes.hasOwnProperty(itemName)) return; // if the item does not exist, we skip it - const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list - var itemModifier: PokemonHeldItemModifier; - if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) { - itemModifier = modifierType.generateType(null, [item.type]).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; - } else { - itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; - } - // we create the item - itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon - itemModifier.stackCount = qty; // we say how many items we want - if (player) { - scene.addModifier(itemModifier, true, false, false, true); - } else { - scene.addEnemyModifier(itemModifier, true, true); - } + const itemName = item.name; + const qty = item.count || 1; + if (!modifierTypes.hasOwnProperty(itemName)) { + return; + } // if the item does not exist, we skip it + const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list + let itemModifier: PokemonHeldItemModifier; + if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) { + itemModifier = modifierType.generateType(null, [item.type]).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + } else { + itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + } + // we create the item + itemModifier.pokemonId = pokemon.id; // we assign the created item to the pokemon + itemModifier.stackCount = qty; // we say how many items we want + if (player) { + scene.addModifier(itemModifier, true, false, false, true); + } else { + scene.addEnemyModifier(itemModifier, true, true); + } }); -} \ No newline at end of file +} diff --git a/src/overrides.ts b/src/overrides.ts index b7307ab2f7f3..aab8bd16c4df 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,16 +1,16 @@ -import { Species } from './data/enums/species'; +import { Species } from "./data/enums/species"; import { Abilities } from "./data/enums/abilities"; import { Biome } from "./data/enums/biome"; import { Moves } from "./data/enums/moves"; import { WeatherType } from "./data/weather"; -import { Variant } from './data/variant'; -import { BerryType } from './data/berry'; -import { TempBattleStat } from './data/temp-battle-stat'; -import { Nature } from './data/nature'; -import { Type } from './data/type'; -import { Stat } from './data/pokemon-stat'; -import { PokeballCounts } from './battle-scene'; -import { PokeballType } from './data/pokeball'; +import { Variant } from "./data/variant"; +import { BerryType } from "./data/berry"; +import { TempBattleStat } from "./data/temp-battle-stat"; +import { Nature } from "./data/nature"; +import { Type } from "./data/type"; +import { Stat } from "./data/pokemon-stat"; +import { PokeballCounts } from "./battle-scene"; +import { PokeballType } from "./data/pokeball"; /** * Overrides for testing different in game situations @@ -22,7 +22,7 @@ import { PokeballType } from './data/pokeball'; */ // a specific seed (default: a random string of 24 characters) -export const SEED_OVERRIDE: string = ''; +export const SEED_OVERRIDE: string = ""; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE: boolean = false; export const STARTING_WAVE_OVERRIDE: integer = 0; @@ -30,15 +30,15 @@ export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; // default 1000 export const STARTING_MONEY_OVERRIDE: integer = 0; export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { - active: false, - pokeballs: { - [PokeballType.POKEBALL]: 5, - [PokeballType.GREAT_BALL]: 0, - [PokeballType.ULTRA_BALL]: 0, - [PokeballType.ROGUE_BALL]: 0, - [PokeballType.MASTER_BALL]: 0, - } -} + active: false, + pokeballs: { + [PokeballType.POKEBALL]: 5, + [PokeballType.GREAT_BALL]: 0, + [PokeballType.ULTRA_BALL]: 0, + [PokeballType.ROGUE_BALL]: 0, + [PokeballType.MASTER_BALL]: 0, + } +}; /** * PLAYER OVERRIDES diff --git a/src/phase.ts b/src/phase.ts index a8fb7c68a121..02939757112d 100644 --- a/src/phase.ts +++ b/src/phase.ts @@ -8,12 +8,13 @@ export class Phase { } start() { - console.log(`%cStart Phase ${this.constructor.name}`, 'color:green;'); - if (this.scene.abilityBar.shown) + console.log(`%cStart Phase ${this.constructor.name}`, "color:green;"); + if (this.scene.abilityBar.shown) { this.scene.abilityBar.resetAutoHideTimer(); + } } end() { this.scene.shiftPhase(); } -} \ No newline at end of file +} diff --git a/src/phases.ts b/src/phases.ts index bec02390c725..58e17d4d9a88 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,12 +1,12 @@ -import BattleScene, { AnySound, bypassLogin, startingWave } from "./battle-scene"; +import BattleScene, { bypassLogin } from "./battle-scene"; import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; -import * as Utils from './utils'; +import * as Utils from "./utils"; import { Moves } from "./data/enums/moves"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, OneHitKOAttr, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, DelayedAttackAttr, RechargeAttr, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, SacrificialAttr, IncrementMovePriorityAttr } from "./data/move"; -import { Mode } from './ui/ui'; +import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; +import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -37,7 +37,7 @@ import { BattleType, BattlerIndex, TurnCommand } from "./battle"; import { BattleSpec } from "./enums/battle-spec"; import { Species } from "./data/enums/species"; import { HealAchv, LevelAchv, achvs } from "./system/achv"; -import { TrainerConfig, TrainerSlot, trainerConfigs } from "./data/trainer-config"; +import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; import { TrainerType } from "./data/enums/trainer-type"; import { EggHatchPhase } from "./egg-hatch-phase"; import { Egg } from "./data/egg"; @@ -55,10 +55,10 @@ import { OptionSelectConfig, OptionSelectItem } from "./ui/abstact-option-select import { SaveSlotUiMode } from "./ui/save-slot-select-ui-handler"; import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run"; import { GameModes, gameModes } from "./game-mode"; -import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./data/pokemon-species"; -import i18next from './plugins/i18n'; +import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; +import i18next from "./plugins/i18n"; import { Abilities } from "./data/enums/abilities"; -import * as Overrides from './overrides'; +import * as Overrides from "./overrides"; import { TextStyle, addTextObject } from "./ui/text"; import { Type } from "./data/type"; @@ -83,10 +83,11 @@ export class LoginPhase extends Phase { const statusCode = response ? response[1] : null; if (!success) { if (!statusCode || statusCode === 400) { - if (this.showText) - this.scene.ui.showText(i18next.t('menu:logInOrCreateAccount')); + if (this.showText) { + this.scene.ui.showText(i18next.t("menu:logInOrCreateAccount")); + } - this.scene.playSound('menu_open'); + this.scene.playSound("menu_open"); const loadData = () => { updateUserInfo().then(() => this.scene.gameData.loadSystem().then(() => this.end())); @@ -98,7 +99,7 @@ export class LoginPhase extends Phase { this.scene.ui.playSelect(); loadData(); }, () => { - this.scene.playSound('menu_open'); + this.scene.playSound("menu_open"); this.scene.ui.setMode(Mode.REGISTRATION_FORM, { buttonActions: [ () => { @@ -120,11 +121,11 @@ export class LoginPhase extends Phase { return null; } else { this.scene.gameData.loadSystem().then(success => { - if (success || bypassLogin) + if (success || bypassLogin) { this.end(); - else { + } else { this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('menu:failedToLoadSaveData')); + this.scene.ui.showText(i18next.t("menu:failedToLoadSaveData")); } }); } @@ -134,8 +135,9 @@ export class LoginPhase extends Phase { end(): void { this.scene.ui.setMode(Mode.MESSAGE); - if (!this.scene.gameData.gender) + if (!this.scene.gameData.gender) { this.scene.unshiftPhase(new SelectGenderPhase(this.scene)); + } handleTutorial(this.scene, Tutorial.Intro).then(() => super.end()); } @@ -158,7 +160,7 @@ export class TitlePhase extends Phase { this.scene.ui.clearText(); this.scene.ui.fadeIn(250); - this.scene.playBgm('title', true); + this.scene.playBgm("title", true); this.scene.gameData.getSession(loggedInUser.lastSessionSlot).then(sessionData => { if (sessionData) { @@ -178,7 +180,7 @@ export class TitlePhase extends Phase { const options: OptionSelectItem[] = []; if (loggedInUser.lastSessionSlot > -1) { options.push({ - label: i18next.t('menu:continue'), + label: i18next.t("menu:continue"), handler: () => { this.loadSaveSlot(this.lastSessionData ? -1 : loggedInUser.lastSessionSlot); return true; @@ -186,7 +188,7 @@ export class TitlePhase extends Phase { }); } options.push({ - label: i18next.t('menu:newGame'), + label: i18next.t("menu:newGame"), handler: () => { const setModeAndEnd = (gameMode: GameModes) => { this.gameMode = gameMode; @@ -221,7 +223,7 @@ export class TitlePhase extends Phase { }); } options.push({ - label: i18next.t('menu:cancel'), + label: i18next.t("menu:cancel"), handler: () => { this.scene.clearPhaseQueue(); this.scene.pushPhase(new TitlePhase(this.scene)); @@ -240,19 +242,20 @@ export class TitlePhase extends Phase { } }, { - label: i18next.t('menu:loadGame'), + label: i18next.t("menu:loadGame"), handler: () => { this.scene.ui.setOverlayMode(Mode.SAVE_SLOT, SaveSlotUiMode.LOAD, (slotId: integer) => { - if (slotId === -1) + if (slotId === -1) { return this.showOptions(); + } this.loadSaveSlot(slotId); }); return true; } }, { - label: i18next.t('menu:dailyRun'), + label: i18next.t("menu:dailyRun"), handler: () => { this.initDailyRun(); return true; @@ -273,12 +276,13 @@ export class TitlePhase extends Phase { this.scene.gameData.loadSession(this.scene, slotId, slotId === -1 ? this.lastSessionData : null).then((success: boolean) => { if (success) { this.loaded = true; - this.scene.ui.showText(i18next.t('menu:sessionSuccess'), null, () => this.end()); - } else + this.scene.ui.showText(i18next.t("menu:sessionSuccess"), null, () => this.end()); + } else { this.end(); + } }).catch(err => { console.error(err); - this.scene.ui.showText(i18next.t('menu:failedToLoadSession'), null); + this.scene.ui.showText(i18next.t("menu:failedToLoadSession"), null); }); } @@ -304,7 +308,7 @@ export class TitlePhase extends Phase { const party = this.scene.getParty(); const loadPokemonAssets: Promise[] = []; - for (let starter of starters) { + for (const starter of starters) { const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); const starterGender = starter.species.malePercent !== null @@ -321,8 +325,9 @@ export class TitlePhase extends Phase { .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) .concat(getDailyRunStarterModifiers(party)); - for (let m of modifiers) + for (const m of modifiers) { this.scene.addModifier(m, true, false, false, true); + } this.scene.updateModifiers(true, true); Promise.all(loadPokemonAssets).then(() => { @@ -355,8 +360,9 @@ export class TitlePhase extends Phase { this.scene.arena.preloadBgm(); this.scene.pushPhase(new SelectStarterPhase(this.scene, this.gameMode)); this.scene.newArena(this.scene.gameMode.getStartingBiome(this.scene)); - } else + } else { this.scene.playBgm(); + } this.scene.pushPhase(new EncounterPhase(this.scene, this.loaded)); @@ -364,22 +370,25 @@ export class TitlePhase extends Phase { const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()).length; this.scene.pushPhase(new SummonPhase(this.scene, 0, true, true)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) + if (this.scene.currentBattle.double && availablePartyMembers > 1) { this.scene.pushPhase(new SummonPhase(this.scene, 1, true, true)); + } if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { const minPartySize = this.scene.currentBattle.double ? 2 : 1; if (availablePartyMembers > minPartySize) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) + if (this.scene.currentBattle.double) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } } } } - for (let achv of Object.keys(this.scene.gameData.achvUnlocks)) { - if (vouchers.hasOwnProperty(achv)) + for (const achv of Object.keys(this.scene.gameData.achvUnlocks)) { + if (vouchers.hasOwnProperty(achv)) { this.scene.validateVoucher(vouchers[achv]); + } } super.end(); @@ -415,19 +424,21 @@ export class ReloadSessionPhase extends Phase { let loaded = false; this.scene.time.delayedCall(Utils.fixedInt(1500), () => { - if (loaded) + if (loaded) { this.end(); - else + } else { delayElapsed = true; + } }); this.scene.gameData.clearLocalData(); (this.systemDataStr ? this.scene.gameData.initSystem(this.systemDataStr) : this.scene.gameData.loadSystem()).then(() => { - if (delayElapsed) + if (delayElapsed) { this.end(); - else + } else { loaded = true; + } }); } } @@ -450,11 +461,11 @@ export class SelectGenderPhase extends Phase { start(): void { super.start(); - this.scene.ui.showText(i18next.t('menu:boyOrGirl'), null, () => { + this.scene.ui.showText(i18next.t("menu:boyOrGirl"), null, () => { this.scene.ui.setMode(Mode.OPTION_SELECT, { options: [ { - label: i18next.t('menu:boy'), + label: i18next.t("menu:boy"), handler: () => { this.scene.gameData.gender = PlayerGender.MALE; this.scene.gameData.saveSetting(Setting.Player_Gender, 0); @@ -463,7 +474,7 @@ export class SelectGenderPhase extends Phase { } }, { - label: i18next.t('menu:girl'), + label: i18next.t("menu:girl"), handler: () => { this.scene.gameData.gender = PlayerGender.FEMALE; this.scene.gameData.saveSetting(Setting.Player_Gender, 1); @@ -494,7 +505,7 @@ export class SelectStarterPhase extends Phase { start() { super.start(); - this.scene.playBgm('menu'); + this.scene.playBgm("menu"); this.scene.ui.setMode(Mode.STARTER_SELECT, (starters: Starter[]) => { this.scene.ui.clearText(); @@ -509,25 +520,30 @@ export class SelectStarterPhase extends Phase { const party = this.scene.getParty(); const loadPokemonAssets: Promise[] = []; starters.forEach((starter: Starter, i: integer) => { - if (!i && Overrides.STARTER_SPECIES_OVERRIDE) + if (!i && Overrides.STARTER_SPECIES_OVERRIDE) { starter.species = getPokemonSpecies(Overrides.STARTER_SPECIES_OVERRIDE as Species); + } const starterProps = this.scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); - if (!i && Overrides.STARTER_SPECIES_OVERRIDE) + if (!i && Overrides.STARTER_SPECIES_OVERRIDE) { starterFormIndex = Overrides.STARTER_FORM_OVERRIDE; + } const starterGender = starter.species.malePercent !== null ? !starterProps.female ? Gender.MALE : Gender.FEMALE : Gender.GENDERLESS; const starterIvs = this.scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); const starterPokemon = this.scene.addPlayerPokemon(starter.species, this.scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); starterPokemon.tryPopulateMoveset(starter.moveset); - if (starter.passive) + if (starter.passive) { starterPokemon.passive = true; + } starterPokemon.luck = this.scene.gameData.getDexAttrLuck(this.scene.gameData.dexData[starter.species.speciesId].caughtAttr); - if (starter.pokerus) + if (starter.pokerus) { starterPokemon.pokerus = true; - if (this.scene.gameMode.isSplicedOnly) + } + if (this.scene.gameMode.isSplicedOnly) { starterPokemon.generateFusionSpecies(true); + } starterPokemon.setVisible(false); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); @@ -535,12 +551,13 @@ export class SelectStarterPhase extends Phase { overrideModifiers(this.scene); overrideHeldItems(this.scene, party[0]); Promise.all(loadPokemonAssets).then(() => { - SoundFade.fadeOut(this.scene, this.scene.sound.get('menu'), 500, true); + SoundFade.fadeOut(this.scene, this.scene.sound.get("menu"), 500, true); this.scene.time.delayedCall(500, () => this.scene.playBgm()); - if (this.scene.gameMode.isClassic) + if (this.scene.gameMode.isClassic) { this.scene.gameData.gameStats.classicSessionsPlayed++; - else + } else { this.scene.gameData.gameStats.endlessSessionsPlayed++; + } this.scene.newBattle(); this.scene.arena.init(); this.scene.sessionPlayTime = 0; @@ -563,11 +580,12 @@ export class BattlePhase extends Phase { for (let i = 0; i < sprites.length; i++) { const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; [ sprites[i], tintSprites[i] ].map(sprite => { - if (visible) + if (visible) { sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; + } sprite.setVisible(visible); sprite.clearTint(); - }) + }); sprites[i].setVisible(visible); tintSprites[i].setVisible(visible); sprites[i].clearTint(); @@ -575,10 +593,10 @@ export class BattlePhase extends Phase { } this.scene.tweens.add({ targets: this.scene.currentBattle.trainer, - x: '-=16', - y: '+=16', + x: "-=16", + y: "+=16", alpha: 1, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", duration: 750 }); } @@ -586,10 +604,10 @@ export class BattlePhase extends Phase { hideEnemyTrainer(): void { this.scene.tweens.add({ targets: this.scene.currentBattle.trainer, - x: '+=16', - y: '-=16', + x: "+=16", + y: "-=16", alpha: 0, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", duration: 750 }); } @@ -612,8 +630,9 @@ export abstract class FieldPhase extends BattlePhase { const speedReversed = new Utils.BooleanHolder(false); this.scene.arena.applyTags(TrickRoomTag, speedReversed); - if (speedReversed.value) + if (speedReversed.value) { orderedTargets = orderedTargets.reverse(); + } return orderedTargets.map(t => t.getFieldIndex() + (!t.isPlayer() ? BattlerIndex.ENEMY : 0)); } @@ -632,8 +651,9 @@ export abstract class PokemonPhase extends FieldPhase { constructor(scene: BattleScene, battlerIndex: BattlerIndex | integer) { super(scene); - if (battlerIndex === undefined) + if (battlerIndex === undefined) { battlerIndex = scene.getField().find(p => p?.isActive()).getBattlerIndex(); + } this.battlerIndex = battlerIndex; this.player = battlerIndex < 2; @@ -641,8 +661,9 @@ export abstract class PokemonPhase extends FieldPhase { } getPokemon() { - if (this.battlerIndex > BattlerIndex.ENEMY_2) + if (this.battlerIndex > BattlerIndex.ENEMY_2) { return this.scene.getPokemonById(this.battlerIndex); + } return this.scene.getField()[this.battlerIndex]; } } @@ -715,13 +736,14 @@ export class EncounterPhase extends BattlePhase { battle.enemyLevels.forEach((level, e) => { if (!this.loaded) { - if (battle.battleType === BattleType.TRAINER) + if (battle.battleType === BattleType.TRAINER) { battle.enemyParty[e] = battle.trainer.genPartyMember(e); - else { + } else { const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); battle.enemyParty[e] = this.scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!this.scene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { battle.enemyParty[e].ivs = new Array(6).fill(31); + } this.scene.getParty().slice(0, !battle.double ? 1 : 2).reverse().forEach(playerPokemon => { applyAbAttrs(SyncEncounterNatureAbAttr, playerPokemon, null, battle.enemyParty[e]); }); @@ -733,8 +755,9 @@ export class EncounterPhase extends BattlePhase { enemyPokemon.resetSummonData(); } - if (!this.loaded) + if (!this.loaded) { this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER); + } if (enemyPokemon.species.speciesId === Species.ETERNATUS) { if (this.scene.gameMode.isClassic && (battle.battleSpec === BattleSpec.FINAL_BOSS || this.scene.gameMode.isWaveFinal(battle.waveIndex))) { @@ -756,14 +779,15 @@ export class EncounterPhase extends BattlePhase { console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); }); - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) + if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { this.scene.validateAchv(achvs.SHINY_PARTY); + } - if (battle.battleType === BattleType.TRAINER) + if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); - else { + } else { if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { - for (let enemyPokemon of battle.enemyParty) { + for (const enemyPokemon of battle.enemyParty) { if (enemyPokemon.isBoss()) { enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); enemyPokemon.initBattleInfo(); @@ -779,15 +803,17 @@ export class EncounterPhase extends BattlePhase { this.scene.field.add(enemyPokemon); battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); const playerPokemon = this.scene.getPlayerPokemon(); - if (playerPokemon?.visible) + if (playerPokemon?.visible) { this.scene.field.moveBelow(enemyPokemon as Pokemon, playerPokemon); + } enemyPokemon.tint(0, 0.5); } else if (battle.battleType === BattleType.TRAINER) { enemyPokemon.setVisible(false); this.scene.currentBattle.trainer.tint(0, 0.5); } - if (battle.double) + if (battle.double) { enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); + } } }); @@ -800,12 +826,14 @@ export class EncounterPhase extends BattlePhase { if (!this.loaded) { this.scene.gameData.saveAll(this.scene, true, battle.waveIndex % 10 === 1 || this.scene.lastSavePlayTime >= 300).then(success => { this.scene.disableMenu = false; - if (!success) + if (!success) { return this.scene.reset(true); + } this.doEncounter(); }); - } else + } else { this.doEncounter(); + } }); }); } @@ -821,13 +849,15 @@ export class EncounterPhase extends BattlePhase { this.scene.updateModifiers(true); }*/ - for (let pokemon of this.scene.getParty()) { - if (pokemon) + for (const pokemon of this.scene.getParty()) { + if (pokemon) { pokemon.resetBattleData(); + } } - if (!this.loaded) + if (!this.loaded) { this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); + } const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ @@ -835,8 +865,9 @@ export class EncounterPhase extends BattlePhase { x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, duration: 2000, onComplete: () => { - if (!this.tryOverrideForBattleSpec()) + if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); + } } }); } @@ -844,22 +875,22 @@ export class EncounterPhase extends BattlePhase { getEncounterMessage(): string { const enemyField = this.scene.getEnemyField(); - if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) - return i18next.t('battle:bossAppeared', {bossName: enemyField[0].name}); + if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + return i18next.t("battle:bossAppeared", {bossName: enemyField[0].name}); + } if (this.scene.currentBattle.battleType === BattleType.TRAINER) { if (this.scene.currentBattle.double) { - return i18next.t('battle:trainerAppearedDouble', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); + return i18next.t("battle:trainerAppearedDouble", {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); - } - else { - return i18next.t('battle:trainerAppeared', {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); + } else { + return i18next.t("battle:trainerAppeared", {trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true)}); } } return enemyField.length === 1 - ? i18next.t('battle:singleWildAppeared', {pokemonName: enemyField[0].name}) - : i18next.t('battle:multiWildAppeared', {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name}) + ? i18next.t("battle:singleWildAppeared", {pokemonName: enemyField[0].name}) + : i18next.t("battle:multiWildAppeared", {pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name}); } doEncounterCommon(showEncounterMessage: boolean = true) { @@ -867,20 +898,22 @@ export class EncounterPhase extends BattlePhase { if (this.scene.currentBattle.battleType === BattleType.WILD) { enemyField.forEach(enemyPokemon => { - enemyPokemon.untint(100, 'Sine.easeOut'); + enemyPokemon.untint(100, "Sine.easeOut"); enemyPokemon.cry(); enemyPokemon.showInfo(); - if (enemyPokemon.isShiny()) + if (enemyPokemon.isShiny()) { this.scene.validateAchv(achvs.SEE_SHINY); + } }); this.scene.updateFieldScale(); - if (showEncounterMessage) + if (showEncounterMessage) { this.scene.ui.showText(this.getEncounterMessage(), null, () => this.end(), 1500); - else + } else { this.end(); + } } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { const trainer = this.scene.currentBattle.trainer; - trainer.untint(100, 'Sine.easeOut'); + trainer.untint(100, "Sine.easeOut"); trainer.playAnim(); const doSummon = () => { @@ -892,21 +925,23 @@ export class EncounterPhase extends BattlePhase { this.hideEnemyTrainer(); const availablePartyMembers = this.scene.getEnemyParty().filter(p => !p.isFainted()).length; this.scene.unshiftPhase(new SummonPhase(this.scene, 0, false)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) + if (this.scene.currentBattle.double && availablePartyMembers > 1) { this.scene.unshiftPhase(new SummonPhase(this.scene, 1, false)); + } this.end(); }; - if (showEncounterMessage) + if (showEncounterMessage) { this.scene.ui.showText(this.getEncounterMessage(), null, doTrainerSummon, 1500, true); - else + } else { doTrainerSummon(); + } }; const encounterMessages = this.scene.currentBattle.trainer.getEncounterMessages(); - if (!encounterMessages?.length) + if (!encounterMessages?.length) { doSummon(); - else { + } else { const showDialogueAndSummon = () => { let message: string; this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); @@ -914,10 +949,11 @@ export class EncounterPhase extends BattlePhase { this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doSummon())); }); }; - if (this.scene.currentBattle.trainer.config.hasCharSprite) + if (this.scene.currentBattle.trainer.config.hasCharSprite) { this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer.getKey(), getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); - else + } else { showDialogueAndSummon(); + } } } } @@ -926,45 +962,51 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); enemyField.forEach((enemyPokemon, e) => { - if (enemyPokemon.isShiny()) + if (enemyPokemon.isShiny()) { this.scene.unshiftPhase(new ShinySparklePhase(this.scene, BattlerIndex.ENEMY + e)); + } }); if (this.scene.currentBattle.battleType !== BattleType.TRAINER) { enemyField.map(p => this.scene.pushPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()))); const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); - if (ivScannerModifier) + if (ivScannerModifier) { enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + } } if (!this.loaded) { const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()); - if (availablePartyMembers[0].isOnField()) + if (availablePartyMembers[0].isOnField()) { applyPostBattleInitAbAttrs(PostBattleInitAbAttr, availablePartyMembers[0]); - else + } else { this.scene.pushPhase(new SummonPhase(this.scene, 0)); + } if (this.scene.currentBattle.double) { if (availablePartyMembers.length > 1) { this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); - if (availablePartyMembers[1].isOnField()) + if (availablePartyMembers[1].isOnField()) { applyPostBattleInitAbAttrs(PostBattleInitAbAttr, availablePartyMembers[1]); - else + } else { this.scene.pushPhase(new SummonPhase(this.scene, 1)); + } } } else { - if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) + if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { this.scene.pushPhase(new ReturnPhase(this.scene, 1)); + } this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false)); } - if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { + if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { const minPartySize = this.scene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double) + if (this.scene.currentBattle.double) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } } } } @@ -974,14 +1016,14 @@ export class EncounterPhase extends BattlePhase { tryOverrideForBattleSpec(): boolean { switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const enemy = this.scene.getEnemyPokemon(); - this.scene.ui.showText(this.getEncounterMessage(), null, () => { - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].encounter, enemy.species.name, null, () => { - this.doEncounterCommon(false); - }); - }, 1500, true); - return true; + case BattleSpec.FINAL_BOSS: + const enemy = this.scene.getEnemyPokemon(); + this.scene.ui.showText(this.getEncounterMessage(), null, () => { + this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].encounter, enemy.species.name, null, () => { + this.doEncounterCommon(false); + }); + }, 1500, true); + return true; } return false; @@ -996,9 +1038,10 @@ export class NextEncounterPhase extends EncounterPhase { doEncounter(): void { this.scene.playBgm(undefined, true); - for (let pokemon of this.scene.getParty()) { - if (pokemon) + for (const pokemon of this.scene.getParty()) { + if (pokemon) { pokemon.resetBattleData(); + } } this.scene.arenaNextEnemy.setBiome(this.scene.arena.biomeType); @@ -1007,7 +1050,7 @@ export class NextEncounterPhase extends EncounterPhase { const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ targets: [ this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer ].flat(), - x: '+=300', + x: "+=300", duration: 2000, onComplete: () => { this.scene.arenaEnemy.setBiome(this.scene.arena.biomeType); @@ -1015,11 +1058,13 @@ export class NextEncounterPhase extends EncounterPhase { this.scene.arenaEnemy.setAlpha(1); this.scene.arenaNextEnemy.setX(this.scene.arenaNextEnemy.x - 300); this.scene.arenaNextEnemy.setVisible(false); - if (this.scene.lastEnemyTrainer) + if (this.scene.lastEnemyTrainer) { this.scene.lastEnemyTrainer.destroy(); + } - if (!this.tryOverrideForBattleSpec()) + if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); + } } }); } @@ -1033,24 +1078,27 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { doEncounter(): void { this.scene.playBgm(undefined, true); - for (let pokemon of this.scene.getParty()) { - if (pokemon) + for (const pokemon of this.scene.getParty()) { + if (pokemon) { pokemon.resetBattleData(); + } } this.scene.arena.trySetWeather(getRandomWeatherType(this.scene.arena), false); - for (let pokemon of this.scene.getParty().filter(p => p.isOnField())) + for (const pokemon of this.scene.getParty().filter(p => p.isOnField())) { applyAbAttrs(PostBiomeChangeAbAttr, pokemon, null); + } const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ targets: [ this.scene.arenaEnemy, enemyField ].flat(), - x: '+=300', + x: "+=300", duration: 2000, onComplete: () => { - if (!this.tryOverrideForBattleSpec()) + if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); + } } }); } @@ -1092,11 +1140,11 @@ export class SelectBiomePhase extends BattlePhase { if ((this.scene.gameMode.isClassic && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex + 9)) || (this.scene.gameMode.isDaily && this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) - || (this.scene.gameMode.hasShortBiomes && !(this.scene.currentBattle.waveIndex % 50))) + || (this.scene.gameMode.hasShortBiomes && !(this.scene.currentBattle.waveIndex % 50))) { setNextBiome(Biome.END); - else if (this.scene.gameMode.hasRandomBiomes) + } else if (this.scene.gameMode.hasRandomBiomes) { setNextBiome(this.generateNextBiome()); - else if (Array.isArray(biomeLinks[currentBiome])) { + } else if (Array.isArray(biomeLinks[currentBiome])) { let biomes: Biome[]; this.scene.executeWithSeedOffset(() => { biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) @@ -1127,17 +1175,20 @@ export class SelectBiomePhase extends BattlePhase { options: biomeSelectItems, delay: 1000 }); - } else + } else { setNextBiome(biomes[Utils.randSeedInt(biomes.length)]); - } else if (biomeLinks.hasOwnProperty(currentBiome)) + } + } else if (biomeLinks.hasOwnProperty(currentBiome)) { setNextBiome(biomeLinks[currentBiome] as Biome); - else + } else { setNextBiome(this.generateNextBiome()); + } } generateNextBiome(): Biome { - if (!(this.scene.currentBattle.waveIndex % 50)) + if (!(this.scene.currentBattle.waveIndex % 50)) { return Biome.END; + } return this.scene.generateRandomBiome(this.scene.currentBattle.waveIndex); } } @@ -1154,12 +1205,13 @@ export class SwitchBiomePhase extends BattlePhase { start() { super.start(); - if (this.nextBiome === undefined) + if (this.nextBiome === undefined) { return this.end(); + } this.scene.tweens.add({ targets: [ this.scene.arenaEnemy, this.scene.lastEnemyTrainer ], - x: '+=300', + x: "+=300", duration: 2000, onComplete: () => { this.scene.arenaEnemy.setX(this.scene.arenaEnemy.x - 600); @@ -1168,7 +1220,7 @@ export class SwitchBiomePhase extends BattlePhase { const biomeKey = getBiomeKey(this.nextBiome); const bgTexture = `${biomeKey}_bg`; - this.scene.arenaBgTransition.setTexture(bgTexture) + this.scene.arenaBgTransition.setTexture(bgTexture); this.scene.arenaBgTransition.setAlpha(0); this.scene.arenaBgTransition.setVisible(true); this.scene.arenaPlayerTransition.setBiome(this.nextBiome); @@ -1179,7 +1231,7 @@ export class SwitchBiomePhase extends BattlePhase { targets: [ this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition ], duration: 1000, delay: 1000, - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", alpha: (target: any) => target === this.scene.arenaPlayer ? 0 : 1, onComplete: () => { this.scene.arenaBg.setTexture(bgTexture); @@ -1190,8 +1242,9 @@ export class SwitchBiomePhase extends BattlePhase { this.scene.arenaNextEnemy.setBiome(this.nextBiome); this.scene.arenaBgTransition.setVisible(false); this.scene.arenaPlayerTransition.setVisible(false); - if (this.scene.lastEnemyTrainer) + if (this.scene.lastEnemyTrainer) { this.scene.lastEnemyTrainer.destroy(); + } this.end(); } @@ -1239,14 +1292,15 @@ export class SummonPhase extends PartyMemberPokemonPhase { } if (this.player) { - this.scene.ui.showText(i18next.t('battle:playerGo', { pokemonName: this.getPokemon().name })); - if (this.player) - this.scene.pbTray.hide(); - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back_pb`); + this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: this.getPokemon().name })); + if (this.player) { + this.scene.pbTray.hide(); + } + this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); this.scene.time.delayedCall(562, () => { - this.scene.trainer.setFrame('2'); + this.scene.trainer.setFrame("2"); this.scene.time.delayedCall(64, () => { - this.scene.trainer.setFrame('3'); + this.scene.trainer.setFrame("3"); }); }); this.scene.tweens.add({ @@ -1265,14 +1319,14 @@ export class SummonPhase extends PartyMemberPokemonPhase { summon(): void { const pokemon = this.getPokemon(); - const pokeball = this.scene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, 'pb', getPokeballAtlasKey(pokemon.pokeball)); + const pokeball = this.scene.addFieldSprite(this.player ? 36 : 248, this.player ? 80 : 44, "pb", getPokeballAtlasKey(pokemon.pokeball)); pokeball.setVisible(false); pokeball.setOrigin(0.5, 0.625); this.scene.field.add(pokeball); - if (this.fieldIndex === 1) + if (this.fieldIndex === 1) { pokemon.setFieldPosition(FieldPosition.RIGHT, 0); - else { + } else { const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); } @@ -1290,24 +1344,25 @@ export class SummonPhase extends PartyMemberPokemonPhase { this.scene.tweens.add({ targets: pokeball, duration: 150, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", y: (this.player ? 70 : 34) + fpOffset[1], onComplete: () => { this.scene.tweens.add({ targets: pokeball, duration: 500, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", angle: 1440, y: (this.player ? 132 : 86) + fpOffset[1], onComplete: () => { - this.scene.playSound('pb_rel'); + this.scene.playSound("pb_rel"); pokeball.destroy(); this.scene.add.existing(pokemon); this.scene.field.add(pokemon); if (!this.player) { const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) + if (playerPokemon?.visible) { this.scene.field.moveBelow(pokemon, playerPokemon); + } this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); } addPokeballOpenParticles(this.scene, pokemon.x, pokemon.y - 16, pokemon.pokeball); @@ -1319,12 +1374,12 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.getSprite().setVisible(true); pokemon.setScale(0.5); pokemon.tint(getPokeballTintColor(pokemon.pokeball)); - pokemon.untint(250, 'Sine.easeIn'); + pokemon.untint(250, "Sine.easeIn"); this.scene.updateFieldScale(); this.scene.tweens.add({ targets: pokemon, duration: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", scale: pokemon.getSpriteScale(), onComplete: () => { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); @@ -1342,8 +1397,9 @@ export class SummonPhase extends PartyMemberPokemonPhase { onEnd(): void { const pokemon = this.getPokemon(); - if (pokemon.isShiny()) + if (pokemon.isShiny()) { this.scene.unshiftPhase(new ShinySparklePhase(this.scene, pokemon.getBattlerIndex())); + } pokemon.resetTurnData(); @@ -1382,8 +1438,9 @@ export class SwitchSummonPhase extends SummonPhase { preSummon(): void { if (!this.player) { - if (this.slotIndex === -1) + if (this.slotIndex === -1) { this.slotIndex = this.scene.currentBattle.trainer.getNextSummonIndex(!this.fieldIndex ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + } if (this.slotIndex > -1) { this.showEnemyTrainer(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); @@ -1391,9 +1448,9 @@ export class SwitchSummonPhase extends SummonPhase { } if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { - if (this.player) + if (this.player) { return this.switchAndSummon(); - else { + } else { this.scene.time.delayedCall(750, () => this.switchAndSummon()); return; } @@ -1401,25 +1458,26 @@ export class SwitchSummonPhase extends SummonPhase { const pokemon = this.getPokemon(); - if (!this.batonPass) + if (!this.batonPass) { (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); + } applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, pokemon); this.scene.ui.showText(this.player ? - i18next.t('battle:playerComeBack', { pokemonName: pokemon.name }) : - i18next.t('battle:trainerComeBack', { + i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) : + i18next.t("battle:trainerComeBack", { trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), pokemonName: pokemon.name }) ); - this.scene.playSound('pb_rel'); + this.scene.playSound("pb_rel"); pokemon.hideInfo(); - pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, 'Sine.easeIn'); + pokemon.tint(getPokeballTintColor(pokemon.pokeball), 1, 250, "Sine.easeIn"); this.scene.tweens.add({ targets: pokemon, duration: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", scale: 0.5, onComplete: () => { pokemon.setVisible(false); @@ -1439,8 +1497,9 @@ export class SwitchSummonPhase extends SummonPhase { if (!this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { const batonPassModifier = this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === this.lastPokemon.id) as SwitchEffectTransferModifier; - if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) + if (batonPassModifier && !this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === switchedPokemon.id)) { this.scene.tryTransferHeldItemModifier(batonPassModifier, switchedPokemon, false, false); + } } } if (switchedPokemon) { @@ -1448,25 +1507,26 @@ export class SwitchSummonPhase extends SummonPhase { party[this.fieldIndex] = switchedPokemon; const showTextAndSummon = () => { this.scene.ui.showText(this.player ? - i18next.t('battle:playerGo', { pokemonName: switchedPokemon.name }) : - i18next.t('battle:trainerGo', { + i18next.t("battle:playerGo", { pokemonName: switchedPokemon.name }) : + i18next.t("battle:trainerGo", { trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), pokemonName: this.getPokemon().name }) ); this.summon(); }; - if (this.player) + if (this.player) { showTextAndSummon(); - else { + } else { this.scene.time.delayedCall(1500, () => { this.hideEnemyTrainer(); this.scene.pbTrayEnemy.hide(); showTextAndSummon(); }); } - } else + } else { this.end(); + } } onEnd(): void { @@ -1477,11 +1537,13 @@ export class SwitchSummonPhase extends SummonPhase { const lastUsedMove = moveId ? allMoves[moveId] : undefined; // Compensate for turn spent summoning - if (pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command === Command.POKEMON || !!lastUsedMove?.findAttr(attr => attr instanceof ForceSwitchOutAttr)) //check if hard switch OR pivot move was used + if (pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command === Command.POKEMON || !!lastUsedMove?.findAttr(attr => attr instanceof ForceSwitchOutAttr)) { //check if hard switch OR pivot move was used pokemon.battleSummonData.turnCount--; + } - if (this.batonPass && pokemon) + if (this.batonPass && pokemon) { pokemon.transferSummon(this.lastPokemon); + } this.lastPokemon?.resetSummonData(); @@ -1524,9 +1586,9 @@ export class ShowTrainerPhase extends BattlePhase { start() { super.start(); - this.scene.trainer.setVisible(true) + this.scene.trainer.setVisible(true); - this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}_back`); + this.scene.trainer.setTexture(`trainer_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); this.scene.tweens.add({ targets: this.scene.trainer, @@ -1559,8 +1621,9 @@ export class ToggleDoublePositionPhase extends BattlePhase { } this.end(); }); - } else + } else { this.end(); + } } } @@ -1596,7 +1659,7 @@ export class CheckSwitchPhase extends BattlePhase { return; } - this.scene.ui.showText(i18next.t('battle:switchQuestion', { pokemonName: this.useName ? pokemon.name : i18next.t('battle:pokemon') }), null, () => { + this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? pokemon.name : i18next.t("battle:pokemon") }), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); @@ -1616,7 +1679,7 @@ export class SummonMissingPhase extends SummonPhase { } preSummon(): void { - this.scene.ui.showText(i18next.t('battle:sendOutPokemon', { pokemonName: this.getPokemon().name})); + this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: this.getPokemon().name})); this.scene.time.delayedCall(250, () => this.summon()); } } @@ -1630,8 +1693,8 @@ export class LevelCapPhase extends FieldPhase { super.start(); this.scene.ui.setMode(Mode.MESSAGE).then(() => { - this.scene.playSound('level_up_fanfare'); - this.scene.ui.showText(i18next.t('battle:levelCapUp', { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:levelCapUp", { levelCap: this.scene.getMaxExpLevel() }), null, () => this.end(), null, true); this.executeForAll(pokemon => pokemon.updateInfo(true)); }); } @@ -1649,8 +1712,9 @@ export class TurnInitPhase extends FieldPhase { this.scene.getField().forEach((pokemon, i) => { if (pokemon?.isActive()) { - if (pokemon.isPlayer()) + if (pokemon.isPlayer()) { this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); + } pokemon.resetTurnData(); @@ -1678,12 +1742,14 @@ export class CommandPhase extends FieldPhase { if (this.fieldIndex) { const allyCommand = this.scene.currentBattle.turnCommands[this.fieldIndex - 1]; - if (allyCommand.command === Command.BALL || allyCommand.command === Command.RUN) + if (allyCommand.command === Command.BALL || allyCommand.command === Command.RUN) { this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: allyCommand.command, skip: true }; + } } - if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) + if (this.scene.currentBattle.turnCommands[this.fieldIndex]?.skip) { return this.end(); + } const playerPokemon = this.scene.getPlayerField()[this.fieldIndex]; @@ -1691,22 +1757,25 @@ export class CommandPhase extends FieldPhase { while (moveQueue.length && moveQueue[0] && moveQueue[0].move && (!playerPokemon.getMoveset().find(m => m.moveId === moveQueue[0].move) - || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable(playerPokemon, moveQueue[0].ignorePP))) - moveQueue.shift(); + || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable(playerPokemon, moveQueue[0].ignorePP))) { + moveQueue.shift(); + } if (moveQueue.length) { const queuedMove = moveQueue[0]; - if (!queuedMove.move) + if (!queuedMove.move) { this.handleCommand(Command.FIGHT, -1, false); - else { + } else { const moveIndex = playerPokemon.getMoveset().findIndex(m => m.moveId === queuedMove.move); if (moveIndex > -1 && playerPokemon.getMoveset()[moveIndex].isUsable(playerPokemon, queuedMove.ignorePP)) { this.handleCommand(Command.FIGHT, moveIndex, queuedMove.ignorePP, { targets: queuedMove.targets, multiple: queuedMove.targets.length > 1 }); - } else + } else { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } } - } else + } else { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } } handleCommand(command: Command, cursor: integer, ...args: any[]): boolean { @@ -1715,146 +1784,152 @@ export class CommandPhase extends FieldPhase { let success: boolean; switch (command) { - case Command.FIGHT: - let useStruggle = false; - if (cursor === -1 || + case Command.FIGHT: + let useStruggle = false; + if (cursor === -1 || playerPokemon.trySelectMove(cursor, args[0] as boolean) || (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)) { - const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor].moveId : Moves.NONE : Moves.STRUGGLE; - const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; - const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; - if (!moveId) - turnCommand.targets = [ this.fieldIndex ]; - console.log(moveTargets, playerPokemon.name); - if (moveTargets.targets.length <= 1 || moveTargets.multiple) - turnCommand.move.targets = moveTargets.targets; - else if(playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) - turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; - else - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); - this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; - success = true; + const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor].moveId : Moves.NONE : Moves.STRUGGLE; + const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; + const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; + if (!moveId) { + turnCommand.targets = [ this.fieldIndex ]; } - else if (cursor < playerPokemon.getMoveset().length) { - const move = playerPokemon.getMoveset()[cursor]; - this.scene.ui.setMode(Mode.MESSAGE); + console.log(moveTargets, playerPokemon.name); + if (moveTargets.targets.length <= 1 || moveTargets.multiple) { + turnCommand.move.targets = moveTargets.targets; + } else if(playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { + turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; + } else { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } + this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; + success = true; + } else if (cursor < playerPokemon.getMoveset().length) { + const move = playerPokemon.getMoveset()[cursor]; + this.scene.ui.setMode(Mode.MESSAGE); - // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = - playerPokemon.summonData.disabledMove === move.moveId ? 'battle:moveDisabled' : - move.getName().endsWith(' (N)') ? 'battle:moveNotImplemented' : 'battle:moveNoPP'; - const moveName = move.getName().replace(' (N)', ''); // Trims off the indicator + // Decides between a Disabled, Not Implemented, or No PP translation message + const errorMessage = + playerPokemon.summonData.disabledMove === move.moveId ? "battle:moveDisabled" : + move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; + const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator - this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); - }, null, true); - } - break; - case Command.BALL: - if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { + this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); + }, null, true); + } + break; + case Command.BALL: + if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarters).length - 1))) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { + this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noPokeballForce'), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + }, null, true); + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { + this.scene.ui.showText(null, 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); + if (targets.length > 1) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noPokeballTrainer'), null, () => { + this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); - } else { - const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); - if (targets.length > 1) { + } else if (cursor < 5) { + const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); + if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && !targetPokemon.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noPokeballMulti'), null, () => { + this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); - } else if (cursor < 5) { - const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); - if (targetPokemon.isBoss() && targetPokemon.bossSegmentIndex >= 1 && !targetPokemon.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noPokeballStrong'), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; - this.scene.currentBattle.turnCommands[this.fieldIndex].targets = targets; - if (this.fieldIndex) - this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; - success = true; + } else { + this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; + this.scene.currentBattle.turnCommands[this.fieldIndex].targets = targets; + if (this.fieldIndex) { + this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; } + success = true; } } - break; - case Command.POKEMON: - case Command.RUN: - const isSwitch = command === Command.POKEMON; - if (!isSwitch && this.scene.arena.biomeType === Biome.END) { + } + break; + case Command.POKEMON: + case Command.RUN: + const isSwitch = command === Command.POKEMON; + if (!isSwitch && this.scene.arena.biomeType === Biome.END) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { + this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noEscapeForce'), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { + }, null, true); + } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { + this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t('battle:noEscapeTrainer'), null, () => { - this.scene.ui.showText(null, 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag; - const trapped = new Utils.BooleanHolder(false); - const batonPass = isSwitch && args[0] as boolean; - if (!batonPass) - enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon)); - if (batonPass || (!trapTag && !trapped.value)) { - this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } - : { command: Command.RUN }; + }, null, true); + } else { + const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag; + const trapped = new Utils.BooleanHolder(false); + const batonPass = isSwitch && args[0] as boolean; + if (!batonPass) { + enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon)); + } + if (batonPass || (!trapTag && !trapped.value)) { + this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch + ? { command: Command.POKEMON, cursor: cursor, args: args } + : { command: Command.RUN }; + success = true; + if (!isSwitch && this.fieldIndex) { + this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; + } + } else if (trapTag) { + if(trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { success = true; - if (!isSwitch && this.fieldIndex) - this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; - } else if (trapTag) { - if(trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { - success = true; - this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch + this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch ? { command: Command.POKEMON, cursor: cursor, args: args } : { command: Command.RUN }; - break; - } - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - } - this.scene.ui.showText( - i18next.t('battle:noEscapePokemon', { - pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, - moveName: trapTag.getMoveName(), - escapeVerb: isSwitch ? i18next.t('battle:escapeVerbSwitch') : i18next.t('battle:escapeVerbFlee') - }), - null, - () => { - this.scene.ui.showText(null, 0); - if (!isSwitch) - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); + break; } + if (!isSwitch) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + } + this.scene.ui.showText( + i18next.t("battle:noEscapePokemon", { + pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, + moveName: trapTag.getMoveName(), + escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") + }), + null, + () => { + this.scene.ui.showText(null, 0); + if (!isSwitch) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + }, null, true); } - break; + } + break; } - if (success) + if (success) { this.end(); + } return success; } @@ -1872,13 +1947,15 @@ export class CommandPhase extends FieldPhase { const encoreTag = pokemon.getTag(EncoreTag) as EncoreTag; - if (!encoreTag) + if (!encoreTag) { return false; + } const moveIndex = pokemon.getMoveset().findIndex(m => m.moveId === encoreTag.moveId); - if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex].isUsable(pokemon)) + if (moveIndex === -1 || !pokemon.getMoveset()[moveIndex].isUsable(pokemon)) { return false; + } this.handleCommand(Command.FIGHT, moveIndex, false); @@ -1973,10 +2050,12 @@ export class SelectTargetPhase extends PokemonPhase { if (cursor === -1) { this.scene.currentBattle.turnCommands[this.fieldIndex] = null; this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); - } else + } else { turnCommand.targets = [ cursor ]; - if (turnCommand.command === Command.BALL && this.fieldIndex) + } + if (turnCommand.command === Command.BALL && this.fieldIndex) { this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; + } this.end(); }); } @@ -2008,10 +2087,11 @@ export class TurnStartPhase extends FieldPhase { const bCommand = this.scene.currentBattle.turnCommands[b]; if (aCommand.command !== bCommand.command) { - if (aCommand.command === Command.FIGHT) + if (aCommand.command === Command.FIGHT) { return 1; - else if (bCommand.command === Command.FIGHT) + } else if (bCommand.command === Command.FIGHT) { return -1; + } } else if (aCommand.command === Command.FIGHT) { const aMove = allMoves[aCommand.move.move]; const bMove = allMoves[bCommand.move.move]; @@ -2025,12 +2105,14 @@ export class TurnStartPhase extends FieldPhase { applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a), null, aMove, aPriority); applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); - if (aPriority.value !== bPriority.value) + if (aPriority.value !== bPriority.value) { return aPriority.value < bPriority.value ? 1 : -1; + } } - if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) + if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) { return battlerBypassSpeed[a].value ? -1 : 1; + } const aIndex = order.indexOf(a); const bIndex = order.indexOf(b); @@ -2038,51 +2120,57 @@ export class TurnStartPhase extends FieldPhase { return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0; }); - for (let o of moveOrder) { + for (const o of moveOrder) { const pokemon = field[o]; const turnCommand = this.scene.currentBattle.turnCommands[o]; - if (turnCommand.skip) + if (turnCommand.skip) { continue; + } switch (turnCommand.command) { - case Command.FIGHT: - const queuedMove = turnCommand.move; - if (!queuedMove) - continue; - const move = pokemon.getMoveset().find(m => m.moveId === queuedMove.move) || new PokemonMove(queuedMove.move); - if (pokemon.isPlayer()) { - if (turnCommand.cursor === -1) - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move)); - else { - const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP); - this.scene.pushPhase(playerPhase); - } - } else - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP)); - break; - case Command.BALL: - this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets[0] % 2, turnCommand.cursor)); - break; - case Command.POKEMON: - case Command.RUN: - const isSwitch = turnCommand.command === Command.POKEMON; - if (isSwitch) - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor, true, turnCommand.args[0] as boolean, pokemon.isPlayer())); - else - this.scene.unshiftPhase(new AttemptRunPhase(this.scene, pokemon.getFieldIndex())); - break; + case Command.FIGHT: + const queuedMove = turnCommand.move; + if (!queuedMove) { + continue; + } + const move = pokemon.getMoveset().find(m => m.moveId === queuedMove.move) || new PokemonMove(queuedMove.move); + if (pokemon.isPlayer()) { + if (turnCommand.cursor === -1) { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move)); + } else { + const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP); + this.scene.pushPhase(playerPhase); + } + } else { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move.targets, move, false, queuedMove.ignorePP)); + } + break; + case Command.BALL: + this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets[0] % 2, turnCommand.cursor)); + break; + case Command.POKEMON: + case Command.RUN: + const isSwitch = turnCommand.command === Command.POKEMON; + if (isSwitch) { + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor, true, turnCommand.args[0] as boolean, pokemon.isPlayer())); + } else { + this.scene.unshiftPhase(new AttemptRunPhase(this.scene, pokemon.getFieldIndex())); + } + break; } } - if (this.scene.arena.weather) + if (this.scene.arena.weather) { this.scene.pushPhase(new WeatherEffectPhase(this.scene, this.scene.arena.weather)); + } - for (let o of order) { - if (field[o].status && field[o].status.isPostTurn()) + for (const o of order) { + if (field[o].status && field[o].status.isPostTurn()) { this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, o)); + } } this.scene.pushPhase(new BerryPhase(this.scene)); @@ -2144,7 +2232,7 @@ export class TurnEndPhase extends FieldPhase { pokemon.lapseTags(BattlerTagLapseType.TURN_END); if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) { - this.scene.pushPhase(new MessagePhase(this.scene, i18next.t('battle:notDisabled', { pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, moveName: allMoves[pokemon.summonData.disabledMove].name }))); + this.scene.pushPhase(new MessagePhase(this.scene, i18next.t("battle:notDisabled", { pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, moveName: allMoves[pokemon.summonData.disabledMove].name }))); pokemon.summonData.disabledMove = Moves.NONE; } @@ -2152,7 +2240,7 @@ export class TurnEndPhase extends FieldPhase { if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), getPokemonMessage(pokemon, '\'s HP was restored.'), true)); + Math.max(pokemon.getMaxHp() >> 4, 1), getPokemonMessage(pokemon, "'s HP was restored."), true)); } if (!pokemon.isPlayer()) { @@ -2171,11 +2259,13 @@ export class TurnEndPhase extends FieldPhase { this.scene.arena.lapseTags(); - if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) + if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) { this.scene.arena.trySetWeather(WeatherType.NONE, false); + } - if (this.scene.arena.terrain && !this.scene.arena.terrain.lapse()) + if (this.scene.arena.terrain && !this.scene.arena.terrain.lapse()) { this.scene.arena.trySetTerrain(TerrainType.NONE, false); + } this.end(); } @@ -2186,32 +2276,39 @@ export class BattleEndPhase extends BattlePhase { super.start(); this.scene.currentBattle.addBattleScore(this.scene); - if (this.scene.currentBattle.moneyScattered) + if (this.scene.currentBattle.moneyScattered) { this.scene.currentBattle.pickUpScatteredMoney(this.scene); + } this.scene.gameData.gameStats.battles++; - if (this.scene.currentBattle.trainer) + if (this.scene.currentBattle.trainer) { this.scene.gameData.gameStats.trainersDefeated++; - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) - this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; + } + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) { + this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; + } - for (let pokemon of this.scene.getField()) { - if (pokemon) + for (const pokemon of this.scene.getField()) { + if (pokemon) { pokemon.resetBattleSummonData(); + } } - for (let pokemon of this.scene.getParty().filter(p => !p.isFainted())) + for (const pokemon of this.scene.getParty().filter(p => !p.isFainted())) { applyPostBattleAbAttrs(PostBattleAbAttr, pokemon); + } this.scene.clearEnemyHeldItemModifiers(); const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; - for (let m of lapsingModifiers) { + for (const m of lapsingModifiers) { const args: any[] = []; - if (m instanceof LapsingPokemonHeldItemModifier) + if (m instanceof LapsingPokemonHeldItemModifier) { args.push(this.scene.getPokemonById(m.pokemonId)); - if (!m.lapse(args)) + } + if (!m.lapse(args)) { this.scene.removeModifier(m); + } } this.scene.updateModifiers().then(() => this.end()); @@ -2287,14 +2384,16 @@ export class MovePhase extends BattlePhase { console.log(Moves[this.move.moveId]); if (!this.canMove()) { - if (this.move.moveId && this.pokemon.summonData.disabledMove === this.move.moveId) + if (this.move.moveId && this.pokemon.summonData.disabledMove === this.move.moveId) { this.scene.queueMessage(`${this.move.getName()} is disabled!`); + } return this.end(); } if (!this.followUp) { - if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) + if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { this.scene.arena.setIgnoreAbilities(); + } } else { this.pokemon.turnData.hitsLeft = undefined; this.pokemon.turnData.hitCount = undefined; @@ -2305,12 +2404,12 @@ export class MovePhase extends BattlePhase { ? new Utils.IntegerHolder(this.targets[0]) : null; if (moveTarget) { - var oldTarget = moveTarget.value; + const oldTarget = moveTarget.value; this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget)); //Check if this move is immune to being redirected, and restore its target to the intended target if it is. if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) || this.move.getMove().getAttrs(BypassRedirectAttr).length)) { //If an ability prevented this move from being redirected, display its ability pop up. - if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget != moveTarget.value) { + if ((this.pokemon.hasAbilityWithAttr(BlockRedirectAbAttr) && !this.move.getMove().getAttrs(BypassRedirectAttr).length) && oldTarget !== moveTarget.value) { this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); } moveTarget.value = oldTarget; @@ -2321,8 +2420,9 @@ export class MovePhase extends BattlePhase { if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { if (this.pokemon.turnData.attacksReceived.length) { const attacker = this.pokemon.turnData.attacksReceived.length ? this.pokemon.scene.getPokemonById(this.pokemon.turnData.attacksReceived[0].sourceId) : null; - if (attacker?.isActive(true)) + if (attacker?.isActive(true)) { this.targets[0] = attacker.getBattlerIndex(); + } } if (this.targets[0] === BattlerIndex.ATTACKER) { this.fail(); // Marks the move as failed for later in doMove @@ -2332,8 +2432,9 @@ export class MovePhase extends BattlePhase { } const targets = this.scene.getField(true).filter(p => { - if (this.targets.indexOf(p.getBattlerIndex()) > -1) + if (this.targets.indexOf(p.getBattlerIndex()) > -1) { return true; + } return false; }); @@ -2345,11 +2446,13 @@ export class MovePhase extends BattlePhase { let ppUsed = 1; // Filter all opponents to include only those this move is targeting const targetedOpponents = this.pokemon.getOpponents().filter(o => this.targets.includes(o.getBattlerIndex())); - for (let opponent of targetedOpponents) { - if (this.move.ppUsed + ppUsed >= this.move.getMovePp()) // If we're already at max PP usage, stop checking + for (const opponent of targetedOpponents) { + if (this.move.ppUsed + ppUsed >= this.move.getMovePp()) { // If we're already at max PP usage, stop checking break; - if (opponent.hasAbilityWithAttr(IncreasePpAbAttr)) // Accounting for abilities like Pressure + } + if (opponent.hasAbilityWithAttr(IncreasePpAbAttr)) { // Accounting for abilities like Pressure ppUsed++; + } } if (!this.followUp && this.canMove() && !this.cancelled) { @@ -2358,8 +2461,9 @@ export class MovePhase extends BattlePhase { const moveQueue = this.pokemon.getMoveQueue(); if (this.cancelled || this.failed) { - if (this.failed) - this.move.usePp(ppUsed); // Only use PP if the move failed + if (this.failed) { + this.move.usePp(ppUsed); + } // Only use PP if the move failed // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); @@ -2371,8 +2475,9 @@ export class MovePhase extends BattlePhase { this.scene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); - if (this.move.moveId) + if (this.move.moveId) { this.showMoveText(); + } // This should only happen when there are no valid targets left on the field if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { @@ -2388,29 +2493,33 @@ export class MovePhase extends BattlePhase { return this.end(); } - if (!moveQueue.length || !moveQueue.shift().ignorePP) // using .shift here clears out two turn moves once they've been used + if (!moveQueue.length || !moveQueue.shift().ignorePP) {// using .shift here clears out two turn moves once they've been used this.move.usePp(ppUsed); + } - if (!allMoves[this.move.moveId].getAttrs(CopyMoveAttr).length) + if (!allMoves[this.move.moveId].getAttrs(CopyMoveAttr).length) { this.scene.currentBattle.lastMove = this.move.moveId; + } // Assume conditions affecting targets only apply to moves with a single target let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove()); - let cancelled = new Utils.BooleanHolder(false); + const cancelled = new Utils.BooleanHolder(false); let failedText = this.move.getMove().getFailedText(this.pokemon, targets[0], this.move.getMove(), cancelled); - if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) + if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) { success = false; - else if (success && this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, this.move.getMove())) { + } else if (success && this.scene.arena.isMoveTerrainCancelled(this.pokemon, this.targets, this.move.getMove())) { success = false; - if (failedText == null) + if (failedText === null) { failedText = getTerrainBlockMessage(targets[0], this.scene.arena.terrain.terrainType); + } } - if (success) + if (success) { this.scene.unshiftPhase(this.getEffectPhase()); - else { + } else { this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); - if (!cancelled.value) + if (!cancelled.value) { this.showFailedText(failedText); + } } this.end(); @@ -2422,23 +2531,23 @@ export class MovePhase extends BattlePhase { let healed = false; switch (this.pokemon.status.effect) { - case StatusEffect.PARALYSIS: - if (!this.pokemon.randSeedInt(4)) { - activated = true; - this.cancelled = true; - } - break; - case StatusEffect.SLEEP: - applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); - healed = this.pokemon.status.turnCount === this.pokemon.status.cureTurn; - activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); - this.cancelled = activated; - break; - case StatusEffect.FREEZE: - healed = !!this.move.getMove().findAttr(attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE)) || !this.pokemon.randSeedInt(5); - activated = !healed; - this.cancelled = activated; - break; + case StatusEffect.PARALYSIS: + if (!this.pokemon.randSeedInt(4)) { + activated = true; + this.cancelled = true; + } + break; + case StatusEffect.SLEEP: + applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); + healed = this.pokemon.status.turnCount === this.pokemon.status.cureTurn; + activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); + this.cancelled = activated; + break; + case StatusEffect.FREEZE: + healed = !!this.move.getMove().findAttr(attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE)) || !this.pokemon.randSeedInt(5); + activated = !healed; + this.cancelled = activated; + break; } if (activated) { @@ -2453,8 +2562,9 @@ export class MovePhase extends BattlePhase { } doMove(); } - } else + } else { doMove(); + } } getEffectPhase(): MoveEffectPhase { @@ -2470,20 +2580,22 @@ export class MovePhase extends BattlePhase { } } - if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) + if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) { return; + } this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500); applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents().find(() => true), this.move.getMove()); } showFailedText(failedText: string = null): void { - this.scene.queueMessage(failedText || i18next.t('battle:attackFailed')); + this.scene.queueMessage(failedText || i18next.t("battle:attackFailed")); } end() { - if (!this.followUp && this.canMove()) + if (!this.followUp && this.canMove()) { this.scene.unshiftPhase(new MoveEndPhase(this.scene, this.pokemon.getBattlerIndex())); + } super.end(); } @@ -2506,16 +2618,18 @@ export class MoveEffectPhase extends PokemonPhase { const user = this.getUserPokemon(); const targets = this.getTargets(); - if (!user?.isOnField()) + if (!user?.isOnField()) { return super.end(); + } const overridden = new Utils.BooleanHolder(false); // Assume single target for override applyMoveAttrs(OverrideMoveEffectAttr, user, this.getTarget(), this.move.getMove(), overridden, this.move.virtual).then(() => { - if (overridden.value) + if (overridden.value) { return this.end(); + } user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); @@ -2523,8 +2637,9 @@ export class MoveEffectPhase extends PokemonPhase { const hitCount = new Utils.IntegerHolder(1); // Assume single target for multi hit applyMoveAttrs(MultiHitAttr, user, this.getTarget(), this.move.getMove(), hitCount); - if (this.move.getMove() instanceof AttackMove && !this.move.getMove().getAttrs(FixedDamageAttr).length) + if (this.move.getMove() instanceof AttackMove && !this.move.getMove().getAttrs(FixedDamageAttr).length) { this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); + } user.turnData.hitsLeft = user.turnData.hitCount = hitCount.value; } @@ -2537,11 +2652,11 @@ export class MoveEffectPhase extends PokemonPhase { user.turnData.hitCount = 1; user.turnData.hitsLeft = 1; if (activeTargets.length) { - this.scene.queueMessage(getPokemonMessage(user, '\'s\nattack missed!')); + this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); moveHistoryEntry.result = MoveResult.MISS; applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); } else { - this.scene.queueMessage(i18next.t('battle:attackFailed')); + this.scene.queueMessage(i18next.t("battle:attackFailed")); moveHistoryEntry.result = MoveResult.FAIL; } return this.end(); @@ -2551,13 +2666,14 @@ export class MoveEffectPhase extends PokemonPhase { // Move animation only needs one target new MoveAnim(this.move.getMove().id as Moves, user, this.getTarget()?.getBattlerIndex()).play(this.scene, () => { - for (let target of targets) { + for (const target of targets) { if (!targetHitChecks[target.getBattlerIndex()]) { user.turnData.hitCount = 1; user.turnData.hitsLeft = 1; - this.scene.queueMessage(getPokemonMessage(user, '\'s\nattack missed!')); - if (moveHistoryEntry.result === MoveResult.PENDING) + this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); + if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; + } applyMoveAttrs(MissEffectAttr, user, null, this.move.getMove()); continue; } @@ -2586,29 +2702,34 @@ export class MoveEffectPhase extends PokemonPhase { if (hitResult < HitResult.NO_EFFECT) { const flinched = new Utils.BooleanHolder(false); user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); - if (flinched.value) + if (flinched.value) { target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); + } } Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit), user, target, this.move.getMove()).then(() => { - return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move, hitResult).then(() => { - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) - user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); - })).then(() => { - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move, hitResult).then(() => { - if (this.move.getMove() instanceof AttackMove) - this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target.getFieldIndex()); - resolve(); - }); + return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move, hitResult).then(() => { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); + } + })).then(() => { + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move, hitResult).then(() => { + if (this.move.getMove() instanceof AttackMove) { + this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target.getFieldIndex()); + } + resolve(); }); - }) + }); + }) ).then(() => resolve()); }); - } else + } else { applyMoveAttrs(NoEffectAttr, user, null, this.move.getMove()).then(() => resolve()); + } }); - } else + } else { resolve(); + } }); })); } @@ -2616,10 +2737,11 @@ export class MoveEffectPhase extends PokemonPhase { const postTarget = applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_TARGET, user, null, this.move.getMove()); - if (applyAttrs.length) // If there is a pending asynchronous move effect, do this after + if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); - else // Otherwise, push a new asynchronous move effect + } else { // Otherwise, push a new asynchronous move effect applyAttrs.push(postTarget); + } Promise.allSettled(applyAttrs).then(() => this.end()); }); @@ -2629,12 +2751,13 @@ export class MoveEffectPhase extends PokemonPhase { end() { const user = this.getUserPokemon(); if (user) { - if (--user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) + if (--user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { this.scene.unshiftPhase(this.getNewHitPhase()); - else { + } else { const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); - if (hitsTotal > 1) - this.scene.queueMessage(i18next.t('battle:attackHitsCount', { count: hitsTotal })); + if (hitsTotal > 1) { + this.scene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal })); + } this.scene.applyModifiers(HitHealModifier, this.player, user); } } @@ -2644,43 +2767,52 @@ export class MoveEffectPhase extends PokemonPhase { hitCheck(target: Pokemon): boolean { // Moves targeting the user and entry hazards can't miss - if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) + if ([MoveTarget.USER, MoveTarget.ENEMY_SIDE].includes(this.move.getMove().moveTarget)) { return true; + } const user = this.getUserPokemon(); // Hit check only calculated on first hit for multi-hit moves - if (user.turnData.hitsLeft < user.turnData.hitCount) + if (user.turnData.hitsLeft < user.turnData.hitCount) { return true; + } - if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) + 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().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { return true; + } const hiddenTag = target.getTag(HiddenTag); - if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length) + if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length) { return false; + } const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); - if (moveAccuracy.value === -1) + if (moveAccuracy.value === -1) { return true; + } const isOhko = !!this.move.getMove().getAttrs(OneHitKOAccuracyAttr).length; - if (!isOhko) + if (!isOhko) { user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); + } - if (this.scene.arena.weather?.weatherType === WeatherType.FOG) + if (this.scene.arena.weather?.weatherType === WeatherType.FOG) { moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); + } - if (!isOhko && this.scene.arena.getTag(ArenaTagType.GRAVITY)) + if (!isOhko && this.scene.arena.getTag(ArenaTagType.GRAVITY)) { moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); + } const userAccuracyLevel = new Utils.IntegerHolder(user.summonData.battleStats[BattleStat.ACC]); const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); @@ -2710,8 +2842,9 @@ export class MoveEffectPhase extends PokemonPhase { } getUserPokemon(): Pokemon { - if (this.battlerIndex > BattlerIndex.ENEMY_2) + if (this.battlerIndex > BattlerIndex.ENEMY_2) { return this.scene.getPokemonById(this.battlerIndex); + } return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; } @@ -2737,8 +2870,9 @@ export class MoveEndPhase extends PokemonPhase { super.start(); const pokemon = this.getPokemon(); - if (pokemon.isActive(true)) + if (pokemon.isActive(true)) { pokemon.lapseTags(BattlerTagLapseType.AFTER_MOVE); + } this.scene.arena.setIgnoreAbilities(false); @@ -2765,19 +2899,21 @@ export class MoveAnimTestPhase extends BattlePhase { if (moveId === undefined) { this.playMoveAnim(this.moveQueue.slice(0), true); return; - } else if (player) + } else if (player) { console.log(Moves[moveId]); + } initMoveAnim(this.scene, moveId).then(() => { loadMoveAnimAssets(this.scene, [ moveId ], true) .then(() => { new MoveAnim(moveId, player ? this.scene.getPlayerPokemon() : this.scene.getEnemyPokemon(), (player !== (allMoves[moveId] instanceof SelfStatusMove) ? this.scene.getEnemyPokemon() : this.scene.getPlayerPokemon()).getBattlerIndex()).play(this.scene, () => { - if (player) + if (player) { this.playMoveAnim(moveQueue, false); - else + } else { this.playMoveAnim(moveQueue, true); + } }); - }); + }); }); } } @@ -2831,25 +2967,29 @@ export class StatChangePhase extends PokemonPhase { this.aggregateStatChanges(random); - if (!pokemon.isActive(true)) + if (!pokemon.isActive(true)) { return this.end(); + } const filteredStats = this.stats.map(s => s !== BattleStat.RAND ? s : this.getRandomStat()).filter(stat => { const cancelled = new Utils.BooleanHolder(false); - if (!this.selfTarget && this.levels < 0) + if (!this.selfTarget && this.levels < 0) { this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, cancelled); + } - if (!cancelled.value && !this.selfTarget && this.levels < 0) + if (!cancelled.value && !this.selfTarget && this.levels < 0) { applyPreStatChangeAbAttrs(ProtectStatAbAttr, this.getPokemon(), stat, cancelled); + } return !cancelled.value; }); const levels = new Utils.IntegerHolder(this.levels); - if (!this.ignoreAbilities) + if (!this.ignoreAbilities) { applyAbAttrs(StatChangeMultiplierAbAttr, pokemon, null, levels); + } const battleStats = this.getPokemon().summonData.battleStats; const relLevels = filteredStats.map(stat => (levels.value >= 1 ? Math.min(battleStats[stat] + levels.value, 6) : Math.max(battleStats[stat] + levels.value, -6)) - battleStats[stat]); @@ -2857,16 +2997,20 @@ export class StatChangePhase extends PokemonPhase { const end = () => { if (this.showMessage) { const messages = this.getStatChangeMessages(filteredStats, levels.value, relLevels); - for (let message of messages) + for (const message of messages) { this.scene.queueMessage(message); + } } - for (let stat of filteredStats) + for (const stat of filteredStats) { pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6); + } - if (levels.value > 0 && this.canBeCopied) - for (let opponent of pokemon.getOpponents()) + if (levels.value > 0 && this.canBeCopied) { + for (const opponent of pokemon.getOpponents()) { applyAbAttrs(StatChangeCopyAbAttr, opponent, null, this.stats, levels.value); + } + } applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); @@ -2884,13 +3028,13 @@ export class StatChangePhase extends PokemonPhase { const tileWidth = 156 * this.scene.field.scale * pokemon.getSpriteScale(); const tileHeight = 316 * this.scene.field.scale * pokemon.getSpriteScale(); - const statSprite = this.scene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, 'battle_stats', filteredStats.length > 1 ? 'mix' : BattleStat[filteredStats[0]].toLowerCase()); + const statSprite = this.scene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, "battle_stats", filteredStats.length > 1 ? "mix" : BattleStat[filteredStats[0]].toLowerCase()); statSprite.setPipeline(this.scene.fieldSpritePipeline); statSprite.setAlpha(0); statSprite.setScale(6); statSprite.setOrigin(0.5, 1); - this.scene.playSound(`stat_${levels.value >= 1 ? 'up' : 'down'}`); + this.scene.playSound(`stat_${levels.value >= 1 ? "up" : "down"}`); statSprite.setMask(new Phaser.Display.Masks.BitmapMask(this.scene, pokemonMaskSprite)); @@ -2911,15 +3055,16 @@ export class StatChangePhase extends PokemonPhase { this.scene.tweens.add({ targets: statSprite, duration: 1500, - y: `${levels.value >= 1 ? '-' : '+'}=${160 * 6}` + y: `${levels.value >= 1 ? "-" : "+"}=${160 * 6}` }); this.scene.time.delayedCall(1750, () => { pokemon.disableMask(); end(); }); - } else + } else { end(); + } } getRandomStat(): BattleStat { @@ -2936,21 +3081,24 @@ export class StatChangePhase extends PokemonPhase { && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) { if (existingPhase.stats[0] === BattleStat.RAND) { existingPhase.stats[0] = this.getRandomStat(); - if (existingPhase.stats[0] !== this.stats[0]) + if (existingPhase.stats[0] !== this.stats[0]) { continue; + } } this.levels += existingPhase.levels; - if (!this.scene.tryRemovePhase(p => p === existingPhase)) + if (!this.scene.tryRemovePhase(p => p === existingPhase)) { break; + } } } while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget && ([ BattleStat.ACC, BattleStat.EVA ].some(s => p.stats.includes(s)) === isAccEva) && p.levels === this.levels && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) { this.stats.push(...existingPhase.stats); - if (!this.scene.tryRemovePhase(p => p === existingPhase)) + if (!this.scene.tryRemovePhase(p => p === existingPhase)) { break; + } } } @@ -2960,21 +3108,23 @@ export class StatChangePhase extends PokemonPhase { const relLevelStatIndexes = {}; for (let rl = 0; rl < relLevels.length; rl++) { const relLevel = relLevels[rl]; - if (!relLevelStatIndexes[relLevel]) + if (!relLevelStatIndexes[relLevel]) { relLevelStatIndexes[relLevel] = []; + } relLevelStatIndexes[relLevel].push(rl); } Object.keys(relLevelStatIndexes).forEach(rl => { const relLevelStats = stats.filter((_, i) => relLevelStatIndexes[rl].includes(i)); - let statsFragment = ''; + let statsFragment = ""; if (relLevelStats.length > 1) { statsFragment = relLevelStats.length >= 5 - ? 'stats' - : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(', ')}${relLevelStats.length > 2 ? ',' : ''} and ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; - } else + ? "stats" + : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} and ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; + } else { statsFragment = getBattleStatName(relLevelStats[0]); + } messages.push(getPokemonMessage(this.getPokemon(), `'s ${statsFragment} ${getBattleStatLevelChangeDescription(Math.abs(parseInt(rl)), levels >= 1)}!`)); }); @@ -3004,8 +3154,9 @@ export class WeatherEffectPhase extends CommonAnimPhase { applyPreWeatherEffectAbAttrs(PreWeatherDamageAbAttr, pokemon, this.weather, cancelled); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); - if (cancelled.value) + if (cancelled.value) { return; + } const damage = Math.ceil(pokemon.getMaxHp() / 16); @@ -3015,8 +3166,9 @@ export class WeatherEffectPhase extends CommonAnimPhase { this.executeForAll((pokemon: Pokemon) => { const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather.isTypeDamageImmune(t)).length; - if (!immune) + if (!immune) { inflictDamage(pokemon); + } }); } } @@ -3048,19 +3200,22 @@ export class ObtainStatusEffectPhase extends PokemonPhase { const pokemon = this.getPokemon(); if (!pokemon.status) { if (pokemon.trySetStatus(this.statusEffect, false, this.sourcePokemon)) { - if (this.cureTurn) + if (this.cureTurn) { pokemon.status.cureTurn = this.cureTurn; + } pokemon.updateInfo(true); new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect - 1), pokemon).play(this.scene, () => { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectObtainText(this.statusEffect, this.sourceText))); - if (pokemon.status.isPostTurn()) + if (pokemon.status.isPostTurn()) { this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, this.battlerIndex)); + } this.end(); }); return; } - } else if (pokemon.status.effect === this.statusEffect) + } else if (pokemon.status.effect === this.statusEffect) { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectOverlapText(this.statusEffect))); + } this.end(); } } @@ -3081,15 +3236,15 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); let damage: integer = 0; switch (pokemon.status.effect) { - case StatusEffect.POISON: - damage = Math.max(pokemon.getMaxHp() >> 3, 1); - break; - case StatusEffect.TOXIC: - damage = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.turnCount), 1); - break; - case StatusEffect.BURN: - damage = Math.max(pokemon.getMaxHp() >> 4, 1); - break; + case StatusEffect.POISON: + damage = Math.max(pokemon.getMaxHp() >> 3, 1); + break; + case StatusEffect.TOXIC: + damage = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.turnCount), 1); + break; + case StatusEffect.BURN: + damage = Math.max(pokemon.getMaxHp() >> 4, 1); + break; } if (damage) { // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... @@ -3097,10 +3252,12 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { pokemon.updateInfo(); } new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(this.scene, () => this.end()); - } else + } else { this.end(); - } else + } + } else { this.end(); + } } } @@ -3122,8 +3279,8 @@ export class MessagePhase extends Phase { start() { super.start(); - if (this.text.indexOf('$') > -1) { - const pageIndex = this.text.indexOf('$'); + if (this.text.indexOf("$") > -1) { + const pageIndex = this.text.indexOf("$"); this.scene.unshiftPhase(new MessagePhase(this.scene, this.text.slice(pageIndex + 1), this.callbackDelay, this.prompt, this.promptDelay)); this.text = this.text.slice(0, pageIndex).trim(); } @@ -3132,8 +3289,9 @@ export class MessagePhase extends Phase { } end() { - if (this.scene.abilityBar.shown) + if (this.scene.abilityBar.shown) { this.scene.abilityBar.hide(); + } super.end(); } @@ -3173,20 +3331,21 @@ export class DamagePhase extends PokemonPhase { applyDamage() { switch (this.damageResult) { - case HitResult.EFFECTIVE: - this.scene.playSound('hit'); - break; - case HitResult.SUPER_EFFECTIVE: - case HitResult.ONE_HIT_KO: - this.scene.playSound('hit_strong'); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.playSound('hit_weak'); - break; + case HitResult.EFFECTIVE: + this.scene.playSound("hit"); + break; + case HitResult.SUPER_EFFECTIVE: + case HitResult.ONE_HIT_KO: + this.scene.playSound("hit_strong"); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.playSound("hit_weak"); + break; } - if (this.amount) + if (this.amount) { this.scene.damageNumberHandler.add(this.getPokemon(), this.amount, this.damageResult, this.critical); + } if (this.damageResult !== HitResult.OTHER) { const flashTimer = this.scene.time.addEvent({ @@ -3195,38 +3354,41 @@ export class DamagePhase extends PokemonPhase { startAt: 200, callback: () => { this.getPokemon().getSprite().setVisible(flashTimer.repeatCount % 2 === 0); - if (!flashTimer.repeatCount) + if (!flashTimer.repeatCount) { this.getPokemon().updateInfo().then(() => this.end()); + } } }); - } else + } else { this.getPokemon().updateInfo().then(() => this.end()); + } } end() { switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const pokemon = this.getPokemon(); - if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { - this.scene.fadeOutBgm(Utils.fixedInt(2000), false); - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, null, () => { - this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true); - pokemon.generateAndPopulateMoveset(1); - this.scene.setFieldScale(0.75); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); - this.scene.currentBattle.double = true; - const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()); - if (availablePartyMembers.length > 1) { - this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); - if (!availablePartyMembers[1].isOnField()) - this.scene.pushPhase(new SummonPhase(this.scene, 1)); + case BattleSpec.FINAL_BOSS: + const pokemon = this.getPokemon(); + if (pokemon instanceof EnemyPokemon && pokemon.isBoss() && !pokemon.formIndex && pokemon.bossSegmentIndex < 1) { + this.scene.fadeOutBgm(Utils.fixedInt(2000), false); + this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].firstStageWin, pokemon.species.name, null, () => { + this.scene.addEnemyModifier(getModifierType(modifierTypes.MINI_BLACK_HOLE).newModifier(pokemon) as PersistentModifier, false, true); + pokemon.generateAndPopulateMoveset(1); + this.scene.setFieldScale(0.75); + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger, false); + this.scene.currentBattle.double = true; + const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()); + if (availablePartyMembers.length > 1) { + this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, true)); + if (!availablePartyMembers[1].isOnField()) { + this.scene.pushPhase(new SummonPhase(this.scene, 1)); } + } - super.end(); - }); - return; - } - break; + super.end(); + }); + return; + } + break; } super.end(); @@ -3249,21 +3411,23 @@ export class FaintPhase extends PokemonPhase { const instantReviveModifier = this.scene.applyModifier(PokemonInstantReviveModifier, this.player, this.getPokemon()) as PokemonInstantReviveModifier; if (instantReviveModifier) { - if (!--instantReviveModifier.stackCount) + if (!--instantReviveModifier.stackCount) { this.scene.removeModifier(instantReviveModifier); + } this.scene.updateModifiers(this.player); return this.end(); } } - if (!this.tryOverrideForBattleSpec()) + if (!this.tryOverrideForBattleSpec()) { this.doFaint(); + } } doFaint(): void { const pokemon = this.getPokemon(); - this.scene.queueMessage(getPokemonMessage(pokemon, ' fainted!'), null, true); + this.scene.queueMessage(getPokemonMessage(pokemon, " fainted!"), null, true); if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; @@ -3279,8 +3443,9 @@ export class FaintPhase extends PokemonPhase { const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr) as PostVictoryStatChangeAttr[]; if (pvattrs.length) { - for (let pvattr of pvattrs) + for (const pvattr of pvattrs) { pvattr.applyPostVictory(defeatSource, defeatSource, pvmove); + } } } } @@ -3288,18 +3453,21 @@ export class FaintPhase extends PokemonPhase { if (this.player) { const nonFaintedPartyMembers = this.scene.getParty().filter(p => !p.isFainted()); const nonFaintedPartyMemberCount = nonFaintedPartyMembers.length; - if (!nonFaintedPartyMemberCount) + if (!nonFaintedPartyMemberCount) { this.scene.unshiftPhase(new GameOverPhase(this.scene)); - else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !nonFaintedPartyMembers[0].isActive(true))) + } else if (nonFaintedPartyMemberCount >= this.scene.currentBattle.getBattlerCount() || (this.scene.currentBattle.double && !nonFaintedPartyMembers[0].isActive(true))) { this.scene.pushPhase(new SwitchPhase(this.scene, this.fieldIndex, true, false)); - if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) + } + if (nonFaintedPartyMemberCount === 1 && this.scene.currentBattle.double) { this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); + } } else { this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); if (this.scene.currentBattle.battleType === BattleType.TRAINER) { const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; - if (hasReservePartyMember) + if (hasReservePartyMember) { this.scene.pushPhase(new SwitchSummonPhase(this.scene, this.fieldIndex, -1, false, false, false)); + } } } @@ -3309,8 +3477,9 @@ export class FaintPhase extends PokemonPhase { let targetingMovePhase: MovePhase; do { targetingMovePhase = this.scene.findPhase(mp => mp instanceof MovePhase && mp.targets.length === 1 && mp.targets[0] === pokemon.getBattlerIndex() && mp.pokemon.isPlayer() !== allyPokemon.isPlayer()) as MovePhase; - if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) + if (targetingMovePhase && targetingMovePhase.targets[0] !== allyPokemon.getBattlerIndex()) { targetingMovePhase.targets[0] = allyPokemon.getBattlerIndex(); + } } while (targetingMovePhase); } } @@ -3319,22 +3488,23 @@ export class FaintPhase extends PokemonPhase { this.scene.getField(true).filter(p => p !== pokemon).forEach(p => p.removeTagsBySourceId(pokemon.id)); pokemon.faintCry(() => { - if (pokemon instanceof PlayerPokemon) + if (pokemon instanceof PlayerPokemon) { pokemon.addFriendship(-10); + } pokemon.hideInfo(); - this.scene.playSound('faint'); + this.scene.playSound("faint"); this.scene.tweens.add({ targets: pokemon, duration: 500, y: pokemon.y + 150, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { pokemon.setVisible(false); pokemon.y -= 150; pokemon.trySetStatus(StatusEffect.FAINT); - if (pokemon.isPlayer()) + if (pokemon.isPlayer()) { this.scene.currentBattle.removeFaintedParticipant(pokemon as PlayerPokemon); - else { + } else { this.scene.addFaintedEnemyScore(pokemon as EnemyPokemon); this.scene.currentBattle.addPostBattleLoot(pokemon as EnemyPokemon); } @@ -3347,19 +3517,19 @@ export class FaintPhase extends PokemonPhase { tryOverrideForBattleSpec(): boolean { switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - if (!this.player) { - const enemy = this.getPokemon(); - if (enemy.formIndex) - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); - else { - // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase - enemy.hp++; - this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); - this.end(); - } - return true; + case BattleSpec.FINAL_BOSS: + if (!this.player) { + const enemy = this.getPokemon(); + if (enemy.formIndex) { + this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); + } else { + // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase + enemy.hp++; + this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); + this.end(); } + return true; + } } return false; @@ -3387,15 +3557,18 @@ export class VictoryPhase extends PokemonPhase { if (participantIds.size) { let expValue = this.getPokemon().getExpValue(); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { expValue = Math.floor(expValue * 1.5); - for (let partyMember of nonFaintedPartyMembers) { + } + for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; const participated = participantIds.has(pId); - if (participated) + if (participated) { partyMember.addFriendship(2); - if (!expPartyMembers.includes(partyMember)) + } + if (!expPartyMembers.includes(partyMember)) { continue; + } if (!participated && !expShareModifier) { partyMemberExp.push(0); continue; @@ -3403,12 +3576,15 @@ export class VictoryPhase extends PokemonPhase { let expMultiplier = 0; if (participated) { expMultiplier += (1 / participantIds.size); - if (participantIds.size > 1 && multipleParticipantExpBonusModifier) + if (participantIds.size > 1 && multipleParticipantExpBonusModifier) { expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; - } else if (expShareModifier) + } + } else if (expShareModifier) { expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.size; - if (partyMember.pokerus) + } + if (partyMember.pokerus) { expMultiplier *= 1.5; + } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); partyMemberExp.push(Math.floor(pokemonExp.value)); @@ -3426,8 +3602,9 @@ export class VictoryPhase extends PokemonPhase { const recipientExpPartyMemberIndexes = []; expPartyMembers.forEach((expPartyMember, epm) => { - if (expPartyMember.level <= medianLevel) + if (expPartyMember.level <= medianLevel) { recipientExpPartyMemberIndexes.push(epm); + } }); const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); @@ -3449,24 +3626,29 @@ export class VictoryPhase extends PokemonPhase { if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType ? !p?.isFainted(true) : p.isOnField())) { this.scene.pushPhase(new BattleEndPhase(this.scene)); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) + if (this.scene.currentBattle.battleType === BattleType.TRAINER) { this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); + } if (this.scene.gameMode.isEndless || !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { this.scene.pushPhase(new EggLapsePhase(this.scene)); - if (this.scene.currentBattle.waveIndex % 10) + if (this.scene.currentBattle.waveIndex % 10) { this.scene.pushPhase(new SelectModifierPhase(this.scene)); - else if (this.scene.gameMode.isDaily) { + } else if (this.scene.gameMode.isDaily) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_CHARM)); - if (this.scene.currentBattle.waveIndex > 10 && !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) + if (this.scene.currentBattle.waveIndex > 10 && !this.scene.gameMode.isWaveFinal(this.scene.currentBattle.waveIndex)) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + } } else { const superExpWave = !this.scene.gameMode.isEndless ? (this.scene.offsetGym ? 0 : 20) : 10; - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex === 10) + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex === 10) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.EXP_SHARE)); - if (this.scene.currentBattle.waveIndex <= 750 && (this.scene.currentBattle.waveIndex <= 500 || (this.scene.currentBattle.waveIndex % 30) === superExpWave)) + } + if (this.scene.currentBattle.waveIndex <= 750 && (this.scene.currentBattle.waveIndex <= 500 || (this.scene.currentBattle.waveIndex % 30) === superExpWave)) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, (this.scene.currentBattle.waveIndex % 30) !== superExpWave || this.scene.currentBattle.waveIndex > 250 ? modifierTypes.EXP_CHARM : modifierTypes.SUPER_EXP_CHARM)); - if (this.scene.currentBattle.waveIndex <= 150 && !(this.scene.currentBattle.waveIndex % 50)) + } + if (this.scene.currentBattle.waveIndex <= 150 && !(this.scene.currentBattle.waveIndex % 50)) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, modifierTypes.GOLDEN_POKEBALL)); + } if (this.scene.gameMode.isEndless && !(this.scene.currentBattle.waveIndex % 50)) { this.scene.pushPhase(new ModifierRewardPhase(this.scene, !(this.scene.currentBattle.waveIndex % 250) ? modifierTypes.VOUCHER_PREMIUM : modifierTypes.VOUCHER_PLUS)); this.scene.pushPhase(new AddEnemyBuffModifierPhase(this.scene)); @@ -3498,16 +3680,18 @@ export class TrainerVictoryPhase extends BattlePhase { this.scene.unshiftPhase(new MoneyRewardPhase(this.scene, this.scene.currentBattle.trainer.config.moneyMultiplier)); const modifierRewardFuncs = this.scene.currentBattle.trainer.config.modifierRewardFuncs; - for (let modifierRewardFunc of modifierRewardFuncs) + for (const modifierRewardFunc of modifierRewardFuncs) { this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, modifierRewardFunc)); + } const trainerType = this.scene.currentBattle.trainer.config.trainerType; if (vouchers.hasOwnProperty(TrainerType[trainerType])) { - if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) + if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer.config.isBoss) { this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); + } } - this.scene.ui.showText(i18next.t('battle:trainerDefeated', { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { + this.scene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: this.scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }), null, () => { const victoryMessages = this.scene.currentBattle.trainer.getVictoryMessages(); const showMessage = () => { let message: string; @@ -3527,10 +3711,12 @@ export class TrainerVictoryPhase extends BattlePhase { const originalFunc = showMessageOrEnd; showMessageOrEnd = () => this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => originalFunc())); this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(this.scene.currentBattle.trainer.getKey(), getCharVariantFromDialogue(victoryMessages[0])).then(() => showMessage())); - } else + } else { showMessage(); - } else + } + } else { showMessageOrEnd(); + } }, null, true); this.showEnemyTrainer(); @@ -3553,7 +3739,7 @@ export class MoneyRewardPhase extends BattlePhase { this.scene.addMoney(moneyAmount.value); - this.scene.ui.showText(`You got ₽${moneyAmount.value.toLocaleString('en-US')}\nfor winning!`, null, () => this.end(), null, true); + this.scene.ui.showText(`You got ₽${moneyAmount.value.toLocaleString("en-US")}\nfor winning!`, null, () => this.end(), null, true); } } @@ -3576,10 +3762,10 @@ export class ModifierRewardPhase extends BattlePhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.playSound('item_fanfare'); + this.scene.playSound("item_fanfare"); this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => resolve(), null, true); }); - }) + }); } } @@ -3592,16 +3778,16 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.playSound('level_up_fanfare'); + this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.fadeIn(250).then(() => { - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { - this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); - resolve(); - }, null, true, 1500); + this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => { + this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); + resolve(); + }, null, true, 1500); }); }); - }) + }); } } @@ -3618,13 +3804,13 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.playSound('level_up_fanfare'); + this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { resolve(); }, null, true, 1500); }); - }) + }); } } @@ -3641,13 +3827,13 @@ export class GameOverPhase extends BattlePhase { start() { super.start(); - if (this.victory || !this.scene.enableRetries) + if (this.victory || !this.scene.enableRetries) { this.handleGameOver(); - else { - this.scene.ui.showText(`Would you like to retry from the start of the battle?`, null, () => { + } else { + this.scene.ui.showText("Would you like to retry from the start of the battle?", null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.fadeOut(1250).then(() => { - this.scene.reset(); + this.scene.reset(); this.scene.clearPhaseQueue(); this.scene.gameData.loadSession(this.scene, this.scene.sessionSlotId).then(() => { this.scene.pushPhase(new EncounterPhase(this.scene, true)); @@ -3655,12 +3841,14 @@ export class GameOverPhase extends BattlePhase { const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()).length; this.scene.pushPhase(new SummonPhase(this.scene, 0)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) + if (this.scene.currentBattle.double && availablePartyMembers > 1) { this.scene.pushPhase(new SummonPhase(this.scene, 1)); + } if (this.scene.currentBattle.waveIndex > 1 && this.scene.currentBattle.battleType !== BattleType.TRAINER) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 0, this.scene.currentBattle.double)); - if (this.scene.currentBattle.double && availablePartyMembers > 1) + if (this.scene.currentBattle.double && availablePartyMembers > 1) { this.scene.pushPhase(new CheckSwitchPhase(this.scene, 1, this.scene.currentBattle.double)); + } } this.scene.ui.fadeIn(1250); @@ -3681,15 +3869,16 @@ export class GameOverPhase extends BattlePhase { if (this.scene.gameMode.isClassic) { firstClear = this.scene.validateAchv(achvs.CLASSIC_VICTORY); this.scene.gameData.gameStats.sessionsWon++; - for (let pokemon of this.scene.getParty()) { + for (const pokemon of this.scene.getParty()) { this.awardRibbon(pokemon); - if (pokemon.species.getRootSpeciesId() != pokemon.species.getRootSpeciesId(true)) { + if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) { this.awardRibbon(pokemon, true); } } - } else if (this.scene.gameMode.isDaily && newClear) + } else if (this.scene.gameMode.isDaily && newClear) { this.scene.gameData.gameStats.dailyRunSessionsWon++; + } } const fadeDuration = this.victory ? 10000 : 5000; this.scene.fadeOutBgm(fadeDuration, true); @@ -3702,21 +3891,24 @@ export class GameOverPhase extends BattlePhase { this.scene.ui.clearText(); const clear = (endCardPhase?: EndCardPhase) => { - if (newClear) + if (newClear) { this.handleUnlocks(); + } if (this.victory && newClear) { - for (let species of this.firstRibbons) + for (const species of this.firstRibbons) { this.scene.unshiftPhase(new RibbonModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PLUS, species)); - if (!firstClear) + } + if (!firstClear) { this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); + } } this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); this.end(); - } + }; if (this.victory && this.scene.gameMode.isClassic) { this.scene.ui.fadeIn(500).then(() => { - this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'm' : 'f'}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => { + this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => { this.scene.ui.showDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1], this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => { this.scene.ui.fadeOut(500).then(() => { this.scene.charSprite.hide().then(() => { @@ -3728,8 +3920,9 @@ export class GameOverPhase extends BattlePhase { }); }); }); - } else + } else { clear(); + } }); }); }; @@ -3740,30 +3933,34 @@ export class GameOverPhase extends BattlePhase { if (this.victory) { if (!Utils.isLocal) { Utils.apiFetch(`savedata/newclear?slot=${this.scene.sessionSlotId}`, true) - .then(response => response.json()) - .then(newClear => doGameOver(newClear)); + .then(response => response.json()) + .then(newClear => doGameOver(newClear)); } else { this.scene.gameData.offlineNewClear(this.scene).then(result => { doGameOver(result); }); } - } else + } else { doGameOver(false); + } } handleUnlocks(): void { if (this.victory && this.scene.gameMode.isClassic) { - if (!this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) + if (!this.scene.gameData.unlocks[Unlockables.ENDLESS_MODE]) { this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.ENDLESS_MODE)); - if (this.scene.getParty().filter(p => p.fusionSpecies).length && !this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) + } + if (this.scene.getParty().filter(p => p.fusionSpecies).length && !this.scene.gameData.unlocks[Unlockables.SPLICED_ENDLESS_MODE]) { this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.SPLICED_ENDLESS_MODE)); - if (!this.scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) + } + if (!this.scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) { this.scene.unshiftPhase(new UnlockPhase(this.scene, Unlockables.MINI_BLACK_HOLE)); + } } } awardRibbon(pokemon: Pokemon, forStarter: boolean = false): void { - const speciesId = getPokemonSpecies(pokemon.species.speciesId) + const speciesId = getPokemonSpecies(pokemon.species.speciesId); const speciesRibbonCount = this.scene.gameData.incrementRibbonCount(speciesId, forStarter); // first time classic win, award voucher if (speciesRibbonCount === 1) { @@ -3786,12 +3983,12 @@ export class EndCardPhase extends Phase { this.scene.ui.getMessageHandler().bg.setVisible(false); this.scene.ui.getMessageHandler().nameBoxContainer.setVisible(false); - this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? 'f' : 'm'}`); + this.endCard = this.scene.add.image(0, 0, `end_${this.scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}`); this.endCard.setOrigin(0); this.endCard.setScale(0.5); this.scene.field.add(this.endCard); - this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, 'Congratulations!', TextStyle.SUMMARY, { fontSize: '128px' }); + this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, "Congratulations!", TextStyle.SUMMARY, { fontSize: "128px" }); this.text.setOrigin(0.5); this.scene.field.add(this.text); @@ -3799,7 +3996,7 @@ export class EndCardPhase extends Phase { this.scene.ui.fadeIn(1000).then(() => { - this.scene.ui.showText('', null, () => { + this.scene.ui.showText("", null, () => { this.scene.ui.getMessageHandler().bg.setVisible(true); this.end(); }, null, true); @@ -3819,7 +4016,7 @@ export class UnlockPhase extends Phase { start(): void { this.scene.time.delayedCall(2000, () => { this.scene.gameData.unlocks[this.unlockable] = true; - this.scene.playSound('level_up_fanfare'); + this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); @@ -3843,11 +4040,13 @@ export class PostGameOverPhase extends Phase { const saveAndReset = () => { this.scene.gameData.saveAll(this.scene, true, true, true).then(success => { - if (!success) + if (!success) { return this.scene.reset(true); + } this.scene.gameData.tryClearSession(this.scene, this.scene.sessionSlotId).then((success: boolean | [boolean, boolean]) => { - if (!success[0]) + if (!success[0]) { return this.scene.reset(true); + } this.scene.reset(); this.scene.unshiftPhase(new TitlePhase(this.scene)); this.end(); @@ -3863,8 +4062,9 @@ export class PostGameOverPhase extends Phase { this.endCardPhase.text.destroy(); saveAndReset(); }); - } else + } else { saveAndReset(); + } } } @@ -3885,19 +4085,22 @@ export class SwitchPhase extends BattlePhase { super.start(); // Skip modal switch if impossible - if (this.isModal && !this.scene.getParty().filter(p => !p.isFainted() && !p.isActive(true)).length) + if (this.isModal && !this.scene.getParty().filter(p => !p.isFainted() && !p.isActive(true)).length) { return super.end(); + } // Check if there is any space still in field - if (this.isModal && this.scene.getPlayerField().filter(p => !p.isFainted() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) + if (this.isModal && this.scene.getPlayerField().filter(p => !p.isFainted() && p.isActive(true)).length >= this.scene.currentBattle.getBattlerCount()) { return super.end(); + } // Override field index to 0 in case of double battle where 2/3 remaining party members fainted at once const fieldIndex = this.scene.currentBattle.getBattlerCount() === 1 || this.scene.getParty().filter(p => !p.isFainted()).length > 1 ? this.fieldIndex : 0; this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { - if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) + if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, fieldIndex, slotIndex, this.doReturn, option === PartyOption.PASS_BATON)); + } this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); }, PartyUiHandler.FilterNonFainted); } @@ -3916,16 +4119,16 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase { super.start(); const pokemon = this.getPokemon(); - let exp = new Utils.NumberHolder(this.expValue); + const exp = new Utils.NumberHolder(this.expValue); this.scene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); - this.scene.ui.showText(i18next.t('battle:expGain', { pokemonName: pokemon.name, exp: exp.value }), null, () => { + this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: pokemon.name, exp: exp.value }), null, () => { const lastLevel = pokemon.level; - let newLevel: integer; pokemon.addExp(exp.value); - newLevel = pokemon.level; - if (newLevel > lastLevel) + const newLevel = pokemon.level; + if (newLevel > lastLevel) { this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); + } pokemon.updateInfo().then(() => this.end()); }, null, true); } @@ -3944,34 +4147,34 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { super.start(); const pokemon = this.getPokemon(); - let exp = new Utils.NumberHolder(this.expValue); + const exp = new Utils.NumberHolder(this.expValue); this.scene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); const lastLevel = pokemon.level; - let newLevel: integer; pokemon.addExp(exp.value); - newLevel = pokemon.level; - if (newLevel > lastLevel) + const newLevel = pokemon.level; + if (newLevel > lastLevel) { this.scene.unshiftPhase(new LevelUpPhase(this.scene, this.partyMemberIndex, lastLevel, newLevel)); + } this.scene.unshiftPhase(new HidePartyExpBarPhase(this.scene)); pokemon.updateInfo(); if (this.scene.expParty === 2) { // 2 - Skip - no level up frame nor message - this.end(); + this.end(); } else if (this.scene.expParty === 1) { // 1 - Only level up - we display the level up in the small frame instead of a message if (newLevel > lastLevel) { // this means if we level up // instead of displaying the exp gain in the small frame, we display the new level // we use the same method for mode 0 & 1, by giving a parameter saying to display the exp or the level this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === 1, newLevel).then(() => { - setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); + setTimeout(() => this.end(), 800 / Math.pow(2, this.scene.expGainsSpeed)); }); } else { this.end(); } } else if (this.scene.expGainsSpeed < 3) { this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, this.scene.expParty === 1, newLevel).then(() => { - setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); + setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); }); } else { this.end(); @@ -4007,8 +4210,9 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { start() { super.start(); - if (this.level > this.scene.gameData.gameStats.highestLevel) + if (this.level > this.scene.gameData.gameStats.highestLevel) { this.scene.gameData.gameStats.highestLevel = this.level; + } this.scene.validateAchvs(LevelAchv, new Utils.IntegerHolder(this.level)); @@ -4017,8 +4221,8 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { pokemon.calculateStats(); pokemon.updateInfo(); if (this.scene.expParty === 0) { // 0 - default - the normal exp gain display, nothing changed - this.scene.playSound('level_up_fanfare'); - this.scene.ui.showText(i18next.t('battle:levelUp', { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:levelUp", { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); } else if (this.scene.expParty === 2) { // 2 - Skip - no level up frame nor message this.end(); } else { // 1 - Only level up - we display the level up in the small frame instead of a message @@ -4027,13 +4231,15 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { } if (this.level <= 100) { const levelMoves = this.getPokemon().getLevelMoves(this.lastLevel + 1); - for (let lm of levelMoves) + for (const lm of levelMoves) { this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, lm[1])); + } } if (!pokemon.pauseEvolutions) { const evolution = pokemon.getEvolution(); - if (evolution) + if (evolution) { this.scene.unshiftPhase(new EvolutionPhase(this.scene, pokemon as PlayerPokemon, evolution, this.lastLevel)); + } } } } @@ -4055,8 +4261,9 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { const existingMoveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === move.id); - if (existingMoveIndex > -1) + if (existingMoveIndex > -1) { return this.end(); + } const emptyMoveIndex = pokemon.getMoveset().length < 4 ? pokemon.getMoveset().length @@ -4072,25 +4279,25 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { loadMoveAnimAssets(this.scene, [ this.moveId ], true) .then(() => { this.scene.ui.setMode(messageMode).then(() => { - this.scene.playSound('level_up_fanfare'); - this.scene.ui.showText(i18next.t('battle:learnMove', { pokemonName: pokemon.name, moveName: move.name }), null, () => { + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: pokemon.name, moveName: move.name }), null, () => { this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); this.end(); }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); }); }); - }); + }); } else { this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t('battle:learnMovePrompt', { pokemonName: pokemon.name, moveName: move.name }), null, () => { - this.scene.ui.showText(i18next.t('battle:learnMoveLimitReached', { pokemonName: pokemon.name }), null, () => { - this.scene.ui.showText(i18next.t('battle:learnMoveReplaceQuestion', { moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: pokemon.name, moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => { const noHandler = () => { this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t('battle:learnMoveStopTeaching', { moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t('battle:learnMoveNotLearned', { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); + this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); }, () => { this.scene.ui.setMode(messageMode); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); @@ -4101,16 +4308,16 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { }; this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t('battle:learnMoveForgetQuestion'), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => { this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { if (moveIndex === 4) { noHandler(); return; } this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t('battle:countdownPoof'), null, () => { - this.scene.ui.showText(i18next.t('battle:learnMoveForgetSuccess', { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { - this.scene.ui.showText(i18next.t('battle:learnMoveAnd'), null, () => { + this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => { pokemon.setMove(moveIndex, Moves.NONE); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); this.end(); @@ -4151,10 +4358,11 @@ export class PokemonHealPhase extends CommonAnimPhase { } start() { - if (!this.skipAnim && (this.revive || this.getPokemon().hp) && this.getPokemon().getHpRatio() < 1) + if (!this.skipAnim && (this.revive || this.getPokemon().hp) && this.getPokemon().getHpRatio() < 1) { super.start(); - else + } else { this.end(); + } } end() { @@ -4172,23 +4380,27 @@ export class PokemonHealPhase extends CommonAnimPhase { if (!fullHp || this.hpHealed < 0) { const hpRestoreMultiplier = new Utils.IntegerHolder(1); - if (!this.revive) + if (!this.revive) { this.scene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); + } const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); if (healAmount.value < 0) { pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL); healAmount.value = 0; } // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) - if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) + if (this.preventFullHeal && pokemon.hp + healAmount.value >= pokemon.getMaxHp()) { healAmount.value = (pokemon.getMaxHp() - pokemon.hp) - 1; + } healAmount.value = pokemon.heal(healAmount.value); - if (healAmount.value) + if (healAmount.value) { this.scene.damageNumberHandler.add(pokemon, healAmount.value, HitResult.HEAL); + } if (pokemon.isPlayer()) { this.scene.validateAchvs(HealAchv, healAmount); - if (healAmount.value > this.scene.gameData.gameStats.highestHeal) + if (healAmount.value > this.scene.gameData.gameStats.highestHeal) { this.scene.gameData.gameStats.highestHeal = healAmount.value; + } } if (this.healStatus && !this.revive && pokemon.status) { lastStatusEffect = pokemon.status.effect; @@ -4196,20 +4408,24 @@ export class PokemonHealPhase extends CommonAnimPhase { } pokemon.updateInfo().then(() => super.end()); } else if (this.healStatus && !this.revive && pokemon.status) { - lastStatusEffect = pokemon.status.effect; - pokemon.resetStatus(); - pokemon.updateInfo().then(() => super.end()); - } else if (this.showFullHpMessage) - this.message = getPokemonMessage(pokemon, `'s\nHP is full!`); + lastStatusEffect = pokemon.status.effect; + pokemon.resetStatus(); + pokemon.updateInfo().then(() => super.end()); + } else if (this.showFullHpMessage) { + this.message = getPokemonMessage(pokemon, "'s\nHP is full!"); + } - if (this.message) + if (this.message) { this.scene.queueMessage(this.message); + } - if (this.healStatus && lastStatusEffect && !hasMessage) + if (this.healStatus && lastStatusEffect && !hasMessage) { this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(lastStatusEffect))); + } - if (fullHp && !lastStatusEffect) + if (fullHp && !lastStatusEffect) { super.end(); + } } } @@ -4229,8 +4445,9 @@ export class AttemptCapturePhase extends PokemonPhase { const pokemon = this.getPokemon() as EnemyPokemon; - if (!pokemon?.hp) + if (!pokemon?.hp) { return this.end(); + } this.scene.pokeballCounts[this.pokeballType]--; @@ -4246,24 +4463,24 @@ export class AttemptCapturePhase extends PokemonPhase { const fpOffset = pokemon.getFieldPositionOffset(); const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); - this.pokeball = this.scene.addFieldSprite(16, 80, 'pb', pokeballAtlasKey); + this.pokeball = this.scene.addFieldSprite(16, 80, "pb", pokeballAtlasKey); this.pokeball.setOrigin(0.5, 0.625); this.scene.field.add(this.pokeball); - this.scene.playSound('pb_throw'); + this.scene.playSound("pb_throw"); this.scene.time.delayedCall(300, () => { this.scene.field.moveBelow(this.pokeball as Phaser.GameObjects.GameObject, pokemon); }); this.scene.tweens.add({ targets: this.pokeball, - x: { value: 236 + fpOffset[0], ease: 'Linear' }, - y: { value: 16 + fpOffset[1], ease: 'Cubic.easeOut' }, + x: { value: 236 + fpOffset[0], ease: "Linear" }, + y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, duration: 500, onComplete: () => { - this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}_open`)); - this.scene.playSound('pb_rel'); + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + this.scene.playSound("pb_rel"); pokemon.tint(getPokeballTintColor(this.pokeballType)); addPokeballOpenParticles(this.scene, this.pokeball.x, this.pokeball.y, this.pokeballType); @@ -4271,14 +4488,14 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.tweens.add({ targets: pokemon, duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", scale: 0.25, y: 20, onComplete: () => { - this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`); + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); pokemon.setVisible(false); - this.scene.playSound('pb_catch'); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}`)); + this.scene.playSound("pb_catch"); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}`)); const doShake = () => { let shakeCount = 0; @@ -4288,7 +4505,7 @@ export class AttemptCapturePhase extends PokemonPhase { to: 1, repeat: 4, yoyo: true, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", duration: 250, repeatDelay: 500, onUpdate: t => { @@ -4304,17 +4521,17 @@ export class AttemptCapturePhase extends PokemonPhase { shakeCounter.stop(); this.failCatch(shakeCount); } else if (shakeCount++ < 3) { - if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) - this.scene.playSound('pb_move'); - else { + if (pokeballMultiplier === -1 || pokemon.randSeedInt(65536) < y) { + this.scene.playSound("pb_move"); + } else { shakeCounter.stop(); this.failCatch(shakeCount); } } else { - this.scene.playSound('pb_lock'); + this.scene.playSound("pb_lock"); addPokeballCaptureStars(this.scene, this.pokeball); - const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, 'pb', 'pb'); + const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY); pbTint.setTintFill(0); pbTint.setAlpha(0); @@ -4323,13 +4540,13 @@ export class AttemptCapturePhase extends PokemonPhase { targets: pbTint, alpha: 0.375, duration: 200, - easing: 'Sine.easeOut', + easing: "Sine.easeOut", onComplete: () => { this.scene.tweens.add({ targets: pbTint, alpha: 0, duration: 200, - easing: 'Sine.easeIn', + easing: "Sine.easeIn", onComplete: () => pbTint.destroy() }); } @@ -4350,22 +4567,23 @@ export class AttemptCapturePhase extends PokemonPhase { failCatch(shakeCount: integer) { const pokemon = this.getPokemon(); - this.scene.playSound('pb_rel'); + this.scene.playSound("pb_rel"); pokemon.setY(this.originalY); - if (pokemon.status?.effect !== StatusEffect.SLEEP) + if (pokemon.status?.effect !== StatusEffect.SLEEP) { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + } pokemon.tint(getPokeballTintColor(this.pokeballType)); pokemon.setVisible(true); - pokemon.untint(250, 'Sine.easeOut'); + pokemon.untint(250, "Sine.easeOut"); const pokeballAtlasKey = getPokeballAtlasKey(this.pokeballType); - this.pokeball.setTexture('pb', `${pokeballAtlasKey}_opening`); - this.scene.time.delayedCall(17, () => this.pokeball.setTexture('pb', `${pokeballAtlasKey}_open`)); + this.pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + this.scene.time.delayedCall(17, () => this.pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); this.scene.tweens.add({ targets: pokemon, duration: 250, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", scale: 1 }); @@ -4380,23 +4598,27 @@ export class AttemptCapturePhase extends PokemonPhase { const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) + if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { this.scene.validateAchv(achvs.HIDDEN_ABILITY); + } - if (pokemon.species.subLegendary) + if (pokemon.species.subLegendary) { this.scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } - if (pokemon.species.legendary) + if (pokemon.species.legendary) { this.scene.validateAchv(achvs.CATCH_LEGENDARY); + } - if (pokemon.species.mythical) + if (pokemon.species.mythical) { this.scene.validateAchv(achvs.CATCH_MYTHICAL); + } this.scene.pokemonInfoContainer.show(pokemon, true); this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - this.scene.ui.showText(i18next.t('battle:pokemonCaught', { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { const end = () => { this.scene.pokemonInfoContainer.hide(); this.removePb(); @@ -4413,15 +4635,17 @@ export class AttemptCapturePhase extends PokemonPhase { const addToParty = () => { const newPokemon = pokemon.addToParty(this.pokeballType); const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (this.scene.getParty().filter(p => p.isShiny()).length === 6) + if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { this.scene.validateAchv(achvs.SHINY_PARTY); + } Promise.all(modifiers.map(m => this.scene.addModifier(m, true))).then(() => { this.scene.updateModifiers(true); removePokemon(); - if (newPokemon) + if (newPokemon) { newPokemon.loadAssets().then(end); - else + } else { end(); + } }); }; Promise.all([ pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon) ]).then(() => { @@ -4432,10 +4656,11 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { this.scene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) + if (slotIndex < 6) { addToParty(); - else + } else { promptRelease(); + } }); }); }, () => { @@ -4447,8 +4672,9 @@ export class AttemptCapturePhase extends PokemonPhase { }); }; promptRelease(); - } else + } else { addToParty(); + } }); }, 0, true); } @@ -4458,7 +4684,7 @@ export class AttemptCapturePhase extends PokemonPhase { targets: this.pokeball, duration: 250, delay: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", alpha: 0, onComplete: () => this.pokeball.destroy() }); @@ -4482,14 +4708,14 @@ export class AttemptRunPhase extends PokemonPhase { applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, escapeChance); if (playerPokemon.randSeedInt(256) < escapeChance.value) { - this.scene.playSound('flee'); - this.scene.queueMessage(i18next.t('battle:runAwaySuccess'), null, true, 500); + this.scene.playSound("flee"); + this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); this.scene.tweens.add({ targets: [ this.scene.arenaEnemy, enemyField ].flat(), alpha: 0, duration: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => enemyField.forEach(enemyPokemon => enemyPokemon.destroy()) }); @@ -4503,8 +4729,9 @@ export class AttemptRunPhase extends PokemonPhase { this.scene.pushPhase(new BattleEndPhase(this.scene)); this.scene.pushPhase(new NewBattlePhase(this.scene)); - } else - this.scene.queueMessage(i18next.t('battle:runAwayCannotEscape'), null, true, 500); + } else { + this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); + } this.end(); } @@ -4524,19 +4751,21 @@ export class SelectModifierPhase extends BattlePhase { start() { super.start(); - if (!this.rerollCount) + if (!this.rerollCount) { this.updateSeed(); + } const party = this.scene.getParty(); regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); const modifierCount = new Utils.IntegerHolder(3); - if (this.isPlayer()) + if (this.isPlayer()) { this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); + } const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { if (rowCursor < 0 || cursor < 0) { - this.scene.ui.showText(i18next.t('battle:skipItemQuestion'), null, () => { + this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { this.scene.ui.revertMode(); this.scene.ui.setMode(Mode.MESSAGE); @@ -4548,50 +4777,51 @@ export class SelectModifierPhase extends BattlePhase { let modifierType: ModifierType; let cost: integer; switch (rowCursor) { - case 0: - if (!cursor) { - const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); - if (this.scene.money < rerollCost) { - this.scene.ui.playError(); - return false; - } else { - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.playSound('buy'); - } - } else if (cursor === 1) { - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, toSlotIndex: integer) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)).then(() => { - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, true); - }); - } else - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - }, PartyUiHandler.FilterItemMaxStacks); - } else { - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - uiHandler.updateLockRaritiesText(); - uiHandler.updateRerollCostText(); + case 0: + if (!cursor) { + const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); + if (this.scene.money < rerollCost) { + this.scene.ui.playError(); return false; + } else { + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.playSound("buy"); } - return true; - case 1: - modifierType = typeOptions[cursor].type; - break; - default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; - modifierType = shopOption.type; - cost = shopOption.cost; - break; + } else if (cursor === 1) { + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, toSlotIndex: integer) => { + if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)).then(() => { + const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, PartyUiHandler.FilterItemMaxStacks); + } else { + this.scene.lockModifierTiers = !this.scene.lockModifierTiers; + const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + uiHandler.updateLockRaritiesText(); + uiHandler.updateRerollCostText(); + return false; + } + return true; + case 1: + modifierType = typeOptions[cursor].type; + break; + default: + const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); + const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + modifierType = shopOption.type; + cost = shopOption.cost; + break; } if (cost && this.scene.money < cost) { @@ -4606,10 +4836,11 @@ export class SelectModifierPhase extends BattlePhase { if (success) { this.scene.money -= cost; this.scene.updateMoneyText(); - this.scene.playSound('buy'); + this.scene.playSound("buy"); (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else + } else { this.scene.ui.playError(); + } }); } else { const doEnd = () => { @@ -4617,10 +4848,11 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.setMode(Mode.MESSAGE); super.end(); }; - if (result instanceof Promise) + if (result instanceof Promise) { result.then(() => doEnd()); - else + } else { doEnd(); + } } }; @@ -4632,8 +4864,9 @@ export class SelectModifierPhase extends BattlePhase { const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); applyModifier(modifier, true); }); - } else + } else { this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } }, modifierType.selectFilter); } else { const pokemonModifierType = modifierType as PokemonModifierType; @@ -4643,8 +4876,8 @@ export class SelectModifierPhase extends BattlePhase { const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER - : PartyUiMode.MODIFIER; + : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + : PartyUiMode.MODIFIER; const tmMoveId = isTmModifier ? (modifierType as TmModifierType).moveId : undefined; @@ -4654,16 +4887,18 @@ export class SelectModifierPhase extends BattlePhase { const modifier = !isMoveModifier ? !isRememberMoveModifier ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as integer) + : modifierType.newModifier(party[slotIndex], option as integer) : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); applyModifier(modifier, true); }); - } else + } else { this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); } - } else + } else { applyModifier(modifierType.newModifier()); + } return !cost; }; @@ -4682,10 +4917,12 @@ export class SelectModifierPhase extends BattlePhase { let baseValue = 0; if (lockRarities) { const tierValues = [ 50, 125, 300, 750, 2000 ]; - for (let opt of typeOptions) + for (const opt of typeOptions) { baseValue += tierValues[opt.type.tier]; - } else + } + } else { baseValue = 250; + } return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount), Number.MAX_SAFE_INTEGER); } @@ -4711,14 +4948,15 @@ export class EggLapsePhase extends Phase { super.start(); const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { - return --egg.hatchWaves < 1 + return --egg.hatchWaves < 1; }); if (eggsToHatch.length) { - this.scene.queueMessage(i18next.t('battle:eggHatching')); + this.scene.queueMessage(i18next.t("battle:eggHatching")); - for (let egg of eggsToHatch) + for (const egg of eggsToHatch) { this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg)); + } } this.end(); @@ -4739,8 +4977,9 @@ export class AddEnemyBuffModifierPhase extends Phase { regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); const count = Math.ceil(waveIndex / 250); - for (let i = 0; i < count; i++) + for (let i = 0; i < count; i++) { this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true); + } this.scene.updateModifiers(false, true).then(() => this.end()); } } @@ -4767,7 +5006,7 @@ export class PartyStatusCurePhase extends BattlePhase { start() { super.start(); - for (let pokemon of this.scene.getParty()) { + for (const pokemon of this.scene.getParty()) { if (!pokemon.isOnField() || pokemon === this.user) { pokemon.resetStatus(false); pokemon.updateInfo(true); @@ -4781,8 +5020,9 @@ export class PartyStatusCurePhase extends BattlePhase { } } } - if (this.message) + if (this.message) { this.scene.queueMessage(this.message); + } this.end(); } } @@ -4800,21 +5040,24 @@ export class PartyHealPhase extends BattlePhase { super.start(); const bgmPlaying = this.scene.isBgmPlaying(); - if (bgmPlaying) + if (bgmPlaying) { this.scene.fadeOutBgm(1000, false); + } this.scene.ui.fadeOut(1000).then(() => { - for (let pokemon of this.scene.getParty()) { + for (const pokemon of this.scene.getParty()) { pokemon.hp = pokemon.getMaxHp(); pokemon.resetStatus(); - for (let move of pokemon.moveset) + for (const move of pokemon.moveset) { move.ppUsed = 0; + } pokemon.updateInfo(true); } - const healSong = this.scene.playSoundWithoutBgm('heal'); + const healSong = this.scene.playSoundWithoutBgm("heal"); this.scene.time.delayedCall(Utils.fixedInt(healSong.totalDuration * 1000), () => { healSong.destroy(); - if (this.resumeBgm && bgmPlaying) + if (this.resumeBgm && bgmPlaying) { this.scene.playBgm(); + } this.scene.ui.fadeIn(500).then(() => this.end()); }); }); @@ -4846,12 +5089,13 @@ export class ScanIvsPhase extends PokemonPhase { start() { super.start(); - if (!this.shownIvs) + if (!this.shownIvs) { return this.end(); + } const pokemon = this.getPokemon(); - this.scene.ui.showText(i18next.t('battle:ivScannerUseQuestion', { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: pokemon.name }), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.clearText(); @@ -4879,22 +5123,25 @@ export class TrainerMessageTestPhase extends BattlePhase { start() { super.start(); - let testMessages: string[] = []; + const testMessages: string[] = []; - for (let t of Object.keys(trainerConfigs)) { + for (const t of Object.keys(trainerConfigs)) { const type = parseInt(t); - if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) + if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { continue; + } const config = trainerConfigs[type]; [ config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages ] .map(messages => { - if (messages?.length) + if (messages?.length) { testMessages.push(...messages); + } }); } - for (let message of testMessages) + for (const message of testMessages) { this.scene.pushPhase(new TestMessagePhase(this.scene, message)); + } this.end(); } diff --git a/src/pipelines/field-sprite.ts b/src/pipelines/field-sprite.ts index a5b660810280..c370f5586e56 100644 --- a/src/pipelines/field-sprite.ts +++ b/src/pipelines/field-sprite.ts @@ -207,47 +207,48 @@ void main() { `; export default class FieldSpritePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { - constructor(game: Phaser.Game, config?: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig) { - super(config || { - game: game, - name: 'field-sprite', - fragShader: spriteFragShader, - vertShader: spriteVertShader - }); + constructor(game: Phaser.Game, config?: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig) { + super(config || { + game: game, + name: "field-sprite", + fragShader: spriteFragShader, + vertShader: spriteVertShader + }); + } + + onPreRender(): void { + this.set1f("time", 0); + this.set1i("ignoreTimeTint", 0); + this.set1f("terrainColorRatio", 0); + this.set3fv("terrainColor", [ 0, 0, 0 ]); + } + + onBind(gameObject: Phaser.GameObjects.GameObject): void { + super.onBind(); + + const sprite = gameObject as Phaser.GameObjects.Sprite | Phaser.GameObjects.NineSlice; + const scene = sprite.scene as BattleScene; + + const data = sprite.pipelineData; + const ignoreTimeTint = data["ignoreTimeTint"] as boolean; + const terrainColorRatio = data["terrainColorRatio"] as number || 0; + + const time = scene.currentBattle?.waveIndex + ? ((scene.currentBattle.waveIndex + scene.waveCycleOffset) % 40) / 40 // ((new Date().getSeconds() * 1000 + new Date().getMilliseconds()) % 10000) / 10000 + : Utils.getCurrentTime(); + this.set1f("time", time); + this.set1i("ignoreTimeTint", ignoreTimeTint ? 1 : 0); + this.set1i("isOutside", scene.arena.isOutside() ? 1 : 0); + this.set3fv("dayTint", scene.arena.getDayTint().map(c => c / 255)); + this.set3fv("duskTint", scene.arena.getDuskTint().map(c => c / 255)); + this.set3fv("nightTint", scene.arena.getNightTint().map(c => c / 255)); + this.set3fv("terrainColor", getTerrainColor(scene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255)); + this.set1f("terrainColorRatio", terrainColorRatio); + } + + onBatch(gameObject: Phaser.GameObjects.GameObject): void { + if (gameObject) { + this.flush(); } - - onPreRender(): void { - this.set1f('time', 0); - this.set1i('ignoreTimeTint', 0); - this.set1f('terrainColorRatio', 0); - this.set3fv('terrainColor', [ 0, 0, 0 ]); - } - - onBind(gameObject: Phaser.GameObjects.GameObject): void { - super.onBind(); - - const sprite = gameObject as Phaser.GameObjects.Sprite | Phaser.GameObjects.NineSlice; - const scene = sprite.scene as BattleScene; - - const data = sprite.pipelineData; - const ignoreTimeTint = data['ignoreTimeTint'] as boolean; - const terrainColorRatio = data['terrainColorRatio'] as number || 0; - - let time = scene.currentBattle?.waveIndex - ? ((scene.currentBattle.waveIndex + scene.waveCycleOffset) % 40) / 40 // ((new Date().getSeconds() * 1000 + new Date().getMilliseconds()) % 10000) / 10000 - : Utils.getCurrentTime(); - this.set1f('time', time); - this.set1i('ignoreTimeTint', ignoreTimeTint ? 1 : 0); - this.set1i('isOutside', scene.arena.isOutside() ? 1 : 0); - this.set3fv('dayTint', scene.arena.getDayTint().map(c => c / 255)); - this.set3fv('duskTint', scene.arena.getDuskTint().map(c => c / 255)); - this.set3fv('nightTint', scene.arena.getNightTint().map(c => c / 255)); - this.set3fv('terrainColor', getTerrainColor(scene.arena.terrain?.terrainType || TerrainType.NONE).map(c => c / 255)); - this.set1f('terrainColorRatio', terrainColorRatio); - } - - onBatch(gameObject: Phaser.GameObjects.GameObject): void { - if (gameObject) - this.flush(); - } -} \ No newline at end of file + } +} diff --git a/src/pipelines/invert.ts b/src/pipelines/invert.ts index 21a2a9439326..5d0161e8afa5 100644 --- a/src/pipelines/invert.ts +++ b/src/pipelines/invert.ts @@ -14,14 +14,14 @@ void main() `; export default class InvertPostFX extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { - constructor (game: Game) { - super({ - game, - name: 'InvertPostFX', - fragShader, - uniforms: [ - 'uMainSampler' - ] - } as Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); - } -} \ No newline at end of file + constructor (game: Game) { + super({ + game, + name: "InvertPostFX", + fragShader, + uniforms: [ + "uMainSampler" + ] + } as Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + } +} diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 534c8d42d54c..e1997c28635d 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -1,5 +1,5 @@ import BattleScene from "../battle-scene"; -import { variantColorCache, variantData } from '#app/data/variant'; +import { variantColorCache } from "#app/data/variant"; import Pokemon from "../field/pokemon"; import Trainer from "../field/trainer"; import FieldSpritePipeline from "./field-sprite"; @@ -313,161 +313,162 @@ void main() `; export default class SpritePipeline extends FieldSpritePipeline { - private _tone: number[]; - - constructor(game: Phaser.Game) { - super(game, { - game: game, - name: 'sprite', - fragShader: spriteFragShader, - vertShader: spriteVertShader - }); - - this._tone = [ 0, 0, 0, 0 ]; + private _tone: number[]; + + constructor(game: Phaser.Game) { + super(game, { + game: game, + name: "sprite", + fragShader: spriteFragShader, + vertShader: spriteVertShader + }); + + this._tone = [ 0, 0, 0, 0 ]; + } + + onPreRender(): void { + super.onPreRender(); + + this.set1f("teraTime", 0); + this.set3fv("teraColor", [ 0, 0, 0 ]); + this.set1i("hasShadow", 0); + this.set1i("yCenter", 0); + this.set2f("relPosition", 0, 0); + this.set2f("texFrameUv", 0, 0); + this.set2f("size", 0, 0); + this.set2f("texSize", 0, 0); + this.set1f("yOffset", 0); + this.set4fv("tone", this._tone); + } + + onBind(gameObject: Phaser.GameObjects.GameObject): void { + super.onBind(gameObject); + + const sprite = (gameObject as Phaser.GameObjects.Sprite); + + const data = sprite.pipelineData; + const tone = data["tone"] as number[]; + const teraColor = data["teraColor"] as integer[] ?? [ 0, 0, 0 ]; + const hasShadow = data["hasShadow"] as boolean; + const ignoreFieldPos = data["ignoreFieldPos"] as boolean; + const ignoreOverride = data["ignoreOverride"] as boolean; + + const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; + const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; + const position = isEntityObj + ? [ sprite.parentContainer.x, sprite.parentContainer.y ] + : [ sprite.x, sprite.y ]; + if (field) { + position[0] += field.x / field.scale; + position[1] += field.y / field.scale; } - - onPreRender(): void { - super.onPreRender(); - - this.set1f('teraTime', 0); - this.set3fv('teraColor', [ 0, 0, 0 ]); - this.set1i('hasShadow', 0); - this.set1i('yCenter', 0); - this.set2f('relPosition', 0, 0); - this.set2f('texFrameUv', 0, 0); - this.set2f('size', 0, 0); - this.set2f('texSize', 0, 0); - this.set1f('yOffset', 0); - this.set4fv('tone', this._tone); + position[0] += -(sprite.width - (sprite.frame.width)) / 2 + sprite.frame.x + (!ignoreFieldPos ? (sprite.x - field.x) : 0); + if (sprite.originY === 0.5) { + position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + (!ignoreFieldPos ? (sprite.y - field.y) : 0); } - - onBind(gameObject: Phaser.GameObjects.GameObject): void { - super.onBind(gameObject); - - const sprite = (gameObject as Phaser.GameObjects.Sprite); - - const data = sprite.pipelineData; - const tone = data['tone'] as number[]; - const teraColor = data['teraColor'] as integer[] ?? [ 0, 0, 0 ]; - const hasShadow = data['hasShadow'] as boolean; - const ignoreFieldPos = data['ignoreFieldPos'] as boolean; - const ignoreOverride = data['ignoreOverride'] as boolean; - - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; - const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; - const position = isEntityObj - ? [ sprite.parentContainer.x, sprite.parentContainer.y ] - : [ sprite.x, sprite.y ]; - if (field) { - position[0] += field.x / field.scale; - position[1] += field.y / field.scale; - } - position[0] += -(sprite.width - (sprite.frame.width)) / 2 + sprite.frame.x + (!ignoreFieldPos ? (sprite.x - field.x) : 0); - if (sprite.originY === 0.5) - position[1] += (sprite.height / 2) * ((isEntityObj ? sprite.parentContainer : sprite).scale - 1) + (!ignoreFieldPos ? (sprite.y - field.y) : 0); - this.set1f('teraTime', (this.game.getTime() % 500000) / 500000); - this.set3fv('teraColor', teraColor.map(c => c / 255)); - this.set1i('hasShadow', hasShadow ? 1 : 0); - this.set1i('yCenter', sprite.originY === 0.5 ? 1 : 0); - this.set1f('fieldScale', field?.scale || 1); - this.set2f('relPosition', position[0], position[1]); - this.set2f('texFrameUv', sprite.frame.u0, sprite.frame.v0); - this.set2f('size', sprite.frame.width, sprite.height); - this.set2f('texSize', sprite.texture.source[0].width, sprite.texture.source[0].height); - this.set1f('yOffset', sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); - this.set4fv('tone', tone); - this.bindTexture(this.game.textures.get('tera').source[0].glTexture, 1); + this.set1f("teraTime", (this.game.getTime() % 500000) / 500000); + this.set3fv("teraColor", teraColor.map(c => c / 255)); + this.set1i("hasShadow", hasShadow ? 1 : 0); + this.set1i("yCenter", sprite.originY === 0.5 ? 1 : 0); + this.set1f("fieldScale", field?.scale || 1); + this.set2f("relPosition", position[0], position[1]); + this.set2f("texFrameUv", sprite.frame.u0, sprite.frame.v0); + this.set2f("size", sprite.frame.width, sprite.height); + this.set2f("texSize", sprite.texture.source[0].width, sprite.texture.source[0].height); + this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + this.set4fv("tone", tone); + this.bindTexture(this.game.textures.get("tera").source[0].glTexture, 1); - if ((gameObject.scene as BattleScene).fusionPaletteSwaps) { - const spriteColors = ((ignoreOverride && data['spriteColorsBase']) || data['spriteColors'] || []) as number[][]; - const fusionSpriteColors = ((ignoreOverride && data['fusionSpriteColorsBase']) || data['fusionSpriteColors'] || []) as number[][]; - - const emptyColors = [ 0, 0, 0, 0 ]; - const flatSpriteColors: integer[] = []; - const flatFusionSpriteColors: integer[] = []; - for (let c = 0; c < 32; c++) { - flatSpriteColors.splice(flatSpriteColors.length, 0, ...(c < spriteColors.length ? spriteColors[c] : emptyColors)); - flatFusionSpriteColors.splice(flatFusionSpriteColors.length, 0, ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors)); - } - - this.set4iv(`spriteColors`, flatSpriteColors.flat()); - this.set4iv(`fusionSpriteColors`, flatFusionSpriteColors.flat()); - } + if ((gameObject.scene as BattleScene).fusionPaletteSwaps) { + const spriteColors = ((ignoreOverride && data["spriteColorsBase"]) || data["spriteColors"] || []) as number[][]; + const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || data["fusionSpriteColors"] || []) as number[][]; + + const emptyColors = [ 0, 0, 0, 0 ]; + const flatSpriteColors: integer[] = []; + const flatFusionSpriteColors: integer[] = []; + for (let c = 0; c < 32; c++) { + flatSpriteColors.splice(flatSpriteColors.length, 0, ...(c < spriteColors.length ? spriteColors[c] : emptyColors)); + flatFusionSpriteColors.splice(flatFusionSpriteColors.length, 0, ...(c < fusionSpriteColors.length ? fusionSpriteColors[c] : emptyColors)); + } + + this.set4iv("spriteColors", flatSpriteColors.flat()); + this.set4iv("fusionSpriteColors", flatFusionSpriteColors.flat()); } - - onBatch(gameObject: Phaser.GameObjects.GameObject): void { - if (gameObject) { - const sprite = (gameObject as Phaser.GameObjects.Sprite); - const data = sprite.pipelineData; - - const variant: integer = data.hasOwnProperty('variant') - ? data['variant'] - : sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.variant - : 0; - let variantColors; - - const emptyColors = [ 0, 0, 0, 0 ]; - const flatBaseColors: integer[] = []; - const flatVariantColors: number[] = []; - - if ((sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data['shiny']) - && (variantColors = variantColorCache[sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.getSprite().texture.key : data['spriteKey']]) && variantColors.hasOwnProperty(variant)) { - const baseColors = Object.keys(variantColors[variant]); - for (let c = 0; c < 32; c++) { - if (c < baseColors.length) { - const baseColor = Array.from(Object.values(Utils.rgbHexToRgba(baseColors[c]))); - const variantColor = Array.from(Object.values(Utils.rgbHexToRgba(variantColors[variant][baseColors[c]]))); - flatBaseColors.splice(flatBaseColors.length, 0, ...baseColor); - flatVariantColors.splice(flatVariantColors.length, 0, ...variantColor.map(c => c / 255.0)); - } else { - flatBaseColors.splice(flatBaseColors.length, 0, ...emptyColors); - flatVariantColors.splice(flatVariantColors.length, 0, ...emptyColors); - } - } - } else { - for (let c = 0; c < 32; c++) { - flatBaseColors.splice(flatBaseColors.length, 0, ...emptyColors); - flatVariantColors.splice(flatVariantColors.length, 0, ...emptyColors); - } - } - - this.set4iv('baseVariantColors', flatBaseColors.flat()); - this.set4fv('variantColors', flatVariantColors.flat()); + } + + onBatch(gameObject: Phaser.GameObjects.GameObject): void { + if (gameObject) { + const sprite = (gameObject as Phaser.GameObjects.Sprite); + const data = sprite.pipelineData; + + const variant: integer = data.hasOwnProperty("variant") + ? data["variant"] + : sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.variant + : 0; + let variantColors; + + const emptyColors = [ 0, 0, 0, 0 ]; + const flatBaseColors: integer[] = []; + const flatVariantColors: number[] = []; + + if ((sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.shiny : !!data["shiny"]) + && (variantColors = variantColorCache[sprite.parentContainer instanceof Pokemon ? sprite.parentContainer.getSprite().texture.key : data["spriteKey"]]) && variantColors.hasOwnProperty(variant)) { + const baseColors = Object.keys(variantColors[variant]); + for (let c = 0; c < 32; c++) { + if (c < baseColors.length) { + const baseColor = Array.from(Object.values(Utils.rgbHexToRgba(baseColors[c]))); + const variantColor = Array.from(Object.values(Utils.rgbHexToRgba(variantColors[variant][baseColors[c]]))); + flatBaseColors.splice(flatBaseColors.length, 0, ...baseColor); + flatVariantColors.splice(flatVariantColors.length, 0, ...variantColor.map(c => c / 255.0)); + } else { + flatBaseColors.splice(flatBaseColors.length, 0, ...emptyColors); + flatVariantColors.splice(flatVariantColors.length, 0, ...emptyColors); + } + } + } else { + for (let c = 0; c < 32; c++) { + flatBaseColors.splice(flatBaseColors.length, 0, ...emptyColors); + flatVariantColors.splice(flatVariantColors.length, 0, ...emptyColors); } + } - super.onBatch(gameObject); + this.set4iv("baseVariantColors", flatBaseColors.flat()); + this.set4fv("variantColors", flatVariantColors.flat()); } - batchQuad(gameObject: Phaser.GameObjects.GameObject, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, - u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, - texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean { - const sprite = gameObject as Phaser.GameObjects.Sprite; - - this.set1f('vCutoff', v1); - - const hasShadow = sprite.pipelineData['hasShadow'] as boolean; - if (hasShadow) { - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; - const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; - const fieldScaleRatio = field.scale / 6; - const baseY = (isEntityObj - ? sprite.parentContainer.y - : sprite.y + sprite.height) * 6 / fieldScaleRatio; - const bottomPadding = Math.ceil(sprite.height * 0.05) * 6 / fieldScaleRatio; - const yDelta = (baseY - y1) / field.scale; - y2 = y1 = baseY + bottomPadding; - const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); - v1 += (yDelta + bottomPadding / field.scale) * pixelHeight; - } - - return super.batchQuad(gameObject, x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit); + super.onBatch(gameObject); + } + + batchQuad(gameObject: Phaser.GameObjects.GameObject, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, + u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, + texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean { + const sprite = gameObject as Phaser.GameObjects.Sprite; + + this.set1f("vCutoff", v1); + + const hasShadow = sprite.pipelineData["hasShadow"] as boolean; + if (hasShadow) { + const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; + const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; + const fieldScaleRatio = field.scale / 6; + const baseY = (isEntityObj + ? sprite.parentContainer.y + : sprite.y + sprite.height) * 6 / fieldScaleRatio; + const bottomPadding = Math.ceil(sprite.height * 0.05) * 6 / fieldScaleRatio; + const yDelta = (baseY - y1) / field.scale; + y2 = y1 = baseY + bottomPadding; + const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + v1 += (yDelta + bottomPadding / field.scale) * pixelHeight; } + + return super.batchQuad(gameObject, x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit); + } - get tone(): number[] { - return this._tone; - } + get tone(): number[] { + return this._tone; + } - set tone(value: number[]) { - this._tone = value; - } -} \ No newline at end of file + set tone(value: number[]) { + this._tone = value; + } +} diff --git a/src/plugins/cache-busted-loader-plugin.ts b/src/plugins/cache-busted-loader-plugin.ts index 449c99454c22..0472ad51fe7d 100644 --- a/src/plugins/cache-busted-loader-plugin.ts +++ b/src/plugins/cache-busted-loader-plugin.ts @@ -1,30 +1,32 @@ let manifest: object; export default class CacheBustedLoaderPlugin extends Phaser.Loader.LoaderPlugin { - constructor(scene: Phaser.Scene) { - super(scene) - } + constructor(scene: Phaser.Scene) { + super(scene); + } - get manifest() { - return manifest; - } + get manifest() { + return manifest; + } - set manifest(manifestObj: object) { - manifest = manifestObj; - } + set manifest(manifestObj: object) { + manifest = manifestObj; + } - addFile(file): void { - if (!Array.isArray(file)) - file = [ file ]; + addFile(file): void { + if (!Array.isArray(file)) { + file = [ file ]; + } - file.forEach(item => { - if (manifest) { - const timestamp = manifest[`/${item.url.replace(/\/\//g, '/')}` ]; - if (timestamp) - item.url += `?t=${timestamp}`; - } - }); + file.forEach(item => { + if (manifest) { + const timestamp = manifest[`/${item.url.replace(/\/\//g, "/")}` ]; + if (timestamp) { + item.url += `?t=${timestamp}`; + } + } + }); - super.addFile(file); - } -} \ No newline at end of file + super.addFile(file); + } +} diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 0e52efc535a7..8af69929441a 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,14 +1,14 @@ -import i18next from 'i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; - -import { deConfig } from '#app/locales/de/config.js'; -import { enConfig } from '#app/locales/en/config.js'; -import { esConfig } from '#app/locales/es/config.js'; -import { frConfig } from '#app/locales/fr/config.js'; -import { itConfig } from '#app/locales/it/config.js'; -import { ptBrConfig } from '#app/locales/pt_BR/config.js'; -import { zhCnConfig } from '#app/locales/zh_CN/config.js'; -import { zhTWConfig } from '#app/locales/zh_TW/config.js'; +import i18next from "i18next"; +import LanguageDetector from "i18next-browser-languagedetector"; + +import { deConfig } from "#app/locales/de/config.js"; +import { enConfig } from "#app/locales/en/config.js"; +import { esConfig } from "#app/locales/es/config.js"; +import { frConfig } from "#app/locales/fr/config.js"; +import { itConfig } from "#app/locales/it/config.js"; +import { ptBrConfig } from "#app/locales/pt_BR/config.js"; +import { zhCnConfig } from "#app/locales/zh_CN/config.js"; +import { zhTWConfig } from "#app/locales/zh_TW/config.js"; export interface SimpleTranslationEntries { [key: string]: string @@ -70,10 +70,11 @@ export function initI18n(): void { return; } isInitialized = true; - let lang = ''; + let lang = ""; - if (localStorage.getItem('prLang')) - lang = localStorage.getItem('prLang'); + if (localStorage.getItem("prLang")) { + lang = localStorage.getItem("prLang"); + } @@ -96,8 +97,8 @@ export function initI18n(): void { i18next.use(LanguageDetector).init({ lng: lang, nonExplicitSupportedLngs: true, - fallbackLng: 'en', - supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh', 'pt'], + fallbackLng: "en", + supportedLngs: ["en", "es", "fr", "it", "de", "zh", "pt"], debug: true, interpolation: { escapeValue: false, @@ -132,7 +133,7 @@ export function initI18n(): void { } // Module declared to make referencing keys in the localization files type-safe. -declare module 'i18next' { +declare module "i18next" { interface CustomTypeOptions { resources: { menu: SimpleTranslationEntries; diff --git a/src/scene-base.ts b/src/scene-base.ts index a990492f57ba..99c06c708cde 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -5,67 +5,77 @@ export class SceneBase extends Phaser.Scene { super(config); } - getCachedUrl(url: string): string { - const manifest = this.game['manifest']; - if (manifest) { - const timestamp = manifest[`/${url}`]; - if (timestamp) - url += `?t=${timestamp}`; - } - return url; - } + getCachedUrl(url: string): string { + const manifest = this.game["manifest"]; + if (manifest) { + const timestamp = manifest[`/${url}`]; + if (timestamp) { + url += `?t=${timestamp}`; + } + } + return url; + } loadImage(key: string, folder: string, filename?: string) { - if (!filename) - filename = `${key}.png`; - this.load.image(key, this.getCachedUrl(`images/${folder}/${filename}`)); - if (folder.startsWith('ui')) { - legacyCompatibleImages.push(key); - folder = folder.replace('ui', 'ui/legacy'); - this.load.image(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`)); - } - } + if (!filename) { + filename = `${key}.png`; + } + this.load.image(key, this.getCachedUrl(`images/${folder}/${filename}`)); + if (folder.startsWith("ui")) { + legacyCompatibleImages.push(key); + folder = folder.replace("ui", "ui/legacy"); + this.load.image(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`)); + } + } loadSpritesheet(key: string, folder: string, size: integer, filename?: string) { - if (!filename) - filename = `${key}.png`; - this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); - if (folder.startsWith('ui')) { - legacyCompatibleImages.push(key); - folder = folder.replace('ui', 'ui/legacy'); - this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); - } - } + if (!filename) { + filename = `${key}.png`; + } + this.load.spritesheet(key, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + if (folder.startsWith("ui")) { + legacyCompatibleImages.push(key); + folder = folder.replace("ui", "ui/legacy"); + this.load.spritesheet(`${key}_legacy`, this.getCachedUrl(`images/${folder}/${filename}`), { frameWidth: size, frameHeight: size }); + } + } - loadAtlas(key: string, folder: string, filenameRoot?: string) { - if (!filenameRoot) - filenameRoot = key; - if (folder) - folder += '/'; - this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); - if (folder.startsWith('ui')) { - legacyCompatibleImages.push(key); - folder = folder.replace('ui', 'ui/legacy'); - this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); - } - } + loadAtlas(key: string, folder: string, filenameRoot?: string) { + if (!filenameRoot) { + filenameRoot = key; + } + if (folder) { + folder += "/"; + } + this.load.atlas(key, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); + if (folder.startsWith("ui")) { + legacyCompatibleImages.push(key); + folder = folder.replace("ui", "ui/legacy"); + this.load.atlas(`${key}_legacy`, this.getCachedUrl(`images/${folder}${filenameRoot}.png`), this.getCachedUrl(`images/${folder}/${filenameRoot}.json`)); + } + } - loadSe(key: string, folder?: string, filenames?: string | string[]) { - if (!filenames) - filenames = `${key}.wav`; - if (!folder) - folder = ''; - else - folder += '/'; - if (!Array.isArray(filenames)) - filenames = [ filenames ]; - for (let f of filenames as string[]) - this.load.audio(key, this.getCachedUrl(`audio/se/${folder}${f}`)); - } + loadSe(key: string, folder?: string, filenames?: string | string[]) { + if (!filenames) { + filenames = `${key}.wav`; + } + if (!folder) { + folder = ""; + } else { + folder += "/"; + } + if (!Array.isArray(filenames)) { + filenames = [ filenames ]; + } + for (const f of filenames as string[]) { + this.load.audio(key, this.getCachedUrl(`audio/se/${folder}${f}`)); + } + } - loadBgm(key: string, filename?: string) { - if (!filename) - filename = `${key}.mp3`; - this.load.audio(key, this.getCachedUrl(`audio/bgm/${filename}`)); - } -} \ No newline at end of file + loadBgm(key: string, filename?: string) { + if (!filename) { + filename = `${key}.mp3`; + } + this.load.audio(key, this.getCachedUrl(`audio/bgm/${filename}`)); + } +} diff --git a/src/system/achv.ts b/src/system/achv.ts index 9a6e43965d63..9af01830b601 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -51,14 +51,18 @@ export class Achv { } getTier(): AchvTier { - if (this.score >= 100) + if (this.score >= 100) { return AchvTier.MASTER; - if (this.score >= 75) + } + if (this.score >= 75) { return AchvTier.ROGUE; - if (this.score >= 50) + } + if (this.score >= 50) { return AchvTier.ULTRA; - if (this.score >= 25) + } + if (this.score >= 25) { return AchvTier.GREAT; + } return AchvTier.COMMON; } } @@ -67,7 +71,7 @@ export class MoneyAchv extends Achv { private moneyAmount: integer; constructor(name: string, moneyAmount: integer, iconImage: string, score: integer) { - super(name, `Accumulate a total of ₽${moneyAmount.toLocaleString('en-US')}`, iconImage, score, (scene: BattleScene, _args: any[]) => scene.money >= this.moneyAmount); + super(name, `Accumulate a total of ₽${moneyAmount.toLocaleString("en-US")}`, iconImage, score, (scene: BattleScene, _args: any[]) => scene.money >= this.moneyAmount); this.moneyAmount = moneyAmount; } @@ -77,7 +81,7 @@ export class RibbonAchv extends Achv { private ribbonAmount: integer; constructor(name: string, ribbonAmount: integer, iconImage: string, score: integer) { - super(name, `Accumulate a total of ${ribbonAmount.toLocaleString('en-US')} Ribbons`, iconImage, score, (scene: BattleScene, _args: any[]) => scene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount); + super(name, `Accumulate a total of ${ribbonAmount.toLocaleString("en-US")} Ribbons`, iconImage, score, (scene: BattleScene, _args: any[]) => scene.gameData.gameStats.ribbonsOwned >= this.ribbonAmount); this.ribbonAmount = ribbonAmount; } @@ -87,7 +91,7 @@ export class DamageAchv extends Achv { private damageAmount: integer; constructor(name: string, damageAmount: integer, iconImage: string, score: integer) { - super(name, `Inflict ${damageAmount.toLocaleString('en-US')} damage in one hit`, iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] as Utils.NumberHolder).value >= this.damageAmount); + super(name, `Inflict ${damageAmount.toLocaleString("en-US")} damage in one hit`, iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] as Utils.NumberHolder).value >= this.damageAmount); this.damageAmount = damageAmount; } @@ -97,7 +101,7 @@ export class HealAchv extends Achv { private healAmount: integer; constructor(name: string, healAmount: integer, iconImage: string, score: integer) { - super(name, `Heal ${healAmount.toLocaleString('en-US')} HP at once with a move, ability, or held item`, iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] as Utils.NumberHolder).value >= this.healAmount); + super(name, `Heal ${healAmount.toLocaleString("en-US")} HP at once with a move, ability, or held item`, iconImage, score, (_scene: BattleScene, args: any[]) => (args[0] as Utils.NumberHolder).value >= this.healAmount); this.healAmount = healAmount; } @@ -120,46 +124,46 @@ export class ModifierAchv extends Achv { } export const achvs = { - _10K_MONEY: new MoneyAchv('Money Haver', 10000, 'nugget', 10), - _100K_MONEY: new MoneyAchv('Rich', 100000, 'big_nugget', 25).setSecret(true), - _1M_MONEY: new MoneyAchv('Millionaire', 1000000, 'relic_gold', 50).setSecret(true), - _10M_MONEY: new MoneyAchv('One Percenter', 10000000, 'coin_case', 100).setSecret(true), - _250_DMG: new DamageAchv('Hard Hitter', 250, 'lucky_punch', 10), - _1000_DMG: new DamageAchv('Harder Hitter', 1000, 'lucky_punch_great', 25).setSecret(true), - _2500_DMG: new DamageAchv('That\'s a Lotta Damage!', 2500, 'lucky_punch_ultra', 50).setSecret(true), - _10000_DMG: new DamageAchv('One Punch Man', 10000, 'lucky_punch_master', 100).setSecret(true), - _250_HEAL: new HealAchv('Novice Healer', 250, 'potion', 10), - _1000_HEAL: new HealAchv('Big Healer', 1000, 'super_potion', 25).setSecret(true), - _2500_HEAL: new HealAchv('Cleric', 2500, 'hyper_potion', 50).setSecret(true), - _10000_HEAL: new HealAchv('Recovery Master', 10000, 'max_potion', 100).setSecret(true), - LV_100: new LevelAchv('But Wait, There\'s More!', 100, 'rare_candy', 25).setSecret(), - LV_250: new LevelAchv('Elite', 250, 'rarer_candy', 50).setSecret(true), - LV_1000: new LevelAchv('To Go Even Further Beyond', 1000, 'candy_jar', 100).setSecret(true), - _10_RIBBONS: new RibbonAchv('Pokémon League Champion', 10, 'bronze_ribbon', 10), - _25_RIBBONS: new RibbonAchv('Great League Champion', 25, 'great_ribbon', 25).setSecret(true), - _50_RIBBONS: new RibbonAchv('Ultra League Champion', 50, 'ultra_ribbon', 50).setSecret(true), - _75_RIBBONS: new RibbonAchv('Rogue League Champion', 75, 'rogue_ribbon', 75).setSecret(true), - _100_RIBBONS: new RibbonAchv('Master League Champion', 100, 'master_ribbon', 100).setSecret(true), - TRANSFER_MAX_BATTLE_STAT: new Achv('Teamwork', 'Baton pass to another party member with at least one stat maxed out', 'stick', 20), - MAX_FRIENDSHIP: new Achv('Friendmaxxing', 'Reach max friendship on a Pokémon', 'soothe_bell', 25), - MEGA_EVOLVE: new Achv('Megamorph', 'Mega evolve a Pokémon', 'mega_bracelet', 50), - GIGANTAMAX: new Achv('Absolute Unit', 'Gigantamax a Pokémon', 'dynamax_band', 50), - TERASTALLIZE: new Achv('STAB Enthusiast', 'Terastallize a Pokémon', 'tera_orb', 25), - STELLAR_TERASTALLIZE: new Achv('The Hidden Type', 'Stellar Terastallize a Pokémon', 'stellar_tera_shard', 25).setSecret(true), - SPLICE: new Achv('Infinite Fusion', 'Splice two Pokémon together with DNA Splicers', 'dna_splicers', 10), - MINI_BLACK_HOLE: new ModifierAchv('A Hole Lot of Items', 'Acquire a Mini Black Hole', 'mini_black_hole', 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), - CATCH_MYTHICAL: new Achv('Mythical', 'Catch a mythical Pokémon', 'strange_ball', 50).setSecret(), - CATCH_SUB_LEGENDARY: new Achv('(Sub-)Legendary', 'Catch a sub-legendary Pokémon', 'rb', 75).setSecret(), - CATCH_LEGENDARY: new Achv('Legendary', 'Catch a legendary Pokémon', 'mb', 100).setSecret(), - SEE_SHINY: new Achv('Shiny', 'Find a shiny Pokémon in the wild', 'pb_gold', 75), - SHINY_PARTY: new Achv('That\'s Dedication', 'Have a full party of shiny Pokémon', 'shiny_charm', 100).setSecret(true), - HATCH_MYTHICAL: new Achv('Mythical Egg', 'Hatch a mythical Pokémon from an egg', 'pair_of_tickets', 75).setSecret(), - HATCH_SUB_LEGENDARY: new Achv('Sub-Legendary Egg', 'Hatch a sub-legendary Pokémon from an egg', 'mystic_ticket', 100).setSecret(), - HATCH_LEGENDARY: new Achv('Legendary Egg', 'Hatch a legendary Pokémon from an egg', 'mystic_ticket', 125).setSecret(), - HATCH_SHINY: new Achv('Shiny Egg', 'Hatch a shiny Pokémon from an egg', 'golden_mystic_ticket', 100).setSecret(), - HIDDEN_ABILITY: new Achv('Hidden Potential', 'Catch a Pokémon with a hidden ability', 'ability_charm', 75), - PERFECT_IVS: new Achv('Certificate of Authenticity', 'Get perfect IVs on a Pokémon', 'blunder_policy', 100), - CLASSIC_VICTORY: new Achv('Undefeated', 'Beat the game in classic mode', 'relic_crown', 150) + _10K_MONEY: new MoneyAchv("Money Haver", 10000, "nugget", 10), + _100K_MONEY: new MoneyAchv("Rich", 100000, "big_nugget", 25).setSecret(true), + _1M_MONEY: new MoneyAchv("Millionaire", 1000000, "relic_gold", 50).setSecret(true), + _10M_MONEY: new MoneyAchv("One Percenter", 10000000, "coin_case", 100).setSecret(true), + _250_DMG: new DamageAchv("Hard Hitter", 250, "lucky_punch", 10), + _1000_DMG: new DamageAchv("Harder Hitter", 1000, "lucky_punch_great", 25).setSecret(true), + _2500_DMG: new DamageAchv("That's a Lotta Damage!", 2500, "lucky_punch_ultra", 50).setSecret(true), + _10000_DMG: new DamageAchv("One Punch Man", 10000, "lucky_punch_master", 100).setSecret(true), + _250_HEAL: new HealAchv("Novice Healer", 250, "potion", 10), + _1000_HEAL: new HealAchv("Big Healer", 1000, "super_potion", 25).setSecret(true), + _2500_HEAL: new HealAchv("Cleric", 2500, "hyper_potion", 50).setSecret(true), + _10000_HEAL: new HealAchv("Recovery Master", 10000, "max_potion", 100).setSecret(true), + LV_100: new LevelAchv("But Wait, There's More!", 100, "rare_candy", 25).setSecret(), + LV_250: new LevelAchv("Elite", 250, "rarer_candy", 50).setSecret(true), + LV_1000: new LevelAchv("To Go Even Further Beyond", 1000, "candy_jar", 100).setSecret(true), + _10_RIBBONS: new RibbonAchv("Pokémon League Champion", 10, "bronze_ribbon", 10), + _25_RIBBONS: new RibbonAchv("Great League Champion", 25, "great_ribbon", 25).setSecret(true), + _50_RIBBONS: new RibbonAchv("Ultra League Champion", 50, "ultra_ribbon", 50).setSecret(true), + _75_RIBBONS: new RibbonAchv("Rogue League Champion", 75, "rogue_ribbon", 75).setSecret(true), + _100_RIBBONS: new RibbonAchv("Master League Champion", 100, "master_ribbon", 100).setSecret(true), + TRANSFER_MAX_BATTLE_STAT: new Achv("Teamwork", "Baton pass to another party member with at least one stat maxed out", "stick", 20), + MAX_FRIENDSHIP: new Achv("Friendmaxxing", "Reach max friendship on a Pokémon", "soothe_bell", 25), + MEGA_EVOLVE: new Achv("Megamorph", "Mega evolve a Pokémon", "mega_bracelet", 50), + GIGANTAMAX: new Achv("Absolute Unit", "Gigantamax a Pokémon", "dynamax_band", 50), + TERASTALLIZE: new Achv("STAB Enthusiast", "Terastallize a Pokémon", "tera_orb", 25), + STELLAR_TERASTALLIZE: new Achv("The Hidden Type", "Stellar Terastallize a Pokémon", "stellar_tera_shard", 25).setSecret(true), + SPLICE: new Achv("Infinite Fusion", "Splice two Pokémon together with DNA Splicers", "dna_splicers", 10), + MINI_BLACK_HOLE: new ModifierAchv("A Hole Lot of Items", "Acquire a Mini Black Hole", "mini_black_hole", 25, modifier => modifier instanceof TurnHeldItemTransferModifier).setSecret(), + CATCH_MYTHICAL: new Achv("Mythical", "Catch a mythical Pokémon", "strange_ball", 50).setSecret(), + CATCH_SUB_LEGENDARY: new Achv("(Sub-)Legendary", "Catch a sub-legendary Pokémon", "rb", 75).setSecret(), + CATCH_LEGENDARY: new Achv("Legendary", "Catch a legendary Pokémon", "mb", 100).setSecret(), + SEE_SHINY: new Achv("Shiny", "Find a shiny Pokémon in the wild", "pb_gold", 75), + SHINY_PARTY: new Achv("That's Dedication", "Have a full party of shiny Pokémon", "shiny_charm", 100).setSecret(true), + HATCH_MYTHICAL: new Achv("Mythical Egg", "Hatch a mythical Pokémon from an egg", "pair_of_tickets", 75).setSecret(), + HATCH_SUB_LEGENDARY: new Achv("Sub-Legendary Egg", "Hatch a sub-legendary Pokémon from an egg", "mystic_ticket", 100).setSecret(), + HATCH_LEGENDARY: new Achv("Legendary Egg", "Hatch a legendary Pokémon from an egg", "mystic_ticket", 125).setSecret(), + HATCH_SHINY: new Achv("Shiny Egg", "Hatch a shiny Pokémon from an egg", "golden_mystic_ticket", 100).setSecret(), + HIDDEN_ABILITY: new Achv("Hidden Potential", "Catch a Pokémon with a hidden ability", "ability_charm", 75), + PERFECT_IVS: new Achv("Certificate of Authenticity", "Get perfect IVs on a Pokémon", "blunder_policy", 100), + CLASSIC_VICTORY: new Achv("Undefeated", "Beat the game in classic mode", "relic_crown", 150) }; { @@ -167,8 +171,9 @@ export const achvs = { const achvKeys = Object.keys(achvs); achvKeys.forEach((a: string, i: integer) => { achvs[a].id = a; - if (achvs[a].hasParent) + if (achvs[a].hasParent) { achvs[a].parentId = achvKeys[i - 1]; + } }); })(); -} \ No newline at end of file +} diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index 4d5fb10e8f0e..2b2aa01bec69 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -14,4 +14,4 @@ export default class ArenaData { this.weather = sourceArena ? sourceArena.weather : source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : undefined; this.tags = sourceArena ? sourceArena.tags : []; } -} \ No newline at end of file +} diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index c1642d1060b5..9bacb357035e 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -17,4 +17,4 @@ export default class EggData { toEgg(): Egg { return new Egg(this.id, this.gachaType, this.hatchWaves, this.timestamp); } -} \ No newline at end of file +} diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 8b09fe8b9109..3211a32d2e6b 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -4,7 +4,7 @@ import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutio import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; import { Species, defaultStarterSpecies } from "../data/enums/species"; import * as Utils from "../utils"; -import * as Overrides from '../overrides'; +import * as Overrides from "../overrides"; import PokemonData from "./pokemon-data"; import PersistentModifierData from "./modifier-data"; import ArenaData from "./arena-data"; @@ -31,7 +31,7 @@ import { TrainerVariant } from "../field/trainer"; import { OutdatedPhase, ReloadSessionPhase } from "#app/phases"; import { Variant, variantData } from "#app/data/variant"; -const saveKey = 'x0i2O7WRiANTqPmZ'; // Temporary; secure encryption is not yet necessary +const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary export enum GameDataType { SYSTEM, @@ -53,17 +53,18 @@ export enum Passive { export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): string { switch (dataType) { - case GameDataType.SYSTEM: - return 'data'; - case GameDataType.SESSION: - let ret = 'sessionData'; - if (slotId) - ret += slotId; - return ret; - case GameDataType.SETTINGS: - return 'settings'; - case GameDataType.TUTORIALS: - return 'tutorials'; + case GameDataType.SYSTEM: + return "data"; + case GameDataType.SESSION: + let ret = "sessionData"; + if (slotId) { + ret += slotId; + } + return ret; + case GameDataType.SETTINGS: + return "settings"; + case GameDataType.TUTORIALS: + return "tutorials"; } } @@ -153,7 +154,7 @@ export const DexAttr = { VARIANT_2: 32n, VARIANT_3: 64n, DEFAULT_FORM: 128n -} +}; export interface DexAttrProps { shiny: boolean; @@ -166,7 +167,7 @@ export const AbilityAttr = { ABILITY_1: 1, ABILITY_2: 2, ABILITY_HIDDEN: 4 -} +}; export type StarterMoveset = [ Moves ] | [ Moves, Moves ] | [ Moves, Moves, Moves ] | [ Moves, Moves, Moves, Moves ]; @@ -198,21 +199,21 @@ export interface TutorialFlags { } const systemShortKeys = { - seenAttr: '$sa', - caughtAttr: '$ca', - natureAttr: '$na', - seenCount: '$s' , - caughtCount: '$c', - hatchedCount: '$hc', - ivs: '$i', - moveset: '$m', - eggMoves: '$em', - candyCount: '$x', - friendship: '$f', - abilityAttr: '$a', - passiveAttr: '$pa', - valueReduction: '$vr', - classicWinCount: '$wc' + seenAttr: "$sa", + caughtAttr: "$ca", + natureAttr: "$na", + seenCount: "$s" , + caughtCount: "$c", + hatchedCount: "$hc", + ivs: "$i", + moveset: "$m", + eggMoves: "$em", + candyCount: "$x", + friendship: "$f", + abilityAttr: "$a", + passiveAttr: "$pa", + valueReduction: "$vr", + classicWinCount: "$wc" }; export class GameData { @@ -287,7 +288,7 @@ export class GameData { const data = this.getSystemSaveData(); const maxIntAttrValue = Math.pow(2, 31); - const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); + const systemData = JSON.stringify(data, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v); localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemData, bypassLogin)); @@ -297,10 +298,10 @@ export class GameData { .then(error => { this.scene.ui.savingIcon.hide(); if (error) { - if (error.startsWith('client version out of date')) { + if (error.startsWith("client version out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new OutdatedPhase(this.scene)); - } else if (error.startsWith('session out of date')) { + } else if (error.startsWith("session out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); } @@ -319,21 +320,22 @@ export class GameData { public loadSystem(): Promise { return new Promise(resolve => { - console.log('Client Session:', clientSessionId); + console.log("Client Session:", clientSessionId); - if (bypassLogin && !localStorage.getItem(`data_${loggedInUser.username}`)) + if (bypassLogin && !localStorage.getItem(`data_${loggedInUser.username}`)) { return resolve(false); + } if (!bypassLogin) { Utils.apiFetch(`savedata/system?clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(response => { - if (!response.length || response[0] !== '{') { - if (response.startsWith('sql: no rows in result set')) { - this.scene.queueMessage('Save data could not be found. If this is a new account, you can safely ignore this message.', null, true); + if (!response.length || response[0] !== "{") { + if (response.startsWith("sql: no rows in result set")) { + this.scene.queueMessage("Save data could not be found. If this is a new account, you can safely ignore this message.", null, true); return resolve(true); - } else if (response.indexOf('Too many connections') > -1) { - this.scene.queueMessage('Too many people are trying to connect and the server is overloaded. Please try again later.', null, true); + } else if (response.indexOf("Too many connections") > -1) { + this.scene.queueMessage("Too many people are trying to connect and the server is overloaded. Please try again later.", null, true); return resolve(false); } console.error(response); @@ -343,8 +345,9 @@ export class GameData { const cachedSystem = localStorage.getItem(`data_${loggedInUser.username}`); this.initSystem(response, cachedSystem ? AES.decrypt(cachedSystem, saveKey).toString(enc.Utf8) : null).then(resolve); }); - } else + } else { this.initSystem(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)).then(resolve); + } }); } @@ -354,13 +357,14 @@ export class GameData { let systemData = this.parseSystemData(systemDataStr); if (cachedSystemDataStr) { - let cachedSystemData = this.parseSystemData(cachedSystemDataStr); + const cachedSystemData = this.parseSystemData(cachedSystemDataStr); if (cachedSystemData.timestamp > systemData.timestamp) { - console.debug('Use cached system'); + console.debug("Use cached system"); systemData = cachedSystemData; systemDataStr = cachedSystemDataStr; - } else + } else { this.clearLocalData(); + } } console.debug(systemData); @@ -385,56 +389,64 @@ export class GameData { if (initStarterData) { this.initStarterData(); - if (systemData['starterMoveData']) { - const starterMoveData = systemData['starterMoveData']; - for (let s of Object.keys(starterMoveData)) + if (systemData["starterMoveData"]) { + const starterMoveData = systemData["starterMoveData"]; + for (const s of Object.keys(starterMoveData)) { this.starterData[s].moveset = starterMoveData[s]; + } } - if (systemData['starterEggMoveData']) { - const starterEggMoveData = systemData['starterEggMoveData']; - for (let s of Object.keys(starterEggMoveData)) + if (systemData["starterEggMoveData"]) { + const starterEggMoveData = systemData["starterEggMoveData"]; + for (const s of Object.keys(starterEggMoveData)) { this.starterData[s].eggMoves = starterEggMoveData[s]; + } } this.migrateStarterAbilities(systemData, this.starterData); } else { - if ([ '1.0.0', '1.0.1' ].includes(systemData.gameVersion)) + if ([ "1.0.0", "1.0.1" ].includes(systemData.gameVersion)) { this.migrateStarterAbilities(systemData); + } //this.fixVariantData(systemData); this.fixStarterData(systemData); // Migrate ability starter data if empty for caught species Object.keys(systemData.starterData).forEach(sd => { - if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) + if (systemData.dexData[sd].caughtAttr && !systemData.starterData[sd].abilityAttr) { systemData.starterData[sd].abilityAttr = 1; + } }); this.starterData = systemData.starterData; } if (systemData.gameStats) { - if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) + if (systemData.gameStats.legendaryPokemonCaught !== undefined && systemData.gameStats.subLegendaryPokemonCaught === undefined) { this.fixLegendaryStats(systemData); + } this.gameStats = systemData.gameStats; } if (systemData.unlocks) { - for (let key of Object.keys(systemData.unlocks)) { - if (this.unlocks.hasOwnProperty(key)) + for (const key of Object.keys(systemData.unlocks)) { + if (this.unlocks.hasOwnProperty(key)) { this.unlocks[key] = systemData.unlocks[key]; + } } } if (systemData.achvUnlocks) { - for (let a of Object.keys(systemData.achvUnlocks)) { - if (achvs.hasOwnProperty(a)) + for (const a of Object.keys(systemData.achvUnlocks)) { + if (achvs.hasOwnProperty(a)) { this.achvUnlocks[a] = systemData.achvUnlocks[a]; + } } } if (systemData.voucherUnlocks) { - for (let v of Object.keys(systemData.voucherUnlocks)) { - if (vouchers.hasOwnProperty(v)) + for (const v of Object.keys(systemData.voucherUnlocks)) { + if (vouchers.hasOwnProperty(v)) { this.voucherUnlocks[v] = systemData.voucherUnlocks[v]; + } } } @@ -455,11 +467,12 @@ export class GameData { if (initStarterData) { const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); - for (let s of starterIds) { + for (const s of starterIds) { this.starterData[s].candyCount += this.dexData[s].caughtCount; this.starterData[s].candyCount += this.dexData[s].hatchedCount * 2; - if (this.dexData[s].caughtAttr & DexAttr.SHINY) + if (this.dexData[s].caughtAttr & DexAttr.SHINY) { this.starterData[s].candyCount += 4; + } } } @@ -473,39 +486,43 @@ export class GameData { private parseSystemData(dataStr: string): SystemSaveData { return JSON.parse(dataStr, (k: string, v: any) => { - if (k === 'gameStats') + if (k === "gameStats") { return new GameStats(v); - else if (k === 'eggs') { + } else if (k === "eggs") { const ret: EggData[] = []; - if (v === null) + if (v === null) { v = []; - for (let e of v) + } + for (const e of v) { ret.push(new EggData(e)); + } return ret; } - return k.endsWith('Attr') && ![ 'natureAttr', 'abilityAttr', 'passiveAttr' ].includes(k) ? BigInt(v) : v; + return k.endsWith("Attr") && ![ "natureAttr", "abilityAttr", "passiveAttr" ].includes(k) ? BigInt(v) : v; }) as SystemSaveData; } private convertSystemDataStr(dataStr: string, shorten: boolean = false): string { if (!shorten) { // Account for past key oversight - dataStr = dataStr.replace(/\$pAttr/g, '$pa'); + dataStr = dataStr.replace(/\$pAttr/g, "$pa"); } const fromKeys = shorten ? Object.keys(systemShortKeys) : Object.values(systemShortKeys); const toKeys = shorten ? Object.values(systemShortKeys) : Object.keys(systemShortKeys); - for (let k in fromKeys) - dataStr = dataStr.replace(new RegExp(`${fromKeys[k].replace('$', '\\$')}`, 'g'), toKeys[k]); + for (const k in fromKeys) { + dataStr = dataStr.replace(new RegExp(`${fromKeys[k].replace("$", "\\$")}`, "g"), toKeys[k]); + } return dataStr; } public async verify(): Promise { - if (bypassLogin) - return true; + if (bypassLogin) { + return true; + } - const response = await Utils.apiPost(`savedata/system/verify`, JSON.stringify({ clientSessionId: clientSessionId }), undefined, true) + const response = await Utils.apiPost("savedata/system/verify", JSON.stringify({ clientSessionId: clientSessionId }), undefined, true) .then(response => response.json()); if (!response.valid) { @@ -519,26 +536,30 @@ export class GameData { } public clearLocalData(): void { - if (bypassLogin) + if (bypassLogin) { return; + } localStorage.removeItem(`data_${loggedInUser.username}`); - for (let s = 0; s < 5; s++) - localStorage.removeItem(`sessionData${s ? s : ''}_${loggedInUser.username}`); + for (let s = 0; s < 5; s++) { + localStorage.removeItem(`sessionData${s ? s : ""}_${loggedInUser.username}`); + } } public saveSetting(setting: Setting, valueIndex: integer): boolean { let settings: object = {}; - if (localStorage.hasOwnProperty('settings')) - settings = JSON.parse(localStorage.getItem('settings')); + if (localStorage.hasOwnProperty("settings")) { + settings = JSON.parse(localStorage.getItem("settings")); + } setSetting(this.scene, setting as Setting, valueIndex); Object.keys(settingDefaults).forEach(s => { - if (s === setting) + if (s === setting) { settings[s] = valueIndex; + } }); - localStorage.setItem('settings', JSON.stringify(settings)); + localStorage.setItem("settings", JSON.stringify(settings)); return true; } @@ -546,29 +567,33 @@ export class GameData { private loadSettings(): boolean { Object.values(Setting).map(setting => setting as Setting).forEach(setting => setSetting(this.scene, setting, settingDefaults[setting])); - if (!localStorage.hasOwnProperty('settings')) + if (!localStorage.hasOwnProperty("settings")) { return false; + } - const settings = JSON.parse(localStorage.getItem('settings')); + const settings = JSON.parse(localStorage.getItem("settings")); - for (let setting of Object.keys(settings)) + for (const setting of Object.keys(settings)) { setSetting(this.scene, setting as Setting, settings[setting]); + } } public saveTutorialFlag(tutorial: Tutorial, flag: boolean): boolean { let tutorials: object = {}; - if (localStorage.hasOwnProperty('tutorials')) - tutorials = JSON.parse(localStorage.getItem('tutorials')); + if (localStorage.hasOwnProperty("tutorials")) { + tutorials = JSON.parse(localStorage.getItem("tutorials")); + } Object.keys(Tutorial).map(t => t as Tutorial).forEach(t => { const key = Tutorial[t]; - if (key === tutorial) + if (key === tutorial) { tutorials[key] = flag; - else + } else { tutorials[key] ??= false; + } }); - localStorage.setItem('tutorials', JSON.stringify(tutorials)); + localStorage.setItem("tutorials", JSON.stringify(tutorials)); return true; } @@ -577,13 +602,15 @@ export class GameData { const ret: TutorialFlags = {}; Object.values(Tutorial).map(tutorial => tutorial as Tutorial).forEach(tutorial => ret[Tutorial[tutorial]] = false); - if (!localStorage.hasOwnProperty('tutorials')) + if (!localStorage.hasOwnProperty("tutorials")) { return ret; + } - const tutorials = JSON.parse(localStorage.getItem('tutorials')); + const tutorials = JSON.parse(localStorage.getItem("tutorials")); - for (let tutorial of Object.keys(tutorials)) + for (const tutorial of Object.keys(tutorials)) { ret[tutorial] = tutorials[tutorial]; + } return ret; } @@ -603,7 +630,7 @@ export class GameData { score: scene.score, waveIndex: scene.currentBattle.waveIndex, battleType: scene.currentBattle.battleType, - trainer: scene.currentBattle.battleType == BattleType.TRAINER ? new TrainerData(scene.currentBattle.trainer) : null, + trainer: scene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(scene.currentBattle.trainer) : null, gameVersion: scene.game.config.gameVersion, timestamp: new Date().getTime() } as SessionSaveData; @@ -611,8 +638,9 @@ export class GameData { getSession(slotId: integer): Promise { return new Promise(async (resolve, reject) => { - if (slotId < 0) + if (slotId < 0) { return resolve(null); + } const handleSessionData = async (sessionDataStr: string) => { try { const sessionData = this.parseSessionData(sessionDataStr); @@ -623,25 +651,26 @@ export class GameData { } }; - if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`)) { + if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`)) { Utils.apiFetch(`savedata/session?slot=${slotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(async response => { - if (!response.length || response[0] !== '{') { + if (!response.length || response[0] !== "{") { console.error(response); return resolve(null); } - localStorage.setItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`, encrypt(response, bypassLogin)); + localStorage.setItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`, encrypt(response, bypassLogin)); await handleSessionData(response); }); } else { - const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`); - if (sessionData) + const sessionData = localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`); + if (sessionData) { await handleSessionData(decrypt(sessionData, bypassLogin)); - else + } else { return resolve(null); + } } }); } @@ -657,7 +686,7 @@ export class GameData { scene.setSeed(sessionData.seed || scene.game.config.seed[0]); scene.resetSeed(); - console.log('Seed:', scene.seed); + console.log("Seed:", scene.seed); scene.sessionPlayTime = sessionData.playTime || 0; scene.lastSavePlayTime = 0; @@ -667,7 +696,7 @@ export class GameData { const party = scene.getParty(); party.splice(0, party.length); - for (let p of sessionData.party) { + for (const p of sessionData.party) { const pokemon = p.toPokemon(scene) as PlayerPokemon; pokemon.setVisible(false); loadPokemonAssets.push(pokemon.loadAssets()); @@ -684,8 +713,9 @@ export class GameData { scene.money = sessionData.money || 0; scene.updateMoneyText(); - if (scene.money > this.gameStats.highestMoney) + if (scene.money > this.gameStats.highestMoney) { this.gameStats.highestMoney = scene.money; + } scene.score = sessionData.score; scene.updateScoreText(); @@ -702,8 +732,9 @@ export class GameData { sessionData.enemyParty.forEach((enemyData, e) => { const enemyPokemon = enemyData.toPokemon(scene, battleType, e, sessionData.trainer?.variant === TrainerVariant.DOUBLE) as EnemyPokemon; battle.enemyParty[e] = enemyPokemon; - if (battleType === BattleType.WILD) + if (battleType === BattleType.WILD) { battle.seenEnemyPartyMemberIds.add(enemyPokemon.id); + } loadPokemonAssets.push(enemyPokemon.loadAssets()); }); @@ -712,29 +743,31 @@ export class GameData { // TODO //scene.arena.tags = sessionData.arena.tags; - const modifiersModule = await import('../modifier/modifier'); + const modifiersModule = await import("../modifier/modifier"); - for (let modifierData of sessionData.modifiers) { + for (const modifierData of sessionData.modifiers) { const modifier = modifierData.toModifier(scene, modifiersModule[modifierData.className]); - if (modifier) + if (modifier) { scene.addModifier(modifier, true); + } } scene.updateModifiers(true); - for (let enemyModifierData of sessionData.enemyModifiers) { + for (const enemyModifierData of sessionData.enemyModifiers) { const modifier = enemyModifierData.toModifier(scene, modifiersModule[enemyModifierData.className]); - if (modifier) + if (modifier) { scene.addEnemyModifier(modifier, true); + } } scene.updateModifiers(false); Promise.all(loadPokemonAssets).then(() => resolve(true)); }; - if (sessionData) + if (sessionData) { initSessionFromData(sessionData); - else { + } else { this.getSession(slotId) .then(data => initSessionFromData(data)) .catch(err => { @@ -752,23 +785,24 @@ export class GameData { deleteSession(slotId: integer): Promise { return new Promise(resolve => { if (bypassLogin) { - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); return resolve(true); } updateUserInfo().then(success => { - if (success !== null && !success) + if (success !== null && !success) { return resolve(false); + } Utils.apiFetch(`savedata/delete?datatype=${GameDataType.SESSION}&slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { if (response.ok) { loggedInUser.lastSessionSlot = -1; - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); resolve(true); } return response.text(); }).then(error => { if (error) { - if (error.startsWith('session out of date')) { + if (error.startsWith("session out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); } @@ -790,19 +824,19 @@ export class GameData { const seed = sessionData.seed; let daily: string[] = []; - if (sessionData.gameMode == GameModes.DAILY) { - if (localStorage.hasOwnProperty('daily')) { - daily = JSON.parse(atob(localStorage.getItem('daily'))); + if (sessionData.gameMode === GameModes.DAILY) { + if (localStorage.hasOwnProperty("daily")) { + daily = JSON.parse(atob(localStorage.getItem("daily"))); if (daily.includes(seed)) { return resolve(false); } else { daily.push(seed); - localStorage.setItem('daily', btoa(JSON.stringify(daily))); + localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } } else { daily.push(seed); - localStorage.setItem('daily', btoa(JSON.stringify(daily))); + localStorage.setItem("daily", btoa(JSON.stringify(daily))); return resolve(true); } } else { @@ -814,24 +848,26 @@ export class GameData { tryClearSession(scene: BattleScene, slotId: integer): Promise<[success: boolean, newClear: boolean]> { return new Promise<[boolean, boolean]>(resolve => { if (bypassLogin) { - localStorage.removeItem(`sessionData${slotId ? slotId : ''}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`); return resolve([true, true]); } updateUserInfo().then(success => { - if (success !== null && !success) + if (success !== null && !success) { return resolve([false, false]); + } const sessionData = this.getSessionSaveData(scene); Utils.apiPost(`savedata/clear?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, JSON.stringify(sessionData), undefined, true).then(response => { if (response.ok) { loggedInUser.lastSessionSlot = -1; - localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ''}_${loggedInUser.username}`); + localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); } return response.json(); }).then(jsonResponse => { - if (!jsonResponse.error) + if (!jsonResponse.error) { return resolve([true, jsonResponse.success as boolean]); - if (jsonResponse && jsonResponse.error.startsWith('session out of date')) { + } + if (jsonResponse && jsonResponse.error.startsWith("session out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); } @@ -850,33 +886,39 @@ export class GameData { const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); }*/ - if (k === 'party' || k === 'enemyParty') { + if (k === "party" || k === "enemyParty") { const ret: PokemonData[] = []; - if (v === null) + if (v === null) { v = []; - for (let pd of v) + } + for (const pd of v) { ret.push(new PokemonData(pd)); + } return ret; } - if (k === 'trainer') + if (k === "trainer") { return v ? new TrainerData(v) : null; + } - if (k === 'modifiers' || k === 'enemyModifiers') { - const player = k === 'modifiers'; + if (k === "modifiers" || k === "enemyModifiers") { + const player = k === "modifiers"; const ret: PersistentModifierData[] = []; - if (v === null) + if (v === null) { v = []; - for (let md of v) { - if(md?.className === 'ExpBalanceModifier') // Temporarily limit EXP Balance until it gets reworked + } + for (const md of v) { + if(md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); + } ret.push(new PersistentModifierData(md, player)); } return ret; } - if (k === 'arena') + if (k === "arena") { return new ArenaData(v); + } return v; }) as SessionSaveData; @@ -885,11 +927,13 @@ export class GameData { saveAll(scene: BattleScene, skipVerification: boolean = false, sync: boolean = false, useCachedSession: boolean = false, useCachedSystem: boolean = false): Promise { return new Promise(resolve => { Utils.executeIf(!skipVerification, updateUserInfo).then(success => { - if (success !== null && !success) + if (success !== null && !success) { return resolve(false); - if (sync) + } + if (sync) { this.scene.ui.savingIcon.show(); - const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); + } + const sessionData = useCachedSession ? this.parseSessionData(decrypt(localStorage.getItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`), bypassLogin)) : this.getSessionSaveData(scene); const maxIntAttrValue = Math.pow(2, 31); const systemData = useCachedSystem ? this.parseSystemData(decrypt(localStorage.getItem(`data_${loggedInUser.username}`), bypassLogin)) : this.getSystemSaveData(); @@ -901,14 +945,14 @@ export class GameData { clientSessionId: clientSessionId }; - localStorage.setItem(`data_${loggedInUser.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); + localStorage.setItem(`data_${loggedInUser.username}`, encrypt(JSON.stringify(systemData, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), bypassLogin)); - localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ''}_${loggedInUser.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); + localStorage.setItem(`sessionData${scene.sessionSlotId ? scene.sessionSlotId : ""}_${loggedInUser.username}`, encrypt(JSON.stringify(sessionData), bypassLogin)); - console.debug('Session data saved'); + console.debug("Session data saved"); if (!bypassLogin && sync) { - Utils.apiPost('savedata/updateall', JSON.stringify(request, (k: any, v: any) => typeof v === 'bigint' ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), undefined, true) + Utils.apiPost("savedata/updateall", JSON.stringify(request, (k: any, v: any) => typeof v === "bigint" ? v <= maxIntAttrValue ? Number(v) : v.toString() : v), undefined, true) .then(response => response.text()) .then(error => { if (sync) { @@ -916,10 +960,10 @@ export class GameData { this.scene.ui.savingIcon.hide(); } if (error) { - if (error.startsWith('client version out of date')) { + if (error.startsWith("client version out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new OutdatedPhase(this.scene)); - } else if (error.startsWith('session out of date')) { + } else if (error.startsWith("session out of date")) { this.scene.clearPhaseQueue(); this.scene.unshiftPhase(new ReloadSessionPhase(this.scene)); } @@ -943,23 +987,23 @@ export class GameData { const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; const handleData = (dataStr: string) => { switch (dataType) { - case GameDataType.SYSTEM: - dataStr = this.convertSystemDataStr(dataStr, true); - break; + case GameDataType.SYSTEM: + dataStr = this.convertSystemDataStr(dataStr, true); + break; } const encryptedData = AES.encrypt(dataStr, saveKey); - const blob = new Blob([ encryptedData.toString() ], {type: 'text/json'}); - const link = document.createElement('a'); + const blob = new Blob([ encryptedData.toString() ], {type: "text/json"}); + const link = document.createElement("a"); link.href = window.URL.createObjectURL(blob); link.download = `${dataKey}.prsv`; link.click(); link.remove(); }; if (!bypassLogin && dataType < GameDataType.SETTINGS) { - Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? 'system' : 'session'}?clientSessionId=${clientSessionId}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}`, true) + Utils.apiFetch(`savedata/${dataType === GameDataType.SYSTEM ? "system" : "session"}?clientSessionId=${clientSessionId}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ""}`, true) .then(response => response.text()) .then(response => { - if (!response.length || response[0] !== '{') { + if (!response.length || response[0] !== "{") { console.error(response); resolve(false); return; @@ -970,8 +1014,9 @@ export class GameData { }); } else { const data = localStorage.getItem(dataKey); - if (data) + if (data) { handleData(decrypt(data, bypassLogin)); + } resolve(!!data); } }); @@ -980,90 +1025,94 @@ export class GameData { public importData(dataType: GameDataType, slotId: integer = 0): void { const dataKey = `${getDataTypeKey(dataType, slotId)}_${loggedInUser.username}`; - let saveFile: any = document.getElementById('saveFile'); - if (saveFile) + let saveFile: any = document.getElementById("saveFile"); + if (saveFile) { saveFile.remove(); + } - saveFile = document.createElement('input'); - saveFile.id = 'saveFile'; - saveFile.type = 'file'; - saveFile.accept = '.prsv'; - saveFile.style.display = 'none'; - saveFile.addEventListener('change', + saveFile = document.createElement("input"); + saveFile.id = "saveFile"; + saveFile.type = "file"; + saveFile.accept = ".prsv"; + saveFile.style.display = "none"; + saveFile.addEventListener("change", e => { - let reader = new FileReader(); + const reader = new FileReader(); reader.onload = (_ => { - return e => { - let dataStr = AES.decrypt(e.target.result.toString(), saveKey).toString(enc.Utf8); - let valid = false; - try { - switch (dataType) { - case GameDataType.SYSTEM: - dataStr = this.convertSystemDataStr(dataStr); - const systemData = this.parseSystemData(dataStr); - valid = !!systemData.dexData && !!systemData.timestamp; - break; - case GameDataType.SESSION: - const sessionData = this.parseSessionData(dataStr); - valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; - break; - case GameDataType.SETTINGS: - case GameDataType.TUTORIALS: - valid = true; - break; - } - } catch (ex) { - console.error(ex); - } - - let dataName: string; + return e => { + let dataStr = AES.decrypt(e.target.result.toString(), saveKey).toString(enc.Utf8); + let valid = false; + try { switch (dataType) { - case GameDataType.SYSTEM: - dataName = 'save'; - break; - case GameDataType.SESSION: - dataName = 'session'; - break; - case GameDataType.SETTINGS: - dataName = 'settings'; - break; - case GameDataType.TUTORIALS: - dataName = 'tutorials'; - break; + case GameDataType.SYSTEM: + dataStr = this.convertSystemDataStr(dataStr); + const systemData = this.parseSystemData(dataStr); + valid = !!systemData.dexData && !!systemData.timestamp; + break; + case GameDataType.SESSION: + const sessionData = this.parseSessionData(dataStr); + valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; + break; + case GameDataType.SETTINGS: + case GameDataType.TUTORIALS: + valid = true; + break; } + } catch (ex) { + console.error(ex); + } + + let dataName: string; + switch (dataType) { + case GameDataType.SYSTEM: + dataName = "save"; + break; + case GameDataType.SESSION: + dataName = "session"; + break; + case GameDataType.SETTINGS: + dataName = "settings"; + break; + case GameDataType.TUTORIALS: + dataName = "tutorials"; + break; + } - const displayError = (error: string) => this.scene.ui.showText(error, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); - - if (!valid) - return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); - this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); - - if (!bypassLogin && dataType < GameDataType.SETTINGS) { - updateUserInfo().then(success => { - if (!success) - return displayError(`Could not contact the server. Your ${dataName} data could not be imported.`); - Utils.apiPost(`savedata/update?datatype=${dataType}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ''}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, dataStr, undefined, true) - .then(response => response.text()) - .then(error => { - if (error) { - console.error(error); - return displayError(`An error occurred while updating ${dataName} data. Please contact the administrator.`); - } - window.location = window.location; - }); - }); - } else - window.location = window.location; - }, () => { - this.scene.ui.revertMode(); - this.scene.ui.showText(null, 0); - }, false, -98); - }); - }; - })((e.target as any).files[0]); + const displayError = (error: string) => this.scene.ui.showText(error, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); + + if (!valid) { + return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); + } + this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { + this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); + + if (!bypassLogin && dataType < GameDataType.SETTINGS) { + updateUserInfo().then(success => { + if (!success) { + return displayError(`Could not contact the server. Your ${dataName} data could not be imported.`); + } + Utils.apiPost(`savedata/update?datatype=${dataType}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ""}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`, dataStr, undefined, true) + .then(response => response.text()) + .then(error => { + if (error) { + console.error(error); + return displayError(`An error occurred while updating ${dataName} data. Please contact the administrator.`); + } + window.location = window.location; + }); + }); + } else { + window.location = window.location; + } + }, () => { + this.scene.ui.revertMode(); + this.scene.ui.showText(null, 0); + }, false, -98); + }); + }; + })((e.target as any).files[0]); reader.readAsText((e.target as any).files[0]); } @@ -1077,7 +1126,7 @@ export class GameData { private initDexData(): void { const data: DexData = {}; - for (let species of allSpecies) { + for (const species of allSpecies) { data[species.speciesId] = { seenAttr: 0n, caughtAttr: 0n, natureAttr: 0, seenCount: 0, caughtCount: 0, hatchedCount: 0, ivs: [ 0, 0, 0, 0, 0, 0 ] }; @@ -1089,17 +1138,19 @@ export class GameData { this.scene.executeWithSeedOffset(() => { const neutralNatures = [ Nature.HARDY, Nature.DOCILE, Nature.SERIOUS, Nature.BASHFUL, Nature.QUIRKY ]; - for (let s = 0; s < defaultStarterSpecies.length; s++) + for (let s = 0; s < defaultStarterSpecies.length; s++) { defaultStarterNatures.push(Utils.randSeedItem(neutralNatures)); - }, 0, 'default'); + } + }, 0, "default"); for (let ds = 0; ds < defaultStarterSpecies.length; ds++) { - let entry = data[defaultStarterSpecies[ds]] as DexEntry; + const entry = data[defaultStarterSpecies[ds]] as DexEntry; entry.seenAttr = defaultStarterAttr; entry.caughtAttr = defaultStarterAttr; entry.natureAttr = Math.pow(2, defaultStarterNatures[ds] + 1); - for (let i in entry.ivs) + for (const i in entry.ivs) { entry.ivs[i] = 10; + } } this.defaultDexData = Object.assign({}, data); @@ -1111,7 +1162,7 @@ export class GameData { const starterSpeciesIds = Object.keys(speciesStarters).map(k => parseInt(k) as Species); - for (let speciesId of starterSpeciesIds) { + for (const speciesId of starterSpeciesIds) { starterData[speciesId] = { moveset: null, eggMoves: 0, @@ -1133,14 +1184,16 @@ export class GameData { if (incrementCount) { dexEntry.seenCount++; this.gameStats.pokemonSeen++; - if (!trainer && pokemon.species.subLegendary) + if (!trainer && pokemon.species.subLegendary) { this.gameStats.subLegendaryPokemonSeen++; - else if (!trainer && pokemon.species.legendary) + } else if (!trainer && pokemon.species.legendary) { this.gameStats.legendaryPokemonSeen++; - else if (!trainer && pokemon.species.mythical) + } else if (!trainer && pokemon.species.mythical) { this.gameStats.mythicalPokemonSeen++; - if (!trainer && pokemon.isShiny()) + } + if (!trainer && pokemon.isShiny()) { this.gameStats.shinyPokemonSeen++; + } } } @@ -1153,8 +1206,9 @@ export class GameData { const dexEntry = this.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr; const formIndex = pokemon.formIndex; - if (noStarterFormKeys.includes(pokemon.getFormKey())) + if (noStarterFormKeys.includes(pokemon.getFormKey())) { pokemon.formIndex = 0; + } const dexAttr = pokemon.getDexAttr(); pokemon.formIndex = formIndex; dexEntry.caughtAttr |= dexAttr; @@ -1173,44 +1227,51 @@ export class GameData { if (!fromEgg) { dexEntry.caughtCount++; this.gameStats.pokemonCaught++; - if (pokemon.species.subLegendary) + if (pokemon.species.subLegendary) { this.gameStats.subLegendaryPokemonCaught++; - else if (pokemon.species.legendary) + } else if (pokemon.species.legendary) { this.gameStats.legendaryPokemonCaught++; - else if (pokemon.species.mythical) + } else if (pokemon.species.mythical) { this.gameStats.mythicalPokemonCaught++; - if (pokemon.isShiny()) + } + if (pokemon.isShiny()) { this.gameStats.shinyPokemonCaught++; + } } else { dexEntry.hatchedCount++; this.gameStats.pokemonHatched++; - if (pokemon.species.subLegendary) + if (pokemon.species.subLegendary) { this.gameStats.subLegendaryPokemonHatched++; - else if (pokemon.species.legendary) + } else if (pokemon.species.legendary) { this.gameStats.legendaryPokemonHatched++; - else if (pokemon.species.mythical) + } else if (pokemon.species.mythical) { this.gameStats.mythicalPokemonHatched++; - if (pokemon.isShiny()) + } + if (pokemon.isShiny()) { this.gameStats.shinyPokemonHatched++; + } } - if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg)) + if (!hasPrevolution && (!pokemon.scene.gameMode.isDaily || hasNewAttr || fromEgg)) { this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, pokemon.variant || 0) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); + } } const checkPrevolution = () => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; return this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg).then(() => resolve()); - } else + } else { resolve(); + } }; if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { - this.scene.playSound('level_up_fanfare'); + this.scene.playSound("level_up_fanfare"); this.scene.ui.showText(`${species.name} has been\nadded as a starter!`, null, () => checkPrevolution(), null, true); - } else + } else { checkPrevolution(); + } }); } @@ -1221,21 +1282,27 @@ export class GameData { this.starterData[speciesIdToIncrement].classicWinCount = 0; } - if (!this.starterData[speciesIdToIncrement].classicWinCount) + if (!this.starterData[speciesIdToIncrement].classicWinCount) { this.scene.gameData.gameStats.ribbonsOwned++; + } const ribbonsInStats: integer = this.scene.gameData.gameStats.ribbonsOwned; - if (ribbonsInStats >= 100) + if (ribbonsInStats >= 100) { this.scene.validateAchv(achvs._100_RIBBONS); - if (ribbonsInStats >= 75) + } + if (ribbonsInStats >= 75) { this.scene.validateAchv(achvs._75_RIBBONS); - if (ribbonsInStats >= 50) + } + if (ribbonsInStats >= 50) { this.scene.validateAchv(achvs._50_RIBBONS); - if (ribbonsInStats >= 25) + } + if (ribbonsInStats >= 25) { this.scene.validateAchv(achvs._25_RIBBONS); - if (ribbonsInStats >= 10) + } + if (ribbonsInStats >= 10) { this.scene.validateAchv(achvs._10_RIBBONS); + } return ++this.starterData[speciesIdToIncrement].classicWinCount; } @@ -1253,8 +1320,9 @@ export class GameData { return; } - if (!this.starterData[speciesId].eggMoves) + if (!this.starterData[speciesId].eggMoves) { this.starterData[speciesId].eggMoves = 0; + } const value = Math.pow(2, eggMoveIndex); @@ -1265,8 +1333,8 @@ export class GameData { this.starterData[speciesId].eggMoves |= value; - this.scene.playSound('level_up_fanfare'); - this.scene.ui.showText(`${eggMoveIndex === 3 ? 'Rare ' : ''}Egg Move unlocked: ${allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name}`, null, () => resolve(true), null, true); + this.scene.playSound("level_up_fanfare"); + this.scene.ui.showText(`${eggMoveIndex === 3 ? "Rare " : ""}Egg Move unlocked: ${allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name}`, null, () => resolve(true), null, true); }); } @@ -1276,20 +1344,23 @@ export class GameData { dexEntry = this.scene.gameData.dexData[speciesId]; const dexIvs = dexEntry.ivs; for (let i = 0; i < dexIvs.length; i++) { - if (dexIvs[i] < ivs[i]) + if (dexIvs[i] < ivs[i]) { dexIvs[i] = ivs[i]; + } } - if (dexIvs.filter(iv => iv === 31).length === 6) + if (dexIvs.filter(iv => iv === 31).length === 6) { this.scene.validateAchv(achvs.PERFECT_IVS); + } } while (pokemonPrevolutions.hasOwnProperty(speciesId) && (speciesId = pokemonPrevolutions[speciesId])); } getSpeciesCount(dexEntryPredicate: (entry: DexEntry) => boolean): integer { const dexKeys = Object.keys(this.dexData); let speciesCount = 0; - for (let s of dexKeys) { - if (dexEntryPredicate(this.dexData[s])) + for (const s of dexKeys) { + if (dexEntryPredicate(this.dexData[s])) { speciesCount++; + } } return speciesCount; } @@ -1297,10 +1368,11 @@ export class GameData { getStarterCount(dexEntryPredicate: (entry: DexEntry) => boolean): integer { const starterKeys = Object.keys(speciesStarters); let starterCount = 0; - for (let s of starterKeys) { + for (const s of starterKeys) { const starterDexEntry = this.dexData[s]; - if (dexEntryPredicate(starterDexEntry)) + if (dexEntryPredicate(starterDexEntry)) { starterCount++; + } } return starterCount; } @@ -1342,8 +1414,9 @@ export class GameData { getSpeciesDefaultNature(species: PokemonSpecies): Nature { const dexEntry = this.dexData[species.speciesId]; for (let n = 0; n < 25; n++) { - if (dexEntry.natureAttr & Math.pow(2, n + 1)) + if (dexEntry.natureAttr & Math.pow(2, n + 1)) { return n as Nature; + } } return 0 as Nature; } @@ -1357,10 +1430,11 @@ export class GameData { } getNaturesForAttr(natureAttr: integer): Nature[] { - let ret: Nature[] = []; + const ret: Nature[] = []; for (let n = 0; n < 25; n++) { - if (natureAttr & Math.pow(2, n + 1)) + if (natureAttr & Math.pow(2, n + 1)) { ret.push(n); + } } return ret; } @@ -1370,25 +1444,29 @@ export class GameData { let value = baseValue; const decrementValue = (value: number) => { - if (value > 1) + if (value > 1) { value--; - else + } else { value /= 2; + } return value; - } + }; - for (let v = 0; v < this.starterData[speciesId].valueReduction; v++) + for (let v = 0; v < this.starterData[speciesId].valueReduction; v++) { value = decrementValue(value); + } return value; } getFormIndex(attr: bigint): integer { - if (!attr || attr < DexAttr.DEFAULT_FORM) + if (!attr || attr < DexAttr.DEFAULT_FORM) { return 0; + } let f = 0; - while (!(attr & this.getFormAttr(f))) + while (!(attr & this.getFormAttr(f))) { f++; + } return f; } @@ -1397,12 +1475,14 @@ export class GameData { } consolidateDexData(dexData: DexData): void { - for (let k of Object.keys(dexData)) { + for (const k of Object.keys(dexData)) { const entry = dexData[k] as DexEntry; - if (!entry.hasOwnProperty('hatchedCount')) + if (!entry.hasOwnProperty("hatchedCount")) { entry.hatchedCount = 0; - if (!entry.hasOwnProperty('natureAttr') || (entry.caughtAttr && !entry.natureAttr)) + } + if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) { entry.natureAttr = this.defaultDexData[k].natureAttr || Math.pow(2, Utils.randInt(25, 1)); + } } } @@ -1410,18 +1490,21 @@ export class GameData { const starterIds = Object.keys(this.starterData).map(s => parseInt(s) as Species); const starterData = initialStarterData || systemData.starterData; const dexData = systemData.dexData; - for (let s of starterIds) { + for (const s of starterIds) { const dexAttr = dexData[s].caughtAttr; starterData[s].abilityAttr = (dexAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) | (dexAttr & DexAttr.VARIANT_2 ? AbilityAttr.ABILITY_2 : 0) | (dexAttr & DexAttr.VARIANT_3 ? AbilityAttr.ABILITY_HIDDEN : 0); if (dexAttr) { - if (!(dexAttr & DexAttr.DEFAULT_VARIANT)) + if (!(dexAttr & DexAttr.DEFAULT_VARIANT)) { dexData[s].caughtAttr ^= DexAttr.DEFAULT_VARIANT; - if (dexAttr & DexAttr.VARIANT_2) + } + if (dexAttr & DexAttr.VARIANT_2) { dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - if (dexAttr & DexAttr.VARIANT_3) + } + if (dexAttr & DexAttr.VARIANT_3) { dexData[s].caughtAttr ^= DexAttr.VARIANT_3; + } } } } @@ -1431,34 +1514,39 @@ export class GameData { const starterData = systemData.starterData; const dexData = systemData.dexData; if (starterIds.find(id => (dexData[id].caughtAttr & DexAttr.VARIANT_2 || dexData[id].caughtAttr & DexAttr.VARIANT_3) && !variantData[id])) { - for (let s of starterIds) { + for (const s of starterIds) { const species = getPokemonSpecies(s); if (variantData[s]) { const tempCaughtAttr = dexData[s].caughtAttr; let seenVariant2 = false; let seenVariant3 = false; - let checkEvoSpecies = (es: Species) => { + const checkEvoSpecies = (es: Species) => { seenVariant2 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_2); seenVariant3 ||= !!(dexData[es].seenAttr & DexAttr.VARIANT_3); if (pokemonEvolutions.hasOwnProperty(es)) { - for (let pe of pokemonEvolutions[es]) + for (const pe of pokemonEvolutions[es]) { checkEvoSpecies(pe.speciesId); + } } }; checkEvoSpecies(s); - if (dexData[s].caughtAttr & DexAttr.VARIANT_2 && !seenVariant2) + if (dexData[s].caughtAttr & DexAttr.VARIANT_2 && !seenVariant2) { dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - if (dexData[s].caughtAttr & DexAttr.VARIANT_3 && !seenVariant3) + } + if (dexData[s].caughtAttr & DexAttr.VARIANT_3 && !seenVariant3) { dexData[s].caughtAttr ^= DexAttr.VARIANT_3; + } starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); } else { const tempCaughtAttr = dexData[s].caughtAttr; - if (dexData[s].caughtAttr & DexAttr.VARIANT_2) + if (dexData[s].caughtAttr & DexAttr.VARIANT_2) { dexData[s].caughtAttr ^= DexAttr.VARIANT_2; - if (dexData[s].caughtAttr & DexAttr.VARIANT_3) + } + if (dexData[s].caughtAttr & DexAttr.VARIANT_3) { dexData[s].caughtAttr ^= DexAttr.VARIANT_3; + } starterData[s].abilityAttr = (tempCaughtAttr & DexAttr.DEFAULT_VARIANT ? AbilityAttr.ABILITY_1 : 0) | (tempCaughtAttr & DexAttr.VARIANT_2 && species.ability2 ? AbilityAttr.ABILITY_2 : 0) | (tempCaughtAttr & DexAttr.VARIANT_3 && species.abilityHidden ? AbilityAttr.ABILITY_HIDDEN : 0); @@ -1468,8 +1556,9 @@ export class GameData { } fixStarterData(systemData: SystemSaveData): void { - for (let starterId of defaultStarterSpecies) + for (const starterId of defaultStarterSpecies) { systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; + } } fixLegendaryStats(systemData: SystemSaveData): void { @@ -1489,4 +1578,4 @@ export class GameData { systemData.gameStats.legendaryPokemonSeen = Math.max(systemData.gameStats.legendaryPokemonSeen, systemData.gameStats.legendaryPokemonCaught); systemData.gameStats.mythicalPokemonSeen = Math.max(systemData.gameStats.mythicalPokemonSeen, systemData.gameStats.mythicalPokemonCaught); } -} \ No newline at end of file +} diff --git a/src/system/game-speed.ts b/src/system/game-speed.ts index 9d0d4c131bd6..e4af04bc2bee 100644 --- a/src/system/game-speed.ts +++ b/src/system/game-speed.ts @@ -1,6 +1,6 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import FadeIn from 'phaser3-rex-plugins/plugins/audio/fade/FadeIn'; -import FadeOut from 'phaser3-rex-plugins/plugins/audio/fade/FadeOut'; +import FadeIn from "phaser3-rex-plugins/plugins/audio/fade/FadeIn"; +import FadeOut from "phaser3-rex-plugins/plugins/audio/fade/FadeOut"; import BattleScene from "../battle-scene"; import * as Utils from "../utils"; @@ -11,61 +11,78 @@ export function initGameSpeed() { const thisArg = this as BattleScene; const transformValue = (value: number | Utils.FixedInt): number => { - if (value instanceof Utils.FixedInt) + if (value instanceof Utils.FixedInt) { return (value as Utils.FixedInt).value; + } return thisArg.gameSpeed === 1 ? value : Math.ceil(value /= thisArg.gameSpeed); }; const originalAddEvent = this.time.addEvent; this.time.addEvent = function (config: Phaser.Time.TimerEvent | Phaser.Types.Time.TimerEventConfig) { - if (config.delay) + if (config.delay) { config.delay = transformValue(config.delay); + } return originalAddEvent.apply(this, [ config ]); }; const originalTweensAdd = this.tweens.add; this.tweens.add = function (config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain) { - if (config.duration) + if (config.duration) { config.duration = transformValue(config.duration); - if (config.delay) + } + if (config.delay) { config.delay = transformValue(config.delay); - if (config.repeatDelay) + } + if (config.repeatDelay) { config.repeatDelay = transformValue(config.repeatDelay); - if (config.loopDelay) + } + if (config.loopDelay) { config.loopDelay = transformValue(config.loopDelay); - if (config.hold) + } + if (config.hold) { config.hold = transformValue(config.hold); + } return originalTweensAdd.apply(this, [ config ]); }; const originalTweensChain = this.tweens.chain; this.tweens.chain = function (config: Phaser.Types.Tweens.TweenChainBuilderConfig): Phaser.Tweens.TweenChain { if (config.tweens) { config.tweens.forEach(t => { - if (t.duration) + if (t.duration) { t.duration = transformValue(t.duration); - if (t.delay) + } + if (t.delay) { t.delay = transformValue(t.delay); - if (t.repeatDelay) + } + if (t.repeatDelay) { t.repeatDelay = transformValue(t.repeatDelay); - if (t.loopDelay) + } + if (t.loopDelay) { t.loopDelay = transformValue(t.loopDelay); - if (t.hold) + } + if (t.hold) { t.hold = transformValue(t.hold); + } }); } return originalTweensChain.apply(this, [ config ]); }; const originalAddCounter = this.tweens.addCounter; this.tweens.addCounter = function (config: Phaser.Types.Tweens.NumberTweenBuilderConfig) { - if (config.duration) + if (config.duration) { config.duration = transformValue(config.duration); - if (config.delay) + } + if (config.delay) { config.delay = transformValue(config.delay); - if (config.repeatDelay) + } + if (config.repeatDelay) { config.repeatDelay = transformValue(config.repeatDelay); - if (config.loopDelay) + } + if (config.loopDelay) { config.loopDelay = transformValue(config.loopDelay); - if (config.hold) + } + if (config.hold) { config.hold = transformValue(config.hold); + } return originalAddCounter.apply(this, [ config ]); }; @@ -85,4 +102,4 @@ export function initGameSpeed() { endVolume?: number, startVolume?: number ) => originalFadeIn(scene, sound, transformValue(duration), endVolume, startVolume)) as FadeIn; -} \ No newline at end of file +} diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index 0f83c79be45a..d79206d89dfd 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -18,10 +18,12 @@ export default class ModifierData { this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; this.typeGeneratorId = sourceModifier ? sourceModifier.type.generatorId : source.typeGeneratorId; if (sourceModifier) { - if ('getPregenArgs' in source.type) + if ("getPregenArgs" in source.type) { this.typePregenArgs = (source.type as GeneratedPersistentModifierType).getPregenArgs(); - } else if (source.typePregenArgs) + } + } else if (source.typePregenArgs) { this.typePregenArgs = source.typePregenArgs; + } this.args = sourceModifier ? sourceModifier.getArgs() : source.args || []; this.stackCount = source.stackCount; this.className = sourceModifier ? sourceModifier.constructor.name : source.className; @@ -29,21 +31,24 @@ export default class ModifierData { toModifier(scene: BattleScene, constructor: any): PersistentModifier { const typeFunc = getModifierTypeFuncById(this.typeId); - if (!typeFunc) + if (!typeFunc) { return null; + } try { let type = typeFunc(); type.id = this.typeId; type.generatorId = this.typeGeneratorId; - if (type instanceof ModifierTypeGenerator) + if (type instanceof ModifierTypeGenerator) { type = (type as ModifierTypeGenerator).generateType(this.player ? scene.getParty() : scene.getEnemyField(), this.typePregenArgs); + } const ret = Reflect.construct(constructor, ([ type ] as any[]).concat(this.args).concat(this.stackCount)) as PersistentModifier; - if (ret.stackCount > ret.getMaxStackCount(scene)) + if (ret.stackCount > ret.getMaxStackCount(scene)) { ret.stackCount = ret.getMaxStackCount(scene); + } return ret; } catch (err) { @@ -51,4 +56,4 @@ export default class ModifierData { return null; } } -} \ No newline at end of file +} diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index dfbb9be570b2..6ec180922e26 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -11,7 +11,7 @@ import Pokemon, { EnemyPokemon, PokemonMove, PokemonSummonData } from "../field/ import { TrainerSlot } from "../data/trainer-config"; import { Moves } from "../data/enums/moves"; import { Variant } from "#app/data/variant"; -import { loadBattlerTag } from '../data/battler-tags'; +import { loadBattlerTag } from "../data/battler-tags"; export default class PokemonData { public id: integer; @@ -66,11 +66,13 @@ export default class PokemonData { this.pokeball = source.pokeball; this.level = source.level; this.exp = source.exp; - if (!forHistory) + if (!forHistory) { this.levelExp = source.levelExp; + } this.gender = source.gender; - if (!forHistory) + if (!forHistory) { this.hp = source.hp; + } this.stats = source.stats; this.ivs = source.ivs; this.nature = source.nature !== undefined ? source.nature : 0 as Nature; @@ -79,8 +81,9 @@ export default class PokemonData { this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; this.luck = source.luck !== undefined ? source.luck : (source.shiny ? (source.variant + 1) : 0); - if (!forHistory) + if (!forHistory) { this.pauseEvolutions = !!source.pauseEvolutions; + } this.pokerus = !!source.pokerus; this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; @@ -91,15 +94,17 @@ export default class PokemonData { this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); - if (!forHistory) + if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); + } if (sourcePokemon) { this.moveset = sourcePokemon.moveset; if (!forHistory) { this.status = sourcePokemon.status; - if (this.player) + if (this.player) { this.summonData = sourcePokemon.summonData; + } } } else { this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); @@ -121,10 +126,11 @@ export default class PokemonData { this.summonData.moveset = source.summonData.moveset?.map(m => PokemonMove.loadMove(m)); this.summonData.types = source.summonData.types; - if (source.summonData.tags) + if (source.summonData.tags) { this.summonData.tags = source.summonData.tags?.map(t => loadBattlerTag(t)); - else + } else { this.summonData.tags = []; + } } } } @@ -134,8 +140,9 @@ export default class PokemonData { const ret: Pokemon = this.player ? scene.addPlayerPokemon(species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this) : scene.addEnemyPokemon(species, this.level, battleType === BattleType.TRAINER ? !double || !(partyMemberIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER : TrainerSlot.NONE, this.boss, this); - if (this.summonData) + if (this.summonData) { ret.primeSummonData(this.summonData); + } return ret; } -} \ No newline at end of file +} diff --git a/src/system/session-history.ts b/src/system/session-history.ts index ed991190369e..85a300110d9f 100644 --- a/src/system/session-history.ts +++ b/src/system/session-history.ts @@ -19,4 +19,4 @@ export interface SessionHistory { waveIndex: integer; gameVersion: string; timestamp: integer; -} \ No newline at end of file +} diff --git a/src/system/settings.ts b/src/system/settings.ts index 403983efbe1f..c0ae94969773 100644 --- a/src/system/settings.ts +++ b/src/system/settings.ts @@ -40,28 +40,28 @@ export interface SettingDefaults { } export const settingOptions: SettingOptions = { - [Setting.Game_Speed]: ['1x', '1.25x', '1.5x', '2x', '2.5x', '3x', '4x', '5x'], - [Setting.Master_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), - [Setting.BGM_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), - [Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : 'Mute'), - [Setting.Language]: ['English', 'Change'], - [Setting.Damage_Numbers]: ['Off', 'Simple', 'Fancy'], - [Setting.UI_Theme]: ['Default', 'Legacy'], + [Setting.Game_Speed]: ["1x", "1.25x", "1.5x", "2x", "2.5x", "3x", "4x", "5x"], + [Setting.Master_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : "Mute"), + [Setting.BGM_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : "Mute"), + [Setting.SE_Volume]: new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : "Mute"), + [Setting.Language]: ["English", "Change"], + [Setting.Damage_Numbers]: ["Off", "Simple", "Fancy"], + [Setting.UI_Theme]: ["Default", "Legacy"], [Setting.Window_Type]: new Array(5).fill(null).map((_, i) => (i + 1).toString()), - [Setting.Tutorials]: ['Off', 'On'], - [Setting.Enable_Retries]: ['Off', 'On'], - [Setting.Sprite_Set]: ['Consistent', 'Mixed Animated'], - [Setting.Move_Animations]: ['Off', 'On'], - [Setting.Show_Stats_on_Level_Up]: ['Off', 'On'], - [Setting.EXP_Gains_Speed]: ['Normal', 'Fast', 'Faster', 'Skip'], - [Setting.EXP_Party_Display]: ['Normal', 'Level Up Notification', 'Skip'], - [Setting.HP_Bar_Speed]: ['Normal', 'Fast', 'Faster', 'Instant'], - [Setting.Fusion_Palette_Swaps]: ['Off', 'On'], - [Setting.Player_Gender]: ['Boy', 'Girl'], - [Setting.Gamepad_Support]: ['Auto', 'Disabled'], - [Setting.Swap_A_and_B]: ['Enabled', 'Disabled'], - [Setting.Touch_Controls]: ['Auto', 'Disabled'], - [Setting.Vibration]: ['Auto', 'Disabled'] + [Setting.Tutorials]: ["Off", "On"], + [Setting.Enable_Retries]: ["Off", "On"], + [Setting.Sprite_Set]: ["Consistent", "Mixed Animated"], + [Setting.Move_Animations]: ["Off", "On"], + [Setting.Show_Stats_on_Level_Up]: ["Off", "On"], + [Setting.EXP_Gains_Speed]: ["Normal", "Fast", "Faster", "Skip"], + [Setting.EXP_Party_Display]: ["Normal", "Level Up Notification", "Skip"], + [Setting.HP_Bar_Speed]: ["Normal", "Fast", "Faster", "Instant"], + [Setting.Fusion_Palette_Swaps]: ["Off", "On"], + [Setting.Player_Gender]: ["Boy", "Girl"], + [Setting.Gamepad_Support]: ["Auto", "Disabled"], + [Setting.Swap_A_and_B]: ["Enabled", "Disabled"], + [Setting.Touch_Controls]: ["Auto", "Disabled"], + [Setting.Vibration]: ["Auto", "Disabled"] }; export const settingDefaults: SettingDefaults = { @@ -93,148 +93,151 @@ export const reloadSettings: Setting[] = [Setting.UI_Theme, Setting.Language, Se export function setSetting(scene: BattleScene, setting: Setting, value: integer): boolean { switch (setting) { - case Setting.Game_Speed: - scene.gameSpeed = parseFloat(settingOptions[setting][value].replace('x', '')); - break; - case Setting.Master_Volume: - scene.masterVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; - scene.updateSoundVolume(); - break; - case Setting.BGM_Volume: - scene.bgmVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; - scene.updateSoundVolume(); - break; - case Setting.SE_Volume: - scene.seVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; - scene.updateSoundVolume(); - break; - case Setting.Damage_Numbers: - scene.damageNumbersMode = value; - break; - case Setting.UI_Theme: - scene.uiTheme = value; - break; - case Setting.Window_Type: - updateWindowType(scene, parseInt(settingOptions[setting][value])); - break; - case Setting.Tutorials: - scene.enableTutorials = settingOptions[setting][value] === 'On'; - break; - case Setting.Enable_Retries: - scene.enableRetries = settingOptions[setting][value] === 'On'; - break; - case Setting.Sprite_Set: - scene.experimentalSprites = !!value; - if (value) - scene.initExpSprites(); - break; - case Setting.Move_Animations: - scene.moveAnimations = settingOptions[setting][value] === 'On'; - break; - case Setting.Show_Stats_on_Level_Up: - scene.showLevelUpStats = settingOptions[setting][value] === 'On'; - break; - case Setting.EXP_Gains_Speed: - scene.expGainsSpeed = value; - break; - case Setting.EXP_Party_Display: - scene.expParty = value; - break; - case Setting.HP_Bar_Speed: - scene.hpBarSpeed = value; - break; - case Setting.Fusion_Palette_Swaps: - scene.fusionPaletteSwaps = !!value; - break; - case Setting.Player_Gender: - if (scene.gameData) { - const female = settingOptions[setting][value] === 'Girl'; - scene.gameData.gender = female ? PlayerGender.FEMALE : PlayerGender.MALE; - scene.trainer.setTexture(scene.trainer.texture.key.replace(female ? 'm' : 'f', female ? 'f' : 'm')); - } else - return false; - break; - case Setting.Gamepad_Support: - // if we change the value of the gamepad support, we call a method in the inputController to - // activate or deactivate the controller listener - scene.inputController.setGamepadSupport(settingOptions[setting][value] !== 'Disabled'); - break; - case Setting.Swap_A_and_B: - scene.abSwapped = settingOptions[setting][value] !== 'Disabled'; - break; - case Setting.Touch_Controls: - scene.enableTouchControls = settingOptions[setting][value] !== 'Disabled' && hasTouchscreen(); - const touchControls = document.getElementById('touchControls'); - if (touchControls) - touchControls.classList.toggle('visible', scene.enableTouchControls); - break; - case Setting.Vibration: - scene.enableVibration = settingOptions[setting][value] !== 'Disabled' && hasTouchscreen(); - break; - case Setting.Language: - if (value) { - if (scene.ui) { - const cancelHandler = () => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(Object.values(Setting).indexOf(Setting.Language), 0, true); - }; - const changeLocaleHandler = (locale: string): boolean => { - try { - i18next.changeLanguage(locale); - localStorage.setItem('prLang', locale); - cancelHandler(); - scene.reset(true, false, true); - return true; - } catch (error) { - console.error('Error changing locale:', error); - return false; + case Setting.Game_Speed: + scene.gameSpeed = parseFloat(settingOptions[setting][value].replace("x", "")); + break; + case Setting.Master_Volume: + scene.masterVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; + scene.updateSoundVolume(); + break; + case Setting.BGM_Volume: + scene.bgmVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; + scene.updateSoundVolume(); + break; + case Setting.SE_Volume: + scene.seVolume = value ? parseInt(settingOptions[setting][value]) * 0.01 : 0; + scene.updateSoundVolume(); + break; + case Setting.Damage_Numbers: + scene.damageNumbersMode = value; + break; + case Setting.UI_Theme: + scene.uiTheme = value; + break; + case Setting.Window_Type: + updateWindowType(scene, parseInt(settingOptions[setting][value])); + break; + case Setting.Tutorials: + scene.enableTutorials = settingOptions[setting][value] === "On"; + break; + case Setting.Enable_Retries: + scene.enableRetries = settingOptions[setting][value] === "On"; + break; + case Setting.Sprite_Set: + scene.experimentalSprites = !!value; + if (value) { + scene.initExpSprites(); + } + break; + case Setting.Move_Animations: + scene.moveAnimations = settingOptions[setting][value] === "On"; + break; + case Setting.Show_Stats_on_Level_Up: + scene.showLevelUpStats = settingOptions[setting][value] === "On"; + break; + case Setting.EXP_Gains_Speed: + scene.expGainsSpeed = value; + break; + case Setting.EXP_Party_Display: + scene.expParty = value; + break; + case Setting.HP_Bar_Speed: + scene.hpBarSpeed = value; + break; + case Setting.Fusion_Palette_Swaps: + scene.fusionPaletteSwaps = !!value; + break; + case Setting.Player_Gender: + if (scene.gameData) { + const female = settingOptions[setting][value] === "Girl"; + scene.gameData.gender = female ? PlayerGender.FEMALE : PlayerGender.MALE; + scene.trainer.setTexture(scene.trainer.texture.key.replace(female ? "m" : "f", female ? "f" : "m")); + } else { + return false; + } + break; + case Setting.Gamepad_Support: + // if we change the value of the gamepad support, we call a method in the inputController to + // activate or deactivate the controller listener + scene.inputController.setGamepadSupport(settingOptions[setting][value] !== "Disabled"); + break; + case Setting.Swap_A_and_B: + scene.abSwapped = settingOptions[setting][value] !== "Disabled"; + break; + case Setting.Touch_Controls: + scene.enableTouchControls = settingOptions[setting][value] !== "Disabled" && hasTouchscreen(); + const touchControls = document.getElementById("touchControls"); + if (touchControls) { + touchControls.classList.toggle("visible", scene.enableTouchControls); + } + break; + case Setting.Vibration: + scene.enableVibration = settingOptions[setting][value] !== "Disabled" && hasTouchscreen(); + break; + case Setting.Language: + if (value) { + if (scene.ui) { + const cancelHandler = () => { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(Object.values(Setting).indexOf(Setting.Language), 0, true); + }; + const changeLocaleHandler = (locale: string): boolean => { + try { + i18next.changeLanguage(locale); + localStorage.setItem("prLang", locale); + cancelHandler(); + scene.reset(true, false, true); + return true; + } catch (error) { + console.error("Error changing locale:", error); + return false; + } + }; + scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: [ + { + label: "English", + handler: () => changeLocaleHandler("en") + }, + { + label: "Español", + handler: () => changeLocaleHandler("es") + }, + { + label: "Italiano", + handler: () => changeLocaleHandler("it") + }, + { + label: "Français", + handler: () => changeLocaleHandler("fr") + }, + { + label: "Deutsch", + handler: () => changeLocaleHandler("de") + }, + { + label: "Português (BR)", + handler: () => changeLocaleHandler("pt_BR") + }, + { + label: "简体中文", + handler: () => changeLocaleHandler("zh_CN") + }, + { + label: "繁體中文", + handler: () => changeLocaleHandler("zh_TW") + }, + { + label: "Cancel", + handler: () => cancelHandler() } - }; - scene.ui.setOverlayMode(Mode.OPTION_SELECT, { - options: [ - { - label: 'English', - handler: () => changeLocaleHandler('en') - }, - { - label: 'Español', - handler: () => changeLocaleHandler('es') - }, - { - label: 'Italiano', - handler: () => changeLocaleHandler('it') - }, - { - label: 'Français', - handler: () => changeLocaleHandler('fr') - }, - { - label: 'Deutsch', - handler: () => changeLocaleHandler('de') - }, - { - label: 'Português (BR)', - handler: () => changeLocaleHandler('pt_BR') - }, - { - label: '简体中文', - handler: () => changeLocaleHandler('zh_CN') - }, - { - label: '繁體中文', - handler: () => changeLocaleHandler('zh_TW') - }, - { - label: 'Cancel', - handler: () => cancelHandler() - } - ], - maxOptions: 7 - }); - return false; - } + ], + maxOptions: 7 + }); + return false; } - break; + } + break; } return true; diff --git a/src/system/trainer-data.ts b/src/system/trainer-data.ts index bf1cc9c9a4c4..d4bb3cee94d8 100644 --- a/src/system/trainer-data.ts +++ b/src/system/trainer-data.ts @@ -12,7 +12,7 @@ export default class TrainerData { constructor(source: Trainer | any) { const sourceTrainer = source instanceof Trainer ? source as Trainer : null; this.trainerType = sourceTrainer ? sourceTrainer.config.trainerType : source.trainerType; - this.variant = source.hasOwnProperty('variant') ? source.variant : source.female ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; + this.variant = source.hasOwnProperty("variant") ? source.variant : source.female ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT; this.partyTemplateIndex = source.partyMemberTemplateIndex; this.name = source.name; this.partnerName = source.partnerName; @@ -21,4 +21,4 @@ export default class TrainerData { toTrainer(scene: BattleScene): Trainer { return new Trainer(scene, this.trainerType, this.variant, this.partyTemplateIndex, this.name, this.partnerName); } -} \ No newline at end of file +} diff --git a/src/system/unlockables.ts b/src/system/unlockables.ts index a186b2bec022..f94e29ff0396 100644 --- a/src/system/unlockables.ts +++ b/src/system/unlockables.ts @@ -8,11 +8,11 @@ export enum Unlockables { export function getUnlockableName(unlockable: Unlockables) { switch (unlockable) { - case Unlockables.ENDLESS_MODE: - return `${gameModes[GameModes.ENDLESS].getName()} Mode`; - case Unlockables.MINI_BLACK_HOLE: - return 'Mini Black Hole'; - case Unlockables.SPLICED_ENDLESS_MODE: - return `${gameModes[GameModes.SPLICED_ENDLESS].getName()} Mode`; + case Unlockables.ENDLESS_MODE: + return `${gameModes[GameModes.ENDLESS].getName()} Mode`; + case Unlockables.MINI_BLACK_HOLE: + return "Mini Black Hole"; + case Unlockables.SPLICED_ENDLESS_MODE: + return `${gameModes[GameModes.SPLICED_ENDLESS].getName()} Mode`; } -} \ No newline at end of file +} diff --git a/src/system/voucher.ts b/src/system/voucher.ts index 507c14b5bfe8..b3d9cdd01f7c 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -1,8 +1,7 @@ import BattleScene from "../battle-scene"; import { TrainerType } from "../data/enums/trainer-type"; -import { ModifierTier } from "../modifier/modifier-tier"; import { Achv, AchvTier, achvs } from "./achv"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export enum VoucherType { REGULAR, @@ -38,41 +37,41 @@ export class Voucher { getTier(): AchvTier { switch (this.voucherType) { - case VoucherType.REGULAR: - return AchvTier.COMMON; - case VoucherType.PLUS: - return AchvTier.GREAT; - case VoucherType.PREMIUM: - return AchvTier.ULTRA; - case VoucherType.GOLDEN: - return AchvTier.ROGUE; + case VoucherType.REGULAR: + return AchvTier.COMMON; + case VoucherType.PLUS: + return AchvTier.GREAT; + case VoucherType.PREMIUM: + return AchvTier.ULTRA; + case VoucherType.GOLDEN: + return AchvTier.ROGUE; } } } export function getVoucherTypeName(voucherType: VoucherType): string { switch (voucherType) { - case VoucherType.REGULAR: - return i18next.t("voucher:eggVoucher"); - case VoucherType.PLUS: - return i18next.t("voucher:eggVoucherPlus"); - case VoucherType.PREMIUM: - return i18next.t("voucher:eggVoucherPremium"); - case VoucherType.GOLDEN: - return i18next.t("voucher:eggVoucherGold"); + case VoucherType.REGULAR: + return i18next.t("voucher:eggVoucher"); + case VoucherType.PLUS: + return i18next.t("voucher:eggVoucherPlus"); + case VoucherType.PREMIUM: + return i18next.t("voucher:eggVoucherPremium"); + case VoucherType.GOLDEN: + return i18next.t("voucher:eggVoucherGold"); } } export function getVoucherTypeIcon(voucherType: VoucherType): string { switch (voucherType) { - case VoucherType.REGULAR: - return 'coupon'; - case VoucherType.PLUS: - return 'pair_of_tickets'; - case VoucherType.PREMIUM: - return 'mystic_ticket'; - case VoucherType.GOLDEN: - return 'golden_mystic_ticket'; + case VoucherType.REGULAR: + return "coupon"; + case VoucherType.PLUS: + return "pair_of_tickets"; + case VoucherType.PREMIUM: + return "mystic_ticket"; + case VoucherType.GOLDEN: + return "golden_mystic_ticket"; } } @@ -86,10 +85,10 @@ const voucherAchvs: Achv[] = [ achvs.CLASSIC_VICTORY ]; { (function() { - import('../data/trainer-config').then(tc => { + import("../data/trainer-config").then(tc => { const trainerConfigs = tc.trainerConfigs; - for (let achv of voucherAchvs) { + for (const achv of voucherAchvs) { const voucherType = achv.score >= 150 ? VoucherType.GOLDEN : achv.score >= 100 @@ -103,7 +102,7 @@ const voucherAchvs: Achv[] = [ achvs.CLASSIC_VICTORY ]; const bossTrainerTypes = Object.keys(trainerConfigs) .filter(tt => trainerConfigs[tt].isBoss && trainerConfigs[tt].getDerivedType() !== TrainerType.RIVAL); - for (let trainerType of bossTrainerTypes) { + for (const trainerType of bossTrainerTypes) { const voucherType = trainerConfigs[trainerType].moneyMultiplier < 10 ? VoucherType.PLUS : VoucherType.PREMIUM; @@ -116,7 +115,7 @@ const voucherAchvs: Achv[] = [ achvs.CLASSIC_VICTORY ]; } const voucherKeys = Object.keys(vouchers); - for (let k of voucherKeys) { + for (const k of voucherKeys) { vouchers[k].id = k; } }); diff --git a/src/test/pokemonSprite.test.ts b/src/test/pokemonSprite.test.ts index 2ea66878f362..264977ecec21 100644 --- a/src/test/pokemonSprite.test.ts +++ b/src/test/pokemonSprite.test.ts @@ -1,225 +1,265 @@ import {beforeAll, describe, expect, it} from "vitest"; -import _masterlist from '../../public/images/pokemon/variant/_masterlist.json'; -import fs from 'fs'; -import path from 'path'; +import _masterlist from "../../public/images/pokemon/variant/_masterlist.json"; +import fs from "fs"; +import path from "path"; import {getAppRootDir} from "#app/test/testUtils"; const deepCopy = (data) => { - return JSON.parse(JSON.stringify(data)); -} + return JSON.parse(JSON.stringify(data)); +}; describe("check if every variant's sprite are correctly set", () => { - let masterlist; - let expVariant; - let femaleVariant; - let backVariant; - let rootDir; - - beforeAll(() => { - rootDir = `${getAppRootDir()}${path.sep}public${path.sep}images${path.sep}pokemon${path.sep}variant${path.sep}` - masterlist = deepCopy(_masterlist); - expVariant = masterlist.exp; - femaleVariant = masterlist.female; - backVariant = masterlist.back; - delete masterlist.exp - delete masterlist.female - delete masterlist.back - }); - - it('data should not be undefined', () => { - expect(masterlist).not.toBeUndefined(); - expect(expVariant).not.toBeUndefined(); - expect(femaleVariant).not.toBeUndefined(); - expect(backVariant).not.toBeUndefined(); - }); - - function getMissingMasterlist(mlist, dirpath, excludes = []) { - const errors = []; - const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; - if (fs.existsSync(dirpath)) { - const files = fs.readdirSync(dirpath); - for (const filename of files) { - const filePath = `${dirpath}${filename}` - const trimmedFilePath = `${trimmedDirpath}${filename}` - const ext = filename.split('.')[1]; - const name = filename.split('.')[0]; - if (excludes.includes(name)) continue; - if (name.includes('_')) { - const id = name.split('_')[0]; - const variant = name.split('_')[1]; - if (ext !== 'json') { - if (mlist.hasOwnProperty(id)) { - const urlJsonFile = `${dirpath}${id}.json`; - const trimmedUrlJsonFilepath = `${trimmedDirpath}${id}.json`; - const jsonFileExists = fs.existsSync(urlJsonFile); - if (mlist[id].includes(1)) { - const msg = `[${name}] MISSING JSON ${trimmedUrlJsonFilepath}`; - if (!jsonFileExists && !errors.includes(msg)) errors.push(msg); - } - } - if (!mlist.hasOwnProperty(id)) errors.push(`[${id}] missing key ${id} in masterlist for ${trimmedFilePath}`); - else if (mlist[id][parseInt(variant, 10) - 1] !== 2) { - const urlJsonFile = `${dirpath}${name}.json`; - const trimmedUrlJsonFilepath = `${trimmedDirpath}${name}.json`; - const jsonFileExists = fs.existsSync(urlJsonFile); - if (mlist[id].includes(1)) { - const msg = `[${id}] MISSING JSON ${trimmedUrlJsonFilepath}`; - if (!jsonFileExists && !errors.includes(msg)) errors.push(msg); - } - errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${parseInt(variant, 10) - 1} - ${trimmedFilePath}`); - } - } - } else if (!mlist.hasOwnProperty(name)) errors.push(`named - missing key ${name} in masterlist for ${trimmedFilePath}`);else { - const raw = fs.readFileSync(filePath, {encoding: 'utf8', flag: 'r'}); - const data = JSON.parse(raw); - for (const key of Object.keys(data)) { - if (mlist[name][key] !== 1) errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); - } + let masterlist; + let expVariant; + let femaleVariant; + let backVariant; + let rootDir; + + beforeAll(() => { + rootDir = `${getAppRootDir()}${path.sep}public${path.sep}images${path.sep}pokemon${path.sep}variant${path.sep}`; + masterlist = deepCopy(_masterlist); + expVariant = masterlist.exp; + femaleVariant = masterlist.female; + backVariant = masterlist.back; + delete masterlist.exp; + delete masterlist.female; + delete masterlist.back; + }); + + it("data should not be undefined", () => { + expect(masterlist).not.toBeUndefined(); + expect(expVariant).not.toBeUndefined(); + expect(femaleVariant).not.toBeUndefined(); + expect(backVariant).not.toBeUndefined(); + }); + + function getMissingMasterlist(mlist, dirpath, excludes = []) { + const errors = []; + const trimmedDirpath = `variant${path.sep}${dirpath.split(rootDir)[1]}`; + if (fs.existsSync(dirpath)) { + const files = fs.readdirSync(dirpath); + for (const filename of files) { + const filePath = `${dirpath}${filename}`; + const trimmedFilePath = `${trimmedDirpath}${filename}`; + const ext = filename.split(".")[1]; + const name = filename.split(".")[0]; + if (excludes.includes(name)) { + continue; + } + if (name.includes("_")) { + const id = name.split("_")[0]; + const variant = name.split("_")[1]; + if (ext !== "json") { + if (mlist.hasOwnProperty(id)) { + const urlJsonFile = `${dirpath}${id}.json`; + const trimmedUrlJsonFilepath = `${trimmedDirpath}${id}.json`; + const jsonFileExists = fs.existsSync(urlJsonFile); + if (mlist[id].includes(1)) { + const msg = `[${name}] MISSING JSON ${trimmedUrlJsonFilepath}`; + if (!jsonFileExists && !errors.includes(msg)) { + errors.push(msg); } + } } - } - return errors; - } - - function getMissingFiles(keys, dirPath) { - const errors = []; - for (const key of Object.keys(keys)) { - const row = keys[key]; - for (const [index, elm] of row.entries()) { - let url; - if (elm === 0) continue - else if (elm === 1) { - url = `${key}.json` - let filePath = `${dirPath}${url}`; - const raw = fs.readFileSync(filePath, {encoding: 'utf8', flag: 'r'}); - const data = JSON.parse(raw); - if (!data.hasOwnProperty(index)) { - errors.push(`index: ${index} - ${filePath}`); - } - } else if (elm === 2) { - url = `${key}_${parseInt(index, 10) + 1}.png`; - let filePath = `${dirPath}${url}`; - if (!fs.existsSync(filePath)) { - errors.push(filePath) - } - - url = `${key}_${parseInt(index, 10) + 1}.json`; - filePath = `${dirPath}${url}`; - if (!fs.existsSync(filePath)) { - errors.push(filePath) - } + if (!mlist.hasOwnProperty(id)) { + errors.push(`[${id}] missing key ${id} in masterlist for ${trimmedFilePath}`); + } else if (mlist[id][parseInt(variant, 10) - 1] !== 2) { + const urlJsonFile = `${dirpath}${name}.json`; + const trimmedUrlJsonFilepath = `${trimmedDirpath}${name}.json`; + const jsonFileExists = fs.existsSync(urlJsonFile); + if (mlist[id].includes(1)) { + const msg = `[${id}] MISSING JSON ${trimmedUrlJsonFilepath}`; + if (!jsonFileExists && !errors.includes(msg)) { + errors.push(msg); } + } + errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${parseInt(variant, 10) - 1} - ${trimmedFilePath}`); + } + } + } else if (!mlist.hasOwnProperty(name)) { + errors.push(`named - missing key ${name} in masterlist for ${trimmedFilePath}`); + }else { + const raw = fs.readFileSync(filePath, {encoding: "utf8", flag: "r"}); + const data = JSON.parse(raw); + for (const key of Object.keys(data)) { + if (mlist[name][key] !== 1) { + errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); } + } } - return errors; - } - - // chech presence of every files listed in masterlist - - it('check root variant files', () => { - const dirPath = rootDir; - const errors = getMissingFiles(masterlist, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - it('check female variant files', () => { - const dirPath = `${rootDir}female${path.sep}`; - const errors = getMissingFiles(femaleVariant, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - it('check back female variant files', () => { - const dirPath = `${rootDir}back${path.sep}female${path.sep}`; - const errors = getMissingFiles(backVariant.female, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - it('check back male back variant files', () => { - const dirPath = `${rootDir}back${path.sep}`; - let backMaleVariant = deepCopy(backVariant); - delete backMaleVariant.female; - const errors = getMissingFiles(backMaleVariant, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - it('check exp back variant files', () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingFiles(expVariant.back, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - 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); - }); - - it('check exp male variant files', () => { - const dirPath = `${rootDir}exp${path.sep}`; - let expMaleVariant = deepCopy(expVariant); - delete expMaleVariant.female; - delete expMaleVariant.back; - const errors = getMissingFiles(expMaleVariant, dirPath); - if (errors.length) console.log('errors', errors); - expect(errors.length).toBe(0); - }); - - // check over every file if it's correctly set in the masterlist - - it('look over every file in variant female and check if present in masterlist', () => { - const dirPath = `${rootDir}female${path.sep}`; - const errors = getMissingMasterlist(femaleVariant, dirPath); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant back female and check if present in masterlist', () => { - const dirPath = `${rootDir}back${path.sep}female${path.sep}`; - const errors = getMissingMasterlist(backVariant.female, dirPath); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant back male and check if present in masterlist', () => { - const dirPath = `${rootDir}back${path.sep}`; - let backMaleVariant = deepCopy(backVariant); - const errors = getMissingMasterlist(backMaleVariant, dirPath, ['female']); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant exp back and check if present in masterlist', () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingMasterlist(expVariant.back, dirPath); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant exp female and check if present in masterlist', () => { - const dirPath = `${rootDir}exp${path.sep}female${path.sep}`; - const errors = getMissingMasterlist(expVariant.female, dirPath); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant exp male and check if present in masterlist', () => { - const dirPath = `${rootDir}exp${path.sep}`; - const errors = getMissingMasterlist(expVariant, dirPath, ['back', 'female']); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); - - it('look over every file in variant root and check if present in masterlist', () => { - const dirPath = `${rootDir}`; - const errors = getMissingMasterlist(masterlist, dirPath, ['back', 'female', 'exp', 'icons']); - if (errors.length) console.log('errors for ', dirPath, errors); - expect(errors.length).toBe(0); - }); -}); \ No newline at end of file + } + } + return errors; + } + + function getMissingFiles(keys, dirPath) { + const errors = []; + for (const key of Object.keys(keys)) { + const row = keys[key]; + for (const [index, elm] of row.entries()) { + let url; + if (elm === 0) { + continue; + } else if (elm === 1) { + url = `${key}.json`; + const filePath = `${dirPath}${url}`; + const raw = fs.readFileSync(filePath, {encoding: "utf8", flag: "r"}); + const data = JSON.parse(raw); + if (!data.hasOwnProperty(index)) { + errors.push(`index: ${index} - ${filePath}`); + } + } else if (elm === 2) { + url = `${key}_${parseInt(index, 10) + 1}.png`; + let filePath = `${dirPath}${url}`; + if (!fs.existsSync(filePath)) { + errors.push(filePath); + } + + url = `${key}_${parseInt(index, 10) + 1}.json`; + filePath = `${dirPath}${url}`; + if (!fs.existsSync(filePath)) { + errors.push(filePath); + } + } + } + } + return errors; + } + + // chech presence of every files listed in masterlist + + it("check root variant files", () => { + const dirPath = rootDir; + const errors = getMissingFiles(masterlist, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + it("check female variant files", () => { + const dirPath = `${rootDir}female${path.sep}`; + const errors = getMissingFiles(femaleVariant, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + it("check back female variant files", () => { + const dirPath = `${rootDir}back${path.sep}female${path.sep}`; + const errors = getMissingFiles(backVariant.female, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + it("check back male back variant files", () => { + const dirPath = `${rootDir}back${path.sep}`; + const backMaleVariant = deepCopy(backVariant); + delete backMaleVariant.female; + const errors = getMissingFiles(backMaleVariant, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + it("check exp back variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const errors = getMissingFiles(expVariant.back, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + 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); + }); + + it("check exp male variant files", () => { + const dirPath = `${rootDir}exp${path.sep}`; + const expMaleVariant = deepCopy(expVariant); + delete expMaleVariant.female; + delete expMaleVariant.back; + const errors = getMissingFiles(expMaleVariant, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors.length).toBe(0); + }); + + // check over every file if it's correctly set in the masterlist + + it("look over every file in variant female and check if present in masterlist", () => { + const dirPath = `${rootDir}female${path.sep}`; + const errors = getMissingMasterlist(femaleVariant, dirPath); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant back female and check if present in masterlist", () => { + const dirPath = `${rootDir}back${path.sep}female${path.sep}`; + const errors = getMissingMasterlist(backVariant.female, dirPath); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant back male and check if present in masterlist", () => { + const dirPath = `${rootDir}back${path.sep}`; + const backMaleVariant = deepCopy(backVariant); + const errors = getMissingMasterlist(backMaleVariant, dirPath, ["female"]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant exp back and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const errors = getMissingMasterlist(expVariant.back, dirPath); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant exp female and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}female${path.sep}`; + const errors = getMissingMasterlist(expVariant.female, dirPath); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant exp male and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}`; + const errors = getMissingMasterlist(expVariant, dirPath, ["back", "female"]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); + + it("look over every file in variant root and check if present in masterlist", () => { + const dirPath = `${rootDir}`; + const errors = getMissingMasterlist(masterlist, dirPath, ["back", "female", "exp", "icons"]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } + expect(errors.length).toBe(0); + }); +}); diff --git a/src/test/testUtils.ts b/src/test/testUtils.ts index 6d01afdb1bc7..481efbed032d 100644 --- a/src/test/testUtils.ts +++ b/src/test/testUtils.ts @@ -1,10 +1,10 @@ -const fs = require('fs') -const path = require('path') +const fs = require("fs"); +const path = require("path"); export function getAppRootDir () { - let currentDir = __dirname - while(!fs.existsSync(path.join(currentDir, 'package.json'))) { - currentDir = path.join(currentDir, '..') + let currentDir = __dirname; + while(!fs.existsSync(path.join(currentDir, "package.json"))) { + currentDir = path.join(currentDir, ".."); } - return currentDir -} \ No newline at end of file + return currentDir; +} diff --git a/src/touch-controls.js b/src/touch-controls.js index d3e8e37abdff..956bc03179f0 100644 --- a/src/touch-controls.js +++ b/src/touch-controls.js @@ -3,22 +3,23 @@ export const keysDown = new Map(); let lastTouchedId; export function initTouchControls(buttonMap) { - for (const button of document.querySelectorAll('[data-key]')) { + for (const button of document.querySelectorAll("[data-key]")) { // @ts-ignore bindKey(button, button.dataset.key, buttonMap); } } export function hasTouchscreen() { - return window.matchMedia('(hover: none), (pointer: coarse)').matches; + return window.matchMedia("(hover: none), (pointer: coarse)").matches; } export function isMobile() { let ret = false; (function (a) { - if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) + if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) { ret = true; - })(navigator.userAgent || navigator.vendor || window['opera']); + } + })(navigator.userAgent || navigator.vendor || window["opera"]); return ret; } @@ -33,12 +34,12 @@ function simulateKeyboardEvent(eventType, button, buttonMap) { const key = buttonMap[button]; switch (eventType) { - case 'keydown': - key.onDown({}); - break; - case 'keyup': - key.onUp({}); - break; + case "keydown": + key.onDown({}); + break; + case "keyup": + key.onUp({}); + break; } } @@ -48,12 +49,12 @@ function simulateKeyboardEvent(eventType, button, buttonMap) { * @param {string} key Key to simulate * @param {object} buttonMap Map of buttons to key objects */ -function simulateKeyboardInput(key, buttonMap) { - simulateKeyboardEvent('keydown', key, buttonMap); - window.setTimeout(() => { - simulateKeyboardEvent('keyup', key, buttonMap); - }, 100); -} +// function simulateKeyboardInput(key, buttonMap) { +// simulateKeyboardEvent('keydown', key, buttonMap); +// window.setTimeout(() => { +// simulateKeyboardEvent('keyup', key, buttonMap); +// }, 100); +// } /** * Bind a node by a specific key to simulate on touch @@ -65,51 +66,52 @@ function simulateKeyboardInput(key, buttonMap) { function bindKey(node, key, buttonMap) { keys.set(node.id, key); - node.addEventListener('touchstart', event => { + node.addEventListener("touchstart", event => { event.preventDefault(); - simulateKeyboardEvent('keydown', key, buttonMap); + simulateKeyboardEvent("keydown", key, buttonMap); keysDown.set(event.target.id, node.id); - node.classList.add('active'); + node.classList.add("active"); }); - node.addEventListener('touchend', event => { + node.addEventListener("touchend", event => { event.preventDefault(); const pressedKey = keysDown.get(event.target.id); if (pressedKey && keys.has(pressedKey)) { const key = keys.get(pressedKey); - simulateKeyboardEvent('keyup', key, buttonMap); + simulateKeyboardEvent("keyup", key, buttonMap); } keysDown.delete(event.target.id); - node.classList.remove('active'); + node.classList.remove("active"); if (lastTouchedId) { - document.getElementById(lastTouchedId).classList.remove('active'); + document.getElementById(lastTouchedId).classList.remove("active"); } }); // Inspired by https://github.com/pulsejet/mkxp-web/blob/262a2254b684567311c9f0e135ee29f6e8c3613e/extra/js/dpad.js - node.addEventListener('touchmove', event => { + node.addEventListener("touchmove", event => { const { target, clientX, clientY } = event.changedTouches[0]; const origTargetId = keysDown.get(target.id); const nextTargetId = document.elementFromPoint(clientX, clientY).id; - if (origTargetId === nextTargetId) + if (origTargetId === nextTargetId) { return; + } if (origTargetId) { const key = keys.get(origTargetId); - simulateKeyboardEvent('keyup', key, buttonMap); + simulateKeyboardEvent("keyup", key, buttonMap); keysDown.delete(target.id); - document.getElementById(origTargetId).classList.remove('active'); + document.getElementById(origTargetId).classList.remove("active"); } if (keys.has(nextTargetId)) { const key = keys.get(nextTargetId); - simulateKeyboardEvent('keydown', key, buttonMap); + simulateKeyboardEvent("keydown", key, buttonMap); keysDown.set(target.id, nextTargetId); lastTouchedId = nextTargetId; - document.getElementById(nextTargetId).classList.add('active'); + document.getElementById(nextTargetId).classList.add("active"); } }); -} \ No newline at end of file +} diff --git a/src/tutorial.ts b/src/tutorial.ts index 88e88fa809ca..ecb45e543a14 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -1,7 +1,7 @@ import BattleScene from "./battle-scene"; import AwaitableUiHandler from "./ui/awaitable-ui-handler"; import { Mode } from "./ui/ui"; -import i18next from './plugins/i18n'; +import i18next from "./plugins/i18n"; export enum Tutorial { Intro = "INTRO", @@ -22,61 +22,66 @@ const tutorialHandlers = { }, [Tutorial.Access_Menu]: (scene: BattleScene) => { return new Promise(resolve => { - if (scene.enableTouchControls) + if (scene.enableTouchControls) { return resolve(); + } scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:accessMenu"), null, () => scene.hideFieldOverlay(1000).then(() => resolve()), null, true)); }); }, [Tutorial.Menu]: (scene: BattleScene) => { return new Promise(resolve => { scene.gameData.saveTutorialFlag(Tutorial.Access_Menu, true); - scene.ui.showText(i18next.t("tutorial:menu"), null, () => scene.ui.showText('', null, () => resolve()), null, true); + scene.ui.showText(i18next.t("tutorial:menu"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, [Tutorial.Starter_Select]: (scene: BattleScene) => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => scene.ui.showText('', null, () => resolve()), null, true); + scene.ui.showText(i18next.t("tutorial:starterSelect"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, [Tutorial.Pokerus]: (scene: BattleScene) => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText('', null, () => resolve()), null, true); + scene.ui.showText(i18next.t("tutorial:pokerus"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, [Tutorial.Stat_Change]: (scene: BattleScene) => { return new Promise(resolve => { - scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:statChange"), null, () => scene.ui.showText('', null, () => scene.hideFieldOverlay(1000).then(() => resolve())), null, true)); + scene.showFieldOverlay(1000).then(() => scene.ui.showText(i18next.t("tutorial:statChange"), null, () => scene.ui.showText("", null, () => scene.hideFieldOverlay(1000).then(() => resolve())), null, true)); }); }, [Tutorial.Select_Item]: (scene: BattleScene) => { return new Promise(resolve => { scene.ui.setModeWithoutClear(Mode.MESSAGE).then(() => { - scene.ui.showText(i18next.t("tutorial:selectItem"), null, () => scene.ui.showText('', null, () => scene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve())), null, true); + scene.ui.showText(i18next.t("tutorial:selectItem"), null, () => scene.ui.showText("", null, () => scene.ui.setModeWithoutClear(Mode.MODIFIER_SELECT).then(() => resolve())), null, true); }); }); }, [Tutorial.Egg_Gacha]: (scene: BattleScene) => { return new Promise(resolve => { - scene.ui.showText(i18next.t("tutorial:eggGacha"), null, () => scene.ui.showText('', null, () => resolve()), null, true); + scene.ui.showText(i18next.t("tutorial:eggGacha"), null, () => scene.ui.showText("", null, () => resolve()), null, true); }); }, }; export function handleTutorial(scene: BattleScene, tutorial: Tutorial): Promise { return new Promise(resolve => { - if (!scene.enableTutorials) + if (!scene.enableTutorials) { return resolve(false); + } - if (scene.gameData.getTutorialFlags()[tutorial]) + if (scene.gameData.getTutorialFlags()[tutorial]) { return resolve(false); + } const handler = scene.ui.getHandler(); - if (handler instanceof AwaitableUiHandler) + if (handler instanceof AwaitableUiHandler) { handler.tutorialActive = true; + } tutorialHandlers[tutorial](scene).then(() => { scene.gameData.saveTutorialFlag(tutorial, true); - if (handler instanceof AwaitableUiHandler) + if (handler instanceof AwaitableUiHandler) { handler.tutorialActive = false; + } resolve(true); }); }); diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 38d8e7830c42..6254773e6567 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -12,143 +12,154 @@ export interface ActionKeys { } export class UiInputs { - private scene: Phaser.Scene; - private events: Phaser.Events; - private inputsController: InputsController; - - constructor(scene: Phaser.Scene, inputsController: InputsController) { - this.scene = scene; - this.inputsController = inputsController; - this.init(); + private scene: Phaser.Scene; + private events: Phaser.Events; + private inputsController: InputsController; + + constructor(scene: Phaser.Scene, inputsController: InputsController) { + this.scene = scene; + this.inputsController = inputsController; + this.init(); + } + + init(): void { + this.events = this.inputsController.events; + this.listenInputs(); + } + + listenInputs(): void { + this.events.on("input_down", (event) => { + const actions = this.getActionsKeyDown(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, this); + + this.events.on("input_up", (event) => { + const actions = this.getActionsKeyUp(); + if (!actions.hasOwnProperty(event.button)) { + return; + } + actions[event.button](); + }, this); + } + + doVibration(inputSuccess: boolean, vibrationLength: number): void { + if (inputSuccess && this.scene.enableVibration && typeof navigator.vibrate !== "undefined") { + navigator.vibrate(vibrationLength); } - - init(): void { - this.events = this.inputsController.events; - this.listenInputs(); - } - - listenInputs(): void { - this.events.on('input_down', (event) => { - const actions = this.getActionsKeyDown(); - if (!actions.hasOwnProperty(event.button)) return; - actions[event.button](); - }, this); - - this.events.on('input_up', (event) => { - const actions = this.getActionsKeyUp(); - if (!actions.hasOwnProperty(event.button)) return; - actions[event.button](); - }, this); + } + + getActionsKeyDown(): ActionKeys { + const actions = {}; + actions[Button.UP] = () => this.buttonDirection(Button.UP); + actions[Button.DOWN] = () => this.buttonDirection(Button.DOWN); + actions[Button.LEFT] = () => this.buttonDirection(Button.LEFT); + actions[Button.RIGHT] = () => this.buttonDirection(Button.RIGHT); + actions[Button.SUBMIT] = () => this.buttonTouch(); + actions[Button.ACTION] = () => this.buttonAb(Button.ACTION); + actions[Button.CANCEL] = () => this.buttonAb(Button.CANCEL); + actions[Button.MENU] = () => this.buttonMenu(); + actions[Button.STATS] = () => this.buttonStats(true); + actions[Button.CYCLE_SHINY] = () => this.buttonCycleOption(Button.CYCLE_SHINY); + actions[Button.CYCLE_FORM] = () => this.buttonCycleOption(Button.CYCLE_FORM); + actions[Button.CYCLE_GENDER] = () => this.buttonCycleOption(Button.CYCLE_GENDER); + actions[Button.CYCLE_ABILITY] = () => this.buttonCycleOption(Button.CYCLE_ABILITY); + actions[Button.CYCLE_NATURE] = () => this.buttonCycleOption(Button.CYCLE_NATURE); + actions[Button.CYCLE_VARIANT] = () => this.buttonCycleOption(Button.CYCLE_VARIANT); + actions[Button.SPEED_UP] = () => this.buttonSpeedChange(); + actions[Button.SLOW_DOWN] = () => this.buttonSpeedChange(false); + return actions; + } + + getActionsKeyUp(): ActionKeys { + const actions = {}; + actions[Button.STATS] = () => this.buttonStats(false); + return actions; + } + + buttonDirection(direction: Button): void { + const inputSuccess = this.scene.ui.processInput(direction); + const vibrationLength = 5; + this.doVibration(inputSuccess, vibrationLength); + } + + buttonAb(button: Button): void { + this.scene.ui.processInput(button); + } + + buttonTouch(): void { + this.scene.ui.processInput(Button.SUBMIT) || this.scene.ui.processInput(Button.ACTION); + } + + buttonStats(pressed: boolean = true): void { + if (pressed) { + for (const p of this.scene.getField().filter(p => p?.isActive(true))) { + p.toggleStats(true); + } + } else { + for (const p of this.scene.getField().filter(p => p?.isActive(true))) { + p.toggleStats(false); + } } + } - doVibration(inputSuccess: boolean, vibrationLength: number): void { - if (inputSuccess && this.scene.enableVibration && typeof navigator.vibrate !== 'undefined') - navigator.vibrate(vibrationLength); + buttonMenu(): void { + if (this.scene.disableMenu) { + return; } - - getActionsKeyDown(): ActionKeys { - const actions = {}; - actions[Button.UP] = () => this.buttonDirection(Button.UP); - actions[Button.DOWN] = () => this.buttonDirection(Button.DOWN); - actions[Button.LEFT] = () => this.buttonDirection(Button.LEFT); - actions[Button.RIGHT] = () => this.buttonDirection(Button.RIGHT); - actions[Button.SUBMIT] = () => this.buttonTouch(); - actions[Button.ACTION] = () => this.buttonAb(Button.ACTION); - actions[Button.CANCEL] = () => this.buttonAb(Button.CANCEL); - actions[Button.MENU] = () => this.buttonMenu(); - actions[Button.STATS] = () => this.buttonStats(true); - actions[Button.CYCLE_SHINY] = () => this.buttonCycleOption(Button.CYCLE_SHINY); - actions[Button.CYCLE_FORM] = () => this.buttonCycleOption(Button.CYCLE_FORM); - actions[Button.CYCLE_GENDER] = () => this.buttonCycleOption(Button.CYCLE_GENDER); - actions[Button.CYCLE_ABILITY] = () => this.buttonCycleOption(Button.CYCLE_ABILITY); - actions[Button.CYCLE_NATURE] = () => this.buttonCycleOption(Button.CYCLE_NATURE); - actions[Button.CYCLE_VARIANT] = () => this.buttonCycleOption(Button.CYCLE_VARIANT); - actions[Button.SPEED_UP] = () => this.buttonSpeedChange(); - actions[Button.SLOW_DOWN] = () => this.buttonSpeedChange(false); - return actions; - } - - getActionsKeyUp(): ActionKeys { - const actions = {}; - actions[Button.STATS] = () => this.buttonStats(false); - return actions; + switch (this.scene.ui?.getMode()) { + case Mode.MESSAGE: + if (!(this.scene.ui.getHandler() as MessageUiHandler).pendingPrompt) { + return; + } + case Mode.TITLE: + case Mode.COMMAND: + case Mode.FIGHT: + case Mode.BALL: + case Mode.TARGET_SELECT: + case Mode.SAVE_SLOT: + case Mode.PARTY: + case Mode.SUMMARY: + case Mode.STARTER_SELECT: + case Mode.CONFIRM: + case Mode.OPTION_SELECT: + this.scene.ui.setOverlayMode(Mode.MENU); + break; + case Mode.MENU: + case Mode.SETTINGS: + case Mode.ACHIEVEMENTS: + this.scene.ui.revertMode(); + this.scene.playSound("select"); + break; + default: + return; } + } - buttonDirection(direction: Button): void { - const inputSuccess = this.scene.ui.processInput(direction); - const vibrationLength = 5; - this.doVibration(inputSuccess, vibrationLength); + buttonCycleOption(button: Button): void { + if (this.scene.ui?.getHandler() instanceof StarterSelectUiHandler) { + this.scene.ui.processInput(button); } - - buttonAb(button: Button): void { - this.scene.ui.processInput(button); - } - - buttonTouch(): void { - this.scene.ui.processInput(Button.SUBMIT) || this.scene.ui.processInput(Button.ACTION); - } - - buttonStats(pressed: boolean = true): void { - if (pressed) { - for (let p of this.scene.getField().filter(p => p?.isActive(true))) - p.toggleStats(true); - } else { - for (let p of this.scene.getField().filter(p => p?.isActive(true))) - p.toggleStats(false); + } + + buttonSpeedChange(up = true): void { + if (up) { + if (this.scene.gameSpeed < 5) { + this.scene.gameData.saveSetting(Setting.Game_Speed, settingOptions[Setting.Game_Speed].indexOf(`${this.scene.gameSpeed}x`) + 1); + if (this.scene.ui?.getMode() === Mode.SETTINGS) { + (this.scene.ui.getHandler() as SettingsUiHandler).show([]); } + } + return; } - - buttonMenu(): void { - if (this.scene.disableMenu) - return; - switch (this.scene.ui?.getMode()) { - case Mode.MESSAGE: - if (!(this.scene.ui.getHandler() as MessageUiHandler).pendingPrompt) - return; - case Mode.TITLE: - case Mode.COMMAND: - case Mode.FIGHT: - case Mode.BALL: - case Mode.TARGET_SELECT: - case Mode.SAVE_SLOT: - case Mode.PARTY: - case Mode.SUMMARY: - case Mode.STARTER_SELECT: - case Mode.CONFIRM: - case Mode.OPTION_SELECT: - this.scene.ui.setOverlayMode(Mode.MENU); - break; - case Mode.MENU: - case Mode.SETTINGS: - case Mode.ACHIEVEMENTS: - this.scene.ui.revertMode(); - this.scene.playSound('select'); - break; - default: - return - } - } - - buttonCycleOption(button: Button): void { - if (this.scene.ui?.getHandler() instanceof StarterSelectUiHandler) { - this.scene.ui.processInput(button); - } + if (this.scene.gameSpeed > 1) { + this.scene.gameData.saveSetting(Setting.Game_Speed, Math.max(settingOptions[Setting.Game_Speed].indexOf(`${this.scene.gameSpeed}x`) - 1, 0)); + if (this.scene.ui?.getMode() === Mode.SETTINGS) { + (this.scene.ui.getHandler() as SettingsUiHandler).show([]); + } } + } - buttonSpeedChange(up = true): void { - if (up) { - if (this.scene.gameSpeed < 5) { - this.scene.gameData.saveSetting(Setting.Game_Speed, settingOptions[Setting.Game_Speed].indexOf(`${this.scene.gameSpeed}x`) + 1); - if (this.scene.ui?.getMode() === Mode.SETTINGS) - (this.scene.ui.getHandler() as SettingsUiHandler).show([]); - } - return; - } - if (this.scene.gameSpeed > 1) { - this.scene.gameData.saveSetting(Setting.Game_Speed, Math.max(settingOptions[Setting.Game_Speed].indexOf(`${this.scene.gameSpeed}x`) - 1, 0)); - if (this.scene.ui?.getMode() === Mode.SETTINGS) - (this.scene.ui.getHandler() as SettingsUiHandler).show([]); - } - } - -} \ No newline at end of file +} diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 155123b85533..a4a49011c109 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -21,16 +21,16 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.image(0, 0, 'ability_bar_left'); + this.bg = this.scene.add.image(0, 0, "ability_bar_left"); this.bg.setOrigin(0, 0); this.add(this.bg); - this.pokemonNameText = addTextObject(this.scene, 15, 3, '', TextStyle.MESSAGE, { fontSize: '72px' }); + this.pokemonNameText = addTextObject(this.scene, 15, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); this.pokemonNameText.setOrigin(0, 0); this.add(this.pokemonNameText); - this.abilityNameText = addTextObject(this.scene, 97, 16, '', TextStyle.WINDOW, { fontSize: '72px' }); + this.abilityNameText = addTextObject(this.scene, 97, 16, "", TextStyle.WINDOW, { fontSize: "72px" }); this.abilityNameText.setOrigin(1, 0); this.add(this.abilityNameText); @@ -39,23 +39,25 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } showAbility(pokemon: Pokemon, passive: boolean = false): void { - this.pokemonNameText.setText(`${pokemon.name}'s${passive ? ' Passive' : ''}`); + this.pokemonNameText.setText(`${pokemon.name}'s${passive ? " Passive" : ""}`); this.abilityNameText.setText((!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name); - if (this.shown) + if (this.shown) { return; + } (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) + if (this.tween) { this.tween.stop(); + } this.y = baseY + ((this.scene as BattleScene).currentBattle.double ? 14 : 0); this.tween = this.scene.tweens.add({ targets: this, x: shownX, duration: 500, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.tween = null; this.resetAutoHideTimer(); @@ -67,20 +69,23 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } hide(): void { - if (!this.shown) + if (!this.shown) { return; + } - if (this.autoHideTimer) + if (this.autoHideTimer) { clearInterval(this.autoHideTimer); + } - if (this.tween) + if (this.tween) { this.tween.stop(); + } this.tween = this.scene.tweens.add({ targets: this, x: -91, duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.tween = null; this.setVisible(false); @@ -91,11 +96,12 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } resetAutoHideTimer(): void { - if (this.autoHideTimer) + if (this.autoHideTimer) { clearInterval(this.autoHideTimer); + } this.autoHideTimer = setTimeout(() => { this.hide(); this.autoHideTimer = null; }, 2500); } -} \ No newline at end of file +} diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index ffc0cabc89c8..82e8ab0da352 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -25,8 +25,8 @@ export interface OptionSelectItem { itemArgs?: any[] } -const scrollUpLabel = '↑'; -const scrollDownLabel = '↓'; +const scrollUpLabel = "↑"; +const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; @@ -71,22 +71,24 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected setupOptions() { const options = this.config?.options || []; - if (this.optionSelectText) + if (this.optionSelectText) { this.optionSelectText.destroy(); + } if (this.optionSelectIcons?.length) { this.optionSelectIcons.map(i => i.destroy()); this.optionSelectIcons.splice(0, this.optionSelectIcons.length); } - this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join('\n'), TextStyle.WINDOW, { maxLines: options.length }); + this.optionSelectText = addTextObject(this.scene, 0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); - if (this.config?.options.length > this.config?.maxOptions) - this.optionSelectText.setText(this.getOptionsWithScroll().map(o => o.label).join('\n')); + if (this.config?.options.length > this.config?.maxOptions) { + this.optionSelectText.setText(this.getOptionsWithScroll().map(o => o.label).join("\n")); + } this.optionSelectBg.height = this.getWindowHeight(); @@ -94,7 +96,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { options.forEach((option: OptionSelectItem, i: integer) => { if (option.item) { - const itemIcon = this.scene.add.sprite(0, 0, 'items', option.item); + const itemIcon = this.scene.add.sprite(0, 0, "items", option.item); itemIcon.setScale(0.5); this.optionSelectIcons.push(itemIcon); @@ -102,8 +104,8 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { itemIcon.setPositionRelative(this.optionSelectText, 6, 7 + 16 * i); - if (option.item === 'candy') { - const itemOverlayIcon = this.scene.add.sprite(0, 0, 'items', 'candy_overlay'); + if (option.item === "candy") { + const itemOverlayIcon = this.scene.add.sprite(0, 0, "items", "candy_overlay"); itemOverlayIcon.setScale(0.5); this.optionSelectIcons.push(itemOverlayIcon); @@ -119,8 +121,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } show(args: any[]): boolean { - if (!args.length || !args[0].hasOwnProperty('options') || !args[0].options.length) + if (!args.length || !args[0].hasOwnProperty("options") || !args[0].options.length) { return false; + } super.show(args); @@ -162,71 +165,82 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { 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; - } else if (!this.config?.noCancel) + } else if (!this.config?.noCancel) { this.setCursor(options.length - 1); - else + } else { return false; + } } const option = this.config.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; if (option.handler()) { - if (!option.keepOpen) + if (!option.keepOpen) { this.clear(); + } playSound = !option.overrideSound; - } else + } else { ui.playError(); + } } else { switch (button) { - case Button.UP: - if (this.cursor) - success = this.setCursor(this.cursor - 1); - break; - case Button.DOWN: - if (this.cursor < options.length - 1) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < options.length - 1) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success && playSound) + if (success && playSound) { ui.playSelect(); + } return success; } unblockInput(): void { - if (!this.blockInput) + if (!this.blockInput) { return; + } this.blockInput = false; this.optionSelectText.setAlpha(1); } getOptionsWithScroll(): OptionSelectItem[] { - if (!this.config) + if (!this.config) { return []; + } const options = this.config.options.slice(0); - if (!this.config.maxOptions || this.config.options.length < this.config.maxOptions) + if (!this.config.maxOptions || this.config.options.length < this.config.maxOptions) { return options; + } const optionsScrollTotal = options.length; - let optionStartIndex = this.scrollCursor; - let optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal ? this.config.maxOptions - 1 : this.config.maxOptions - 2)); + 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)); if (this.config?.maxOptions && options.length > this.config.maxOptions) { options.splice(optionEndIndex, optionsScrollTotal); options.splice(0, optionStartIndex); - if (optionStartIndex) + if (optionStartIndex) { options.unshift({ label: scrollUpLabel, handler: () => true }); - if (optionEndIndex < optionsScrollTotal) + } + if (optionEndIndex < optionsScrollTotal) { options.push({ label: scrollDownLabel, handler: () => true }); + } } return options; @@ -255,17 +269,19 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.scrollCursor--; } } - if (isScroll && this.scrollCursor === 1) + if (isScroll && this.scrollCursor === 1) { this.scrollCursor += isDown ? 1 : -1; + } } } - if (isScroll) + if (isScroll) { this.setupOptions(); - else + } else { this.cursor = cursor; + } if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.optionSelectContainer.add(this.cursorObj); } @@ -282,8 +298,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index 475982117a26..c59b61da7206 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -19,24 +19,24 @@ export default class AchvBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, 'achv_bar', null, 160, 40, 41, 6, 16, 4); + this.bg = this.scene.add.nineslice(0, 0, "achv_bar", null, 160, 40, 41, 6, 16, 4); this.bg.setOrigin(0, 0); this.add(this.bg); - this.icon = this.scene.add.sprite(4, 4, 'items'); + this.icon = this.scene.add.sprite(4, 4, "items"); this.icon.setOrigin(0, 0); this.add(this.icon); - this.titleText = addTextObject(this.scene, 40, 3, '', TextStyle.MESSAGE, { fontSize: '72px' }); + this.titleText = addTextObject(this.scene, 40, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); this.titleText.setOrigin(0, 0); this.add(this.titleText); - this.scoreText = addTextObject(this.scene, 150, 3, '', TextStyle.MESSAGE, { fontSize: '72px' }); + this.scoreText = addTextObject(this.scene, 150, 3, "", TextStyle.MESSAGE, { fontSize: "72px" }); this.scoreText.setOrigin(1, 0); this.add(this.scoreText); - this.descriptionText = addTextObject(this.scene, 43, 16, '', TextStyle.WINDOW_ALT, { fontSize: '72px' }); + this.descriptionText = addTextObject(this.scene, 43, 16, "", TextStyle.WINDOW_ALT, { fontSize: "72px" }); this.descriptionText.setOrigin(0, 0); this.add(this.descriptionText); @@ -56,22 +56,23 @@ export default class AchvBar extends Phaser.GameObjects.Container { const tier = achv.getTier(); - this.bg.setTexture(`achv_bar${tier ? `_${tier + 1}` : ''}`); + this.bg.setTexture(`achv_bar${tier ? `_${tier + 1}` : ""}`); this.icon.setFrame(achv.getIconImage()); this.titleText.setText(achv.getName()); this.scoreText.setVisible(achv instanceof Achv); this.descriptionText.setText(achv.description); - if (achv instanceof Achv) + if (achv instanceof Achv) { this.scoreText.setText(`+${(achv as Achv).score}pt`); + } - (this.scene as BattleScene).playSound('achv'); + (this.scene as BattleScene).playSound("achv"); this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6) - 76, duration: 500, - ease: 'Sine.easeOut' + ease: "Sine.easeOut" }); this.scene.time.delayedCall(10000, () => this.hide()); @@ -81,20 +82,22 @@ export default class AchvBar extends Phaser.GameObjects.Container { } protected hide(): void { - if (!this.shown) + if (!this.shown) { return; + } this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6), duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.shown = false; this.setVisible(false); - if (this.queue.length) + if (this.queue.length) { this.showAchv(this.queue.shift()); + } } }); } -} \ No newline at end of file +} diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 561b09171777..27d01b7b661d 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -32,7 +32,7 @@ export default class AchvsUiHandler extends MessageUiHandler { const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); headerBg.setOrigin(0, 0); - const headerText = addTextObject(this.scene, 0, 0, 'Achievements', TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(this.scene, 0, 0, "Achievements", TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); @@ -47,7 +47,7 @@ export default class AchvsUiHandler extends MessageUiHandler { const x = (a % 17) * 18; const y = Math.floor(a / 17) * 18; - const icon = this.scene.add.sprite(x, y, 'items', 'unknown'); + const icon = this.scene.add.sprite(x, y, "items", "unknown"); icon.setOrigin(0, 0); icon.setScale(0.5); @@ -58,28 +58,28 @@ export default class AchvsUiHandler extends MessageUiHandler { const titleBg = addWindow(this.scene, 0, headerBg.height + this.achvIconsBg.height, 174, 24); titleBg.setOrigin(0, 0); - this.titleText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW); + this.titleText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); this.titleText.setOrigin(0, 0); this.titleText.setPositionRelative(titleBg, 8, 4); const scoreBg = addWindow(this.scene, titleBg.x + titleBg.width, titleBg.y, 46, 24); scoreBg.setOrigin(0, 0); - this.scoreText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW); + this.scoreText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); this.scoreText.setOrigin(0, 0); this.scoreText.setPositionRelative(scoreBg, 8, 4); const unlockBg = addWindow(this.scene, scoreBg.x + scoreBg.width, scoreBg.y, 98, 24); unlockBg.setOrigin(0, 0); - this.unlockText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW); + this.unlockText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); this.unlockText.setOrigin(0, 0); this.unlockText.setPositionRelative(unlockBg, 8, 4); const descriptionBg = addWindow(this.scene, 0, titleBg.y + titleBg.height, (this.scene.game.canvas.width / 6) - 2, 42); descriptionBg.setOrigin(0, 0); - const descriptionText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW, { maxLines: 2 }); + const descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 2 }); descriptionText.setWordWrapWidth(1870); descriptionText.setOrigin(0, 0); descriptionText.setPositionRelative(descriptionBg, 8, 4); @@ -117,11 +117,12 @@ export default class AchvsUiHandler extends MessageUiHandler { const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); const tinted = !hidden && !unlocked; - icon.setFrame(!hidden ? achv.iconImage : 'unknown'); - if (tinted) + icon.setFrame(!hidden ? achv.iconImage : "unknown"); + if (tinted) { icon.setTintFill(0); - else + } else { icon.clearTint(); + } }); this.achvsContainer.setVisible(true); @@ -139,10 +140,10 @@ export default class AchvsUiHandler extends MessageUiHandler { const unlocked = achvUnlocks.hasOwnProperty(achv.id); const hidden = !unlocked && achv.secret && (!achv.parentId || !achvUnlocks.hasOwnProperty(achv.parentId)); - this.titleText.setText(unlocked ? achv.name : '???'); - this.showText(!hidden ? achv.description : ''); + this.titleText.setText(unlocked ? achv.name : "???"); + this.showText(!hidden ? achv.description : ""); this.scoreText.setText(`${achv.score}pt`); - this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : 'Locked'); + this.unlockText.setText(unlocked ? new Date(achvUnlocks[achv.id]).toLocaleDateString() : "Locked"); } processInput(button: Button): boolean { @@ -155,38 +156,43 @@ export default class AchvsUiHandler extends MessageUiHandler { this.scene.ui.revertMode(); } else { switch (button) { - case Button.UP: - if (this.cursor >= 17) - success = this.setCursor(this.cursor - 17); - break; - case Button.DOWN: - if (this.cursor + 17 < Object.keys(achvs).length) - success = this.setCursor(this.cursor + 17); - break; - case Button.LEFT: - if (this.cursor) - success = this.setCursor(this.cursor - 1); - break; - case Button.RIGHT: - if (this.cursor < Object.keys(achvs).length - 1) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (this.cursor >= 17) { + success = this.setCursor(this.cursor - 17); + } + break; + case Button.DOWN: + if (this.cursor + 17 < Object.keys(achvs).length) { + success = this.setCursor(this.cursor + 17); + } + break; + case Button.LEFT: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (this.cursor < Object.keys(achvs).length - 1) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } setCursor(cursor: integer): boolean { - let ret = super.setCursor(cursor); + const ret = super.setCursor(cursor); let updateAchv = ret; if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, 'select_cursor_highlight', null, 16, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", null, 16, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.achvIconsContainer.add(this.cursorObj); updateAchv = true; @@ -194,8 +200,9 @@ export default class AchvsUiHandler extends MessageUiHandler { this.cursorObj.setPositionRelative(this.achvIcons[this.cursor], 0, 0); - if (updateAchv) + if (updateAchv) { this.showAchv(achvs[Object.keys(achvs)[cursor]]); + } return ret; } @@ -207,8 +214,9 @@ export default class AchvsUiHandler extends MessageUiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 532ca1115d20..46f5094a2f60 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -24,4 +24,4 @@ export default abstract class AwaitableUiHandler extends UiHandler { return false; } -} \ No newline at end of file +} diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 06729151d44c..5fb6242750f4 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -30,18 +30,19 @@ export default class BallUiHandler extends UiHandler { this.pokeballSelectBg.setOrigin(0, 1); this.pokeballSelectContainer.add(this.pokeballSelectBg); - let optionsTextContent = ''; + let optionsTextContent = ""; - for (let pb = 0; pb < Object.keys(this.scene.pokeballCounts).length; pb++) + for (let pb = 0; pb < Object.keys(this.scene.pokeballCounts).length; pb++) { optionsTextContent += `${getPokeballName(pb)}\n`; - optionsTextContent += 'Cancel'; - const optionsText = addTextObject(this.scene, 0, 0, optionsTextContent, TextStyle.WINDOW, { align: 'right', maxLines: 6 }); + } + optionsTextContent += "Cancel"; + const optionsText = addTextObject(this.scene, 0, 0, optionsTextContent, TextStyle.WINDOW, { align: "right", maxLines: 6 }); optionsText.setOrigin(0, 0); optionsText.setPositionRelative(this.pokeballSelectBg, 42, 9); optionsText.setLineSpacing(12); this.pokeballSelectContainer.add(optionsText); - this.countsText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW, { maxLines: 5 }); + this.countsText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 5 }); this.countsText.setPositionRelative(this.pokeballSelectBg, 18, 9); this.countsText.setLineSpacing(12); this.pokeballSelectContainer.add(this.countsText); @@ -76,38 +77,40 @@ export default class BallUiHandler extends UiHandler { this.scene.ui.setMode(Mode.MESSAGE); success = true; } - } else + } else { ui.playError(); + } } else { ui.setMode(Mode.COMMAND, commandPhase.getFieldIndex()); success = true; } } else { switch (button) { - case Button.UP: - success = this.setCursor(this.cursor ? this.cursor - 1 : pokeballTypeCount); - break; - case Button.DOWN: - success = this.setCursor(this.cursor < pokeballTypeCount ? this.cursor + 1 : 0); - break; + case Button.UP: + success = this.setCursor(this.cursor ? this.cursor - 1 : pokeballTypeCount); + break; + case Button.DOWN: + success = this.setCursor(this.cursor < pokeballTypeCount ? this.cursor + 1 : 0); + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } updateCounts() { - this.countsText.setText(Object.values(this.scene.pokeballCounts).map(c => `x${c}`).join('\n')); + this.countsText.setText(Object.values(this.scene.pokeballCounts).map(c => `x${c}`).join("\n")); } setCursor(cursor: integer): boolean { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.pokeballSelectContainer.add(this.cursorObj); } @@ -123,8 +126,9 @@ export default class BallUiHandler extends UiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 88bc3230ce30..35db5edf4b8b 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -1,13 +1,13 @@ -import { EnemyPokemon, default as Pokemon } from '../field/pokemon'; -import { getLevelTotalExp, getLevelRelExp } from '../data/exp'; -import * as Utils from '../utils'; -import { addTextObject, TextStyle } from './text'; -import { getGenderSymbol, getGenderColor, Gender } from '../data/gender'; -import { StatusEffect } from '../data/status-effect'; -import BattleScene from '../battle-scene'; -import { Type, getTypeRgb } from '../data/type'; -import { getVariantTint } from '#app/data/variant'; -import { BattleStat } from '#app/data/battle-stat'; +import { EnemyPokemon, default as Pokemon } from "../field/pokemon"; +import { getLevelTotalExp, getLevelRelExp } from "../data/exp"; +import * as Utils from "../utils"; +import { addTextObject, TextStyle } from "./text"; +import { getGenderSymbol, getGenderColor, Gender } from "../data/gender"; +import { StatusEffect } from "../data/status-effect"; +import BattleScene from "../battle-scene"; +import { Type, getTypeRgb } from "../data/type"; +import { getVariantTint } from "#app/data/variant"; +import { BattleStat } from "#app/data/battle-stat"; const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ]; @@ -78,24 +78,24 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.box.setOrigin(1, 0.5); this.add(this.box); - this.nameText = addTextObject(this.scene, player ? -115 : -124, player ? -15.2 : -11.2, '', TextStyle.BATTLE_INFO); + this.nameText = addTextObject(this.scene, player ? -115 : -124, player ? -15.2 : -11.2, "", TextStyle.BATTLE_INFO); this.nameText.setOrigin(0, 0); this.add(this.nameText); - this.genderText = addTextObject(this.scene, 0, 0, '', TextStyle.BATTLE_INFO); + this.genderText = addTextObject(this.scene, 0, 0, "", TextStyle.BATTLE_INFO); this.genderText.setOrigin(0, 0); this.genderText.setPositionRelative(this.nameText, 0, 2); this.add(this.genderText); if (!this.player) { - this.ownedIcon = this.scene.add.sprite(0, 0, 'icon_owned'); + this.ownedIcon = this.scene.add.sprite(0, 0, "icon_owned"); this.ownedIcon.setVisible(false); this.ownedIcon.setOrigin(0, 0); this.ownedIcon.setPositionRelative(this.nameText, 0, 11.75); this.add(this.ownedIcon); } - this.teraIcon = this.scene.add.sprite(0, 0, 'icon_tera'); + this.teraIcon = this.scene.add.sprite(0, 0, "icon_tera"); this.teraIcon.setVisible(false); this.teraIcon.setOrigin(0, 0); this.teraIcon.setScale(0.5); @@ -103,22 +103,22 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.teraIcon); - this.shinyIcon = this.scene.add.sprite(0, 0, 'shiny_star'); + this.shinyIcon = this.scene.add.sprite(0, 0, "shiny_star"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); - this.shinyIcon.setScale(0.5) + this.shinyIcon.setScale(0.5); this.shinyIcon.setPositionRelative(this.nameText, 0, 2); this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.shinyIcon); - this.fusionShinyIcon = this.scene.add.sprite(0, 0, 'shiny_star_2'); + this.fusionShinyIcon = this.scene.add.sprite(0, 0, "shiny_star_2"); this.fusionShinyIcon.setVisible(false); this.fusionShinyIcon.setOrigin(0, 0); - this.fusionShinyIcon.setScale(0.5) + this.fusionShinyIcon.setScale(0.5); this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); this.add(this.fusionShinyIcon); - this.splicedIcon = this.scene.add.sprite(0, 0, 'icon_spliced'); + this.splicedIcon = this.scene.add.sprite(0, 0, "icon_spliced"); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); this.splicedIcon.setScale(0.5); @@ -126,7 +126,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.splicedIcon); - this.statusIndicator = this.scene.add.sprite(0, 0, 'statuses'); + this.statusIndicator = this.scene.add.sprite(0, 0, "statuses"); this.statusIndicator.setVisible(false); this.statusIndicator.setOrigin(0, 0); this.statusIndicator.setPositionRelative(this.nameText, 0, 11.5); @@ -135,10 +135,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.levelContainer = this.scene.add.container(player ? -41 : -50, player ? -10 : -5); this.add(this.levelContainer); - const levelOverlay = this.scene.add.image(0, 0, 'overlay_lv'); + const levelOverlay = this.scene.add.image(0, 0, "overlay_lv"); this.levelContainer.add(levelOverlay); - this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, 'overlay_hp'); + this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, "overlay_hp"); this.hpBar.setOrigin(0); this.add(this.hpBar); @@ -151,7 +151,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.hpNumbersContainer = this.scene.add.container(-15, 10); this.add(this.hpNumbersContainer); - const expBar = this.scene.add.image(-98, 18, 'overlay_exp'); + const expBar = this.scene.add.image(-98, 18, "overlay_exp"); expBar.setOrigin(0); this.add(expBar); @@ -186,26 +186,26 @@ export default class BattleInfo extends Phaser.GameObjects.Container { battleStatOrder.map((s, i) => { const statX = i > 1 ? this.statNumbers[i - 2].x + this.statNumbers[i - 2].width + 4 : -this.statsBox.width + 8; const statY = -this.statsBox.height / 2 + 4 + (i < battleStatOrder.length - 1 ? (i % 2 ? 10 : 0) : 5); - const statLabel = this.scene.add.sprite(statX, statY, 'pbinfo_stat', BattleStat[s]); + const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", BattleStat[s]); statLabel.setOrigin(0, 0); statLabels.push(statLabel); this.statValuesContainer.add(statLabel); - const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, 'pbinfo_stat_numbers', '3'); + const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", "3"); statNumber.setOrigin(0, 0); this.statNumbers.push(statNumber); this.statValuesContainer.add(statNumber); }); - this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type1`); + this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type1`); this.type1Icon.setOrigin(0, 0); this.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? 'player' : 'enemy'}_type2`); + this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? "player" : "enemy"}_type2`); this.type2Icon.setOrigin(0, 0); this.add(this.type2Icon); - this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? 'player' : 'enemy'}_type`); + this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type`); this.type3Icon.setOrigin(0, 0); this.add(this.type3Icon); } @@ -222,40 +222,42 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1, 2); this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); - this.teraIcon.on('pointerover', () => { - if (this.lastTeraType !== Type.UNKNOWN) + this.teraIcon.on("pointerover", () => { + if (this.lastTeraType !== Type.UNKNOWN) { (this.scene as BattleScene).ui.showTooltip(null, `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`); + } }); - this.teraIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + this.teraIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); const isFusion = pokemon.isFusion(); this.splicedIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0), 2.5); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies.getName(pokemon.fusionFormIndex)}`)); - this.splicedIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${pokemon.species.getName(pokemon.formIndex)}/${pokemon.fusionSpecies.getName(pokemon.fusionFormIndex)}`)); + this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } const doubleShiny = isFusion && pokemon.shiny && pokemon.fusionShiny; const baseVariant = !doubleShiny ? pokemon.getVariant() : pokemon.variant; this.shinyIcon.setPositionRelative(this.nameText, nameTextWidth + this.genderText.displayWidth + 1 + (this.teraIcon.visible ? this.teraIcon.displayWidth + 1 : 0) + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0), 2.5); - this.shinyIcon.setTexture(`shiny_star${doubleShiny ? '_1' : ''}`); + this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? 'Epic' : baseVariant === 1 ? 'Rare' : 'Common'}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? 'Epic' : pokemon.fusionVariant === 1 ? 'Rare' : 'Common'}` : ''}` - : ''; - this.shinyIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ''}`)); - this.shinyIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + `${baseVariant === 2 ? "Epic" : baseVariant === 1 ? "Rare" : "Common"}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? "Epic" : pokemon.fusionVariant === 1 ? "Rare" : "Common"}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`)); + this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); this.fusionShinyIcon.setVisible(doubleShiny); - if (isFusion) + if (isFusion) { this.fusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant)); + } if (!this.player) { const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; @@ -276,18 +278,21 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; - if (missingDexAttrs || !rootFormHasHiddenAbility) + if (missingDexAttrs || !rootFormHasHiddenAbility) { this.ownedIcon.setTint(0x808080); + } - if (this.boss) + if (this.boss) { this.updateBossSegmentDividers(pokemon as EnemyPokemon); + } } this.hpBar.setScale(pokemon.getHpRatio(true), 1); - this.lastHpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low'; + this.lastHpFrame = this.hpBar.scaleX > 0.5 ? "high" : this.hpBar.scaleX > 0.25 ? "medium" : "low"; this.hpBar.setFrame(this.lastHpFrame); - if (this.player) + if (this.player) { this.setHpNumbers(pokemon.hp, pokemon.getMaxHp()); + } this.lastHp = pokemon.hp; this.lastMaxHp = pokemon.getMaxHp(); @@ -297,44 +302,48 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.shinyIcon.setVisible(pokemon.isShiny()); const types = pokemon.getTypes(true); - this.type1Icon.setTexture(`pbinfo_${this.player ? 'player' : 'enemy'}_type${types.length > 1 ? '1' : ''}`); + this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); this.type1Icon.setFrame(Type[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); - if (types.length > 1) + if (types.length > 1) { this.type2Icon.setFrame(Type[types[1]].toLowerCase()); - if (types.length > 2) + } + if (types.length > 2) { this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + } if (this.player) { this.expMaskRect.x = (pokemon.levelExp / getLevelTotalExp(pokemon.level, pokemon.species.growthRate)) * 510; this.lastExp = pokemon.exp; this.lastLevelExp = pokemon.levelExp; - this.statValuesContainer.setPosition(8, 7) + this.statValuesContainer.setPosition(8, 7); } const battleStats = battleStatOrder.map(() => 0); - this.lastBattleStats = battleStats.join(''); + this.lastBattleStats = battleStats.join(""); this.updateBattleStats(battleStats); } getTextureName(): string { - return `pbinfo_${this.player ? 'player' : 'enemy'}${!this.player && this.boss ? '_boss' : this.mini ? '_mini' : ''}`; + return `pbinfo_${this.player ? "player" : "enemy"}${!this.player && this.boss ? "_boss" : this.mini ? "_mini" : ""}`; } setMini(mini: boolean): void { - if (this.mini === mini) + if (this.mini === mini) { return; + } this.mini = mini; this.box.setTexture(this.getTextureName()); this.statsBox.setTexture(`${this.getTextureName()}_stats`); - if (this.player) + if (this.player) { this.y -= 12 * (mini ? 1 : -1); + } const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ]; offsetElements.forEach(el => el.y += 1.5 * (mini ? -1 : 1)); @@ -355,7 +364,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.scene.tweens.add({ targets: this.statsContainer, duration: Utils.fixedInt(125), - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", alpha: visible ? 1 : 0 }); } @@ -369,7 +378,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); - this.hpBar.setTexture(`overlay_hp${boss ? '_boss' : ''}`); + this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); this.box.setTexture(this.getTextureName()); this.statsBox.setTexture(`${this.getTextureName()}_stats`); } @@ -379,15 +388,16 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } updateBossSegmentDividers(pokemon: EnemyPokemon): void { - while (this.hpBarSegmentDividers.length) + while (this.hpBarSegmentDividers.length) { this.hpBarSegmentDividers.pop().destroy(); + } if (this.boss && this.bossSegments > 1) { const uiTheme = (this.scene as BattleScene).uiTheme; const maxHp = pokemon.getMaxHp(); for (let s = 1; s < this.bossSegments; s++) { const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; - const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040) + const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040); divider.setOrigin(0.5, 0); this.add(divider); this.moveBelow(divider as Phaser.GameObjects.GameObject, this.statsContainer); @@ -399,8 +409,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } setOffset(offset: boolean): void { - if (this.offset === offset) + if (this.offset === offset) { return; + } this.offset = offset; @@ -410,8 +421,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { updateInfo(pokemon: Pokemon, instant?: boolean): Promise { return new Promise(resolve => { - if (!this.scene) + if (!this.scene) { return resolve(); + } const nameUpdated = this.lastName !== pokemon.name; @@ -441,46 +453,51 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) { this.lastStatus = pokemon.status?.effect || StatusEffect.NONE; - if (this.lastStatus !== StatusEffect.NONE) + if (this.lastStatus !== StatusEffect.NONE) { this.statusIndicator.setFrame(StatusEffect[this.lastStatus].toLowerCase()); + } this.statusIndicator.setVisible(!!this.lastStatus); - if (!this.player && this.ownedIcon.visible) + if (!this.player && this.ownedIcon.visible) { this.ownedIcon.setAlpha(this.statusIndicator.visible ? 0 : 1); + } } const types = pokemon.getTypes(true); - this.type1Icon.setTexture(`pbinfo_${this.player ? 'player' : 'enemy'}_type${types.length > 1 ? '1' : ''}`); + this.type1Icon.setTexture(`pbinfo_${this.player ? "player" : "enemy"}_type${types.length > 1 ? "1" : ""}`); this.type1Icon.setFrame(Type[types[0]].toLowerCase()); this.type2Icon.setVisible(types.length > 1); this.type3Icon.setVisible(types.length > 2); - if (types.length > 1) + if (types.length > 1) { this.type2Icon.setFrame(Type[types[1]].toLowerCase()); - if (types.length > 2) + } + if (types.length > 2) { this.type3Icon.setFrame(Type[types[2]].toLowerCase()); + } const updateHpFrame = () => { - const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low'; + const hpFrame = this.hpBar.scaleX > 0.5 ? "high" : this.hpBar.scaleX > 0.25 ? "medium" : "low"; if (hpFrame !== this.lastHpFrame) { this.hpBar.setFrame(hpFrame); this.lastHpFrame = hpFrame; - }; + } }; const updatePokemonHp = () => { let duration = !instant ? Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0; const speed = (this.scene as BattleScene).hpBarSpeed; - if (speed) + if (speed) { duration = speed >= 3 ? 0 : duration / Math.pow(2, speed); + } this.scene.tweens.add({ targets: this.hpBar, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", scaleX: pokemon.getHpRatio(true), duration: duration, onUpdate: () => { if (this.player && this.lastHp !== pokemon.hp) { const tweenHp = Math.ceil(this.hpBar.scaleX * pokemon.getMaxHp()); - this.setHpNumbers(tweenHp, pokemon.getMaxHp()) + this.setHpNumbers(tweenHp, pokemon.getMaxHp()); this.lastHp = tweenHp; } @@ -491,8 +508,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container { resolve(); } }); - if (!this.player) + if (!this.player) { this.lastHp = pokemon.hp; + } this.lastMaxHp = pokemon.getMaxHp(); }; @@ -501,17 +519,18 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if ((this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level)) { const originalResolve = resolve; - let durationMultipler = Math.max(Phaser.Tweens.Builders.GetEaseFunction('Cubic.easeIn')(1 - (Math.min(pokemon.level - this.lastLevel, 10) / 10)), 0.1); + const durationMultipler = Math.max(Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")(1 - (Math.min(pokemon.level - this.lastLevel, 10) / 10)), 0.1); resolve = () => this.updatePokemonExp(pokemon, false, durationMultipler).then(() => originalResolve()); - } else if (isLevelCapped !== this.lastLevelCapped) + } else if (isLevelCapped !== this.lastLevelCapped) { this.setLevel(pokemon.level); + } this.lastLevelCapped = isLevelCapped; } - if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) + if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) { return updatePokemonHp(); - else if (!this.player && this.lastLevel !== pokemon.level) { + } else if (!this.player && this.lastLevel !== pokemon.level) { this.setLevel(pokemon.level); this.lastLevel = pokemon.level; } @@ -519,7 +538,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const battleStats = pokemon.summonData ? pokemon.summonData.battleStats : battleStatOrder.map(() => 0); - const battleStatsStr = battleStats.join(''); + const battleStatsStr = battleStats.join(""); if (this.lastBattleStats !== battleStatsStr) { this.updateBattleStats(battleStats); @@ -533,14 +552,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } updateNameText(pokemon: Pokemon): void { - let displayName = pokemon.name.replace(/[♂♀]/g, ''); + let displayName = pokemon.name.replace(/[♂♀]/g, ""); let nameTextWidth: number; - let nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.BATTLE_INFO); + const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.BATTLE_INFO); nameTextWidth = nameSizeTest.displayWidth; while (nameTextWidth > (this.player || !this.boss ? 60 : 98) - ((pokemon.gender !== Gender.GENDERLESS ? 6 : 0) + (pokemon.fusionSpecies ? 8 : 0) + (pokemon.isShiny() ? 8 : 0) + (Math.min(pokemon.level.toString().length, 3) - 3) * 8)) { - displayName = `${displayName.slice(0, displayName.endsWith('.') ? -2 : -1).trimEnd()}.`; + displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; } @@ -558,14 +577,15 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const levelExp = levelUp ? relLevelExp : pokemon.levelExp; let ratio = relLevelExp ? levelExp / relLevelExp : 0; if (this.lastLevel >= (this.scene as BattleScene).getMaxExpLevel(true)) { - if (levelUp) + if (levelUp) { ratio = 1; - else + } else { ratio = 0; + } instant = true; } - const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction('Sine.easeIn')(1 - (Math.max(this.lastLevel - 100, 0) / 150)); - let duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * 1650) * durationMultiplier * levelDurationMultiplier : 0; + const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - (Math.max(this.lastLevel - 100, 0) / 150)); + const duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * 1650) * durationMultiplier * levelDurationMultiplier : 0; if (ratio === 1) { this.lastLevelExp = 0; this.lastLevel++; @@ -573,20 +593,23 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.lastExp = pokemon.exp; this.lastLevelExp = pokemon.levelExp; } - if (duration) - (this.scene as BattleScene).playSound('exp'); + if (duration) { + (this.scene as BattleScene).playSound("exp"); + } this.scene.tweens.add({ targets: this.expMaskRect, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", x: ratio * 510, duration: duration, onComplete: () => { - if (!this.scene) + if (!this.scene) { return resolve(); - if (duration) - this.scene.sound.stopByKey('exp'); + } + if (duration) { + this.scene.sound.stopByKey("exp"); + } if (ratio === 1) { - (this.scene as BattleScene).playSound('level_up'); + (this.scene as BattleScene).playSound("level_up"); this.setLevel(this.lastLevel); this.scene.time.delayedCall(500 * levelDurationMultiplier, () => { this.expMaskRect.x = 0; @@ -604,23 +627,27 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const isCapped = level >= (this.scene as BattleScene).getMaxExpLevel(); this.levelNumbersContainer.removeAll(true); const levelStr = level.toString(); - for (let i = 0; i < levelStr.length; i++) - this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, `numbers${isCapped && this.player ? '_red' : ''}`, levelStr[i])); + for (let i = 0; i < levelStr.length; i++) { + this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, `numbers${isCapped && this.player ? "_red" : ""}`, levelStr[i])); + } this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0)); } setHpNumbers(hp: integer, maxHp: integer): void { - if (!this.player || !this.scene) + if (!this.player || !this.scene) { return; + } this.hpNumbersContainer.removeAll(true); const hpStr = hp.toString(); const maxHpStr = maxHp.toString(); let offset = 0; - for (let i = maxHpStr.length - 1; i >= 0; i--) - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', maxHpStr[i])); - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', '/')); - for (let i = hpStr.length - 1; i >= 0; i--) - this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i])); + for (let i = maxHpStr.length - 1; i >= 0; i--) { + this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", maxHpStr[i])); + } + this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", "/")); + for (let i = hpStr.length - 1; i >= 0; i--) { + this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, "numbers", hpStr[i])); + } } updateBattleStats(battleStats: integer[]): void { @@ -642,4 +669,4 @@ export class EnemyBattleInfo extends BattleInfo { } setMini(mini: boolean): void { } // Always mini -} \ No newline at end of file +} diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index b7dccef52b54..0f856cbb3901 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -7,7 +7,7 @@ import { getStatName, Stat } from "../data/pokemon-stat"; import { addWindow } from "./ui-theme"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import {Button} from "../enums/buttons"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export default class BattleMessageUiHandler extends MessageUiHandler { private levelUpStatsContainer: Phaser.GameObjects.Container; @@ -31,7 +31,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textTimer = null; this.textCallbackTimer = null; - const bg = this.scene.add.sprite(0, 0, 'bg', this.scene.windowType); + const bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); bg.setOrigin(0, 1); ui.add(bg); @@ -63,7 +63,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { const messageContainer = this.scene.add.container(12, -39); ui.add(messageContainer); - const message = addTextObject(this.scene, 0, 0, '', TextStyle.MESSAGE, { + const message = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { width: 1780 @@ -76,16 +76,16 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.nameBoxContainer = this.scene.add.container(0, -16); this.nameBoxContainer.setVisible(false); - this.nameBox = this.scene.add.nineslice(0, 0, 'namebox', this.scene.windowType, 72, 16, 8, 8, 5, 5); + this.nameBox = this.scene.add.nineslice(0, 0, "namebox", this.scene.windowType, 72, 16, 8, 8, 5, 5); this.nameBox.setOrigin(0, 0); - this.nameText = addTextObject(this.scene, 8, 0, 'Rival', TextStyle.MESSAGE, { maxLines: 1 }); + this.nameText = addTextObject(this.scene, 8, 0, "Rival", TextStyle.MESSAGE, { maxLines: 1 }); this.nameBoxContainer.add(this.nameBox); this.nameBoxContainer.add(this.nameText); messageContainer.add(this.nameBoxContainer); - const prompt = this.scene.add.sprite(0, 0, 'prompt'); + const prompt = this.scene.add.sprite(0, 0, "prompt"); prompt.setVisible(false); prompt.setOrigin(0, 0); messageContainer.add(prompt); @@ -98,12 +98,13 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsContainer = levelUpStatsContainer; - const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, '', TextStyle.WINDOW, { maxLines: 6 }); - let levelUpStatsLabelText = ''; + const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 }); + let levelUpStatsLabelText = ""; const stats = Utils.getEnumValues(Stat); - for (let s of stats) + for (const s of stats) { levelUpStatsLabelText += `${getStatName(s)}\n`; + } levelUpStatsLabelsContent.text = levelUpStatsLabelText; levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth; @@ -113,14 +114,14 @@ export default class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsContainer.add(levelUpStatsLabelsContent); - const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, '+\n+\n+\n+\n+\n+', TextStyle.WINDOW, { maxLines: 6 }); + const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, { maxLines: 6 }); levelUpStatsContainer.add(levelUpStatsIncrContent); this.levelUpStatsIncrContent = levelUpStatsIncrContent; - const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, '', TextStyle.WINDOW, { maxLines: 6 , lineSpacing: 5}); + const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6 , lineSpacing: 5}); levelUpStatsValuesContent.setOrigin(1, 0); - levelUpStatsValuesContent.setAlign('right'); + levelUpStatsValuesContent.setAlign("right"); levelUpStatsContainer.add(levelUpStatsValuesContent); this.levelUpStatsValuesContent = levelUpStatsValuesContent; @@ -167,21 +168,23 @@ export default class BattleMessageUiHandler extends MessageUiHandler { promptLevelUpStats(partyMemberIndex: integer, prevStats: integer[], showTotals: boolean): Promise { return new Promise(resolve => { - if (!this.scene.showLevelUpStats) + if (!this.scene.showLevelUpStats) { return resolve(); + } const newStats = (this.scene as BattleScene).getParty()[partyMemberIndex].stats; - let levelUpStatsValuesText = ''; + let levelUpStatsValuesText = ""; const stats = Utils.getEnumValues(Stat); - for (let s of stats) + for (const s of stats) { levelUpStatsValuesText += `${showTotals ? newStats[s] : newStats[s] - prevStats[s]}\n`; + } this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(!showTotals); this.levelUpStatsContainer.setVisible(true); this.awaitingActionInput = true; this.onActionInput = () => { - if (!showTotals) + if (!showTotals) { return this.promptLevelUpStats(partyMemberIndex, null, true).then(() => resolve()); - else { + } else { this.levelUpStatsContainer.setVisible(false); resolve(); } @@ -192,11 +195,11 @@ export default class BattleMessageUiHandler extends MessageUiHandler { promptIvs(pokemonId: integer, ivs: integer[], shownIvsCount: integer): Promise { return new Promise(resolve => { this.scene.executeWithSeedOffset(() => { - let levelUpStatsValuesText = ''; + let levelUpStatsValuesText = ""; const stats = Utils.getEnumValues(Stat); let shownStats: Stat[] = []; if (shownIvsCount < 6) { - let statsPool = stats.slice(0); + const statsPool = stats.slice(0); for (let i = 0; i < shownIvsCount; i++) { let shownStat: Stat; let highestIv = -1; @@ -209,10 +212,12 @@ export default class BattleMessageUiHandler extends MessageUiHandler { shownStats.push(shownStat); statsPool.splice(statsPool.indexOf(shownStat), 1); } - } else + } else { shownStats = stats; - for (let s of stats) - levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : '???'}\n`; + } + for (const s of stats) { + levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`; + } this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(false); this.levelUpStatsContainer.setVisible(true); @@ -235,20 +240,25 @@ export default class BattleMessageUiHandler extends MessageUiHandler { const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY; const color = getTextColor(textStyle, false, uiTheme); return `[color=${color}][shadow=${getTextColor(textStyle, true, uiTheme)}]${text}[/shadow][/color]`; -}; - - if (value > 30) - return coloredText(i18next.t('battleMessageUiHandler:ivBest'), value > starterIvs[typeIv]); - if (value === 30) - return coloredText(i18next.t('battleMessageUiHandler:ivFantastic'), value > starterIvs[typeIv]); - if (value > 20) - return coloredText(i18next.t('battleMessageUiHandler:ivVeryGood'), value > starterIvs[typeIv]); - if (value > 10) - return coloredText(i18next.t('battleMessageUiHandler:ivPrettyGood'), value > starterIvs[typeIv]); - if (value > 0) - return coloredText(i18next.t('battleMessageUiHandler:ivDecent'), value > starterIvs[typeIv]); - - return coloredText(i18next.t('battleMessageUiHandler:ivNoGood'), value > starterIvs[typeIv]); + }; + + if (value > 30) { + return coloredText(i18next.t("battleMessageUiHandler:ivBest"), value > starterIvs[typeIv]); + } + if (value === 30) { + return coloredText(i18next.t("battleMessageUiHandler:ivFantastic"), value > starterIvs[typeIv]); + } + if (value > 20) { + return coloredText(i18next.t("battleMessageUiHandler:ivVeryGood"), value > starterIvs[typeIv]); + } + if (value > 10) { + return coloredText(i18next.t("battleMessageUiHandler:ivPrettyGood"), value > starterIvs[typeIv]); + } + if (value > 0) { + return coloredText(i18next.t("battleMessageUiHandler:ivDecent"), value > starterIvs[typeIv]); + } + + return coloredText(i18next.t("battleMessageUiHandler:ivNoGood"), value > starterIvs[typeIv]); } showNameText(name: string): void { diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index a4cc12950282..5afb06ba3e3a 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -21,24 +21,24 @@ export default class CandyBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, 'party_exp_bar', null, 8, 18, 21, 5, 6, 4); + this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", null, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); - this.candyIcon = this.scene.add.sprite(14, 0, 'items', 'candy'); + this.candyIcon = this.scene.add.sprite(14, 0, "items", "candy"); this.candyIcon.setOrigin(0.5, 0); this.candyIcon.setScale(0.5); this.add(this.candyIcon); - this.candyOverlayIcon = this.scene.add.sprite(14, 0, 'items', 'candy_overlay'); + this.candyOverlayIcon = this.scene.add.sprite(14, 0, "items", "candy_overlay"); this.candyOverlayIcon.setOrigin(0.5, 0); this.candyOverlayIcon.setScale(0.5); this.add(this.candyOverlayIcon); - this.countText = addTextObject(this.scene, 22, 4, '', TextStyle.BATTLE_INFO); + this.countText = addTextObject(this.scene, 22, 4, "", TextStyle.BATTLE_INFO); this.countText.setOrigin(0, 0); this.add(this.countText); @@ -49,10 +49,11 @@ export default class CandyBar extends Phaser.GameObjects.Container { showStarterSpeciesCandy(starterSpeciesId: Species, count: integer): Promise { return new Promise(resolve => { if (this.shown) { - if (this.speciesId === starterSpeciesId) + if (this.speciesId === starterSpeciesId) { return resolve(); - else + } else { return this.hide().then(() => this.showStarterSpeciesCandy(starterSpeciesId, count)).then(() => resolve()); + } } const colorScheme = starterColors[starterSpeciesId]; @@ -66,16 +67,17 @@ export default class CandyBar extends Phaser.GameObjects.Container { (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) + if (this.tween) { this.tween.stop(); + } - (this.scene as BattleScene).playSound('shing'); + (this.scene as BattleScene).playSound("shing"); this.tween = this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5), duration: 500, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.tween = null; this.resetAutoHideTimer(); @@ -90,20 +92,23 @@ export default class CandyBar extends Phaser.GameObjects.Container { hide(): Promise { return new Promise(resolve => { - if (!this.shown) + if (!this.shown) { return resolve(); + } - if (this.autoHideTimer) + if (this.autoHideTimer) { clearInterval(this.autoHideTimer); + } - if (this.tween) + if (this.tween) { this.tween.stop(); + } this.tween = this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6), duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.tween = null; this.shown = false; @@ -115,11 +120,12 @@ export default class CandyBar extends Phaser.GameObjects.Container { } resetAutoHideTimer(): void { - if (this.autoHideTimer) + if (this.autoHideTimer) { clearInterval(this.autoHideTimer); + } this.autoHideTimer = setTimeout(() => { this.hide(); this.autoHideTimer = null; }, 2500); } -} \ No newline at end of file +} diff --git a/src/ui/char-sprite.ts b/src/ui/char-sprite.ts index 994c10eb9d75..1e6459096fe3 100644 --- a/src/ui/char-sprite.ts +++ b/src/ui/char-sprite.ts @@ -15,7 +15,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { setup(): void { [ this.sprite, this.transitionSprite ] = new Array(2).fill(null).map(() => { - const ret = this.scene.add.sprite(0, 0, '', ''); + const ret = this.scene.add.sprite(0, 0, "", ""); ret.setOrigin(0.5, 1); this.add(ret); return ret; @@ -29,13 +29,16 @@ export default class CharSprite extends Phaser.GameObjects.Container { showCharacter(key: string, variant: string): Promise { return new Promise(resolve => { - if (!key.startsWith('c_')) + if (!key.startsWith("c_")) { key = `c_${key}`; + } if (this.shown) { - if (key === this.key && variant === this.variant) + if (key === this.key && variant === this.variant) { return resolve(); - if (key !== this.key) + } + if (key !== this.key) { return this.hide().then(() => this.showCharacter(key, variant)); + } this.setVariant(variant).then(() => resolve()); return; } @@ -48,7 +51,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { targets: this, x: (this.scene.game.canvas.width / 6) - 102, duration: 750, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", onComplete: () => { resolve(); } @@ -73,7 +76,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { targets: this.transitionSprite, alpha: 1, duration: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.sprite.setTexture(this.key, variant); this.transitionSprite.setVisible(false); @@ -86,22 +89,24 @@ export default class CharSprite extends Phaser.GameObjects.Container { hide(): Promise { return new Promise(resolve => { - if (!this.shown) + if (!this.shown) { return resolve(); + } this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6) + 32, duration: 750, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { - if (!this.shown) + if (!this.shown) { this.setVisible(false); + } resolve(); } }); this.shown = false; }); - }; -} \ No newline at end of file + } +} diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index a27053015633..ad0d1a4ad11b 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -4,7 +4,7 @@ import { addTextObject, TextStyle } from "./text"; import PartyUiHandler, { PartyUiMode } from "./party-ui-handler"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; import {Button} from "../enums/buttons"; export enum Command { @@ -12,7 +12,7 @@ export enum Command { BALL, POKEMON, RUN -}; +} export default class CommandUiHandler extends UiHandler { private commandsContainer: Phaser.GameObjects.Container; @@ -28,10 +28,10 @@ export default class CommandUiHandler extends UiHandler { setup() { const ui = this.getUi(); const commands = [ - i18next.t('commandUiHandler:fight'), - i18next.t('commandUiHandler:ball'), - i18next.t('commandUiHandler:pokemon'), - i18next.t('commandUiHandler:run') + i18next.t("commandUiHandler:fight"), + i18next.t("commandUiHandler:ball"), + i18next.t("commandUiHandler:pokemon"), + i18next.t("commandUiHandler:run") ]; this.commandsContainer = this.scene.add.container(216, -38.7); @@ -52,17 +52,18 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.setVisible(true); let commandPhase: CommandPhase; - let currentPhase = this.scene.getCurrentPhase(); - if (currentPhase instanceof CommandPhase) + const currentPhase = this.scene.getCurrentPhase(); + if (currentPhase instanceof CommandPhase) { commandPhase = currentPhase; - else + } else { commandPhase = this.scene.getStandbyPhase() as CommandPhase; + } const messageHandler = this.getUi().getMessageHandler(); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(i18next.t('commandUiHandler:actionMessage', {pokemonName: commandPhase.getPokemon().name}), 0); + messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: commandPhase.getPokemon().name}), 0); this.setCursor(this.getCursor()); return true; @@ -79,54 +80,61 @@ export default class CommandUiHandler extends UiHandler { if (button === Button.ACTION) { switch (cursor) { - // Fight - case 0: - if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) - return true; - ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - success = true; - break; + // Fight + case 0: + if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) { + return true; + } + ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + success = true; + break; // Ball - case 1: - ui.setModeWithoutClear(Mode.BALL); - success = true; - break; + case 1: + ui.setModeWithoutClear(Mode.BALL); + success = true; + break; // Pokemon - case 2: - ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); - success = true; - break; + case 2: + ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); + success = true; + break; // Run - case 3: - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); - success = true; - break; + case 3: + (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); + success = true; + break; } - } else + } else { (this.scene.getCurrentPhase() as CommandPhase).cancel(); + } } else { switch (button) { - case Button.UP: - if (cursor >= 2) - success = this.setCursor(cursor - 2); - break; - case Button.DOWN: - if (cursor < 2) - success = this.setCursor(cursor + 2); - break; - case Button.LEFT: - if (cursor % 2 === 1) - success = this.setCursor(cursor - 1); - break; - case Button.RIGHT: - if (cursor % 2 === 0) - success = this.setCursor(cursor + 1); - break; + case Button.UP: + if (cursor >= 2) { + success = this.setCursor(cursor - 2); + } + break; + case Button.DOWN: + if (cursor < 2) { + success = this.setCursor(cursor + 2); + } + break; + case Button.LEFT: + if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor % 2 === 0) { + success = this.setCursor(cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -138,14 +146,15 @@ export default class CommandUiHandler extends UiHandler { setCursor(cursor: integer): boolean { const changed = this.getCursor() !== cursor; if (changed) { - if (!this.fieldIndex) + if (!this.fieldIndex) { this.cursor = cursor; - else + } else { this.cursor2 = cursor; + } } if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.commandsContainer.add(this.cursorObj); } @@ -163,8 +172,9 @@ export default class CommandUiHandler extends UiHandler { } eraseCursor(): void { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index a9b959a99503..c2048eb1f88b 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -59,8 +59,9 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { } processInput(button: Button): boolean { - if (button === Button.CANCEL && this.blockInput) + if (button === Button.CANCEL && this.blockInput) { this.unblockInput(); + } return super.processInput(button); } @@ -68,9 +69,10 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { setCursor(cursor: integer): boolean { const ret = super.setCursor(cursor); - if (ret && this.switchCheck) + if (ret && this.switchCheck) { this.switchCheckCursor = this.cursor; + } return ret; } -} \ No newline at end of file +} diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index 139a6d60cd78..0a5c777cc2a9 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -62,7 +62,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { const titleWindow = addWindow(this.scene, 0, 0, 114, 18, false, false, null, null, WindowVariant.THIN); this.add(titleWindow); - this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t('menu:loading'), TextStyle.WINDOW, { fontSize: '64px' }); + this.titleLabel = addTextObject(this.scene, titleWindow.displayWidth / 2, titleWindow.displayHeight / 2, i18next.t("menu:loading"), TextStyle.WINDOW, { fontSize: "64px" }); this.titleLabel.setOrigin(0.5, 0.5); this.add(this.titleLabel); @@ -72,52 +72,54 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.rankingsContainer = this.scene.add.container(6, 21); this.add(this.rankingsContainer); - this.loadingLabel = addTextObject(this.scene, window.displayWidth / 2, window.displayHeight / 2 + 16, '', TextStyle.WINDOW); + this.loadingLabel = addTextObject(this.scene, window.displayWidth / 2, window.displayHeight / 2 + 16, "", TextStyle.WINDOW); this.loadingLabel.setOrigin(0.5, 0.5); this.loadingLabel.setVisible(false); - this.prevCategoryButton = this.scene.add.sprite(4, 4, 'cursor_reverse'); + this.prevCategoryButton = this.scene.add.sprite(4, 4, "cursor_reverse"); this.prevCategoryButton.setOrigin(0, 0); this.add(this.prevCategoryButton); this.prevCategoryButton.setInteractive(new Phaser.Geom.Rectangle(0, 0, 6, 10), Phaser.Geom.Rectangle.Contains); - this.prevCategoryButton.on('pointerup', () => { + this.prevCategoryButton.on("pointerup", () => { this.update(this.category ? this.category - 1 : Utils.getEnumKeys(ScoreboardCategory).length - 1); }); - this.nextCategoryButton = this.scene.add.sprite(window.displayWidth - 4, 4, 'cursor'); + this.nextCategoryButton = this.scene.add.sprite(window.displayWidth - 4, 4, "cursor"); this.nextCategoryButton.setOrigin(1, 0); this.add(this.nextCategoryButton); this.nextCategoryButton.setInteractive(new Phaser.Geom.Rectangle(0, 0, 6, 10), Phaser.Geom.Rectangle.Contains); - this.nextCategoryButton.on('pointerup', () => { + this.nextCategoryButton.on("pointerup", () => { this.update(this.category < Utils.getEnumKeys(ScoreboardCategory).length - 1 ? this.category + 1 : 0); }); - this.prevPageButton = this.scene.add.sprite(window.displayWidth / 2 - 16, titleWindow.displayHeight + window.displayHeight - 15, 'cursor_reverse'); + this.prevPageButton = this.scene.add.sprite(window.displayWidth / 2 - 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor_reverse"); this.prevPageButton.setOrigin(0, 0); this.prevPageButton.setAlpha(0.5); this.add(this.prevPageButton); this.prevPageButton.setInteractive(new Phaser.Geom.Rectangle(0, 0, 6, 10), Phaser.Geom.Rectangle.Contains); - this.prevPageButton.on('pointerup', () => { - if (this.page > 1) + this.prevPageButton.on("pointerup", () => { + if (this.page > 1) { this.update(undefined, this.page > 1 ? this.page - 1 : this.pageCount); + } }); - this.pageNumberLabel = addTextObject(this.scene, window.displayWidth / 2, titleWindow.displayHeight + window.displayHeight - 16, '1', TextStyle.WINDOW, { fontSize: '64px' }); + this.pageNumberLabel = addTextObject(this.scene, window.displayWidth / 2, titleWindow.displayHeight + window.displayHeight - 16, "1", TextStyle.WINDOW, { fontSize: "64px" }); this.pageNumberLabel.setOrigin(0.5, 0); this.add(this.pageNumberLabel); - this.nextPageButton = this.scene.add.sprite(window.displayWidth / 2 + 16, titleWindow.displayHeight + window.displayHeight - 15, 'cursor'); + this.nextPageButton = this.scene.add.sprite(window.displayWidth / 2 + 16, titleWindow.displayHeight + window.displayHeight - 15, "cursor"); this.nextPageButton.setOrigin(1, 0); this.nextPageButton.setAlpha(0.5); this.add(this.nextPageButton); this.nextPageButton.setInteractive(new Phaser.Geom.Rectangle(0, 0, 6, 10), Phaser.Geom.Rectangle.Contains); - this.nextPageButton.on('pointerup', () => { - if (this.page < this.pageCount) + this.nextPageButton.on("pointerup", () => { + if (this.page < this.pageCount) { this.update(undefined, this.page < this.pageCount ? this.page + 1 : 0); + } }); this.add(this.loadingLabel); @@ -130,29 +132,29 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { const getEntry = (rank: string, username: string, score: string, wave: string) => { const entryContainer = this.scene.add.container(0, 0); - const rankLabel = addTextObject(this.scene, 0, 0, rank, TextStyle.WINDOW, { fontSize: '54px' }); + const rankLabel = addTextObject(this.scene, 0, 0, rank, TextStyle.WINDOW, { fontSize: "54px" }); entryContainer.add(rankLabel); - const usernameLabel = addTextObject(this.scene, 12, 0, username, TextStyle.WINDOW, { fontSize: '54px' }); + const usernameLabel = addTextObject(this.scene, 12, 0, username, TextStyle.WINDOW, { fontSize: "54px" }); entryContainer.add(usernameLabel); - const scoreLabel = addTextObject(this.scene, 84, 0, score, TextStyle.WINDOW, { fontSize: '54px' }); + const scoreLabel = addTextObject(this.scene, 84, 0, score, TextStyle.WINDOW, { fontSize: "54px" }); entryContainer.add(scoreLabel); switch (this.category) { - case ScoreboardCategory.DAILY: - const waveLabel = addTextObject(this.scene, 68, 0, wave, TextStyle.WINDOW, { fontSize: '54px' }); - entryContainer.add(waveLabel); - break; - case ScoreboardCategory.WEEKLY: - scoreLabel.x -= 16; - break; + case ScoreboardCategory.DAILY: + const waveLabel = addTextObject(this.scene, 68, 0, wave, TextStyle.WINDOW, { fontSize: "54px" }); + entryContainer.add(waveLabel); + break; + case ScoreboardCategory.WEEKLY: + scoreLabel.x -= 16; + break; } return entryContainer; }; - this.rankingsContainer.add(getEntry('#', 'Username', 'Score', 'Wave')); + this.rankingsContainer.add(getEntry("#", "Username", "Score", "Wave")); rankings.forEach((r: RankingEntry, i: integer) => { const entryContainer = getEntry(r.rank.toString(), r.username, r.score.toString(), r.wave.toString()); @@ -181,11 +183,12 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { this.isUpdating = true; this.rankingsContainer.removeAll(true); - this.loadingLabel.setText(i18next.t('menu:loading')); + this.loadingLabel.setText(i18next.t("menu:loading")); this.loadingLabel.setVisible(true); - if (category !== this.category) + if (category !== this.category) { this.page = page = 1; + } Utils.executeIf(category !== this.category || this.pageCount === undefined, () => Utils.apiFetch(`daily/rankingpagecount?category=${category}`).then(response => response.json()).then(count => this.pageCount = count) @@ -200,14 +203,15 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { if (jsonResponse) { this.loadingLabel.setVisible(false); this.updateRankings(jsonResponse); - } else - this.loadingLabel.setText(i18next.t('menu:noRankings')); + } else { + this.loadingLabel.setText(i18next.t("menu:noRankings")); + } }).finally(() => { this.isUpdating = false; }); }).catch(err => { - console.error("Failed to load daily rankings:\n", err) - }) + console.error("Failed to load daily rankings:\n", err); + }); } /** @@ -235,4 +239,4 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { export interface DailyRunScoreboard { scene: BattleScene -}; \ No newline at end of file +} diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 7fd49157da71..ef8e5de24c73 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -10,7 +10,7 @@ import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import { EggTier } from "../data/enums/egg-type"; import {Button} from "../enums/buttons"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export default class EggGachaUiHandler extends MessageUiHandler { private eggGachaContainer: Phaser.GameObjects.Container; @@ -43,7 +43,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.gachaInfoContainers = []; this.voucherCountLabels = []; - this.defaultText = i18next.t('egg:selectMachine'); + this.defaultText = i18next.t("egg:selectMachine"); } setup() { @@ -55,19 +55,19 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.setVisible(false); ui.add(this.eggGachaContainer); - const bg = this.scene.add.nineslice(0, 0, 'default_bg', null, 320, 180, 0, 0, 16, 0); + const bg = this.scene.add.nineslice(0, 0, "default_bg", null, 320, 180, 0, 0, 16, 0); bg.setOrigin(0, 0); this.eggGachaContainer.add(bg); - const hatchFrameNames = this.scene.anims.generateFrameNames('gacha_hatch', { suffix: ".png", start: 1, end: 4 }); + const hatchFrameNames = this.scene.anims.generateFrameNames("gacha_hatch", { suffix: ".png", start: 1, end: 4 }); this.scene.anims.create({ - key: 'open', + key: "open", frames: hatchFrameNames, frameRate: 12 }); this.scene.anims.create({ - key: 'close', + key: "close", frames: hatchFrameNames.reverse(), frameRate: 12 }); @@ -82,41 +82,41 @@ export default class EggGachaUiHandler extends MessageUiHandler { const gachaUnderlay = this.scene.add.sprite(115, 80, `gacha_underlay_${gachaTypeKey}`); gachaUnderlay.setOrigin(0, 0); - const gachaEggs = this.scene.add.sprite(0, 0, 'gacha_eggs'); + const gachaEggs = this.scene.add.sprite(0, 0, "gacha_eggs"); gachaEggs.setOrigin(0, 0); - const gachaGlass = this.scene.add.sprite(0, 0, 'gacha_glass'); + const gachaGlass = this.scene.add.sprite(0, 0, "gacha_glass"); gachaGlass.setOrigin(0, 0); const gachaInfoContainer = this.scene.add.container(160, 46); - const gachaUpLabel = addTextObject(this.scene, 4, 0, 'UP!', TextStyle.WINDOW_ALT); + const gachaUpLabel = addTextObject(this.scene, 4, 0, "UP!", TextStyle.WINDOW_ALT); gachaUpLabel.setOrigin(0, 0); gachaInfoContainer.add(gachaUpLabel); switch (gachaType as GachaType) { - case GachaType.LEGENDARY: - const pokemonIcon = this.scene.add.sprite(-20, 6, 'pokemon_icons_0'); - pokemonIcon.setScale(0.5); - pokemonIcon.setOrigin(0, 0.5); + case GachaType.LEGENDARY: + const pokemonIcon = this.scene.add.sprite(-20, 6, "pokemon_icons_0"); + pokemonIcon.setScale(0.5); + pokemonIcon.setOrigin(0, 0.5); - gachaInfoContainer.add(pokemonIcon); - break; - case GachaType.MOVE: - gachaUpLabel.setText('Move UP!'); - gachaUpLabel.setX(0); - gachaUpLabel.setOrigin(0.5, 0); - break; - case GachaType.SHINY: - gachaUpLabel.setText('Shiny UP!'); - gachaUpLabel.setX(0); - gachaUpLabel.setOrigin(0.5, 0); - break; + gachaInfoContainer.add(pokemonIcon); + break; + case GachaType.MOVE: + gachaUpLabel.setText("Move UP!"); + gachaUpLabel.setX(0); + gachaUpLabel.setOrigin(0.5, 0); + break; + case GachaType.SHINY: + gachaUpLabel.setText("Shiny UP!"); + gachaUpLabel.setX(0); + gachaUpLabel.setOrigin(0.5, 0); + break; } - const gachaKnob = this.scene.add.sprite(191, 89, 'gacha_knob'); + const gachaKnob = this.scene.add.sprite(191, 89, "gacha_knob"); - const gachaHatch = this.scene.add.sprite(115, 73, 'gacha_hatch'); + const gachaHatch = this.scene.add.sprite(115, 73, "gacha_hatch"); gachaHatch.setOrigin(0, 0); gachaContainer.add(gachaEggs); @@ -130,7 +130,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaGlass.setAlpha(0.5); gachaHatch.setAlpha(0.9); - gachaHatch.on('animationupdate', (_anim, frame) => gachaUnderlay.setFrame(frame.textureFrame === '4.png' ? 'open_hatch' : 'default')); + gachaHatch.on("animationupdate", (_anim, frame) => gachaUnderlay.setFrame(frame.textureFrame === "4.png" ? "open_hatch" : "default")); this.gachaContainers.push(gachaContainer); this.gachaKnobs.push(gachaKnob); @@ -142,7 +142,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.updateGachaInfo(g); }); - this.eggGachaOptionsContainer = this.scene.add.container() + this.eggGachaOptionsContainer = this.scene.add.container(); this.eggGachaOptionsContainer = this.scene.add.container((this.scene.game.canvas.width / 6), 148); this.eggGachaContainer.add(this.eggGachaOptionsContainer); @@ -153,25 +153,25 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOptionsContainer.add(this.eggGachaOptionSelectBg); const pullOptions = [ - { multiplier: 'x1', description: `1 ${i18next.t('egg:pull')}` }, - { multiplier: 'x10', description: `10 ${i18next.t('egg:pulls')}` }, - { multiplier: 'x1', description: `5 ${i18next.t('egg:pulls')}` }, - { multiplier: 'x1', description: `10 ${i18next.t('egg:pulls')}` }, - { multiplier: 'x1', description: `25 ${i18next.t('egg:pulls')}` } + { multiplier: "x1", description: `1 ${i18next.t("egg:pull")}` }, + { multiplier: "x10", description: `10 ${i18next.t("egg:pulls")}` }, + { multiplier: "x1", description: `5 ${i18next.t("egg:pulls")}` }, + { multiplier: "x1", description: `10 ${i18next.t("egg:pulls")}` }, + { multiplier: "x1", description: `25 ${i18next.t("egg:pulls")}` } ]; - const pullOptionsText = pullOptions.map(option => ` ${option.multiplier.padEnd(4)} ${option.description}`).join('\n'); + const pullOptionsText = pullOptions.map(option => ` ${option.multiplier.padEnd(4)} ${option.description}`).join("\n"); const optionText = addTextObject( this.scene, 0, 0, - `${pullOptionsText}\n${i18next.t('menu:cancel')}`, + `${pullOptionsText}\n${i18next.t("menu:cancel")}`, TextStyle.WINDOW, ); optionText.setLineSpacing(28); - optionText.setFontSize('80px'); + optionText.setFontSize("80px"); this.eggGachaOptionsContainer.add(optionText); @@ -179,7 +179,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { new Array(5).fill(null).map((_, i) => { const voucherType = i < 2 ? VoucherType.REGULAR : i === 2 ? VoucherType.PLUS : i === 3 ? VoucherType.PREMIUM : VoucherType.GOLDEN; - const icon = this.scene.add.sprite(0, 0, 'items', getVoucherTypeIcon(voucherType)); + const icon = this.scene.add.sprite(0, 0, "items", getVoucherTypeIcon(voucherType)); icon.setScale(0.5); icon.setPositionRelative(this.eggGachaOptionSelectBg, 20, 17 + i * 16); this.eggGachaOptionsContainer.add(icon); @@ -194,7 +194,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { bg.setOrigin(1, 0); container.add(bg); - const countLabel = addTextObject(this.scene, -48, 3, '0', TextStyle.WINDOW); + const countLabel = addTextObject(this.scene, -48, 3, "0", TextStyle.WINDOW); countLabel.setOrigin(0, 0); container.add(countLabel); @@ -202,7 +202,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const iconImage = getVoucherTypeIcon(i as VoucherType); - const icon = this.scene.add.sprite(-19, 2, 'items', iconImage); + const icon = this.scene.add.sprite(-19, 2, "items", iconImage); icon.setOrigin(0, 0); icon.setScale(0.5); container.add(icon); @@ -229,7 +229,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaMessageBox = gachaMessageBox; - const gachaMessageText = addTextObject(this.scene, 8, 8, '', TextStyle.WINDOW, { maxLines: 2 }); + const gachaMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); gachaMessageText.setOrigin(0, 0); gachaMessageBoxContainer.add(gachaMessageText); @@ -247,8 +247,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setGachaCursor(1); - for (let g = 0; g < this.gachaContainers.length; g++) + for (let g = 0; g < this.gachaContainers.length; g++) { this.updateGachaInfo(g); + } this.updateVoucherCounts(); @@ -262,8 +263,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { } getDelayValue(delay: integer) { - if (this.transitioning && this.transitionCancelled) + if (this.transitioning && this.transitionCancelled) { delay = Math.ceil(delay / 5); + } return Utils.fixedInt(delay); } @@ -272,89 +274,94 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setTransitioning(true); const doPull = () => { - if (this.transitionCancelled) + if (this.transitionCancelled) { return this.showSummary(eggs); + } - const egg = this.scene.add.sprite(127, 75, 'egg', `egg_${eggs[count].getKey()}`); + const egg = this.scene.add.sprite(127, 75, "egg", `egg_${eggs[count].getKey()}`); egg.setScale(0.5); this.gachaContainers[this.gachaCursor].add(egg); this.gachaContainers[this.gachaCursor].moveTo(egg, 2); const doPullAnim = () => { - this.scene.playSound('gacha_running', { loop: true }); - this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { - this.scene.playSound('gacha_dispense'); - this.scene.time.delayedCall(this.getDelayValue(750), () => { - this.scene.sound.stopByKey('gacha_running'); - this.scene.tweens.add({ - targets: egg, - duration: this.getDelayValue(350), - y: 95, - ease: 'Bounce.easeOut', - onComplete: () => { - this.scene.time.delayedCall(this.getDelayValue(125), () => { - this.scene.playSound('pb_catch'); - this.gachaHatches[this.gachaCursor].play('open'); - this.scene.tweens.add({ - targets: egg, - duration: this.getDelayValue(350), - scale: 0.75, - ease: 'Sine.easeIn' - }); - this.scene.tweens.add({ - targets: egg, - y: 110, - duration: this.getDelayValue(350), - ease: 'Back.easeOut', - onComplete: () => { - this.gachaHatches[this.gachaCursor].play('close'); - this.scene.tweens.add({ - targets: egg, - y: 200, - duration: this.getDelayValue(350), - ease: 'Cubic.easeIn', - onComplete: () => { - if (++count < pullCount) - this.pull(pullCount, count, eggs); - else - this.showSummary(eggs); + this.scene.playSound("gacha_running", { loop: true }); + this.scene.time.delayedCall(this.getDelayValue(count ? 500 : 1250), () => { + this.scene.playSound("gacha_dispense"); + this.scene.time.delayedCall(this.getDelayValue(750), () => { + this.scene.sound.stopByKey("gacha_running"); + this.scene.tweens.add({ + targets: egg, + duration: this.getDelayValue(350), + y: 95, + ease: "Bounce.easeOut", + onComplete: () => { + this.scene.time.delayedCall(this.getDelayValue(125), () => { + this.scene.playSound("pb_catch"); + this.gachaHatches[this.gachaCursor].play("open"); + this.scene.tweens.add({ + targets: egg, + duration: this.getDelayValue(350), + scale: 0.75, + ease: "Sine.easeIn" + }); + this.scene.tweens.add({ + targets: egg, + y: 110, + duration: this.getDelayValue(350), + ease: "Back.easeOut", + onComplete: () => { + this.gachaHatches[this.gachaCursor].play("close"); + this.scene.tweens.add({ + targets: egg, + y: 200, + duration: this.getDelayValue(350), + ease: "Cubic.easeIn", + onComplete: () => { + if (++count < pullCount) { + this.pull(pullCount, count, eggs); + } else { + this.showSummary(eggs); } - }); - } - }); + } + }); + } }); - } - }); + }); + } }); }); + }); }; if (!count) { - this.scene.playSound('gacha_dial'); + this.scene.playSound("gacha_dial"); this.scene.tweens.add({ targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), angle: 90, - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", onComplete: () => { this.scene.tweens.add({ targets: this.gachaKnobs[this.gachaCursor], duration: this.getDelayValue(350), angle: 0, - ease: 'Sine.easeInOut' + ease: "Sine.easeInOut" }); this.scene.time.delayedCall(this.getDelayValue(350), doPullAnim); } }); - } else + } else { doPullAnim(); + } }; - if (!pullCount) + if (!pullCount) { pullCount = 1; - if (!count) + } + if (!count) { count = 0; + } if (!eggs) { eggs = []; const tierValueOffset = this.gachaCursor === GachaType.LEGENDARY ? 1 : 0; @@ -362,29 +369,30 @@ export default class EggGachaUiHandler extends MessageUiHandler { const tierValue = Utils.randInt(256); return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; }); - if (pullCount >= 25 && !tiers.filter(t => t >= EggTier.ULTRA).length) + if (pullCount >= 25 && !tiers.filter(t => t >= EggTier.ULTRA).length) { tiers[Utils.randInt(tiers.length)] = EggTier.ULTRA; - else if (pullCount >= 10 && !tiers.filter(t => t >= EggTier.GREAT).length) + } else if (pullCount >= 10 && !tiers.filter(t => t >= EggTier.GREAT).length) { tiers[Utils.randInt(tiers.length)] = EggTier.GREAT; + } const timestamp = new Date().getTime(); - for (let tier of tiers) { + for (const tier of tiers) { const egg = new Egg(Utils.randInt(EGG_SEED, EGG_SEED * tier), this.gachaCursor, getEggTierDefaultHatchWaves(tier), timestamp); if (egg.isManaphyEgg()) { this.scene.gameData.gameStats.manaphyEggsPulled++; egg.hatchWaves = getEggTierDefaultHatchWaves(EggTier.ULTRA); } else { switch (tier) { - case EggTier.GREAT: - this.scene.gameData.gameStats.rareEggsPulled++; - break; - case EggTier.ULTRA: - this.scene.gameData.gameStats.epicEggsPulled++; - break; - case EggTier.MASTER: - this.scene.gameData.gameStats.legendaryEggsPulled++; - break; + case EggTier.GREAT: + this.scene.gameData.gameStats.rareEggsPulled++; + break; + case EggTier.ULTRA: + this.scene.gameData.gameStats.epicEggsPulled++; + break; + case EggTier.MASTER: + this.scene.gameData.gameStats.legendaryEggsPulled++; + break; } } eggs.push(egg); @@ -393,8 +401,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { } (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { - if (!success) + if (!success) { return this.scene.reset(true); + } doPull(); }); return; @@ -412,7 +421,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.scene.tweens.add({ targets: this.eggGachaOverlay, alpha: 0.5, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", duration: 750, onComplete: () => { const rowItems = 5; @@ -428,10 +437,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { const ret = this.scene.add.container(sliceWidth * (col + 1) + (sliceWidth * 0.5), sliceHeight * (row + 1) + yOffset); ret.setScale(0.0001); - const eggSprite = this.scene.add.sprite(0, 0, 'egg', `egg_${egg.getKey()}`); + const eggSprite = this.scene.add.sprite(0, 0, "egg", `egg_${egg.getKey()}`); ret.add(eggSprite); - const eggText = addTextObject(this.scene, 0, 14, getEggDescriptor(egg), TextStyle.PARTY, { align: 'center' }); + const eggText = addTextObject(this.scene, 0, 14, getEggDescriptor(egg), TextStyle.PARTY, { align: "center" }); eggText.setOrigin(0.5, 0); eggText.setTint(getEggTierTextTint(!egg.isManaphyEgg() ? egg.tier : EggTier.ULTRA)); ret.add(eggText); @@ -446,7 +455,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { delay: this.getDelayValue(e * 100), duration: this.getDelayValue(350), scale: eggScale, - ease: 'Sine.easeOut' + ease: "Sine.easeOut" }); }); } @@ -459,7 +468,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { targets: [ this.eggGachaOverlay, this.eggGachaSummaryContainer ], alpha: 0, duration: this.getDelayValue(250), - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { this.eggGachaSummaryContainer.setVisible(false); this.eggGachaSummaryContainer.setAlpha(1); @@ -473,11 +482,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { updateGachaInfo(gachaType: GachaType): void { const infoContainer = this.gachaInfoContainers[gachaType]; switch (gachaType as GachaType) { - case GachaType.LEGENDARY: - const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.scene, new Date().getTime())); - const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; - pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); - break; + case GachaType.LEGENDARY: + const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.scene, new Date().getTime())); + const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; + pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); + break; } } @@ -493,10 +502,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { } showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void { - if (!text) + if (!text) { text = this.defaultText; + } - if (text?.indexOf('\n') === -1) { + if (text?.indexOf("\n") === -1) { this.eggGachaMessageBox.setSize(320, 32); this.eggGachaMessageBox.setY(0); this.message.setY(8); @@ -514,8 +524,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { } setTransitioning(transitioning: boolean): void { - if (this.transitioning === transitioning) + if (this.transitioning === transitioning) { return; + } this.transitioning = transitioning; this.transitionCancelled = false; } @@ -530,8 +541,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { if (!this.transitionCancelled && (button === Button.ACTION || button === Button.CANCEL)) { this.transitionCancelled = true; success = true; - } else + } else { return false; + } } else { if (this.eggGachaSummaryContainer.visible) { @@ -541,99 +553,105 @@ export default class EggGachaUiHandler extends MessageUiHandler { } } else { switch (button) { - case Button.ACTION: - switch (this.cursor) { - case 0: - if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { - error = true; - this.showError(i18next.t('egg:notEnoughVouchers')); - } else if (this.scene.gameData.eggs.length < 99) { - this.consumeVouchers(VoucherType.REGULAR, 1); - this.pull(); - success = true; - } else { - error = true; - this.showError(i18next.t('egg:tooManyEggs')); - } - break; - case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { - error = true; - this.showError(i18next.t('egg:notEnoughVouchers')); - } else if (this.scene.gameData.eggs.length < 95) { - this.consumeVouchers(VoucherType.PLUS, 1); - this.pull(5); - success = true; - } else { - error = true; - this.showError(i18next.t('egg:tooManyEggs')); - } - break; - case 1: - case 3: - if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10) - || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) { - error = true; - this.showError(i18next.t('egg:notEnoughVouchers')); - } else if (this.scene.gameData.eggs.length < 90) { - if (this.cursor === 3) - this.consumeVouchers(VoucherType.PREMIUM, 1); - else - this.consumeVouchers(VoucherType.REGULAR, 10); - this.pull(10); - success = true; - } else { - error = true; - this.showError(i18next.t('egg:tooManyEggs')); - } - break; - case 4: - if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { - error = true; - this.showError(i18next.t('egg:notEnoughVouchers')); - } else if (this.scene.gameData.eggs.length < 75) { - this.consumeVouchers(VoucherType.GOLDEN, 1); - this.pull(25); - success = true; - } else { - error = true; - this.showError(i18next.t('egg:tooManyEggs')); - } - break; - case 5: - ui.revertMode(); - success = true; - break; + case Button.ACTION: + switch (this.cursor) { + case 0: + if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 99) { + this.consumeVouchers(VoucherType.REGULAR, 1); + this.pull(); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); } break; - case Button.CANCEL: - this.getUi().revertMode(); - success = true; - break; - case Button.UP: - if (this.cursor) - success = this.setCursor(this.cursor - 1); + case 2: + if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 95) { + this.consumeVouchers(VoucherType.PLUS, 1); + this.pull(5); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); + } break; - case Button.DOWN: - if (this.cursor < 5) - success = this.setCursor(this.cursor + 1); + case 1: + case 3: + if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10) + || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM])) { + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 90) { + if (this.cursor === 3) { + this.consumeVouchers(VoucherType.PREMIUM, 1); + } else { + this.consumeVouchers(VoucherType.REGULAR, 10); + } + this.pull(10); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); + } break; - case Button.LEFT: - if (this.gachaCursor) - success = this.setGachaCursor(this.gachaCursor - 1); + case 4: + if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 75) { + this.consumeVouchers(VoucherType.GOLDEN, 1); + this.pull(25); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); + } break; - case Button.RIGHT: - if (this.gachaCursor < Utils.getEnumKeys(GachaType).length - 1) - success = this.setGachaCursor(this.gachaCursor + 1); + case 5: + ui.revertMode(); + success = true; break; + } + break; + case Button.CANCEL: + this.getUi().revertMode(); + success = true; + break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < 5) { + success = this.setCursor(this.cursor + 1); + } + break; + case Button.LEFT: + if (this.gachaCursor) { + success = this.setGachaCursor(this.gachaCursor - 1); + } + break; + case Button.RIGHT: + if (this.gachaCursor < Utils.getEnumKeys(GachaType).length - 1) { + success = this.setGachaCursor(this.gachaCursor + 1); + } + break; } } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } @@ -642,7 +660,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.eggGachaOptionsContainer.add(this.cursorObj); } @@ -652,9 +670,9 @@ export default class EggGachaUiHandler extends MessageUiHandler { } setGachaCursor(cursor: integer): boolean { - let oldCursor = this.gachaCursor; + const oldCursor = this.gachaCursor; - let changed = oldCursor !== cursor; + const changed = oldCursor !== cursor; if (changed) { this.gachaCursor = cursor; @@ -665,7 +683,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { targets: this.gachaContainers, duration: this.eggGachaContainer.visible ? 500 : 0, x: (_target, _key, _value, index) => 180 * (index - cursor), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", onComplete: () => this.setTransitioning(false) }); } @@ -678,4 +696,4 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.setGachaCursor(-1); this.eggGachaContainer.setVisible(false); } -} \ No newline at end of file +} diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index ea8df429c587..2277c3a4b64c 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -15,9 +15,9 @@ export default class EggHatchSceneHandler extends UiHandler { this.eggHatchContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); this.scene.fieldUI.add(this.eggHatchContainer); - const eggLightraysAnimFrames = this.scene.anims.generateFrameNames('egg_lightrays', { start: 0, end: 3 }); + const eggLightraysAnimFrames = this.scene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); this.scene.anims.create({ - key: 'egg_lightrays', + key: "egg_lightrays", frames: eggLightraysAnimFrames, frameRate: 32 }); @@ -36,8 +36,9 @@ export default class EggHatchSceneHandler extends UiHandler { processInput(button: Button): boolean { if (button === Button.ACTION || button === Button.CANCEL) { const phase = this.scene.getCurrentPhase(); - if (phase instanceof EggHatchPhase && phase.trySkip()) + if (phase instanceof EggHatchPhase && phase.trySkip()) { return true; + } } return this.scene.ui.getMessageHandler().processInput(button); @@ -52,4 +53,4 @@ export default class EggHatchSceneHandler extends UiHandler { this.eggHatchContainer.removeAll(true); this.getUi().hideTooltip(); } -} \ No newline at end of file +} diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index a62eb743697b..b2cbcb26769c 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -3,11 +3,10 @@ import { Mode } from "./ui"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import { TextStyle, addTextObject } from "./text"; import MessageUiHandler from "./message-ui-handler"; -import { EGG_SEED, Egg, GachaType, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; -import * as Utils from "../utils"; +import { Egg, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; import { addWindow } from "./ui-theme"; import {Button} from "../enums/buttons"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export default class EggListUiHandler extends MessageUiHandler { private eggListContainer: Phaser.GameObjects.Container; @@ -38,7 +37,7 @@ export default class EggListUiHandler extends MessageUiHandler { bgColor.setOrigin(0, 0); this.eggListContainer.add(bgColor); - const eggListBg = this.scene.add.image(0, 0, 'egg_list_bg'); + const eggListBg = this.scene.add.image(0, 0, "egg_list_bg"); eggListBg.setOrigin(0, 0); this.eggListContainer.add(eggListBg); @@ -50,29 +49,29 @@ export default class EggListUiHandler extends MessageUiHandler { this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(this.scene); - this.eggNameText = addTextObject(this.scene, 8, 66, '', TextStyle.SUMMARY); + this.eggNameText = addTextObject(this.scene, 8, 66, "", TextStyle.SUMMARY); this.eggNameText.setOrigin(0, 0); this.eggListContainer.add(this.eggNameText); - this.eggDateText = addTextObject(this.scene, 8, 91, '', TextStyle.TOOLTIP_CONTENT); + this.eggDateText = addTextObject(this.scene, 8, 91, "", TextStyle.TOOLTIP_CONTENT); this.eggListContainer.add(this.eggDateText); - this.eggHatchWavesText = addTextObject(this.scene, 8, 108, '', TextStyle.TOOLTIP_CONTENT); + this.eggHatchWavesText = addTextObject(this.scene, 8, 108, "", TextStyle.TOOLTIP_CONTENT); this.eggHatchWavesText.setWordWrapWidth(540); this.eggListContainer.add(this.eggHatchWavesText); - this.eggGachaInfoText = addTextObject(this.scene, 8, 152, '', TextStyle.TOOLTIP_CONTENT); + this.eggGachaInfoText = addTextObject(this.scene, 8, 152, "", TextStyle.TOOLTIP_CONTENT); this.eggGachaInfoText.setWordWrapWidth(540); this.eggListContainer.add(this.eggGachaInfoText); this.eggListIconContainer = this.scene.add.container(115, 9); this.eggListContainer.add(this.eggListIconContainer); - this.cursorObj = this.scene.add.image(0, 0, 'select_cursor'); + this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); this.eggListContainer.add(this.cursorObj); - this.eggSprite = this.scene.add.sprite(54, 37, `egg`); + this.eggSprite = this.scene.add.sprite(54, 37, "egg"); this.eggListContainer.add(this.eggSprite); this.eggListMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); @@ -83,7 +82,7 @@ export default class EggListUiHandler extends MessageUiHandler { eggListMessageBox.setOrigin(0, 1); this.eggListMessageBoxContainer.add(eggListMessageBox); - this.message = addTextObject(this.scene, 8, -8, '', TextStyle.WINDOW, { maxLines: 1 }); + this.message = addTextObject(this.scene, 8, -8, "", TextStyle.WINDOW, { maxLines: 1 }); this.message.setOrigin(0, 1); this.eggListMessageBoxContainer.add(this.message); @@ -106,10 +105,10 @@ export default class EggListUiHandler extends MessageUiHandler { new Egg(1 + EGG_SEED * 3, GachaType.LEGENDARY, 100, new Date().getTime()) ];*/ - for (let egg of this.scene.gameData.eggs) { + for (const egg of this.scene.gameData.eggs) { const x = (e % 11) * 18; const y = Math.floor(e / 11) * 18; - const icon = this.scene.add.sprite(x - 2, y + 2, 'egg_icons'); + const icon = this.scene.add.sprite(x - 2, y + 2, "egg_icons"); icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame(egg.getKey()); @@ -127,7 +126,7 @@ export default class EggListUiHandler extends MessageUiHandler { const ui = this.getUi(); let success = false; - let error = false; + const error = false; if (button === Button.CANCEL) { ui.revertMode(); @@ -137,42 +136,47 @@ export default class EggListUiHandler extends MessageUiHandler { const rows = Math.ceil(eggCount / 11); const row = Math.floor(this.cursor / 11); switch (button) { - case Button.UP: - if (row) - success = this.setCursor(this.cursor - 11); - break; - case Button.DOWN: - if (row < rows - 2 || (row < rows - 1 && this.cursor % 11 <= (eggCount - 1) % 11)) - success = this.setCursor(this.cursor + 11); - break; - case Button.LEFT: - if (this.cursor % 11) - success = this.setCursor(this.cursor - 1); - break; - case Button.RIGHT: - if (this.cursor % 11 < (row < rows - 1 ? 10 : (eggCount - 1) % 11)) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (row) { + success = this.setCursor(this.cursor - 11); + } + break; + case Button.DOWN: + if (row < rows - 2 || (row < rows - 1 && this.cursor % 11 <= (eggCount - 1) % 11)) { + success = this.setCursor(this.cursor + 11); + } + break; + case Button.LEFT: + if (this.cursor % 11) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (this.cursor % 11 < (row < rows - 1 ? 10 : (eggCount - 1) % 11)) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } setEggDetails(egg: Egg): void { this.eggSprite.setFrame(`egg_${egg.getKey()}`); - this.eggNameText.setText(`${i18next.t('egg:egg')} (${getEggDescriptor(egg)})`); + this.eggNameText.setText(`${i18next.t("egg:egg")} (${getEggDescriptor(egg)})`); this.eggDateText.setText( new Date(egg.timestamp).toLocaleString(undefined, { - weekday: 'short', - year: 'numeric', - month: '2-digit', - day: 'numeric' + weekday: "short", + year: "numeric", + month: "2-digit", + day: "numeric" }) ); this.eggHatchWavesText.setText(getEggHatchWavesMessage(egg.hatchWaves)); @@ -182,15 +186,16 @@ export default class EggListUiHandler extends MessageUiHandler { setCursor(cursor: integer): boolean { let changed = false; - let lastCursor = this.cursor; + const lastCursor = this.cursor; changed = super.setCursor(cursor); if (changed) { this.cursorObj.setPosition(114 + 18 * (cursor % 11), 10 + 18 * Math.floor(cursor / 11)); - if (lastCursor > -1) + if (lastCursor > -1) { this.iconAnimHandler.addOrUpdate(this.eggListIconContainer.getAt(lastCursor) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.NONE); + } this.iconAnimHandler.addOrUpdate(this.eggListIconContainer.getAt(cursor) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.ACTIVE); this.setEggDetails(this.scene.gameData.eggs[cursor]); @@ -206,4 +211,4 @@ export default class EggListUiHandler extends MessageUiHandler { this.iconAnimHandler.removeAll(); this.eggListIconContainer.removeAll(true); } -} \ No newline at end of file +} diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index 3361e9038d8f..368fca9238b9 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -24,8 +24,8 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.evolutionContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); ui.add(this.evolutionContainer); - const messageBg = this.scene.add.sprite(0, 0, 'bg', this.scene.windowType); - messageBg.setOrigin(0, 1); + const messageBg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + messageBg.setOrigin(0, 1); messageBg.setVisible(false); ui.add(messageBg); @@ -35,7 +35,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.messageContainer.setVisible(false); ui.add(this.messageContainer); - const message = addTextObject(this.scene, 0, 0, '', TextStyle.MESSAGE, { + const message = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE, { maxLines: 2, wordWrap: { width: 1780 @@ -45,7 +45,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.message = message; - const prompt = this.scene.add.sprite(0, 0, 'prompt'); + const prompt = this.scene.add.sprite(0, 0, "prompt"); prompt.setVisible(false); prompt.setOrigin(0, 0); this.messageContainer.add(prompt); @@ -97,4 +97,4 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.messageContainer.setVisible(false); this.messageBg.setVisible(false); } -} \ No newline at end of file +} diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 084337b40860..9cd48f159365 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -7,7 +7,7 @@ import UiHandler from "./ui-handler"; import * as Utils from "../utils"; import { CommandPhase } from "../phases"; import { MoveCategory } from "#app/data/move.js"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; import {Button} from "../enums/buttons"; export default class FightUiHandler extends UiHandler { @@ -35,43 +35,43 @@ export default class FightUiHandler extends UiHandler { this.movesContainer = this.scene.add.container(18, -38.7); ui.add(this.movesContainer); - this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36, 'types', 'unknown'); + this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36, "types", "unknown"); this.typeIcon.setVisible(false); ui.add(this.typeIcon); - this.moveCategoryIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 25, -36, 'categories', 'physical'); + this.moveCategoryIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 25, -36, "categories", "physical"); this.moveCategoryIcon.setVisible(false); ui.add(this.moveCategoryIcon); - this.ppLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -26, 'PP', TextStyle.MOVE_INFO_CONTENT); + this.ppLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); this.ppLabel.setOrigin(0.0, 0.5); this.ppLabel.setVisible(false); - this.ppLabel.setText(i18next.t('fightUiHandler:pp')); + this.ppLabel.setText(i18next.t("fightUiHandler:pp")); ui.add(this.ppLabel); - this.ppText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -26, '--/--', TextStyle.MOVE_INFO_CONTENT); + this.ppText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); this.ppText.setOrigin(1, 0.5); this.ppText.setVisible(false); ui.add(this.ppText); - this.powerLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -18, 'POWER', TextStyle.MOVE_INFO_CONTENT); + this.powerLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); this.powerLabel.setOrigin(0.0, 0.5); this.powerLabel.setVisible(false); - this.powerLabel.setText(i18next.t('fightUiHandler:power')); + this.powerLabel.setText(i18next.t("fightUiHandler:power")); ui.add(this.powerLabel); - this.powerText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -18, '---', TextStyle.MOVE_INFO_CONTENT); + this.powerText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); this.powerText.setOrigin(1, 0.5); this.powerText.setVisible(false); ui.add(this.powerText); - this.accuracyLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -10, 'ACC', TextStyle.MOVE_INFO_CONTENT); + this.accuracyLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); this.accuracyLabel.setOrigin(0.0, 0.5); this.accuracyLabel.setVisible(false); - this.accuracyLabel.setText(i18next.t('fightUiHandler:accuracy')) + this.accuracyLabel.setText(i18next.t("fightUiHandler:accuracy")); ui.add(this.accuracyLabel); - this.accuracyText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -10, '---', TextStyle.MOVE_INFO_CONTENT); + this.accuracyText = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setVisible(false); ui.add(this.accuracyText); @@ -100,37 +100,43 @@ export default class FightUiHandler extends UiHandler { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - if ((this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, cursor, false)) + if ((this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, cursor, false)) { success = true; - else + } else { ui.playError(); + } } else { ui.setMode(Mode.COMMAND, this.fieldIndex); success = true; } } else { switch (button) { - case Button.UP: - if (cursor >= 2) - success = this.setCursor(cursor - 2); - break; - case Button.DOWN: - if (cursor < 2) - success = this.setCursor(cursor + 2); - break; - case Button.LEFT: - if (cursor % 2 === 1) - success = this.setCursor(cursor - 1); - break; - case Button.RIGHT: - if (cursor % 2 === 0) - success = this.setCursor(cursor + 1); - break; + case Button.UP: + if (cursor >= 2) { + success = this.setCursor(cursor - 2); + } + break; + case Button.DOWN: + if (cursor < 2) { + success = this.setCursor(cursor + 2); + } + break; + case Button.LEFT: + if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor % 2 === 0) { + success = this.setCursor(cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -144,14 +150,15 @@ export default class FightUiHandler extends UiHandler { const changed = this.getCursor() !== cursor; if (changed) { - if (!this.fieldIndex) + if (!this.fieldIndex) { this.cursor = cursor; - else + } else { this.cursor2 = cursor; + } } if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); ui.add(this.cursorObj); } @@ -161,17 +168,17 @@ export default class FightUiHandler extends UiHandler { if (hasMove) { const pokemonMove = moveset[cursor]; - this.typeIcon.setTexture('types', Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8); - this.moveCategoryIcon.setTexture('categories', MoveCategory[pokemonMove.getMove().category].toLowerCase()).setScale(1.0); + this.typeIcon.setTexture("types", Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8); + this.moveCategoryIcon.setTexture("categories", MoveCategory[pokemonMove.getMove().category].toLowerCase()).setScale(1.0); const power = pokemonMove.getMove().power; const accuracy = pokemonMove.getMove().accuracy; const maxPP = pokemonMove.getMovePp(); const pp = maxPP - pokemonMove.ppUsed; - this.ppText.setText(`${Utils.padInt(pp, 2, ' ')}/${Utils.padInt(maxPP, 2, ' ')}`); - this.powerText.setText(`${power >= 0 ? power : '---'}`); - this.accuracyText.setText(`${accuracy >= 0 ? accuracy : '---'}`); + this.ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); + this.powerText.setText(`${power >= 0 ? power : "---"}`); + this.accuracyText.setText(`${accuracy >= 0 ? accuracy : "---"}`); } this.typeIcon.setVisible(hasMove); @@ -191,9 +198,10 @@ export default class FightUiHandler extends UiHandler { displayMoves() { const moveset = (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getMoveset(); for (let m = 0; m < 4; m++) { - const moveText = addTextObject(this.scene, m % 2 === 0 ? 0 : 100, m < 2 ? 0 : 16, '-', TextStyle.WINDOW); - if (m < moveset.length) + const moveText = addTextObject(this.scene, m % 2 === 0 ? 0 : 100, m < 2 ? 0 : 16, "-", TextStyle.WINDOW); + if (m < moveset.length) { moveText.setText(moveset[m].getName()); + } this.movesContainer.add(moveText); } } @@ -217,8 +225,9 @@ export default class FightUiHandler extends UiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index b2c2c1181001..227315f0b690 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -5,7 +5,7 @@ import { TextStyle, addTextInputObject, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; import InputText from "phaser3-rex-plugins/plugins/inputtext"; import * as Utils from "../utils"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; import {Button} from "../enums/buttons"; export interface FormModalConfig extends ModalConfig { @@ -34,8 +34,9 @@ export abstract class FormModalUiHandler extends ModalUiHandler { } getReadableErrorMessage(error: string): string { - if (error?.indexOf('connection refused') > -1) - return 'Could not connect to the server'; + if (error?.indexOf("connection refused") > -1) { + return "Could not connect to the server"; + } return error; } @@ -58,7 +59,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); const isPassword = field.includes(i18next.t("menu:password")) || field.includes(i18next.t("menu:confirmPassword")); - const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? 'password' : 'text', maxLength: isPassword ? 64 : 16 }); + const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 16 }); input.setOrigin(0, 0); inputContainer.add(inputBg); @@ -69,7 +70,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.inputs.push(input); }); - this.errorMessage = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * (fields.length - 1) + 16 + this.getButtonTopMargin(), '', TextStyle.TOOLTIP_CONTENT); + this.errorMessage = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * (fields.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT); this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); this.errorMessage.setVisible(false); @@ -87,10 +88,11 @@ export abstract class FormModalUiHandler extends ModalUiHandler { : null; if (this.buttonBgs.length) { - this.buttonBgs[0].off('pointerdown'); - this.buttonBgs[0].on('pointerdown', () => { - if (this.submitAction) + this.buttonBgs[0].off("pointerdown"); + this.buttonBgs[0].on("pointerdown", () => { + if (this.submitAction) { this.submitAction(); + } }); } @@ -100,8 +102,8 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.scene.tweens.add({ targets: this.modalContainer, duration: Utils.fixedInt(1000), - ease: 'Sine.easeInOut', - y: '-=24', + ease: "Sine.easeInOut", + y: "-=24", alpha: 1 }); @@ -121,14 +123,15 @@ export abstract class FormModalUiHandler extends ModalUiHandler { } sanitizeInputs(): void { - for (let input of this.inputs) + for (const input of this.inputs) { input.text = input.text.trim(); + } } updateContainer(config?: ModalConfig): void { super.updateContainer(config); - this.errorMessage.setText(this.getReadableErrorMessage((config as FormModalConfig)?.errorMessage || '')); + this.errorMessage.setText(this.getReadableErrorMessage((config as FormModalConfig)?.errorMessage || "")); this.errorMessage.setVisible(!!this.errorMessage.text); } @@ -140,4 +143,4 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.submitAction = null; } -} \ No newline at end of file +} diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index c053d5700ac1..75d4b6ab7eba 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -1,5 +1,5 @@ import BattleScene from "../battle-scene"; -import { TextStyle, addTextObject, getTextColor } from "./text"; +import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; @@ -22,68 +22,68 @@ const displayStats: DisplayStats = { playTime: { sourceFunc: gameData => Utils.getPlayTimeString(gameData.gameStats.playTime) }, - battles: 'Total Battles', + battles: "Total Battles", startersUnlocked: { - label: 'Starters', + label: "Starters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!d.caughtAttr); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarters).length) * 1000) / 10}%)`; } }, shinyStartersUnlocked: { - label: 'Shiny Starters', + label: "Shiny Starters", sourceFunc: gameData => { const starterCount = gameData.getStarterCount(d => !!(d.caughtAttr & DexAttr.SHINY)); return `${starterCount} (${Math.floor((starterCount / Object.keys(speciesStarters).length) * 1000) / 10}%)`; } }, dexSeen: { - label: 'Species Seen', + label: "Species Seen", sourceFunc: gameData => { const seenCount = gameData.getSpeciesCount(d => !!d.seenAttr); return `${seenCount} (${Math.floor((seenCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; } }, dexCaught: { - label: 'Species Caught', + label: "Species Caught", sourceFunc: gameData => { const caughtCount = gameData.getSpeciesCount(d => !!d.caughtAttr); return `${caughtCount} (${Math.floor((caughtCount / Object.keys(gameData.dexData).length) * 1000) / 10}%)`; } }, - ribbonsOwned: 'Ribbons Owned', - classicSessionsPlayed: 'Classic Runs', - sessionsWon: 'Classic Wins', - dailyRunSessionsPlayed: 'Daily Run Attempts', - dailyRunSessionsWon: 'Daily Run Wins', - endlessSessionsPlayed: 'Endless Runs?', - highestEndlessWave: 'Highest Wave (Endless)?', - highestMoney: 'Highest Money', - highestDamage: 'Highest Damage', - highestHeal: 'Highest HP Healed', - pokemonSeen: 'Pokémon Encountered', - pokemonDefeated: 'Pokémon Defeated', - pokemonCaught: 'Pokémon Caught', - pokemonHatched: 'Eggs Hatched', - subLegendaryPokemonSeen: 'Sub-Legends Seen?', - subLegendaryPokemonCaught: 'Sub-Legends Caught?', - subLegendaryPokemonHatched: 'Sub-Legends Hatched?', - legendaryPokemonSeen: 'Legends Seen?', - legendaryPokemonCaught: 'Legends Caught?', - legendaryPokemonHatched: 'Legends Hatched?', - mythicalPokemonSeen: 'Mythicals Seen?', - mythicalPokemonCaught: 'Mythicals Caught?', - mythicalPokemonHatched: 'Mythicals Hatched?', - shinyPokemonSeen: 'Shinies Seen?', - shinyPokemonCaught: 'Shinies Caught?', - shinyPokemonHatched: 'Shinies Hatched?', - pokemonFused: 'Pokémon Fused?', - trainersDefeated: 'Trainers Defeated', - eggsPulled: 'Eggs Pulled', - rareEggsPulled: 'Rare Eggs Pulled?', - epicEggsPulled: 'Epic Eggs Pulled?', - legendaryEggsPulled: 'Legendary Eggs Pulled?', - manaphyEggsPulled: 'Manaphy Eggs Pulled?' + ribbonsOwned: "Ribbons Owned", + classicSessionsPlayed: "Classic Runs", + sessionsWon: "Classic Wins", + dailyRunSessionsPlayed: "Daily Run Attempts", + dailyRunSessionsWon: "Daily Run Wins", + endlessSessionsPlayed: "Endless Runs?", + highestEndlessWave: "Highest Wave (Endless)?", + highestMoney: "Highest Money", + highestDamage: "Highest Damage", + highestHeal: "Highest HP Healed", + pokemonSeen: "Pokémon Encountered", + pokemonDefeated: "Pokémon Defeated", + pokemonCaught: "Pokémon Caught", + pokemonHatched: "Eggs Hatched", + subLegendaryPokemonSeen: "Sub-Legends Seen?", + subLegendaryPokemonCaught: "Sub-Legends Caught?", + subLegendaryPokemonHatched: "Sub-Legends Hatched?", + legendaryPokemonSeen: "Legends Seen?", + legendaryPokemonCaught: "Legends Caught?", + legendaryPokemonHatched: "Legends Hatched?", + mythicalPokemonSeen: "Mythicals Seen?", + mythicalPokemonCaught: "Mythicals Caught?", + mythicalPokemonHatched: "Mythicals Hatched?", + shinyPokemonSeen: "Shinies Seen?", + shinyPokemonCaught: "Shinies Caught?", + shinyPokemonHatched: "Shinies Hatched?", + pokemonFused: "Pokémon Fused?", + trainersDefeated: "Trainers Defeated", + eggsPulled: "Eggs Pulled", + rareEggsPulled: "Rare Eggs Pulled?", + epicEggsPulled: "Epic Eggs Pulled?", + legendaryEggsPulled: "Legendary Eggs Pulled?", + manaphyEggsPulled: "Manaphy Eggs Pulled?" }; export default class GameStatsUiHandler extends UiHandler { @@ -110,15 +110,16 @@ export default class GameStatsUiHandler extends UiHandler { const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); headerBg.setOrigin(0, 0); - const headerText = addTextObject(this.scene, 0, 0, 'Stats', TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(this.scene, 0, 0, "Stats", TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); const statsBgWidth = ((this.scene.game.canvas.width / 6) - 2) / 2; const [ statsBgLeft, statsBgRight ] = new Array(2).fill(null).map((_, i) => { let width = statsBgWidth; - if (!i) + if (!i) { width += 5; + } const statsBg = addWindow(this.scene, statsBgWidth * i, headerBg.height, width, (this.scene.game.canvas.height / 6) - headerBg.height - 2, false, !!i, 2); statsBg.setOrigin(0, 0); return statsBg; @@ -127,12 +128,12 @@ export default class GameStatsUiHandler extends UiHandler { this.statsContainer = this.scene.add.container(0, 0); new Array(18).fill(null).map((_, s) => { - const statLabel = addTextObject(this.scene, 8 + (s % 2 === 1 ? statsBgWidth : 0), 28 + Math.floor(s / 2) * 16, '', TextStyle.SETTINGS_LABEL); + const statLabel = addTextObject(this.scene, 8 + (s % 2 === 1 ? statsBgWidth : 0), 28 + Math.floor(s / 2) * 16, "", TextStyle.SETTINGS_LABEL); statLabel.setOrigin(0, 0); this.statsContainer.add(statLabel); this.statLabels.push(statLabel); - const statValue = addTextObject(this.scene, (statsBgWidth * ((s % 2) + 1)) - 8, statLabel.y, '', TextStyle.WINDOW); + const statValue = addTextObject(this.scene, (statsBgWidth * ((s % 2) + 1)) - 8, statLabel.y, "", TextStyle.WINDOW); statValue.setOrigin(1, 0); this.statsContainer.add(statValue); this.statValues.push(statValue); @@ -172,13 +173,13 @@ export default class GameStatsUiHandler extends UiHandler { statKeys.forEach((key, s) => { const stat = displayStats[key] as DisplayStat; const value = stat.sourceFunc(this.scene.gameData); - this.statLabels[s].setText(!stat.hidden || isNaN(parseInt(value)) || parseInt(value) ? stat.label : '???'); + this.statLabels[s].setText(!stat.hidden || isNaN(parseInt(value)) || parseInt(value) ? stat.label : "???"); this.statValues[s].setText(value); }); if (statKeys.length < 18) { for (let s = statKeys.length; s < 18; s++) { - this.statLabels[s].setText(''); - this.statValues[s].setText(''); + this.statLabels[s].setText(""); + this.statValues[s].setText(""); } } } @@ -193,19 +194,22 @@ export default class GameStatsUiHandler extends UiHandler { this.scene.ui.revertMode(); } else { switch (button) { - case Button.UP: - if (this.cursor) - success = this.setCursor(this.cursor - 1); - break; - case Button.DOWN: - if (this.cursor < Math.ceil((Object.keys(displayStats).length - 18) / 2)) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < Math.ceil((Object.keys(displayStats).length - 18) / 2)) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -213,8 +217,9 @@ export default class GameStatsUiHandler extends UiHandler { setCursor(cursor: integer): boolean { const ret = super.setCursor(cursor); - if (ret) + if (ret) { this.updateStats(); + } return ret; } @@ -228,11 +233,11 @@ export default class GameStatsUiHandler extends UiHandler { (function () { const statKeys = Object.keys(displayStats); - for (let key of statKeys) { - if (typeof displayStats[key] === 'string') { + for (const key of statKeys) { + if (typeof displayStats[key] === "string") { let label = displayStats[key] as string; let hidden = false; - if (label.endsWith('?')) { + if (label.endsWith("?")) { label = label.slice(0, -1); hidden = true; } @@ -247,8 +252,8 @@ export default class GameStatsUiHandler extends UiHandler { }; } if (!(displayStats[key] as DisplayStat).label) { - const splittableKey = key.replace(/([a-z]{2,})([A-Z]{1}(?:[^A-Z]|$))/g, '$1_$2'); + const splittableKey = key.replace(/([a-z]{2,})([A-Z]{1}(?:[^A-Z]|$))/g, "$1_$2"); (displayStats[key] as DisplayStat).label = Utils.toReadableString(`${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`); } } -})(); \ No newline at end of file +})(); diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index 731348905bfb..c0d0ff9067b2 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -9,7 +9,7 @@ export default class LoadingModalUiHandler extends ModalUiHandler { } getModalTitle(): string { - return ''; + return ""; } getWidth(): number { @@ -31,9 +31,9 @@ export default class LoadingModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, 'Loading…', TextStyle.WINDOW); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Loading…", TextStyle.WINDOW); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); } -} \ No newline at end of file +} diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index f77efcad2609..890aabeb7afd 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -2,15 +2,15 @@ import { FormModalUiHandler } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export default class LoginFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { - return i18next.t('menu:login'); + return i18next.t("menu:login"); } getFields(config?: ModalConfig): string[] { - return [ i18next.t('menu:username'), i18next.t('menu:password') ]; + return [ i18next.t("menu:username"), i18next.t("menu:password") ]; } getWidth(config?: ModalConfig): number { @@ -22,22 +22,23 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t('menu:login'), i18next.t('menu:register') ]; + return [ i18next.t("menu:login"), i18next.t("menu:register") ]; } getReadableErrorMessage(error: string): string { - let colonIndex = error?.indexOf(':'); - if (colonIndex > 0) + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { error = error.slice(0, colonIndex); + } switch (error) { - case 'invalid username': - return i18next.t('menu:invalidLoginUsername'); - case 'invalid password': - return i18next.t('menu:invalidLoginPassword'); - case 'account doesn\'t exist': - return i18next.t('menu:accountNonExistent'); - case 'password doesn\'t match': - return i18next.t('menu:unmatchingPassword'); + case "invalid username": + return i18next.t("menu:invalidLoginUsername"); + case "invalid password": + return i18next.t("menu:invalidLoginPassword"); + case "account doesn't exist": + return i18next.t("menu:accountNonExistent"); + case "password doesn't match": + return i18next.t("menu:unmatchingPassword"); } return super.getReadableErrorMessage(error); @@ -57,20 +58,23 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.scene.ui.setMode(Mode.LOGIN_FORM, Object.assign(config, { errorMessage: error?.trim() })); this.scene.ui.playError(); }; - if (!this.inputs[0].text) - return onFail(i18next.t('menu:emptyUsername')); - Utils.apiPost(`account/login`, `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, 'application/x-www-form-urlencoded') + if (!this.inputs[0].text) { + return onFail(i18next.t("menu:emptyUsername")); + } + Utils.apiPost("account/login", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") .then(response => { - if (!response.ok) + if (!response.ok) { return response.text(); + } return response.json(); }) .then(response => { - if (response.hasOwnProperty('token')) { + if (response.hasOwnProperty("token")) { Utils.setCookie(Utils.sessionIdKey, response.token); originalLoginAction(); - } else + } else { onFail(response); + } }); }; @@ -79,4 +83,4 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return false; } -} \ No newline at end of file +} diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index fb253d94f9b3..f02986b514b6 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -8,7 +8,7 @@ import { GameDataType } from "../system/game-data"; import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler"; import { Tutorial, handleTutorial } from "../tutorial"; import { updateUserInfo } from "../account"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; import {Button} from "../enums/buttons"; export enum MenuOptions { @@ -24,9 +24,9 @@ export enum MenuOptions { LOG_OUT } -const wikiUrl = 'https://wiki.pokerogue.net'; -const discordUrl = 'https://discord.gg/uWpTfdKG49'; -const githubUrl = 'https://github.com/Flashfyre/pokerogue'; +const wikiUrl = "https://wiki.pokerogue.net"; +const discordUrl = "https://discord.gg/uWpTfdKG49"; +const githubUrl = "https://github.com/Flashfyre/pokerogue"; export default class MenuUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; @@ -59,11 +59,11 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); - const menuMessageText = addTextObject(this.scene, 8, 8, '', TextStyle.WINDOW, { maxLines: 2 }); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); menuMessageText.setWordWrapWidth(1224); menuMessageText.setOrigin(0, 0); - this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join('\n'), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); + this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); this.optionSelectText.setLineSpacing(12); this.menuBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 23, (this.scene.game.canvas.height / 6) - 2); @@ -99,7 +99,7 @@ export default class MenuUiHandler extends MessageUiHandler { const config: OptionSelectConfig = { options: new Array(5).fill(null).map((_, i) => i).filter(slotFilter).map(i => { return { - label: i18next.t('menuUiHandler:slot', {slotNumber: i+1}), + label: i18next.t("menuUiHandler:slot", {slotNumber: i+1}), handler: () => { callback(i); ui.revertMode(); @@ -108,7 +108,7 @@ export default class MenuUiHandler extends MessageUiHandler { } }; }).concat([{ - label: i18next.t('menuUiHandler:cancel'), + label: i18next.t("menuUiHandler:cancel"), handler: () => { ui.revertMode(); ui.showText(null, 0); @@ -139,14 +139,15 @@ export default class MenuUiHandler extends MessageUiHandler { new Array(5).fill(null).map((_, i) => { const slotId = i; return this.scene.gameData.getSession(slotId).then(data => { - if (data) + if (data) { dataSlots.push(slotId); - }) + } + }); })).then(() => { - confirmSlot(i18next.t("menuUiHandler:exportSlotSelect"), - i => dataSlots.indexOf(i) > -1, - slotId => this.scene.gameData.tryExportData(GameDataType.SESSION, slotId)); - }); + confirmSlot(i18next.t("menuUiHandler:exportSlotSelect"), + i => dataSlots.indexOf(i) > -1, + slotId => this.scene.gameData.tryExportData(GameDataType.SESSION, slotId)); + }); return true; }, keepOpen: true @@ -171,7 +172,7 @@ export default class MenuUiHandler extends MessageUiHandler { keepOpen: true }, { - label: i18next.t('menuUiHandler:cancel'), + label: i18next.t("menuUiHandler:cancel"), handler: () => { this.scene.ui.revertMode(); return true; @@ -186,31 +187,31 @@ export default class MenuUiHandler extends MessageUiHandler { const communityOptions: OptionSelectItem[] = [ { - label: 'Wiki', + label: "Wiki", handler: () => { - window.open(wikiUrl, '_blank').focus(); + window.open(wikiUrl, "_blank").focus(); return true; }, keepOpen: true }, { - label: 'Discord', + label: "Discord", handler: () => { - window.open(discordUrl, '_blank').focus(); + window.open(discordUrl, "_blank").focus(); return true; }, keepOpen: true }, { - label: 'GitHub', + label: "GitHub", handler: () => { - window.open(githubUrl, '_blank').focus(); + window.open(githubUrl, "_blank").focus(); return true; }, keepOpen: true }, { - label: i18next.t('menuUiHandler:cancel'), + label: i18next.t("menuUiHandler:cancel"), handler: () => { this.scene.ui.revertMode(); return true; @@ -238,7 +239,7 @@ export default class MenuUiHandler extends MessageUiHandler { this.getUi().hideTooltip(); - this.scene.playSound('menu_open'); + this.scene.playSound("menu_open"); handleTutorial(this.scene, Tutorial.Menu); @@ -253,113 +254,123 @@ export default class MenuUiHandler extends MessageUiHandler { if (button === Button.ACTION) { let adjustedCursor = this.cursor; - for (let imo of this.ignoredMenuOptions) { - if (adjustedCursor >= imo) + for (const imo of this.ignoredMenuOptions) { + if (adjustedCursor >= imo) { adjustedCursor++; - else + } else { break; + } } switch (adjustedCursor) { - case MenuOptions.GAME_SETTINGS: - ui.setOverlayMode(Mode.SETTINGS); - success = true; - break; - case MenuOptions.ACHIEVEMENTS: - ui.setOverlayMode(Mode.ACHIEVEMENTS); - success = true; - break; - case MenuOptions.STATS: - ui.setOverlayMode(Mode.GAME_STATS); - success = true; - break; - case MenuOptions.VOUCHERS: - ui.setOverlayMode(Mode.VOUCHERS); - success = true; - break; - case MenuOptions.EGG_LIST: - if (this.scene.gameData.eggs.length) { - ui.revertMode(); - ui.setOverlayMode(Mode.EGG_LIST); - success = true; - } else - error = true; - break; - case MenuOptions.EGG_GACHA: + case MenuOptions.GAME_SETTINGS: + ui.setOverlayMode(Mode.SETTINGS); + success = true; + break; + case MenuOptions.ACHIEVEMENTS: + ui.setOverlayMode(Mode.ACHIEVEMENTS); + success = true; + break; + case MenuOptions.STATS: + ui.setOverlayMode(Mode.GAME_STATS); + success = true; + break; + case MenuOptions.VOUCHERS: + ui.setOverlayMode(Mode.VOUCHERS); + success = true; + break; + case MenuOptions.EGG_LIST: + if (this.scene.gameData.eggs.length) { ui.revertMode(); - ui.setOverlayMode(Mode.EGG_GACHA); - success = true; - break; - case MenuOptions.MANAGE_DATA: - ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); + ui.setOverlayMode(Mode.EGG_LIST); success = true; - break; - case MenuOptions.COMMUNITY: - ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.communityConfig); - success = true; - break; - case MenuOptions.SAVE_AND_QUIT: - if (this.scene.currentBattle) { - success = true; - if (this.scene.currentBattle.turn > 1) { - ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)), () => { - ui.revertMode(); - ui.showText(null, 0); - }, false, -98); - }); - } else - this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)); - } else - error = true; - break; - case MenuOptions.LOG_OUT: + } else { + error = true; + } + break; + case MenuOptions.EGG_GACHA: + ui.revertMode(); + ui.setOverlayMode(Mode.EGG_GACHA); + success = true; + break; + case MenuOptions.MANAGE_DATA: + ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); + success = true; + break; + case MenuOptions.COMMUNITY: + ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.communityConfig); + success = true; + break; + case MenuOptions.SAVE_AND_QUIT: + if (this.scene.currentBattle) { success = true; - const doLogout = () => { - Utils.apiFetch('account/logout', true).then(res => { - if (!res.ok) - console.error(`Log out failed (${res.status}: ${res.statusText})`); - Utils.setCookie(Utils.sessionIdKey, ''); - updateUserInfo().then(() => this.scene.reset(true, true)); - }); - }; - if (this.scene.currentBattle) { + if (this.scene.currentBattle.turn > 1) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { + ui.setOverlayMode(Mode.CONFIRM, () => this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)), () => { ui.revertMode(); ui.showText(null, 0); }, false, -98); }); - } else - doLogout(); - break; + } else { + this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)); + } + } else { + error = true; + } + break; + case MenuOptions.LOG_OUT: + success = true; + const doLogout = () => { + Utils.apiFetch("account/logout", true).then(res => { + if (!res.ok) { + console.error(`Log out failed (${res.status}: ${res.statusText})`); + } + Utils.setCookie(Utils.sessionIdKey, ""); + updateUserInfo().then(() => this.scene.reset(true, true)); + }); + }; + if (this.scene.currentBattle) { + ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { + ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { + ui.revertMode(); + ui.showText(null, 0); + }, false, -98); + }); + } else { + doLogout(); + } + break; } } else if (button === Button.CANCEL) { success = true; ui.revertMode().then(result => { - if (!result) - ui.setMode(Mode.MESSAGE); + if (!result) { + ui.setMode(Mode.MESSAGE); + } }); } else { switch (button) { - 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.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; } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } @@ -374,7 +385,7 @@ export default class MenuUiHandler extends MessageUiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.cursorObj.setOrigin(0, 0); this.menuContainer.add(this.cursorObj); } @@ -391,8 +402,9 @@ export default class MenuUiHandler extends MessageUiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 44b3cc1a1d00..21a650a92ea4 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -26,37 +26,38 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } private showTextInternal(text: string, delay: integer, callback: Function, callbackDelay: integer, prompt: boolean, promptDelay: integer) { - if (delay === null || delay === undefined) + if (delay === null || delay === undefined) { delay = 20; - let charVarMap = new Map(); - let delayMap = new Map(); - let soundMap = new Map(); + } + const charVarMap = new Map(); + const delayMap = new Map(); + const soundMap = new Map(); const actionPattern = /@(c|d|s)\{(.*?)\}/; let actionMatch: RegExpExecArray; while ((actionMatch = actionPattern.exec(text))) { switch (actionMatch[1]) { - case 'c': - charVarMap.set(actionMatch.index, actionMatch[2]); - break; - case 'd': - delayMap.set(actionMatch.index, parseInt(actionMatch[2])); - break; - case 's': - soundMap.set(actionMatch.index, actionMatch[2]); - break; + case "c": + charVarMap.set(actionMatch.index, actionMatch[2]); + break; + case "d": + delayMap.set(actionMatch.index, parseInt(actionMatch[2])); + break; + case "s": + soundMap.set(actionMatch.index, actionMatch[2]); + break; } text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); } if (text) { // Predetermine overflow line breaks to avoid words breaking while displaying - const textWords = text.split(' '); + const textWords = text.split(" "); let lastLineCount = 1; - let newText = ''; + let newText = ""; for (let w = 0; w < textWords.length; w++) { const nextWordText = newText ? `${newText} ${textWords[w]}` : textWords[w]; - if (textWords[w].includes('\n')) { + if (textWords[w].includes("\n")) { newText = nextWordText; lastLineCount++; } else { @@ -64,8 +65,9 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { if (lineCount > lastLineCount) { lastLineCount = lineCount; newText = `${newText}\n${textWords[w]}`; - } else + } else { newText = nextWordText; + } } } @@ -74,23 +76,26 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { if (this.textTimer) { this.textTimer.remove(); - if (this.textCallbackTimer) + if (this.textCallbackTimer) { this.textCallbackTimer.callback(); - }; + } + } if (prompt) { const originalCallback = callback; callback = () => { const showPrompt = () => this.showPrompt(originalCallback, callbackDelay); - if (promptDelay) + if (promptDelay) { this.scene.time.delayedCall(promptDelay, showPrompt); - else + } else { showPrompt(); + } }; } if (delay) { this.clearText(); - if (prompt) + if (prompt) { this.pendingPrompt = true; + } this.textTimer = this.scene.time.addEvent({ delay: delay, callback: () => { @@ -100,10 +105,12 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const charDelay = delayMap.get(charIndex); this.message.setText(text.slice(0, charIndex)); const advance = () => { - if (charVar) + if (charVar) { this.scene.charSprite.setVariant(charVar); - if (charSound) + } + if (charSound) { this.scene.playSound(charSound); + } if (callback && !this.textTimer.repeatCount) { if (callbackDelay && !prompt) { this.textCallbackTimer = this.scene.time.delayedCall(callbackDelay, () => { @@ -113,8 +120,9 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } callback(); }); - } else + } else { callback(); + } } }; if (charDelay) { @@ -126,17 +134,20 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { advance(); } }); - } else + } else { advance(); + } }, repeat: text.length }); } else { this.message.setText(text); - if (prompt) + if (prompt) { this.pendingPrompt = true; - if (callback) + } + if (callback) { callback(); + } } } @@ -144,13 +155,13 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const wrappedTextLines = this.message.runWordWrap(this.message.text).split(/\n/g); const textLinesCount = wrappedTextLines.length; const lastTextLine = wrappedTextLines[wrappedTextLines.length - 1]; - const lastLineTest = this.scene.add.text(0, 0, lastTextLine, { font: '96px emerald' }); + const lastLineTest = this.scene.add.text(0, 0, lastTextLine, { font: "96px emerald" }); lastLineTest.setScale(this.message.scale); const lastLineWidth = lastLineTest.displayWidth; lastLineTest.destroy(); if (this.prompt) { this.prompt.setPosition(lastLineWidth + 2, (textLinesCount - 1) * 18 + 2); - this.prompt.play('prompt'); + this.prompt.play("prompt"); } this.pendingPrompt = false; this.awaitingActionInput = true; @@ -168,18 +179,19 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { } callback(); }); - } else + } else { callback(); + } } }; } clearText() { - this.message.setText(''); + this.message.setText(""); this.pendingPrompt = false; } clear() { super.clear(); } -} \ No newline at end of file +} diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 77a3c14bd7b0..ccc5d5650fba 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -48,7 +48,7 @@ export abstract class ModalUiHandler extends UiHandler { this.modalContainer.add(this.modalBg); - this.titleText = addTextObject(this.scene, 0, 4, '', TextStyle.SETTINGS_LABEL); + this.titleText = addTextObject(this.scene, 0, 4, "", TextStyle.SETTINGS_LABEL); this.titleText.setOrigin(0.5, 0); this.modalContainer.add(this.titleText); @@ -59,7 +59,7 @@ export abstract class ModalUiHandler extends UiHandler { const buttonTopMargin = this.getButtonTopMargin(); - for (let label of buttonLabels) { + for (const label of buttonLabels) { const buttonLabel = addTextObject(this.scene, 0, 8, label, TextStyle.TOOLTIP_CONTENT); buttonLabel.setOrigin(0.5, 0.5); @@ -81,7 +81,7 @@ export abstract class ModalUiHandler extends UiHandler { } show(args: any[]): boolean { - if (args.length >= 1 && 'buttonActions' in args[0]) { + if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); const config = args[0] as ModalConfig; @@ -93,8 +93,9 @@ export abstract class ModalUiHandler extends UiHandler { this.getUi().moveTo(this.modalContainer, this.getUi().length - 1); for (let a = 0; a < this.buttonBgs.length; a++) { - if (a < this.buttonBgs.length) - this.buttonBgs[a].on('pointerdown', (_) => config.buttonActions[a]()); + if (a < this.buttonBgs.length) { + this.buttonBgs[a].on("pointerdown", (_) => config.buttonActions[a]()); + } } return true; @@ -132,6 +133,6 @@ export abstract class ModalUiHandler extends UiHandler { super.clear(); this.modalContainer.setVisible(false); - this.buttonBgs.map(bg => bg.off('pointerdown')); + this.buttonBgs.map(bg => bg.off("pointerdown")); } -} \ No newline at end of file +} diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 8af13d8f6489..bcd460dfab79 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -44,7 +44,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); - const transferButtonText = addTextObject(this.scene, -4, -2, 'Transfer', TextStyle.PARTY); + const transferButtonText = addTextObject(this.scene, -4, -2, "Transfer", TextStyle.PARTY); transferButtonText.setOrigin(1, 0); this.transferButtonContainer.add(transferButtonText); @@ -52,11 +52,11 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); - const rerollButtonText = addTextObject(this.scene, -4, -2, 'Reroll', TextStyle.PARTY); + const rerollButtonText = addTextObject(this.scene, -4, -2, "Reroll", TextStyle.PARTY); rerollButtonText.setOrigin(0, 0); this.rerollButtonContainer.add(rerollButtonText); - this.rerollCostText = addTextObject(this.scene, 0, 0, '', TextStyle.MONEY); + this.rerollCostText = addTextObject(this.scene, 0, 0, "", TextStyle.MONEY); this.rerollCostText.setOrigin(0, 0); this.rerollCostText.setPositionRelative(rerollButtonText, rerollButtonText.displayWidth + 5, 1); this.rerollButtonContainer.add(this.rerollCostText); @@ -65,7 +65,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.setVisible(false); ui.add(this.lockRarityButtonContainer); - this.lockRarityButtonText = addTextObject(this.scene, -4, -2, 'Lock Rarities', TextStyle.PARTY); + this.lockRarityButtonText = addTextObject(this.scene, -4, -2, "Lock Rarities", TextStyle.PARTY); this.lockRarityButtonText.setOrigin(0, 0); this.lockRarityButtonContainer.add(this.lockRarityButtonText); } @@ -79,8 +79,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return false; } - if (args.length !== 4 || !(args[1] instanceof Array) || !args[1].length || !(args[2] instanceof Function)) + if (args.length !== 4 || !(args[1] instanceof Array) || !args[1].length || !(args[2] instanceof Function)) { return false; + } super.show(args); @@ -131,8 +132,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.scene.add.existing(option); this.modifierContainer.add(option); - if (row >= this.shopOptionsRows.length) + if (row >= this.shopOptionsRows.length) { this.shopOptionsRows.push([]); + } this.shopOptionsRows[row].push(option); } @@ -144,7 +146,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { let i = 0; this.scene.tweens.addCounter({ - ease: 'Sine.easeIn', + ease: "Sine.easeIn", duration: 1250, onUpdate: t => { const value = t.getValue(); @@ -158,8 +160,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { }); this.scene.time.delayedCall(1000 + maxUpgradeCount * 2000, () => { - for (let shopOption of this.shopOptionsRows.flat()) + for (const shopOption of this.shopOptionsRows.flat()) { shopOption.show(0, 0); + } }); this.scene.time.delayedCall(4000 + maxUpgradeCount * 2000, () => { @@ -200,8 +203,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { processInput(button: Button): boolean { const ui = this.getUi(); - if (!this.awaitingActionInput) + if (!this.awaitingActionInput) { return false; + } let success = false; @@ -228,39 +232,44 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } } else { switch (button) { - case Button.UP: - if (!this.rowCursor && this.cursor === 2) - success = this.setCursor(0); - else if (this.rowCursor < this.shopOptionsRows.length + 1) - success = this.setRowCursor(this.rowCursor + 1); - break; - case Button.DOWN: - if (this.rowCursor) - success = this.setRowCursor(this.rowCursor - 1); - else if (this.lockRarityButtonContainer.visible && !this.cursor) - success = this.setCursor(2); - break; - case Button.LEFT: - if (!this.rowCursor) { - success = this.cursor === 1 && this.rerollButtonContainer.visible && this.setCursor(0); - } else if (this.cursor) - success = this.setCursor(this.cursor - 1); - else if (this.rowCursor === 1 && this.rerollButtonContainer.visible) - success = this.setRowCursor(0); - break; - case Button.RIGHT: - if (!this.rowCursor) - success = this.cursor !== 1 && this.transferButtonContainer.visible && this.setCursor(1); - else if (this.cursor < this.getRowItems(this.rowCursor) - 1) - success = this.setCursor(this.cursor + 1); - else if (this.rowCursor === 1 && this.transferButtonContainer.visible) - success = this.setRowCursor(0); - break; + case Button.UP: + if (!this.rowCursor && this.cursor === 2) { + success = this.setCursor(0); + } else if (this.rowCursor < this.shopOptionsRows.length + 1) { + success = this.setRowCursor(this.rowCursor + 1); + } + break; + case Button.DOWN: + if (this.rowCursor) { + success = this.setRowCursor(this.rowCursor - 1); + } else if (this.lockRarityButtonContainer.visible && !this.cursor) { + success = this.setCursor(2); + } + break; + case Button.LEFT: + if (!this.rowCursor) { + success = this.cursor === 1 && this.rerollButtonContainer.visible && this.setCursor(0); + } else if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.rowCursor === 1 && this.rerollButtonContainer.visible) { + success = this.setRowCursor(0); + } + break; + case Button.RIGHT: + if (!this.rowCursor) { + success = this.cursor !== 1 && this.transferButtonContainer.visible && this.setCursor(1); + } else if (this.cursor < this.getRowItems(this.rowCursor) - 1) { + success = this.setCursor(this.cursor + 1); + } else if (this.rowCursor === 1 && this.transferButtonContainer.visible) { + success = this.setRowCursor(0); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -270,7 +279,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.image(0, 0, 'cursor'); + this.cursorObj = this.scene.add.image(0, 0, "cursor"); this.modifierContainer.add(this.cursorObj); } @@ -279,21 +288,22 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.cursorObj.setScale(this.rowCursor === 1 ? 2 : this.rowCursor >= 2 ? 1.5 : 1); if (this.rowCursor) { - let sliceWidth = (this.scene.game.canvas.width / 6) / (options.length + 2); - if (this.rowCursor < 2) + const sliceWidth = (this.scene.game.canvas.width / 6) / (options.length + 2); + if (this.rowCursor < 2) { this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 20, (-this.scene.game.canvas.height / 12) - (this.shopOptionsRows.length > 1 ? 6 : 22)); - else + } else { this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 16, (-this.scene.game.canvas.height / 12 - this.scene.game.canvas.height / 32) - (-16 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1)))); + } ui.showText(options[this.cursor].modifierTypeOption.type.getDescription(this.scene)); } else if (!cursor) { this.cursorObj.setPosition(6, this.lockRarityButtonContainer.visible ? -72 : -60); - ui.showText('Spend money to reroll your item options.'); + ui.showText("Spend money to reroll your item options."); } else if (cursor === 1) { this.cursorObj.setPosition((this.scene.game.canvas.width / 6) - 50, -60); - ui.showText('Transfer a held item from one Pokémon to another.'); + ui.showText("Transfer a held item from one Pokémon to another."); } else { this.cursorObj.setPosition(6, -60); - ui.showText('Lock item rarities on reroll (affects reroll cost).'); + ui.showText("Lock item rarities on reroll (affects reroll cost)."); } return ret; @@ -306,10 +316,11 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rowCursor = rowCursor; let newCursor = Math.round(this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1) * (this.getRowItems(rowCursor) - 1)); if (!rowCursor) { - if (!newCursor && !this.rerollButtonContainer.visible) + if (!newCursor && !this.rerollButtonContainer.visible) { newCursor = 1; - else if (newCursor && !this.transferButtonContainer.visible) + } else if (newCursor && !this.transferButtonContainer.visible) { newCursor = 0; + } } this.cursor = -1; this.setCursor(newCursor); @@ -321,12 +332,12 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private getRowItems(rowCursor: integer): integer { switch (rowCursor) { - case 0: - return 2; - case 1: - return this.options.length; - default: - return this.shopOptionsRows[this.shopOptionsRows.length - (rowCursor - 1)].length; + case 0: + return 2; + case 1: + return this.options.length; + default: + return this.shopOptionsRows[this.shopOptionsRows.length - (rowCursor - 1)].length; } } @@ -336,8 +347,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { updateCostText(): void { const shopOptions = this.shopOptionsRows.flat(); - for (let shopOption of shopOptions) + for (const shopOption of shopOptions) { shopOption.updateCostText(); + } this.updateRerollCostText(); } @@ -345,7 +357,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { updateRerollCostText(): void { const canReroll = this.scene.money >= this.rerollCost; - this.rerollCostText.setText(`₽${this.rerollCost.toLocaleString('en-US')}`); + this.rerollCostText.setText(`₽${this.rerollCost.toLocaleString("en-US")}`); this.rerollCostText.setColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED)); this.rerollCostText.setShadowColor(this.getTextColor(canReroll ? TextStyle.MONEY : TextStyle.PARTY_RED, true)); } @@ -375,7 +387,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { targets: options, scale: 0.01, duration: 250, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => options.forEach(o => o.destroy()) }); @@ -385,12 +397,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { targets: container, alpha: 0, duration: 250, - ease: 'Cubic.easeIn', + ease: "Cubic.easeIn", onComplete: () => { - if (!this.options.length) + if (!this.options.length) { container.setVisible(false); - else + } else { container.setAlpha(1); + } } }); } @@ -398,8 +411,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } } @@ -425,7 +439,7 @@ class ModifierOption extends Phaser.GameObjects.Container { setup() { if (!this.modifierTypeOption.cost) { const getPb = (): Phaser.GameObjects.Sprite => { - const pb = this.scene.add.sprite(0, -182, 'pb', this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount)); + const pb = this.scene.add.sprite(0, -182, "pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount)); pb.setScale(2); return pb; }; @@ -444,7 +458,7 @@ class ModifierOption extends Phaser.GameObjects.Container { this.add(this.itemContainer); const getItem = () => { - const item = this.scene.add.sprite(0, 0, 'items', this.modifierTypeOption.type.iconImage); + const item = this.scene.add.sprite(0, 0, "items", this.modifierTypeOption.type.iconImage); return item; }; @@ -457,14 +471,14 @@ class ModifierOption extends Phaser.GameObjects.Container { this.itemContainer.add(this.itemTint); } - this.itemText = addTextObject(this.scene, 0, 35, this.modifierTypeOption.type.name, TextStyle.PARTY, { align: 'center' }); + this.itemText = addTextObject(this.scene, 0, 35, this.modifierTypeOption.type.name, TextStyle.PARTY, { align: "center" }); this.itemText.setOrigin(0.5, 0); this.itemText.setAlpha(0); this.itemText.setTint(getModifierTierTextTint(this.modifierTypeOption.type.tier)); this.add(this.itemText); if (this.modifierTypeOption.cost) { - this.itemCostText = addTextObject(this.scene, 0, 45, '', TextStyle.MONEY, { align: 'center' }); + this.itemCostText = addTextObject(this.scene, 0, 45, "", TextStyle.MONEY, { align: "center" }); this.itemCostText.setOrigin(0.5, 0); this.itemCostText.setAlpha(0); @@ -480,7 +494,7 @@ class ModifierOption extends Phaser.GameObjects.Container { targets: this.pb, y: 0, duration: 1250, - ease: 'Bounce.Out' + ease: "Bounce.Out" }); let lastValue = 1; @@ -491,16 +505,18 @@ class ModifierOption extends Phaser.GameObjects.Container { from: 1, to: 0, duration: 1250, - ease: 'Bounce.Out', + ease: "Bounce.Out", onUpdate: t => { - if (!this.scene) + if (!this.scene) { return; + } const value = t.getValue(); if (!bounce && value > lastValue) { - (this.scene as BattleScene).playSound('pb_bounce_1', { volume: 1 / ++bounceCount }); + (this.scene as BattleScene).playSound("pb_bounce_1", { volume: 1 / ++bounceCount }); bounce = true; - } else if (bounce && value < lastValue) + } else if (bounce && value < lastValue) { bounce = false; + } lastValue = value; } }); @@ -508,7 +524,7 @@ class ModifierOption extends Phaser.GameObjects.Container { for (let u = 0; u < this.modifierTypeOption.upgradeCount; u++) { const upgradeIndex = u; this.scene.time.delayedCall(remainingDuration - 2000 * (this.modifierTypeOption.upgradeCount - (upgradeIndex + 1 + upgradeCountOffset)), () => { - (this.scene as BattleScene).playSound('upgrade', { rate: 1 + 0.25 * upgradeIndex }); + (this.scene as BattleScene).playSound("upgrade", { rate: 1 + 0.25 * upgradeIndex }); this.pbTint.setPosition(this.pb.x, this.pb.y); this.pbTint.setTintFill(0xFFFFFF); this.pbTint.setAlpha(0); @@ -517,14 +533,14 @@ class ModifierOption extends Phaser.GameObjects.Container { targets: this.pbTint, alpha: 1, duration: 1000, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { - this.pb.setTexture('pb', this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1))); + this.pb.setTexture("pb", this.getPbAtlasKey(-this.modifierTypeOption.upgradeCount + (upgradeIndex + 1))); this.scene.tweens.add({ targets: this.pbTint, alpha: 0, duration: 750, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.pbTint.setVisible(false); } @@ -536,18 +552,19 @@ class ModifierOption extends Phaser.GameObjects.Container { } this.scene.time.delayedCall(remainingDuration + 2000, () => { - if (!this.scene) + if (!this.scene) { return; + } if (!this.modifierTypeOption.cost) { - this.pb.setTexture('pb', `${this.getPbAtlasKey(0)}_open`); - (this.scene as BattleScene).playSound('pb_rel'); + this.pb.setTexture("pb", `${this.getPbAtlasKey(0)}_open`); + (this.scene as BattleScene).playSound("pb_rel"); this.scene.tweens.add({ targets: this.pb, duration: 500, delay: 250, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", alpha: 0, onComplete: () => this.pb.destroy() }); @@ -556,7 +573,7 @@ class ModifierOption extends Phaser.GameObjects.Container { this.scene.tweens.add({ targets: this.itemContainer, duration: 500, - ease: 'Elastic.Out', + ease: "Elastic.Out", scale: 2, alpha: 1 }); @@ -565,7 +582,7 @@ class ModifierOption extends Phaser.GameObjects.Container { targets: this.itemTint, alpha: 0, duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => this.itemTint.destroy() }); } @@ -574,7 +591,7 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 500, alpha: 1, y: 25, - ease: 'Cubic.easeInOut' + ease: "Cubic.easeInOut" }); if (this.itemCostText) { this.scene.tweens.add({ @@ -582,7 +599,7 @@ class ModifierOption extends Phaser.GameObjects.Container { duration: 500, alpha: 1, y: 35, - ease: 'Cubic.easeInOut' + ease: "Cubic.easeInOut" }); } }); @@ -596,8 +613,8 @@ class ModifierOption extends Phaser.GameObjects.Container { const scene = this.scene as BattleScene; const textStyle = this.modifierTypeOption.cost <= scene.money ? TextStyle.MONEY : TextStyle.PARTY_RED; - this.itemCostText.setText(`₽${this.modifierTypeOption.cost.toLocaleString('en-US')}`); + this.itemCostText.setText(`₽${this.modifierTypeOption.cost.toLocaleString("en-US")}`); this.itemCostText.setColor(getTextColor(textStyle, false, scene.uiTheme)); this.itemCostText.setShadowColor(getTextColor(textStyle, true, scene.uiTheme)); } -} \ No newline at end of file +} diff --git a/src/ui/option-select-ui-handler.ts b/src/ui/option-select-ui-handler.ts index 824fa153570b..3253ca8d325e 100644 --- a/src/ui/option-select-ui-handler.ts +++ b/src/ui/option-select-ui-handler.ts @@ -10,4 +10,4 @@ export default class OptionSelectUiHandler extends AbstractOptionSelectUiHandler getWindowWidth(): integer { return 64; } -} \ No newline at end of file +} diff --git a/src/ui/outdated-modal-ui-handler.ts b/src/ui/outdated-modal-ui-handler.ts index 53243c42bbee..1e737cf638b6 100644 --- a/src/ui/outdated-modal-ui-handler.ts +++ b/src/ui/outdated-modal-ui-handler.ts @@ -9,7 +9,7 @@ export default class OutdatedModalUiHandler extends ModalUiHandler { } getModalTitle(): string { - return ''; + return ""; } getWidth(): number { @@ -31,7 +31,7 @@ export default class OutdatedModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, 'Your client is currently outdated.\nPlease reload to update the game.\n\nIf this error persists, please clear your browser cache.', TextStyle.WINDOW, { fontSize: '48px', align: 'center' }); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Your client is currently outdated.\nPlease reload to update the game.\n\nIf this error persists, please clear your browser cache.", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -44,4 +44,4 @@ export default class OutdatedModalUiHandler extends ModalUiHandler { return super.show([ config ]); } -} \ No newline at end of file +} diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 93c69ce2c1b4..0d913f7074c9 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -16,12 +16,12 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, 'party_exp_bar', null, 8, 18, 21, 5, 6, 4); + this.bg = this.scene.add.nineslice(0, 0, "party_exp_bar", null, 8, 18, 21, 5, 6, 4); this.bg.setOrigin(0, 0); this.add(this.bg); - this.expText = addTextObject(this.scene, 22, 4, '', TextStyle.BATTLE_INFO); + this.expText = addTextObject(this.scene, 22, 4, "", TextStyle.BATTLE_INFO); this.expText.setOrigin(0, 0); this.add(this.expText); @@ -31,8 +31,9 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { showPokemonExp(pokemon: Pokemon, expValue: integer, showOnlyLevelUp: boolean, newLevel: number): Promise { return new Promise(resolve => { - if (this.shown) + if (this.shown) { return resolve(); + } this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(pokemon, -8, 15, 0, 0.5); this.pokemonIcon.setScale(0.5); @@ -42,7 +43,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { // if we want to only display the level in the small frame if (showOnlyLevelUp) { if (newLevel > 200) { // if the level is greater than 200, we only display Lv. UP - this.expText.setText('Lv. UP'); + this.expText.setText("Lv. UP"); } else { // otherwise we display Lv. Up and the new level this.expText.setText(`Lv. UP: ${newLevel.toString()}`); } @@ -55,14 +56,15 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) + if (this.tween) { this.tween.stop(); + } this.tween = this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6) - (this.bg.width - 5), duration: 500 / Math.pow(2, pokemon.scene.expGainsSpeed), - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => { this.tween = null; resolve(); @@ -76,17 +78,19 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { hide(): Promise { return new Promise(resolve => { - if (!this.shown) + if (!this.shown) { return resolve(); + } - if (this.tween) + if (this.tween) { this.tween.stop(); + } this.tween = this.scene.tweens.add({ targets: this, x: (this.scene.game.canvas.width / 6), duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.tween = null; this.shown = false; @@ -97,4 +101,4 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { }); }); } -} \ No newline at end of file +} diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 253ed8b4b720..13461592b166 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -18,7 +18,7 @@ import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; import { getVariantTint } from "#app/data/variant"; import {Button} from "../enums/buttons"; -const defaultMessage = 'Choose a Pokémon.'; +const defaultMessage = "Choose a Pokémon."; export enum PartyUiMode { SWITCH, @@ -100,27 +100,30 @@ export default class PartyUiHandler extends MessageUiHandler { private static FilterAll = (_pokemon: PlayerPokemon) => null; public static FilterNonFainted = (pokemon: PlayerPokemon) => { - if (pokemon.isFainted()) + if (pokemon.isFainted()) { return `${pokemon.name} has no energy\nleft to battle!`; + } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { - if(!pokemon.isFainted()) + if(!pokemon.isFainted()) { return `${pokemon.name} still has energy\nto battle!`; + } return null; - } + }; private static FilterAllMoves = (_pokemonMove: PokemonMove) => null; public static FilterItemMaxStacks = (pokemon: PlayerPokemon, modifier: PokemonHeldItemModifier) => { const matchingModifier = pokemon.scene.findModifier(m => m instanceof PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(modifier)) as PokemonHeldItemModifier; - if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene)) + if (matchingModifier && matchingModifier.stackCount === matchingModifier.getMaxStackCount(pokemon.scene)) { return `${pokemon.name} has too many\nof this item!`; + } return null; }; - public static NoEffectMessage = 'It won\'t have any effect.'; + public static NoEffectMessage = "It won't have any effect."; constructor(scene: BattleScene) { super(scene, Mode.PARTY); @@ -135,7 +138,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.partyContainer = partyContainer; - this.partyBg = this.scene.add.image(0, 0, 'party_bg'); + this.partyBg = this.scene.add.image(0, 0, "party_bg"); partyContainer.add(this.partyBg); this.partyBg.setOrigin(0, 1); @@ -178,8 +181,9 @@ export default class PartyUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if (!args.length || this.active) + if (!args.length || this.active) { return false; + } super.show(args); @@ -198,7 +202,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.showMovePp = args.length > 6 && args[6]; this.partyContainer.setVisible(true); - this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? '_double' : ''}`); + this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? "_double" : ""}`); this.populatePartySlots(); this.setCursor(this.cursor < 6 ? this.cursor : 0); @@ -208,8 +212,9 @@ export default class PartyUiHandler extends MessageUiHandler { processInput(button: Button): boolean { const ui = this.getUi(); - if (this.pendingPrompt) + if (this.pendingPrompt) { return false; + } if (this.awaitingActionInput) { if ((button === Button.ACTION || button === Button.CANCEL) && this.onActionInput) { @@ -235,7 +240,7 @@ export default class PartyUiHandler extends MessageUiHandler { ui.playSelect(); return true; } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER && option !== PartyOption.CANCEL) { - let filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); + const filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null) { this.selectCallback(this.cursor, option); this.clearOptions(); @@ -250,8 +255,9 @@ export default class PartyUiHandler extends MessageUiHandler { let filterResult: string; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); - if (filterResult === null && this.partyUiMode === PartyUiMode.MOVE_MODIFIER) + if (filterResult === null && this.partyUiMode === PartyUiMode.MOVE_MODIFIER) { filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]); + } } else { const transferPokemon = this.scene.getParty()[this.transferCursor]; const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier @@ -259,8 +265,9 @@ export default class PartyUiHandler extends MessageUiHandler { filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, itemModifiers[this.transferOptionCursor]); } if (filterResult === null) { - if (this.partyUiMode !== PartyUiMode.SPLICE) + if (this.partyUiMode !== PartyUiMode.SPLICE) { this.clearOptions(); + } if (this.selectCallback) { if (option === PartyOption.TRANSFER) { (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.cursor); @@ -269,12 +276,13 @@ export default class PartyUiHandler extends MessageUiHandler { if (option === PartyOption.SPLICE) { (this.selectCallback as PartyModifierSpliceSelectCallback)(this.transferCursor, this.cursor); this.clearTransfer(); - } else + } else { this.startTransfer(); + } this.clearOptions(); - } else if (option === PartyOption.RELEASE) + } else if (option === PartyOption.RELEASE) { this.doRelease(this.cursor); - else { + } else { const selectCallback = this.selectCallback; this.selectCallback = null; selectCallback(this.cursor, option); @@ -282,22 +290,25 @@ export default class PartyUiHandler extends MessageUiHandler { } else { if (option >= PartyOption.FORM_CHANGE_ITEM && this.scene.getCurrentPhase() instanceof CommandPhase) { switch (this.partyUiMode) { - case PartyUiMode.SWITCH: - case PartyUiMode.FAINT_SWITCH: - case PartyUiMode.POST_BATTLE_SWITCH: - let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - if (formChangeItemModifiers.find(m => m.active)) - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); - const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; - modifier.active = !modifier.active; - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); - break; + case PartyUiMode.SWITCH: + case PartyUiMode.FAINT_SWITCH: + case PartyUiMode.POST_BATTLE_SWITCH: + let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; + if (formChangeItemModifiers.find(m => m.active)) { + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); + } + const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; + modifier.active = !modifier.active; + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); + break; } - } else if (this.cursor) + } else if (this.cursor) { (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor, option === PartyOption.PASS_BATON); + } } - if (this.partyUiMode !== PartyUiMode.MODIFIER && this.partyUiMode !== PartyUiMode.TM_MODIFIER && this.partyUiMode !== PartyUiMode.MOVE_MODIFIER) + if (this.partyUiMode !== PartyUiMode.MODIFIER && this.partyUiMode !== PartyUiMode.TM_MODIFIER && this.partyUiMode !== PartyUiMode.MOVE_MODIFIER) { ui.playSelect(); + } return true; } else { this.clearOptions(); @@ -345,23 +356,25 @@ export default class PartyUiHandler extends MessageUiHandler { this.showText(null, 0); }); }); - } else - this.showText('You can\'t release a Pokémon that\'s in battle!', null, () => this.showText(null, 0), null, true); + } else { + this.showText("You can't release a Pokémon that's in battle!", null, () => this.showText(null, 0), null, true); + } return true; - } else if (option === PartyOption.CANCEL) + } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); + } } else if (button === Button.CANCEL) { this.clearOptions(); ui.playSelect(); return true; } else { switch (button) { - case Button.UP: - success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); - break; - case Button.DOWN: - success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); - break; + case Button.UP: + success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); + break; + case Button.DOWN: + success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); + break; } } } else { @@ -369,10 +382,11 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.cursor < 6) { this.showOptions(); ui.playSelect(); - } else if (this.partyUiMode === PartyUiMode.FAINT_SWITCH || this.partyUiMode === PartyUiMode.REVIVAL_BLESSING) + } else if (this.partyUiMode === PartyUiMode.FAINT_SWITCH || this.partyUiMode === PartyUiMode.REVIVAL_BLESSING) { ui.playError(); - else + } else { return this.processInput(Button.CANCEL); + } return true; } else if (button === Button.CANCEL) { if ((this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.SPLICE) && this.transferMode) { @@ -397,32 +411,34 @@ export default class PartyUiHandler extends MessageUiHandler { const battlerCount = this.scene.currentBattle.getBattlerCount(); switch (button) { - case Button.UP: - success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); - break; - case Button.DOWN: - success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); - break; - case Button.LEFT: - if (this.cursor >= battlerCount && this.cursor <= 6) - success = this.setCursor(0); - break; - case Button.RIGHT: - if (slotCount === battlerCount){ - success = this.setCursor(6); + case Button.UP: + success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); + break; + case Button.DOWN: + success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); + break; + case Button.LEFT: + if (this.cursor >= battlerCount && this.cursor <= 6) { + success = this.setCursor(0); + } + break; + case Button.RIGHT: + if (slotCount === battlerCount){ + success = this.setCursor(6); break; - } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1){ - success = this.setCursor(2); + } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1){ + success = this.setCursor(2); break; - } else if (slotCount > battlerCount && this.cursor < battlerCount){ - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + } else if (slotCount > battlerCount && this.cursor < battlerCount){ + success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); break; - } + } } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -430,19 +446,21 @@ export default class PartyUiHandler extends MessageUiHandler { populatePartySlots() { const party = this.scene.getParty(); - if (this.cursor < 6 && this.cursor >= party.length) + if (this.cursor < 6 && this.cursor >= party.length) { this.cursor = party.length - 1; - else if (this.cursor === 6) + } else if (this.cursor === 6) { this.partyCancelButton.select(); + } - for (let p in party) { + for (const p in party) { const slotIndex = parseInt(p); const partySlot = new PartySlot(this.scene, slotIndex, party[p], this.iconAnimHandler, this.partyUiMode, this.tmMoveId); this.scene.add.existing(partySlot); this.partySlotsContainer.add(partySlot); this.partySlots.push(partySlot); - if (this.cursor === slotIndex) + if (this.cursor === slotIndex) { partySlot.select(); + } } } @@ -469,16 +487,18 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsScrollCursor--; } } - if (isScroll && this.optionsScrollCursor === 1) + if (isScroll && this.optionsScrollCursor === 1) { this.optionsScrollCursor += isDown ? 1 : -1; + } } } - if (isScroll) + if (isScroll) { this.updateOptions(); - else + } else { this.optionsCursor = cursor; + } if (!this.optionsCursorObj) { - this.optionsCursorObj = this.scene.add.image(0, 0, 'cursor'); + this.optionsCursorObj = this.scene.add.image(0, 0, "cursor"); this.optionsCursorObj.setOrigin(0, 0); this.optionsContainer.add(this.optionsCursorObj); } @@ -488,14 +508,16 @@ export default class PartyUiHandler extends MessageUiHandler { if (changed) { this.lastCursor = this.cursor; this.cursor = cursor; - if (this.lastCursor < 6) + if (this.lastCursor < 6) { this.partySlots[this.lastCursor].deselect(); - else if (this.lastCursor === 6) + } else if (this.lastCursor === 6) { this.partyCancelButton.deselect(); - if (cursor < 6) + } + if (cursor < 6) { this.partySlots[cursor].select(); - else if (cursor === 6) + } else if (cursor === 6) { this.partyCancelButton.select(); + } } } @@ -503,10 +525,11 @@ export default class PartyUiHandler extends MessageUiHandler { } showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { - if (text === null) + if (text === null) { text = defaultMessage; + } - if (text?.indexOf('\n') === -1) { + if (text?.indexOf("\n") === -1) { this.partyMessageBox.setSize(262, 30); this.message.setY(10); } else { @@ -518,25 +541,28 @@ export default class PartyUiHandler extends MessageUiHandler { } showOptions() { - if (this.cursor === 6) + if (this.cursor === 6) { return; + } this.optionsMode = true; - let optionsMessage = 'Do what with this Pokémon?'; + let optionsMessage = "Do what with this Pokémon?"; switch (this.partyUiMode) { - case PartyUiMode.MOVE_MODIFIER: - optionsMessage = 'Select a move.'; - break; - case PartyUiMode.MODIFIER_TRANSFER: - if (!this.transferMode) - optionsMessage = 'Select a held item to transfer.'; - break; - case PartyUiMode.SPLICE: - if (!this.transferMode) - optionsMessage = 'Select another Pokémon to splice.'; - break; + case PartyUiMode.MOVE_MODIFIER: + optionsMessage = "Select a move."; + break; + case PartyUiMode.MODIFIER_TRANSFER: + if (!this.transferMode) { + optionsMessage = "Select a held item to transfer."; + } + break; + case PartyUiMode.SPLICE: + if (!this.transferMode) { + optionsMessage = "Select another Pokémon to splice."; + } + break; } this.showText(optionsMessage, 0); @@ -552,8 +578,8 @@ export default class PartyUiHandler extends MessageUiHandler { const pokemon = this.scene.getParty()[this.cursor]; const learnableLevelMoves = this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER - ? pokemon.getLearnableLevelMoves() - : null; + ? pokemon.getLearnableLevelMoves() + : null; const itemModifiers = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER ? this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier @@ -570,69 +596,80 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { switch (this.partyUiMode) { - case PartyUiMode.SWITCH: - case PartyUiMode.FAINT_SWITCH: - case PartyUiMode.POST_BATTLE_SWITCH: - if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { - this.options.push(PartyOption.SEND_OUT); - if (this.partyUiMode !== PartyUiMode.FAINT_SWITCH + case PartyUiMode.SWITCH: + case PartyUiMode.FAINT_SWITCH: + case PartyUiMode.POST_BATTLE_SWITCH: + if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { + this.options.push(PartyOption.SEND_OUT); + if (this.partyUiMode !== PartyUiMode.FAINT_SWITCH && this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier - && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id)) - this.options.push(PartyOption.PASS_BATON); + && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id)) { + this.options.push(PartyOption.PASS_BATON); } - if (this.scene.getCurrentPhase() instanceof CommandPhase) { - formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; - if (formChangeItemModifiers.find(m => m.active)) - formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); - for (let i = 0; i < formChangeItemModifiers.length; i++) - this.options.push(PartyOption.FORM_CHANGE_ITEM + i); + } + if (this.scene.getCurrentPhase() instanceof CommandPhase) { + formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; + if (formChangeItemModifiers.find(m => m.active)) { + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); } - break; - case PartyUiMode.REVIVAL_BLESSING: - this.options.push(PartyOption.REVIVE); - break; - case PartyUiMode.MODIFIER: + for (let i = 0; i < formChangeItemModifiers.length; i++) { + this.options.push(PartyOption.FORM_CHANGE_ITEM + i); + } + } + break; + case PartyUiMode.REVIVAL_BLESSING: + this.options.push(PartyOption.REVIVE); + break; + case PartyUiMode.MODIFIER: + this.options.push(PartyOption.APPLY); + break; + case PartyUiMode.TM_MODIFIER: + this.options.push(PartyOption.TEACH); + break; + case PartyUiMode.MODIFIER_TRANSFER: + this.options.push(PartyOption.TRANSFER); + break; + case PartyUiMode.SPLICE: + if (this.transferMode) { + if (this.cursor !== this.transferCursor) { + this.options.push(PartyOption.SPLICE); + } + } else { this.options.push(PartyOption.APPLY); - break; - case PartyUiMode.TM_MODIFIER: - this.options.push(PartyOption.TEACH); - break; - case PartyUiMode.MODIFIER_TRANSFER: - this.options.push(PartyOption.TRANSFER); - break; - case PartyUiMode.SPLICE: - if (this.transferMode) { - if (this.cursor !== this.transferCursor) - this.options.push(PartyOption.SPLICE); - } else - this.options.push(PartyOption.APPLY); - break; - case PartyUiMode.RELEASE: - this.options.push(PartyOption.RELEASE); - break; + } + break; + case PartyUiMode.RELEASE: + this.options.push(PartyOption.RELEASE); + break; } this.options.push(PartyOption.SUMMARY); - if (pokemon.pauseEvolutions && pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) + if (pokemon.pauseEvolutions && pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); + } if (this.partyUiMode === PartyUiMode.SWITCH) { - if (pokemon.isFusion()) + if (pokemon.isFusion()) { this.options.push(PartyOption.UNSPLICE); + } this.options.push(PartyOption.RELEASE); - } else if (this.partyUiMode === PartyUiMode.SPLICE && pokemon.isFusion()) + } else if (this.partyUiMode === PartyUiMode.SPLICE && pokemon.isFusion()) { this.options.push(PartyOption.UNSPLICE); + } } else if (this.partyUiMode === PartyUiMode.MOVE_MODIFIER) { - for (let m = 0; m < pokemon.moveset.length; m++) + for (let m = 0; m < pokemon.moveset.length; m++) { this.options.push(PartyOption.MOVE_1 + m); + } } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const learnableMoves = pokemon.getLearnableLevelMoves(); - for (let m = 0; m < learnableMoves.length; m++) + for (let m = 0; m < learnableMoves.length; m++) { this.options.push(m); + } } else { - for (let im = 0; im < itemModifiers.length; im++) + for (let im = 0; im < itemModifiers.length; im++) { this.options.push(im); + } } this.optionsScrollTotal = this.options.length; @@ -644,10 +681,12 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.optionsScroll) { this.options.splice(optionEndIndex, this.optionsScrollTotal); this.options.splice(0, optionStartIndex); - if (optionStartIndex) + if (optionStartIndex) { this.options.unshift(PartyOption.SCROLL_UP); - if (optionEndIndex < this.optionsScrollTotal) + } + if (optionEndIndex < this.optionsScrollTotal) { this.options.push(PartyOption.SCROLL_DOWN); + } } this.options.push(PartyOption.CANCEL); @@ -661,38 +700,39 @@ export default class PartyUiHandler extends MessageUiHandler { optionEndIndex = this.options.length; let widestOptionWidth = 0; - let optionTexts: Phaser.GameObjects.Text[] = []; + const optionTexts: Phaser.GameObjects.Text[] = []; for (let o = optionStartIndex; o < optionEndIndex; o++) { const option = this.options[this.options.length - (o + 1)]; let altText = false; let optionName: string; - if (option === PartyOption.SCROLL_UP) - optionName = '↑'; - else if (option === PartyOption.SCROLL_DOWN) - optionName = '↓'; - else if ((this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || option === PartyOption.CANCEL) { + if (option === PartyOption.SCROLL_UP) { + optionName = "↑"; + } else if (option === PartyOption.SCROLL_DOWN) { + optionName = "↓"; + } else if ((this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || option === PartyOption.CANCEL) { switch (option) { - case PartyOption.MOVE_1: - case PartyOption.MOVE_2: - case PartyOption.MOVE_3: - case PartyOption.MOVE_4: - const move = pokemon.moveset[option - PartyOption.MOVE_1]; - if(this.showMovePp) { - const maxPP = move.getMovePp(); - const currPP = maxPP - move.ppUsed; - optionName = `${move.getName()} ${currPP}/${maxPP}`; - } else { - optionName = move.getName(); - } - break; - default: - if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { - const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; - optionName = `${modifier.active ? 'Deactivate' : 'Activate'} ${modifier.type.name}`; - } else - optionName = Utils.toReadableString(PartyOption[option]); - break; + case PartyOption.MOVE_1: + case PartyOption.MOVE_2: + case PartyOption.MOVE_3: + case PartyOption.MOVE_4: + const move = pokemon.moveset[option - PartyOption.MOVE_1]; + if(this.showMovePp) { + const maxPP = move.getMovePp(); + const currPP = maxPP - move.ppUsed; + optionName = `${move.getName()} ${currPP}/${maxPP}`; + } else { + optionName = move.getName(); + } + break; + default: + if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { + const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; + optionName = `${modifier.active ? "Deactivate" : "Activate"} ${modifier.type.name}`; + } else { + optionName = Utils.toReadableString(PartyOption[option]); + } + break; } } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const move = learnableLevelMoves[option]; @@ -701,15 +741,16 @@ export default class PartyUiHandler extends MessageUiHandler { } else { const itemModifier = itemModifiers[option]; optionName = itemModifier.type.name; - if (itemModifier.stackCount > 1) + if (itemModifier.stackCount > 1) { optionName += ` (${itemModifier.stackCount})`; + } } const yCoord = -6 - 16 * o; const optionText = addTextObject(this.scene, 0, yCoord - 16, optionName, TextStyle.WINDOW); if (altText) { - optionText.setColor('#40c8f8'); - optionText.setShadowColor('#006090') + optionText.setColor("#40c8f8"); + optionText.setShadowColor("#006090"); } optionText.setOrigin(0, 0); @@ -721,8 +762,9 @@ export default class PartyUiHandler extends MessageUiHandler { } this.optionsBg.width = Math.max(widestOptionWidth + 24, 94); - for (let optionText of optionTexts) + for (const optionText of optionTexts) { optionText.x = 15 - this.optionsBg.width; + } } startTransfer(): void { @@ -745,8 +787,9 @@ export default class PartyUiHandler extends MessageUiHandler { const releasedPokemon = this.scene.getParty().splice(slotIndex, 1)[0]; releasedPokemon.destroy(); this.populatePartySlots(); - if (this.cursor >= this.scene.getParty().length) + if (this.cursor >= this.scene.getParty().length) { this.setCursor(this.cursor - 1); + } if (this.partyUiMode === PartyUiMode.RELEASE) { const selectCallback = this.selectCallback; this.selectCallback = null; @@ -758,26 +801,27 @@ export default class PartyUiHandler extends MessageUiHandler { getReleaseMessage(pokemonName: string): string { const rand = Utils.randInt(128); - if (rand < 20) + if (rand < 20) { return `Goodbye, ${pokemonName}!`; - else if (rand < 40) + } else if (rand < 40) { return `Byebye, ${pokemonName}!`; - else if (rand < 60) + } else if (rand < 60) { return `Farewell, ${pokemonName}!`; - else if (rand < 80) + } else if (rand < 80) { return `So long, ${pokemonName}!`; - else if (rand < 100) + } else if (rand < 100) { return `This is where we part, ${pokemonName}!`; - else if (rand < 108) + } else if (rand < 108) { return `I'll miss you, ${pokemonName}!`; - else if (rand < 116) + } else if (rand < 116) { return `I'll never forget you, ${pokemonName}!`; - else if (rand < 124) + } else if (rand < 124) { return `Until we meet again, ${pokemonName}!`; - else if (rand < 127) - return `Sayonara, ${pokemonName}!` - else + } else if (rand < 127) { + return `Sayonara, ${pokemonName}!`; + } else { return `Smell ya later, ${pokemonName}!`; + } } getOptionsCursorWithScroll(): integer { @@ -798,8 +842,9 @@ export default class PartyUiHandler extends MessageUiHandler { } eraseOptionsCursor() { - if (this.optionsCursorObj) + if (this.optionsCursorObj) { this.optionsCursorObj.destroy(); + } this.optionsCursorObj = null; } @@ -842,14 +887,14 @@ class PartySlot extends Phaser.GameObjects.Container { setup(partyUiMode: PartyUiMode, tmMoveId: Moves) { const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); - const slotKey = `party_slot${this.slotIndex >= battlerCount ? '' : '_main'}`; + const slotKey = `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`; - const slotBg = this.scene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? '' : '_fnt'}`); + const slotBg = this.scene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? "" : "_fnt"}`); this.slotBg = slotBg; this.add(slotBg); - const slotPb = this.scene.add.sprite(this.slotIndex >= battlerCount ? -85.5 : -51, this.slotIndex >= battlerCount ? 0 : -20.5, 'party_pb'); + const slotPb = this.scene.add.sprite(this.slotIndex >= battlerCount ? -85.5 : -51, this.slotIndex >= battlerCount ? 0 : -20.5, "party_pb"); this.slotPb = slotPb; this.add(slotPb); @@ -866,11 +911,11 @@ class PartySlot extends Phaser.GameObjects.Container { let displayName = this.pokemon.name; let nameTextWidth: number; - let nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); + const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); nameTextWidth = nameSizeTest.displayWidth; while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : (76 - (this.pokemon.fusionSpecies ? 8 : 0)))) { - displayName = `${displayName.slice(0, displayName.endsWith('.') ? -2 : -1).trimEnd()}.`; + displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`; nameSizeTest.setText(displayName); nameTextWidth = nameSizeTest.displayWidth; } @@ -881,7 +926,7 @@ class PartySlot extends Phaser.GameObjects.Container { slotName.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 21 : 24, this.slotIndex >= battlerCount ? 2 : 10); slotName.setOrigin(0, 0); - const slotLevelLabel = this.scene.add.image(0, 0, 'party_slot_overlay_lv'); + const slotLevelLabel = this.scene.add.image(0, 0, "party_slot_overlay_lv"); slotLevelLabel.setPositionRelative(slotName, 8, 12); slotLevelLabel.setOrigin(0, 0); @@ -897,29 +942,31 @@ class PartySlot extends Phaser.GameObjects.Container { const slotGenderText = addTextObject(this.scene, 0, 0, genderSymbol, TextStyle.PARTY); slotGenderText.setColor(getGenderColor(this.pokemon.getGender(true))); slotGenderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); - if (this.slotIndex >= battlerCount) + if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); - else + } else { slotGenderText.setPositionRelative(slotName, 76, 3); + } slotGenderText.setOrigin(0, 0.25); slotInfoContainer.add(slotGenderText); } if (this.pokemon.fusionSpecies) { - const splicedIcon = this.scene.add.image(0, 0, 'icon_spliced'); + const splicedIcon = this.scene.add.image(0, 0, "icon_spliced"); splicedIcon.setScale(0.5); splicedIcon.setOrigin(0, 0); - if (this.slotIndex >= battlerCount) + if (this.slotIndex >= battlerCount) { splicedIcon.setPositionRelative(slotLevelLabel, 36 - (genderSymbol ? 8 : 0), 0.5); - else + } else { splicedIcon.setPositionRelative(slotName, 76 - (genderSymbol ? 8 : 0), 3.5); + } slotInfoContainer.add(splicedIcon); } if (this.pokemon.status) { - const statusIndicator = this.scene.add.sprite(0, 0, 'statuses'); + const statusIndicator = this.scene.add.sprite(0, 0, "statuses"); statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase()); statusIndicator.setOrigin(0, 0); statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0); @@ -930,7 +977,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.pokemon.isShiny()) { const doubleShiny = this.pokemon.isFusion() && this.pokemon.shiny && this.pokemon.fusionShiny; - const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? '_1' : ''}`); + const shinyStar = this.scene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); shinyStar.setPositionRelative(slotName, -9, 3); shinyStar.setTint(getVariantTint(!doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant)); @@ -938,7 +985,7 @@ class PartySlot extends Phaser.GameObjects.Container { slotInfoContainer.add(shinyStar); if (doubleShiny) { - const fusionShinyStar = this.scene.add.image(0, 0, `shiny_star_small_2`); + const fusionShinyStar = this.scene.add.image(0, 0, "shiny_star_small_2"); fusionShinyStar.setOrigin(0, 0); fusionShinyStar.setPosition(shinyStar.x, shinyStar.y); fusionShinyStar.setTint(getVariantTint(this.pokemon.fusionVariant)); @@ -948,13 +995,13 @@ class PartySlot extends Phaser.GameObjects.Container { } if (partyUiMode !== PartyUiMode.TM_MODIFIER) { - const slotHpBar = this.scene.add.image(0, 0, 'party_slot_hp_bar'); + const slotHpBar = this.scene.add.image(0, 0, "party_slot_hp_bar"); slotHpBar.setPositionRelative(slotBg, this.slotIndex >= battlerCount ? 72 : 8, this.slotIndex >= battlerCount ? 6 : 31); slotHpBar.setOrigin(0, 0); const hpRatio = this.pokemon.getHpRatio(); - const slotHpOverlay = this.scene.add.sprite(0, 0, 'party_slot_hp_overlay', hpRatio > 0.5 ? 'high' : hpRatio > 0.25 ? 'medium' : 'low'); + const slotHpOverlay = this.scene.add.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low"); slotHpOverlay.setPositionRelative(slotHpBar, 16, 2); slotHpOverlay.setOrigin(0, 0); slotHpOverlay.setScale(hpRatio, 1); @@ -967,15 +1014,15 @@ class PartySlot extends Phaser.GameObjects.Container { } else { let slotTmText: string; switch (true) { - case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1): - slotTmText = 'Not Able'; - break; - case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0): - slotTmText = 'Learned'; - break; - default: - slotTmText = 'Able'; - break; + case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1): + slotTmText = "Not Able"; + break; + case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0): + slotTmText = "Learned"; + break; + default: + slotTmText = "Able"; + break; } const slotTmLabel = addTextObject(this.scene, 0, 0, slotTmText, TextStyle.MESSAGE); @@ -987,30 +1034,33 @@ class PartySlot extends Phaser.GameObjects.Container { } select(): void { - if (this.selected) + if (this.selected) { return; + } this.selected = true; this.iconAnimHandler.addOrUpdate(this.pokemonIcon, PokemonIconAnimMode.ACTIVE); this.updateSlotTexture(); - this.slotPb.setFrame('party_pb_sel'); + this.slotPb.setFrame("party_pb_sel"); } deselect(): void { - if (!this.selected) + if (!this.selected) { return; + } this.selected = false; this.iconAnimHandler.addOrUpdate(this.pokemonIcon, PokemonIconAnimMode.PASSIVE); this.updateSlotTexture(); - this.slotPb.setFrame('party_pb'); + this.slotPb.setFrame("party_pb"); } setTransfer(transfer: boolean): void { - if (this.transfer === transfer) + if (this.transfer === transfer) { return; + } this.transfer = transfer; this.updateSlotTexture(); @@ -1018,8 +1068,8 @@ class PartySlot extends Phaser.GameObjects.Container { private updateSlotTexture(): void { const battlerCount = (this.scene as BattleScene).currentBattle.getBattlerCount(); - this.slotBg.setTexture(`party_slot${this.slotIndex >= battlerCount ? '' : '_main'}`, - `party_slot${this.slotIndex >= battlerCount ? '' : '_main'}${this.transfer ? '_swap' : this.pokemon.hp ? '' : '_fnt'}${this.selected ? '_sel' : ''}`); + this.slotBg.setTexture(`party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`, + `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`); } } @@ -1036,37 +1086,39 @@ class PartyCancelButton extends Phaser.GameObjects.Container { } setup() { - const partyCancelBg = this.scene.add.sprite(0, 0, 'party_cancel'); + const partyCancelBg = this.scene.add.sprite(0, 0, "party_cancel"); this.add(partyCancelBg); this.partyCancelBg = partyCancelBg; - const partyCancelPb = this.scene.add.sprite(-17, 0, 'party_pb'); + const partyCancelPb = this.scene.add.sprite(-17, 0, "party_pb"); this.add(partyCancelPb); this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -7, -6, 'Cancel', TextStyle.PARTY); + const partyCancelText = addTextObject(this.scene, -7, -6, "Cancel", TextStyle.PARTY); this.add(partyCancelText); } select() { - if (this.selected) + if (this.selected) { return; + } this.selected = true; - this.partyCancelBg.setFrame(`party_cancel_sel`); - this.partyCancelPb.setFrame('party_pb_sel'); + this.partyCancelBg.setFrame("party_cancel_sel"); + this.partyCancelPb.setFrame("party_pb_sel"); } deselect() { - if (!this.selected) + if (!this.selected) { return; + } this.selected = false; - this.partyCancelBg.setFrame('party_cancel'); - this.partyCancelPb.setFrame('party_pb'); + this.partyCancelBg.setFrame("party_cancel"); + this.partyCancelPb.setFrame("party_pb"); } -} \ No newline at end of file +} diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index cc2bd21cb0b4..3ac41b9148ec 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -15,14 +15,14 @@ export default class PokeballTray extends Phaser.GameObjects.Container { } setup(): void { - this.bg = this.scene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? 'player' : 'enemy'}`, null, 104, 4, 48, 8, 0, 0); + this.bg = this.scene.add.nineslice(0, 0, `pb_tray_overlay_${this.player ? "player" : "enemy"}`, null, 104, 4, 48, 8, 0, 0); this.bg.setOrigin(this.player ? 1 : 0, 0); this.add(this.bg); - this.balls = new Array(6).fill(null).map((_, i) => this.scene.add.sprite((this.player ? -83 : 76) + (this.scene.game.canvas.width / 6) * (this.player ? -1 : 1) + 10 * i * (this.player ? 1 : -1), -8, 'pb_tray_ball', 'empty')); + this.balls = new Array(6).fill(null).map((_, i) => this.scene.add.sprite((this.player ? -83 : 76) + (this.scene.game.canvas.width / 6) * (this.player ? -1 : 1) + 10 * i * (this.player ? 1 : -1), -8, "pb_tray_ball", "empty")); - for (let ball of this.balls) { + for (const ball of this.balls) { ball.setOrigin(0, 0); this.add(ball); } @@ -33,8 +33,9 @@ export default class PokeballTray extends Phaser.GameObjects.Container { showPbTray(party: Pokemon[]): Promise { return new Promise(resolve => { - if (this.shown) + if (this.shown) { return resolve(); + } (this.scene as BattleScene).fieldUI.bringToTop(this); @@ -45,31 +46,32 @@ export default class PokeballTray extends Phaser.GameObjects.Container { this.balls.forEach((ball, b) => { ball.x += (this.scene.game.canvas.width / 6 + 104) * (this.player ? 1 : -1); - let ballFrame = 'ball'; - if (b >= party.length) - ballFrame = 'empty'; - else if (!party[b].hp) - ballFrame = 'faint'; - else if (party[b].status) - ballFrame = 'status'; + let ballFrame = "ball"; + if (b >= party.length) { + ballFrame = "empty"; + } else if (!party[b].hp) { + ballFrame = "faint"; + } else if (party[b].status) { + ballFrame = "status"; + } ball.setFrame(ballFrame); }); - (this.scene as BattleScene).playSound('pb_tray_enter'); + (this.scene as BattleScene).playSound("pb_tray_enter"); this.scene.tweens.add({ targets: this, - x: `${this.player ? '-' : '+'}=104`, + x: `${this.player ? "-" : "+"}=104`, duration: 500, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.balls.forEach((ball, b) => { this.scene.tweens.add({ targets: ball, - x: `${this.player ? '-' : '+'}=104`, + x: `${this.player ? "-" : "+"}=104`, duration: b * 100, - ease: 'Sine.easeIn', - onComplete: () => (this.scene as BattleScene).playSound(b < party.length ? 'pb_tray_ball' : 'pb_tray_empty') + ease: "Sine.easeIn", + onComplete: () => (this.scene as BattleScene).playSound(b < party.length ? "pb_tray_ball" : "pb_tray_empty") }); }); } @@ -84,16 +86,17 @@ export default class PokeballTray extends Phaser.GameObjects.Container { hide(): Promise { return new Promise(resolve => { - if (!this.shown) + if (!this.shown) { return resolve(); + } this.balls.forEach((ball, b) => { this.scene.tweens.add({ targets: ball, - x: `${this.player ? '-' : '+'}=${this.scene.game.canvas.width / 6}`, + x: `${this.player ? "-" : "+"}=${this.scene.game.canvas.width / 6}`, duration: 250, delay: b * 100, - ease: 'Sine.easeIn' + ease: "Sine.easeIn" }); }); @@ -102,7 +105,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { width: 144, alpha: 0, duration: 500, - ease: 'Sine.easeIn' + ease: "Sine.easeIn" }); this.scene.time.delayedCall(850, () => { @@ -112,5 +115,5 @@ export default class PokeballTray extends Phaser.GameObjects.Container { this.shown = false; }); - }; -} \ No newline at end of file + } +} diff --git a/src/ui/pokemon-icon-anim-handler.ts b/src/ui/pokemon-icon-anim-handler.ts index a6202d2bff8c..99fe39c4184d 100644 --- a/src/ui/pokemon-icon-anim-handler.ts +++ b/src/ui/pokemon-icon-anim-handler.ts @@ -20,8 +20,9 @@ export default class PokemonIconAnimHandler { const onAlternate = (tween: Phaser.Tweens.Tween) => { const value = tween.getValue(); this.toggled = !!value; - for (let i of this.icons.keys()) - i.y += this.getModeYDelta(this.icons.get(i)) * (this.toggled ? 1 : -1); + for (const i of this.icons.keys()) { + i.y += this.getModeYDelta(this.icons.get(i)) * (this.toggled ? 1 : -1); + } }; scene.tweens.addCounter({ duration: Utils.fixedInt(200), @@ -36,21 +37,23 @@ export default class PokemonIconAnimHandler { getModeYDelta(mode: PokemonIconAnimMode): number { switch (mode) { - case PokemonIconAnimMode.NONE: - return 0; - case PokemonIconAnimMode.PASSIVE: - return -1; - case PokemonIconAnimMode.ACTIVE: - return -2; + case PokemonIconAnimMode.NONE: + return 0; + case PokemonIconAnimMode.PASSIVE: + return -1; + case PokemonIconAnimMode.ACTIVE: + return -2; } } addOrUpdate(icons: PokemonIcon | PokemonIcon[], mode: PokemonIconAnimMode): void { - if (!Array.isArray(icons)) + if (!Array.isArray(icons)) { icons = [ icons ]; - for (let i of icons) { - if (this.icons.has(i) && this.icons.get(i) === mode) + } + for (const i of icons) { + if (this.icons.has(i) && this.icons.get(i) === mode) { continue; + } if (this.toggled) { const lastYDelta = this.icons.has(i) ? this.icons.get(i) @@ -63,20 +66,23 @@ export default class PokemonIconAnimHandler { } remove(icons: PokemonIcon | PokemonIcon[]): void { - if (!Array.isArray(icons)) + if (!Array.isArray(icons)) { icons = [ icons ]; - for (let i of icons) { - if (this.toggled) + } + for (const i of icons) { + if (this.toggled) { i.y -= this.getModeYDelta(this.icons.get(i)); + } this.icons.delete(i); } } removeAll(): void { - for (let i of this.icons.keys()) { - if (this.toggled) + for (const i of this.icons.keys()) { + if (this.toggled) { i.y -= this.getModeYDelta(this.icons.get(i)); + } this.icons.delete(i); } } -} \ No newline at end of file +} diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 14d7ec35d1b7..a5d74fbd9aa2 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -55,7 +55,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { movesBg.setOrigin(1, 0); this.pokemonMovesContainer.add(movesBg); - const movesLabel = addTextObject(this.scene, -movesBg.width / 2, 6, 'Moveset', TextStyle.WINDOW, { fontSize: '64px' }); + const movesLabel = addTextObject(this.scene, -movesBg.width / 2, 6, "Moveset", TextStyle.WINDOW, { fontSize: "64px" }); movesLabel.setOrigin(0.5, 0); this.pokemonMovesContainer.add(movesLabel); @@ -63,10 +63,10 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const moveContainer = this.scene.add.container(-6, 18 + 7 * m); moveContainer.setScale(0.5); - const moveBg = this.scene.add.nineslice(0, 0, 'type_bgs', 'unknown', 92, 14, 2, 2, 2, 2); + const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); - const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, '-', TextStyle.PARTY); + const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, "-", TextStyle.PARTY); moveLabel.setOrigin(0.5, 0); this.pokemonMoveBgs.push(moveBg); @@ -86,39 +86,39 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.add(infoBg); this.add(this.statsContainer); - this.pokemonGenderLabelText = addTextObject(this.scene, -18, 18, 'Gender:', TextStyle.WINDOW, { fontSize: '64px' }); + this.pokemonGenderLabelText = addTextObject(this.scene, -18, 18, "Gender:", TextStyle.WINDOW, { fontSize: "64px" }); this.pokemonGenderLabelText.setOrigin(1, 0); this.pokemonGenderLabelText.setVisible(false); this.add(this.pokemonGenderLabelText); - this.pokemonGenderText = addTextObject(this.scene, -14, 18, '', TextStyle.WINDOW, { fontSize: '64px' }); + this.pokemonGenderText = addTextObject(this.scene, -14, 18, "", TextStyle.WINDOW, { fontSize: "64px" }); this.pokemonGenderText.setOrigin(0, 0); this.pokemonGenderText.setVisible(false); this.add(this.pokemonGenderText); - this.pokemonAbilityLabelText = addTextObject(this.scene, -18, 28, 'Ability:', TextStyle.WINDOW, { fontSize: '64px' }); + this.pokemonAbilityLabelText = addTextObject(this.scene, -18, 28, "Ability:", TextStyle.WINDOW, { fontSize: "64px" }); this.pokemonAbilityLabelText.setOrigin(1, 0); this.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(this.scene, -14, 28, '', TextStyle.WINDOW, { fontSize: '64px' }); + this.pokemonAbilityText = addTextObject(this.scene, -14, 28, "", TextStyle.WINDOW, { fontSize: "64px" }); this.pokemonAbilityText.setOrigin(0, 0); this.add(this.pokemonAbilityText); - this.pokemonNatureLabelText = addTextObject(this.scene, -18, 38, 'Nature:', TextStyle.WINDOW, { fontSize: '64px' }); + this.pokemonNatureLabelText = addTextObject(this.scene, -18, 38, "Nature:", TextStyle.WINDOW, { fontSize: "64px" }); this.pokemonNatureLabelText.setOrigin(1, 0); this.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(this.scene, -14, 38, '', TextStyle.WINDOW, { fontSize: '64px', lineSpacing: 3, maxLines: 2 }); + this.pokemonNatureText = addBBCodeTextObject(this.scene, -14, 38, "", TextStyle.WINDOW, { fontSize: "64px", lineSpacing: 3, maxLines: 2 }); this.pokemonNatureText.setOrigin(0, 0); this.add(this.pokemonNatureText); - this.pokemonShinyIcon = this.scene.add.image(-43.5, 48.5, 'shiny_star'); + this.pokemonShinyIcon = this.scene.add.image(-43.5, 48.5, "shiny_star"); this.pokemonShinyIcon.setOrigin(0, 0); this.pokemonShinyIcon.setScale(0.75); this.pokemonShinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.add(this.pokemonShinyIcon); - this.pokemonFusionShinyIcon = this.scene.add.image(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y, 'shiny_star_2'); + this.pokemonFusionShinyIcon = this.scene.add.image(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y, "shiny_star_2"); this.pokemonFusionShinyIcon.setOrigin(0, 0); this.pokemonFusionShinyIcon.setScale(0.75); this.add(this.pokemonFusionShinyIcon); @@ -134,8 +134,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonGenderText.setShadowColor(getGenderColor(pokemon.gender, true)); this.pokemonGenderLabelText.setVisible(true); this.pokemonGenderText.setVisible(true); - } else + } else { this.pokemonGenderText.setVisible(false); + } const abilityTextStyle = pokemon.abilityIndex === (pokemon.species.ability2 ? 2 : 1) ? TextStyle.MONEY : TextStyle.WINDOW; this.pokemonAbilityText.setText(pokemon.getAbility(true).name); @@ -148,33 +149,34 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const doubleShiny = isFusion && pokemon.shiny && pokemon.fusionShiny; const baseVariant = !doubleShiny ? pokemon.getVariant() : pokemon.variant; - this.pokemonShinyIcon.setTexture(`shiny_star${doubleShiny ? '_1' : ''}`); + this.pokemonShinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.pokemonShinyIcon.setVisible(pokemon.isShiny()); this.pokemonShinyIcon.setTint(getVariantTint(baseVariant)); if (this.pokemonShinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? 'Epic' : baseVariant === 1 ? 'Rare' : 'Common'}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? 'Epic' : pokemon.fusionVariant === 1 ? 'Rare' : 'Common'}` : ''}` - : ''; - this.pokemonShinyIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ''}`, true)); - this.pokemonShinyIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + `${baseVariant === 2 ? "Epic" : baseVariant === 1 ? "Rare" : "Common"}${doubleShiny ? `/${pokemon.fusionVariant === 2 ? "Epic" : pokemon.fusionVariant === 1 ? "Rare" : "Common"}` : ""}` + : ""; + this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.pokemonFusionShinyIcon.setPosition(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y); this.pokemonFusionShinyIcon.setVisible(doubleShiny); - if (isFusion) + if (isFusion) { this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant)); + } const starterSpeciesId = pokemon.species.getRootSpeciesId(true); const originalIvs: integer[] = this.scene.gameData.dexData[starterSpeciesId].caughtAttr - ? this.scene.gameData.dexData[starterSpeciesId].ivs - : null; + ? this.scene.gameData.dexData[starterSpeciesId].ivs + : null; this.statsContainer.updateIvs(pokemon.ivs, originalIvs); this.scene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", x: this.initialX - this.infoWindowWidth, onComplete: () => { resolve(); @@ -186,7 +188,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { delay: Utils.fixedInt(Math.floor(325 / speedMultiplier)), targets: this.pokemonMovesContainer, duration: Utils.fixedInt(Math.floor(325 / speedMultiplier)), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", x: this.movesContainerInitialX - 57, onComplete: () => resolve() }); @@ -195,7 +197,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { for (let m = 0; m < 4; m++) { const move = m < pokemon.moveset.length ? pokemon.moveset[m].getMove() : null; this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); - this.pokemonMoveLabels[m].setText(move ? move.name : '-'); + this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMovesContainers[m].setVisible(!!move); } @@ -209,7 +211,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.scene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(150 / speedMultiplier)), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", x: this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth, onComplete: () => { resolve(); @@ -220,25 +222,26 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { hide(speedMultiplier: number = 1): Promise { return new Promise(resolve => { - if (!this.shown) + if (!this.shown) { return resolve(); + } this.scene.tweens.add({ targets: this.pokemonMovesContainer, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", x: this.movesContainerInitialX }); this.scene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)), - ease: 'Cubic.easeInOut', + ease: "Cubic.easeInOut", x: this.initialX, onComplete: () => { this.setVisible(false); - this.pokemonShinyIcon.off('pointerover'); - this.pokemonShinyIcon.off('pointerout'); + this.pokemonShinyIcon.off("pointerover"); + this.pokemonShinyIcon.off("pointerout"); (this.scene as BattleScene).ui.hideTooltip(); resolve(); } @@ -246,9 +249,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.shown = false; }); - }; + } } export default interface PokemonInfoContainer { scene: BattleScene -} \ No newline at end of file +} diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index f5ff8c218b49..e4bb5c6395bf 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -3,15 +3,15 @@ import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; import { TextStyle, addTextObject } from "./text"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; export default class RegistrationFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { - return i18next.t('menu:register'); + return i18next.t("menu:register"); } getFields(config?: ModalConfig): string[] { - return [ i18next.t('menu:username'), i18next.t('menu:password'), i18next.t('menu:confirmPassword') ]; + return [ i18next.t("menu:username"), i18next.t("menu:password"), i18next.t("menu:confirmPassword") ]; } getWidth(config?: ModalConfig): number { @@ -27,20 +27,21 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { } getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t('menu:register'), i18next.t('menu:backToLogin') ]; + return [ i18next.t("menu:register"), i18next.t("menu:backToLogin") ]; } getReadableErrorMessage(error: string): string { - let colonIndex = error?.indexOf(':'); - if (colonIndex > 0) + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { error = error.slice(0, colonIndex); + } switch (error) { - case 'invalid username': - return i18next.t('menu:invalidRegisterUsername'); - case 'invalid password': - return i18next.t('menu:invalidRegisterPassword'); - case 'failed to add account record': - return i18next.t('menu:usernameAlreadyUsed'); + case "invalid username": + return i18next.t("menu:invalidRegisterUsername"); + case "invalid password": + return i18next.t("menu:invalidRegisterPassword"); + case "failed to add account record": + return i18next.t("menu:usernameAlreadyUsed"); } return super.getReadableErrorMessage(error); @@ -49,7 +50,7 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, 10, 87, i18next.t('menu:registrationAgeWarning'), TextStyle.TOOLTIP_CONTENT, { fontSize: '42px' }); + const label = addTextObject(this.scene, 10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { fontSize: "42px" }); this.modalContainer.add(label); } @@ -68,31 +69,37 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { this.scene.ui.setMode(Mode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); this.scene.ui.playError(); }; - if (!this.inputs[0].text) - return onFail(i18next.t('menu:emptyUsername')); - if (!this.inputs[1].text) - return onFail(this.getReadableErrorMessage('invalid password')); - if (this.inputs[1].text !== this.inputs[2].text) - return onFail(i18next.t('menu:passwordNotMatchingConfirmPassword')); - Utils.apiPost(`account/register`, `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, 'application/x-www-form-urlencoded') + if (!this.inputs[0].text) { + return onFail(i18next.t("menu:emptyUsername")); + } + if (!this.inputs[1].text) { + return onFail(this.getReadableErrorMessage("invalid password")); + } + if (this.inputs[1].text !== this.inputs[2].text) { + return onFail(i18next.t("menu:passwordNotMatchingConfirmPassword")); + } + Utils.apiPost("account/register", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") .then(response => response.text()) .then(response => { if (!response) { - Utils.apiPost(`account/login`, `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, 'application/x-www-form-urlencoded') + Utils.apiPost("account/login", `username=${encodeURIComponent(this.inputs[0].text)}&password=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded") .then(response => { - if (!response.ok) + if (!response.ok) { return response.text(); + } return response.json(); }) .then(response => { - if (response.hasOwnProperty('token')) { + if (response.hasOwnProperty("token")) { Utils.setCookie(Utils.sessionIdKey, response.token); originalRegistrationAction(); - } else + } else { onFail(response); + } }); - } else + } else { onFail(response); + } }); }; @@ -101,4 +108,4 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { return false; } -} \ No newline at end of file +} diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index a30e21c8f57c..063ea6e1c848 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -65,7 +65,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { this.saveSlotSelectMessageBox.setOrigin(0, 1); this.saveSlotSelectMessageBoxContainer.add(this.saveSlotSelectMessageBox); - this.message = addTextObject(this.scene, 8, 8, '', TextStyle.WINDOW, { maxLines: 2 }); + this.message = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); this.message.setOrigin(0, 0); this.saveSlotSelectMessageBoxContainer.add(this.message); @@ -73,12 +73,13 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if ((args.length < 2 || !(args[1] instanceof Function))) + if ((args.length < 2 || !(args[1] instanceof Function))) { return false; + } super.show(args); - this.uiMode = args[0] as SaveSlotUiMode;; + this.uiMode = args[0] as SaveSlotUiMode; this.saveSlotSelectCallback = args[1] as SaveSlotSelectCallback; this.saveSlotSelectContainer.setVisible(true); @@ -99,35 +100,36 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { const originalCallback = this.saveSlotSelectCallback; if (button === Button.ACTION) { const cursor = this.cursor + this.scrollCursor; - if (this.uiMode === SaveSlotUiMode.LOAD && !this.sessionSlots[cursor].hasData) + if (this.uiMode === SaveSlotUiMode.LOAD && !this.sessionSlots[cursor].hasData) { error = true; - else { + } else { switch (this.uiMode) { - case SaveSlotUiMode.LOAD: + case SaveSlotUiMode.LOAD: + this.saveSlotSelectCallback = null; + originalCallback(cursor); + break; + case SaveSlotUiMode.SAVE: + const saveAndCallback = () => { + const originalCallback = this.saveSlotSelectCallback; this.saveSlotSelectCallback = null; + ui.revertMode(); + ui.showText(null, 0); + ui.setMode(Mode.MESSAGE); originalCallback(cursor); - break; - case SaveSlotUiMode.SAVE: - const saveAndCallback = () => { - const originalCallback = this.saveSlotSelectCallback; - this.saveSlotSelectCallback = null; - ui.revertMode(); - ui.showText(null, 0); - ui.setMode(Mode.MESSAGE); - originalCallback(cursor); - }; - if (this.sessionSlots[cursor].hasData) { - ui.showText('Overwrite the data in the selected slot?', null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { - ui.revertMode(); - ui.showText(null, 0); - }, false, 0, 19, 2000); - }); - } else if (this.sessionSlots[cursor].hasData === false) - saveAndCallback(); - else - return false; - break; + }; + if (this.sessionSlots[cursor].hasData) { + ui.showText("Overwrite the data in the selected slot?", null, () => { + ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { + ui.revertMode(); + ui.showText(null, 0); + }, false, 0, 19, 2000); + }); + } else if (this.sessionSlots[cursor].hasData === false) { + saveAndCallback(); + } else { + return false; + } + break; } success = true; } @@ -138,25 +140,28 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } } else { switch (button) { - case Button.UP: - if (this.cursor) - success = this.setCursor(this.cursor - 1); - else if (this.scrollCursor) - success = this.setScrollCursor(this.scrollCursor - 1); - break; - case Button.DOWN: - if (this.cursor < 2) - success = this.setCursor(this.cursor + 1); - else if (this.scrollCursor < sessionSlotCount - 3) - success = this.setScrollCursor(this.scrollCursor + 1); - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < 2) { + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < sessionSlotCount - 3) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } @@ -174,7 +179,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); - if (text?.indexOf('\n') === -1) { + if (text?.indexOf("\n") === -1) { this.saveSlotSelectMessageBox.setSize(318, 28); this.message.setY(-22); } else { @@ -186,10 +191,10 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } setCursor(cursor: integer): boolean { - let changed = super.setCursor(cursor); + const changed = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, 'select_cursor_highlight_thick', null, 296, 44, 6, 6, 6, 6); + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", null, 296, 44, 6, 6, 6, 6); this.cursorObj.setOrigin(0, 0); this.sessionSlotsContainer.add(this.cursorObj); } @@ -199,7 +204,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } setScrollCursor(scrollCursor: integer): boolean { - let changed = scrollCursor !== this.scrollCursor; + const changed = scrollCursor !== this.scrollCursor; if (changed) { this.scrollCursor = scrollCursor; @@ -208,7 +213,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { targets: this.sessionSlotsContainer, y: this.sessionSlotsContainerInitialY - 56 * scrollCursor, duration: Utils.fixedInt(325), - ease: 'Sine.easeInOut' + ease: "Sine.easeInOut" }); } @@ -224,8 +229,9 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } @@ -252,7 +258,7 @@ class SessionSlot extends Phaser.GameObjects.Container { const slotWindow = addWindow(this.scene, 0, 0, 304, 52); this.add(slotWindow); - this.loadingLabel = addTextObject(this.scene, 152, 26, 'Loading…', TextStyle.WINDOW); + this.loadingLabel = addTextObject(this.scene, 152, 26, "Loading…", TextStyle.WINDOW); this.loadingLabel.setOrigin(0.5, 0.5); this.add(this.loadingLabel); } @@ -260,7 +266,7 @@ class SessionSlot extends Phaser.GameObjects.Container { async setupWithData(data: SessionSaveData) { this.remove(this.loadingLabel, true); - const gameModeLabel = addTextObject(this.scene, 8, 5, `${gameModes[data.gameMode]?.getName() || 'Unknown'} - Wave ${data.waveIndex}`, TextStyle.WINDOW); + const gameModeLabel = addTextObject(this.scene, 8, 5, `${gameModes[data.gameMode]?.getName() || "Unknown"} - Wave ${data.waveIndex}`, TextStyle.WINDOW); this.add(gameModeLabel); const timestampLabel = addTextObject(this.scene, 8, 19, new Date(data.timestamp).toLocaleString(), TextStyle.WINDOW); @@ -277,9 +283,9 @@ class SessionSlot extends Phaser.GameObjects.Container { const pokemon = p.toPokemon(this.scene); const icon = this.scene.addPokemonIcon(pokemon, 0, 0, 0, 0); - const text = addTextObject(this.scene, 32, 20, `Lv${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: '54px', color: '#f8f8f8' }); + const text = addTextObject(this.scene, 32, 20, `Lv${Utils.formatLargeNumber(pokemon.level, 1000)}`, TextStyle.PARTY, { fontSize: "54px", color: "#f8f8f8" }); text.setShadow(0, 0, null); - text.setStroke('#424242', 14); + text.setStroke("#424242", 14); text.setOrigin(1, 0); iconContainer.add(icon); @@ -292,20 +298,22 @@ class SessionSlot extends Phaser.GameObjects.Container { this.add(pokemonIconsContainer); - const modifiersModule = await import('../modifier/modifier'); + const modifiersModule = await import("../modifier/modifier"); const modifierIconsContainer = this.scene.add.container(148, 30); modifierIconsContainer.setScale(0.5); let visibleModifierIndex = 0; - for (let m of data.modifiers) { + for (const m of data.modifiers) { const modifier = m.toModifier(this.scene, modifiersModule[m.className]); - if (modifier instanceof PokemonHeldItemModifier) + if (modifier instanceof PokemonHeldItemModifier) { continue; + } const icon = modifier.getIcon(this.scene, false); icon.setPosition(24 * visibleModifierIndex, 0); modifierIconsContainer.add(icon); - if (++visibleModifierIndex === 12) + if (++visibleModifierIndex === 12) { break; + } } this.add(modifierIconsContainer); @@ -330,4 +338,4 @@ class SessionSlot extends Phaser.GameObjects.Container { interface SessionSlot { scene: BattleScene; -} \ No newline at end of file +} diff --git a/src/ui/saving-icon-handler.ts b/src/ui/saving-icon-handler.ts index 71d9a11fb474..a7c09ba490cc 100644 --- a/src/ui/saving-icon-handler.ts +++ b/src/ui/saving-icon-handler.ts @@ -12,7 +12,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { } setup(): void { - this.icon = this.scene.add.sprite(0, 0, 'saving_icon'); + this.icon = this.scene.add.sprite(0, 0, "saving_icon"); this.icon.setOrigin(1, 1); this.add(this.icon); @@ -27,8 +27,9 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { show(): void { this.shown = true; - if (this.animActive) + if (this.animActive) { return; + } this.animActive = true; @@ -36,12 +37,13 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { targets: this, alpha: 1, duration: Utils.fixedInt(250), - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", onComplete: () => { this.scene.time.delayedCall(Utils.fixedInt(500), () => { this.animActive = false; - if (!this.shown) + if (!this.shown) { this.hide(); + } }); } }); @@ -53,8 +55,9 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { hide(): void { this.shown = false; - if (this.animActive) + if (this.animActive) { return; + } this.animActive = true; @@ -62,15 +65,16 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { targets: this, alpha: 0, duration: Utils.fixedInt(250), - ease: 'Sine.easeInOut', + ease: "Sine.easeInOut", onComplete: () => { this.animActive = false; this.setVisible(false); - if (this.shown) + if (this.shown) { this.show(); + } } }); this.shown = false; } -} \ No newline at end of file +} diff --git a/src/ui/session-reload-modal-ui-handler.ts b/src/ui/session-reload-modal-ui-handler.ts index fdcd9b2c206a..5313de585801 100644 --- a/src/ui/session-reload-modal-ui-handler.ts +++ b/src/ui/session-reload-modal-ui-handler.ts @@ -9,7 +9,7 @@ export default class SessionReloadModalUiHandler extends ModalUiHandler { } getModalTitle(): string { - return ''; + return ""; } getWidth(): number { @@ -31,7 +31,7 @@ export default class SessionReloadModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, 'Your session is out of date.\nYour data will be reloaded…', TextStyle.WINDOW, { fontSize: '48px', align: 'center' }); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Your session is out of date.\nYour data will be reloaded…", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -44,4 +44,4 @@ export default class SessionReloadModalUiHandler extends ModalUiHandler { return super.show([ config ]); } -} \ No newline at end of file +} diff --git a/src/ui/settings-ui-handler.ts b/src/ui/settings-ui-handler.ts index 6e40103b8701..bec98197dcf1 100644 --- a/src/ui/settings-ui-handler.ts +++ b/src/ui/settings-ui-handler.ts @@ -42,7 +42,7 @@ export default class SettingsUiHandler extends UiHandler { const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6) - 2, 24); headerBg.setOrigin(0, 0); - const headerText = addTextObject(this.scene, 0, 0, 'Options', TextStyle.SETTINGS_LABEL); + const headerText = addTextObject(this.scene, 0, 0, "Options", TextStyle.SETTINGS_LABEL); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); @@ -55,9 +55,10 @@ export default class SettingsUiHandler extends UiHandler { this.optionValueLabels = []; Object.keys(Setting).forEach((setting, s) => { - let settingName = setting.replace(/\_/g, ' '); - if (reloadSettings.includes(Setting[setting])) - settingName += ' (Requires Reload)'; + let settingName = setting.replace(/\_/g, " "); + if (reloadSettings.includes(Setting[setting])) { + settingName += " (Requires Reload)"; + } this.settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); this.settingLabels[s].setOrigin(0, 0); @@ -82,7 +83,7 @@ export default class SettingsUiHandler extends UiHandler { let xOffset = 0; - for (let value of this.optionValueLabels[s]) { + for (const value of this.optionValueLabels[s]) { value.setPositionRelative(this.settingLabels[s], labelWidth + xOffset, 0); xOffset += value.width / 6 + optionSpacing; } @@ -106,7 +107,7 @@ export default class SettingsUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); - const settings: object = localStorage.hasOwnProperty('settings') ? JSON.parse(localStorage.getItem('settings')) : {}; + const settings: object = localStorage.hasOwnProperty("settings") ? JSON.parse(localStorage.getItem("settings")) : {}; Object.keys(settingDefaults).forEach((setting, s) => this.setOptionCursor(s, settings.hasOwnProperty(setting) ? settings[setting] : settingDefaults[setting])); @@ -143,51 +144,56 @@ export default class SettingsUiHandler extends UiHandler { } else { const cursor = this.cursor + this.scrollCursor; switch (button) { - case Button.UP: - if (cursor) { - if (this.cursor) - success = this.setCursor(this.cursor - 1); - else - success = this.setScrollCursor(this.scrollCursor - 1); + case Button.UP: + if (cursor) { + if (this.cursor) { + success = this.setCursor(this.cursor - 1); } else { - // When at the top of the menu and pressing UP, move to the bottommost item. - // First, set the cursor to the last visible element, preparing for the scroll to the end. - const successA = this.setCursor(rowsToDisplay - 1); - // Then, adjust the scroll to display the bottommost elements of the menu. - const successB = this.setScrollCursor(this.optionValueLabels.length - rowsToDisplay); - success = successA && successB; // success is just there to play the little validation sound effect + success = this.setScrollCursor(this.scrollCursor - 1); } - break; - case Button.DOWN: - if (cursor < this.optionValueLabels.length - 1) { - if (this.cursor < rowsToDisplay - 1) // if the visual cursor is in the frame of 0 to 8 - success = this.setCursor(this.cursor + 1); - else if (this.scrollCursor < this.optionValueLabels.length - rowsToDisplay) - success = this.setScrollCursor(this.scrollCursor + 1); - } else { - // When at the bottom of the menu and pressing DOWN, move to the topmost item. - // First, set the cursor to the first visible element, resetting the scroll to the top. - const successA = this.setCursor(0); - // Then, reset the scroll to start from the first element of the menu. - const successB = this.setScrollCursor(0); - success = successA && successB; // Indicates a successful cursor and scroll adjustment. + } else { + // When at the top of the menu and pressing UP, move to the bottommost item. + // First, set the cursor to the last visible element, preparing for the scroll to the end. + const successA = this.setCursor(rowsToDisplay - 1); + // Then, adjust the scroll to display the bottommost elements of the menu. + const successB = this.setScrollCursor(this.optionValueLabels.length - rowsToDisplay); + success = successA && successB; // success is just there to play the little validation sound effect + } + break; + case Button.DOWN: + if (cursor < this.optionValueLabels.length - 1) { + if (this.cursor < rowsToDisplay - 1) { // if the visual cursor is in the frame of 0 to 8 + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < this.optionValueLabels.length - rowsToDisplay) { + success = this.setScrollCursor(this.scrollCursor + 1); } - break; - case Button.LEFT: - if (this.optionCursors[cursor]) // Moves the option cursor left, if possible. - success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); - break; - case Button.RIGHT: - // Moves the option cursor right, if possible. - if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) - success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); - break; + } else { + // When at the bottom of the menu and pressing DOWN, move to the topmost item. + // First, set the cursor to the first visible element, resetting the scroll to the top. + const successA = this.setCursor(0); + // Then, reset the scroll to start from the first element of the menu. + const successB = this.setScrollCursor(0); + success = successA && successB; // Indicates a successful cursor and scroll adjustment. + } + break; + case Button.LEFT: + if (this.optionCursors[cursor]) { // Moves the option cursor left, if possible. + success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); + } + break; + case Button.RIGHT: + // Moves the option cursor right, if possible. + if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { + success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); + } + break; } } // Plays a select sound effect if an action was successfully processed. - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -196,7 +202,7 @@ export default class SettingsUiHandler extends UiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, 'summary_moves_cursor', null, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 6) - 10, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.optionsContainer.add(this.cursorObj); } @@ -227,11 +233,12 @@ export default class SettingsUiHandler extends UiHandler { newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); if (save) { - this.scene.gameData.saveSetting(setting, cursor) + this.scene.gameData.saveSetting(setting, cursor); if (reloadSettings.includes(setting)) { this.reloadRequired = true; - if (setting === Setting.Language) + if (setting === Setting.Language) { this.reloadI18n = true; + } } } @@ -239,8 +246,9 @@ export default class SettingsUiHandler extends UiHandler { } setScrollCursor(scrollCursor: integer): boolean { - if (scrollCursor === this.scrollCursor) + if (scrollCursor === this.scrollCursor) { return false; + } this.scrollCursor = scrollCursor; @@ -257,8 +265,9 @@ export default class SettingsUiHandler extends UiHandler { for (let s = 0; s < this.settingLabels.length; s++) { const visible = s >= this.scrollCursor && s < this.scrollCursor + 9; this.settingLabels[s].setVisible(visible); - for (let option of this.optionValueLabels[s]) + for (const option of this.optionValueLabels[s]) { option.setVisible(visible); + } } } @@ -273,8 +282,9 @@ export default class SettingsUiHandler extends UiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } -} \ No newline at end of file +} diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 4a0407926433..7fd8cce55e59 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -51,36 +51,36 @@ interface LanguageSetting { const languageSettings: { [key: string]: LanguageSetting } = { "en":{ - starterInfoTextSize: '56px', - instructionTextSize: '42px', + starterInfoTextSize: "56px", + instructionTextSize: "42px", }, "de":{ - starterInfoTextSize: '56px', - instructionTextSize: '35px', + starterInfoTextSize: "56px", + instructionTextSize: "35px", }, "es":{ - starterInfoTextSize: '56px', - instructionTextSize: '35px', + starterInfoTextSize: "56px", + instructionTextSize: "35px", }, "it":{ - starterInfoTextSize: '56px', - instructionTextSize: '38px', + starterInfoTextSize: "56px", + instructionTextSize: "38px", }, "fr":{ - starterInfoTextSize: '54px', - instructionTextSize: '42px', + starterInfoTextSize: "54px", + instructionTextSize: "42px", }, "zh":{ - starterInfoTextSize: '40px', - instructionTextSize: '42px', + starterInfoTextSize: "40px", + instructionTextSize: "42px", starterInfoYOffset: 2 }, "pt":{ - starterInfoTextSize: '47px', - instructionTextSize: '38px', + starterInfoTextSize: "47px", + instructionTextSize: "38px", starterInfoXPos: 32, }, -} +}; const starterCandyCosts: { passive: integer, costReduction: [integer, integer] }[] = [ { passive: 50, costReduction: [30, 75] }, // 1 @@ -93,7 +93,7 @@ const starterCandyCosts: { passive: integer, costReduction: [integer, integer] } { passive: 10, costReduction: [5, 15] }, // 8 { passive: 10, costReduction: [3, 10] }, // 9 { passive: 10, costReduction: [3, 10] }, // 10 -] +]; function getPassiveCandyCount(baseValue: integer): integer { return starterCandyCosts[baseValue - 1].passive; @@ -104,15 +104,15 @@ function getValueReductionCandyCounts(baseValue: integer): [integer, integer] { } const gens = [ - i18next.t("starterSelectUiHandler:gen1"), - i18next.t("starterSelectUiHandler:gen2"), - i18next.t("starterSelectUiHandler:gen3"), - i18next.t("starterSelectUiHandler:gen4"), - i18next.t("starterSelectUiHandler:gen5"), - i18next.t("starterSelectUiHandler:gen6"), - i18next.t("starterSelectUiHandler:gen7"), - i18next.t("starterSelectUiHandler:gen8"), - i18next.t("starterSelectUiHandler:gen9") + i18next.t("starterSelectUiHandler:gen1"), + i18next.t("starterSelectUiHandler:gen2"), + i18next.t("starterSelectUiHandler:gen3"), + i18next.t("starterSelectUiHandler:gen4"), + i18next.t("starterSelectUiHandler:gen5"), + i18next.t("starterSelectUiHandler:gen6"), + i18next.t("starterSelectUiHandler:gen7"), + i18next.t("starterSelectUiHandler:gen8"), + i18next.t("starterSelectUiHandler:gen9") ]; export default class StarterSelectUiHandler extends MessageUiHandler { @@ -228,11 +228,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { bgColor.setOrigin(0, 0); this.starterSelectContainer.add(bgColor); - const starterSelectBg = this.scene.add.image(0, 0, 'starter_select_bg'); + const starterSelectBg = this.scene.add.image(0, 0, "starter_select_bg"); starterSelectBg.setOrigin(0, 0); this.starterSelectContainer.add(starterSelectBg); - this.shinyOverlay = this.scene.add.image(6, 6, 'summary_overlay_shiny'); + this.shinyOverlay = this.scene.add.image(6, 6, "summary_overlay_shiny"); this.shinyOverlay.setOrigin(0, 0); this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); @@ -244,51 +244,52 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(addWindow(this.scene, 107, 145, 34, 34, true)); this.starterSelectContainer.add(starterContainerWindow); - if (!this.scene.uiTheme) + if (!this.scene.uiTheme) { starterContainerWindow.setVisible(false); + } this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(this.scene); - this.pokemonNumberText = addTextObject(this.scene, 17, 1, '0000', TextStyle.SUMMARY); + this.pokemonNumberText = addTextObject(this.scene, 17, 1, "0000", TextStyle.SUMMARY); this.pokemonNumberText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNumberText); - this.pokemonNameText = addTextObject(this.scene, 6, 112, '', TextStyle.SUMMARY); + this.pokemonNameText = addTextObject(this.scene, 6, 112, "", TextStyle.SUMMARY); this.pokemonNameText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNameText); - this.pokemonGrowthRateLabelText = addTextObject(this.scene, 8, 106, i18next.t("starterSelectUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: '36px' }); + this.pokemonGrowthRateLabelText = addTextObject(this.scene, 8, 106, i18next.t("starterSelectUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }); this.pokemonGrowthRateLabelText.setOrigin(0, 0); this.pokemonGrowthRateLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); - this.pokemonGrowthRateText = addTextObject(this.scene, 34, 106, '', TextStyle.SUMMARY_PINK, { fontSize: '36px' }); + this.pokemonGrowthRateText = addTextObject(this.scene, 34, 106, "", TextStyle.SUMMARY_PINK, { fontSize: "36px" }); this.pokemonGrowthRateText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGrowthRateText); - this.pokemonGenderText = addTextObject(this.scene, 96, 112, '', TextStyle.SUMMARY_ALT); + this.pokemonGenderText = addTextObject(this.scene, 96, 112, "", TextStyle.SUMMARY_ALT); this.pokemonGenderText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGenderText); - this.pokemonUncaughtText = addTextObject(this.scene, 6, 127, i18next.t("starterSelectUiHandler:uncaught"), TextStyle.SUMMARY_ALT, { fontSize: '56px' }); + this.pokemonUncaughtText = addTextObject(this.scene, 6, 127, i18next.t("starterSelectUiHandler:uncaught"), TextStyle.SUMMARY_ALT, { fontSize: "56px" }); this.pokemonUncaughtText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonUncaughtText); // The position should be set per language - let starterInfoXPos = textSettings?.starterInfoXPos || 31; - let starterInfoYOffset = textSettings?.starterInfoYOffset || 0; + const starterInfoXPos = textSettings?.starterInfoXPos || 31; + const starterInfoYOffset = textSettings?.starterInfoYOffset || 0; // The font size should be set per language - let starterInfoTextSize = textSettings?.starterInfoTextSize || 56; + const starterInfoTextSize = textSettings?.starterInfoTextSize || 56; this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonAbilityLabelText.setOrigin(0, 0); this.pokemonAbilityLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonAbilityLabelText); - this.pokemonAbilityText = addTextObject(this.scene, starterInfoXPos, 127 + starterInfoYOffset, '', TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonAbilityText = addTextObject(this.scene, starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonAbilityText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonAbilityText); @@ -297,7 +298,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonPassiveLabelText); - this.pokemonPassiveText = addTextObject(this.scene, starterInfoXPos, 136 + starterInfoYOffset, '', TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonPassiveText = addTextObject(this.scene, starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonPassiveText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonPassiveText); @@ -306,7 +307,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonNatureLabelText.setVisible(false); this.starterSelectContainer.add(this.pokemonNatureLabelText); - this.pokemonNatureText = addBBCodeTextObject(this.scene, starterInfoXPos, 145 + starterInfoYOffset, '', TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); + this.pokemonNatureText = addBBCodeTextObject(this.scene, starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonNatureText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonNatureText); @@ -318,7 +319,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.genOptionsText = addTextObject(this.scene, 124, 7, '', TextStyle.WINDOW, { fontSize: 72, lineSpacing: 39, align: 'center' }); + this.genOptionsText = addTextObject(this.scene, 124, 7, "", TextStyle.WINDOW, { fontSize: 72, lineSpacing: 39, align: "center" }); this.genOptionsText.setShadowOffset(4.5, 4.5); this.genOptionsText.setOrigin(0.5, 0); this.starterSelectContainer.add(this.genOptionsText); @@ -327,14 +328,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectGenIconContainers = new Array(gens.length).fill(null).map((_, i) => { const container = this.scene.add.container(151, 9); - if (i) + if (i) { container.setVisible(false); + } this.starterSelectContainer.add(container); return container; }); this.pokerusCursorObjs = new Array(3).fill(null).map(() => { - const cursorObj = this.scene.add.image(0, 0, 'select_cursor_pokerus'); + const cursorObj = this.scene.add.image(0, 0, "select_cursor_pokerus"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); this.starterSelectContainer.add(cursorObj); @@ -342,27 +344,27 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); this.starterCursorObjs = new Array(6).fill(null).map(() => { - const cursorObj = this.scene.add.image(0, 0, 'select_cursor_highlight'); + const cursorObj = this.scene.add.image(0, 0, "select_cursor_highlight"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); this.starterSelectContainer.add(cursorObj); return cursorObj; }); - this.cursorObj = this.scene.add.image(0, 0, 'select_cursor'); + this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.cursorObj); - this.genCursorHighlightObj = this.scene.add.image(111, 5, 'select_gen_cursor_highlight'); + this.genCursorHighlightObj = this.scene.add.image(111, 5, "select_gen_cursor_highlight"); this.genCursorHighlightObj.setOrigin(0, 0); this.starterSelectContainer.add(this.genCursorHighlightObj); - this.genCursorObj = this.scene.add.image(111, 5, 'select_gen_cursor'); + this.genCursorObj = this.scene.add.image(111, 5, "select_gen_cursor"); this.genCursorObj.setVisible(false); this.genCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.genCursorObj); - this.valueLimitLabel = addTextObject(this.scene, 124, 150, '0/10', TextStyle.TOOLTIP_CONTENT); + this.valueLimitLabel = addTextObject(this.scene, 124, 150, "0/10", TextStyle.TOOLTIP_CONTENT); this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); @@ -370,7 +372,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { startLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(startLabel); - this.startCursorObj = this.scene.add.nineslice(111, 160, 'select_cursor', null, 26, 15, 6, 6, 6, 6); + this.startCursorObj = this.scene.add.nineslice(111, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); this.startCursorObj.setVisible(false); this.startCursorObj.setOrigin(0, 0); this.starterSelectContainer.add(this.startCursorObj); @@ -381,9 +383,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let s = 0; this.genSpecies.push([]); - for (let species of allSpecies) { - if (!speciesStarters.hasOwnProperty(species.speciesId) || species.generation !== g + 1 || !species.isObtainable()) + for (const species of allSpecies) { + if (!speciesStarters.hasOwnProperty(species.speciesId) || species.generation !== g + 1 || !species.isObtainable()) { continue; + } starterSpecies.push(species.speciesId); this.speciesLoaded.set(species.speciesId, false); this.genSpecies[g].push(species); @@ -404,10 +407,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } this.starterIcons = new Array(6).fill(null).map((_, i) => { - const icon = this.scene.add.sprite(113, 63 + 13 * i, 'pokemon_icons_0'); + const icon = this.scene.add.sprite(113, 63 + 13 * i, "pokemon_icons_0"); icon.setScale(0.5); icon.setOrigin(0, 0); - icon.setFrame('unknown'); + icon.setFrame("unknown"); this.starterSelectContainer.add(icon); this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); return icon; @@ -416,7 +419,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterValueLabels = new Array(81).fill(null).map((_, i) => { const x = (i % 9) * 18; const y = Math.floor(i / 9) * 18; - const ret = addTextObject(this.scene, x + 152, y + 11, '0', TextStyle.WINDOW, { fontSize: '32px' }); + const ret = addTextObject(this.scene, x + 152, y + 11, "0", TextStyle.WINDOW, { fontSize: "32px" }); ret.setShadowOffset(2, 2); ret.setOrigin(0, 0); ret.setVisible(false); @@ -427,13 +430,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const getShinyStar = (i: integer, v: integer): Phaser.GameObjects.Image => { const x = (i % 9) * 18 - v * 3; const y = Math.floor(i / 9) * 18; - const ret = this.scene.add.image(x + 163, y + 11, 'shiny_star_small'); + const ret = this.scene.add.image(x + 163, y + 11, "shiny_star_small"); ret.setOrigin(0, 0); ret.setScale(0.5); ret.setVisible(false); this.starterSelectContainer.add(ret); return ret; - } + }; this.shinyIcons = new Array(81).fill(null).map((_, i) => { return new Array(3).fill(null).map((_, v) => getShinyStar(i, v)); @@ -442,7 +445,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.hiddenAbilityIcons = new Array(81).fill(null).map((_, i) => { const x = (i % 9) * 18; const y = Math.floor(i / 9) * 18; - const ret = this.scene.add.image(x + 163, y + 16, 'ha_capsule'); + const ret = this.scene.add.image(x + 163, y + 16, "ha_capsule"); ret.setOrigin(0, 0); ret.setScale(0.5); ret.setVisible(false); @@ -453,7 +456,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.classicWinIcons = new Array(81).fill(null).map((_, i) => { const x = (i % 9) * 18; const y = Math.floor(i / 9) * 18; - const ret = this.scene.add.image(x + 153, y + 21, 'champion_ribbon'); + const ret = this.scene.add.image(x + 153, y + 21, "champion_ribbon"); ret.setOrigin(0, 0); ret.setScale(0.5); ret.setVisible(false); @@ -461,43 +464,43 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return ret; }); - this.pokemonSprite = this.scene.add.sprite(53, 63, `pkmn__sub`); + this.pokemonSprite = this.scene.add.sprite(53, 63, "pkmn__sub"); this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); this.starterSelectContainer.add(this.pokemonSprite); - this.type1Icon = this.scene.add.sprite(8, 98, 'types'); + this.type1Icon = this.scene.add.sprite(8, 98, "types"); this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, 'types'); + this.type2Icon = this.scene.add.sprite(26, 98, "types"); this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.pokemonLuckLabelText = addTextObject(this.scene, 8, 89, 'Luck:', TextStyle.WINDOW_ALT, { fontSize: '56px' }); + this.pokemonLuckLabelText = addTextObject(this.scene, 8, 89, "Luck:", TextStyle.WINDOW_ALT, { fontSize: "56px" }); this.pokemonLuckLabelText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckLabelText); - this.pokemonLuckText = addTextObject(this.scene, 8 + this.pokemonLuckLabelText.displayWidth + 2, 89, '0', TextStyle.WINDOW, { fontSize: '56px' }); + this.pokemonLuckText = addTextObject(this.scene, 8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { fontSize: "56px" }); this.pokemonLuckText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonLuckText); - this.pokemonCandyIcon = this.scene.add.sprite(4.5, 18, 'candy'); + this.pokemonCandyIcon = this.scene.add.sprite(4.5, 18, "candy"); this.pokemonCandyIcon.setScale(0.5); this.pokemonCandyIcon.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonCandyIcon); - this.pokemonFormText = addTextObject(this.scene, 6, 42, 'Form', TextStyle.WINDOW_ALT, { fontSize: '42px' }); + this.pokemonFormText = addTextObject(this.scene, 6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px" }); this.pokemonFormText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonFormText); - this.pokemonCandyOverlayIcon = this.scene.add.sprite(4.5, 18, 'candy_overlay'); + this.pokemonCandyOverlayIcon = this.scene.add.sprite(4.5, 18, "candy_overlay"); this.pokemonCandyOverlayIcon.setScale(0.5); this.pokemonCandyOverlayIcon.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonCandyOverlayIcon); - this.pokemonCandyDarknessOverlay = this.scene.add.sprite(4.5, 18, 'candy'); + this.pokemonCandyDarknessOverlay = this.scene.add.sprite(4.5, 18, "candy"); this.pokemonCandyDarknessOverlay.setScale(0.5); this.pokemonCandyDarknessOverlay.setOrigin(0, 0); this.pokemonCandyDarknessOverlay.setTint(0x000000); @@ -505,7 +508,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyDarknessOverlay.setInteractive(new Phaser.Geom.Rectangle(0, 0, 16, 16), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonCandyDarknessOverlay); - this.pokemonCandyCountText = addTextObject(this.scene, 14, 18, 'x0', TextStyle.WINDOW_ALT, { fontSize: '56px' }); + this.pokemonCandyCountText = addTextObject(this.scene, 14, 18, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); this.pokemonCandyCountText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonCandyCountText); @@ -513,21 +516,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCaughtHatchedContainer.setScale(0.5); this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer); - const pokemonCaughtIcon = this.scene.add.sprite(1, 0, 'items', 'pb'); + const pokemonCaughtIcon = this.scene.add.sprite(1, 0, "items", "pb"); pokemonCaughtIcon.setOrigin(0, 0); pokemonCaughtIcon.setScale(0.75); this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon); - this.pokemonCaughtCountText = addTextObject(this.scene, 24, 4, '0', TextStyle.SUMMARY_ALT); + this.pokemonCaughtCountText = addTextObject(this.scene, 24, 4, "0", TextStyle.SUMMARY_ALT); this.pokemonCaughtCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText); - const pokemonHatchedIcon = this.scene.add.sprite(1, 14, 'items', 'mystery_egg'); + const pokemonHatchedIcon = this.scene.add.sprite(1, 14, "items", "mystery_egg"); pokemonHatchedIcon.setOrigin(0, 0); pokemonHatchedIcon.setScale(0.75); this.pokemonCaughtHatchedContainer.add(pokemonHatchedIcon); - this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, '0', TextStyle.SUMMARY_ALT); + this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); @@ -537,10 +540,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(0, 14 * m); - const moveBg = this.scene.add.nineslice(0, 0, 'type_bgs', 'unknown', 92, 14, 2, 2, 2, 2); + const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); - const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, '-', TextStyle.PARTY); + const moveLabel = addTextObject(this.scene, -moveBg.width / 2, 0, "-", TextStyle.PARTY); moveLabel.setOrigin(0.5, 0); this.pokemonMoveBgs.push(moveBg); @@ -553,7 +556,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonMovesContainer.add(moveContainer); } - this.pokemonAdditionalMoveCountLabel = addTextObject(this.scene, -this.pokemonMoveBgs[0].width / 2, 56, '(+0)', TextStyle.PARTY); + this.pokemonAdditionalMoveCountLabel = addTextObject(this.scene, -this.pokemonMoveBgs[0].width / 2, 56, "(+0)", TextStyle.PARTY); this.pokemonAdditionalMoveCountLabel.setOrigin(0.5, 0); this.pokemonMovesContainer.add(this.pokemonAdditionalMoveCountLabel); @@ -571,10 +574,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let m = 0; m < 4; m++) { const eggMoveContainer = this.scene.add.container(0, 16 + 14 * m); - const eggMoveBg = this.scene.add.nineslice(0, 0, 'type_bgs', 'unknown', 92, 14, 2, 2, 2, 2); + const eggMoveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); eggMoveBg.setOrigin(1, 0); - const eggMoveLabel = addTextObject(this.scene, -eggMoveBg.width / 2, 0, '???', TextStyle.PARTY); + const eggMoveLabel = addTextObject(this.scene, -eggMoveBg.width / 2, 0, "???", TextStyle.PARTY); eggMoveLabel.setOrigin(0.5, 0); this.pokemonEggMoveBgs.push(eggMoveBg); @@ -591,9 +594,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.pokemonEggMovesContainer); // The font size should be set per language - let instructionTextSize = textSettings.instructionTextSize; + const instructionTextSize = textSettings.instructionTextSize; - this.instructionsText = addTextObject(this.scene, 4, 156, '', TextStyle.PARTY, { fontSize: instructionTextSize }); + this.instructionsText = addTextObject(this.scene, 4, 156, "", TextStyle.PARTY, { fontSize: instructionTextSize }); this.starterSelectContainer.add(this.instructionsText); this.starterSelectMessageBoxContainer = this.scene.add.container(0, this.scene.game.canvas.height / 6); @@ -604,7 +607,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectMessageBox.setOrigin(0, 1); this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); - this.message = addTextObject(this.scene, 8, 8, '', TextStyle.WINDOW, { maxLines: 2 }); + this.message = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); this.message.setOrigin(0, 0); this.starterSelectMessageBoxContainer.add(this.message); @@ -656,17 +659,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } show(args: any[]): boolean { - if (args.length >= 2 && args[0] instanceof Function && typeof args[1] === 'number') { + if (args.length >= 2 && args[0] instanceof Function && typeof args[1] === "number") { super.show(args); for (let g = 0; g < this.genSpecies.length; g++) { this.genSpecies[g].forEach((species, s) => { const dexEntry = this.scene.gameData.dexData[species.speciesId]; const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; - if (dexEntry.caughtAttr) + if (dexEntry.caughtAttr) { icon.clearTint(); - else if (dexEntry.seenAttr) + } else if (dexEntry.seenAttr) { icon.setTint(0x808080); + } }); } @@ -693,7 +697,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); - if (text?.indexOf('\n') === -1) { + if (text?.indexOf("\n") === -1) { this.starterSelectMessageBox.setSize(318, 28); this.message.setY(-22); } else { @@ -705,8 +709,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } processInput(button: Button): boolean { - if (this.blockInput) + if (this.blockInput) { return false; + } const ui = this.getUi(); @@ -714,10 +719,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let error = false; if (button === Button.SUBMIT) { - if (this.tryStart(true)) + if (this.tryStart(true)) { success = true; - else + } else { error = true; + } } else if (button === Button.CANCEL) { if (this.statsMode) { this.toggleStatsMode(false); @@ -735,57 +741,59 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else if (this.startCursorObj.visible) { switch (button) { - case Button.ACTION: - if (this.tryStart(true)) - success = true; - else - error = true; - break; - case Button.UP: - this.startCursorObj.setVisible(false); - this.setGenMode(true); - success = true; - break; - case Button.LEFT: - this.startCursorObj.setVisible(false); - this.setGenMode(false); - this.setCursor(this.cursor + 8); + case Button.ACTION: + if (this.tryStart(true)) { success = true; - break; - case Button.RIGHT: - this.startCursorObj.setVisible(false); - this.setGenMode(false); - success = true; - break; + } else { + error = true; + } + break; + case Button.UP: + this.startCursorObj.setVisible(false); + this.setGenMode(true); + success = true; + break; + case Button.LEFT: + this.startCursorObj.setVisible(false); + this.setGenMode(false); + this.setCursor(this.cursor + 8); + success = true; + break; + case Button.RIGHT: + this.startCursorObj.setVisible(false); + this.setGenMode(false); + success = true; + break; } } else if (this.genMode) { switch (button) { - case Button.UP: - if (this.genCursor) - success = this.setCursor(this.genCursor - 1); - break; - case Button.DOWN: - if (this.genCursor < 2) - success = this.setCursor(this.genCursor + 1); - else { - this.startCursorObj.setVisible(true); - this.setGenMode(true); - success = true; - } - break; - case Button.LEFT: - success = this.setGenMode(false); - this.setCursor(this.cursor + 8); - break; - case Button.RIGHT: - success = this.setGenMode(false); - break; + case Button.UP: + if (this.genCursor) { + success = this.setCursor(this.genCursor - 1); + } + break; + case Button.DOWN: + if (this.genCursor < 2) { + success = this.setCursor(this.genCursor + 1); + } else { + this.startCursorObj.setVisible(true); + this.setGenMode(true); + success = true; + } + break; + case Button.LEFT: + success = this.setGenMode(false); + this.setCursor(this.cursor + 8); + break; + case Button.RIGHT: + success = this.setGenMode(false); + break; } } else { if (button === Button.ACTION) { - if (!this.speciesStarterDexEntry?.caughtAttr) + if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - else if (this.starterCursors.length < 6) { + } else if (this.starterCursors.length < 6) { const options = [ { label: i18next.t("starterSelectUiHandler:addToParty"), @@ -813,14 +821,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterAbilityIndexes.push(this.abilityCursor); this.starterNatures.push(this.natureCursor as unknown as Nature); this.starterMovesets.push(this.starterMoveset.slice(0) as StarterMoveset); - if (this.speciesLoaded.get(species.speciesId)) + if (this.speciesLoaded.get(species.speciesId)) { getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); - if (this.starterCursors.length === 6 || this.value === this.getValueLimit()) + } + if (this.starterCursors.length === 6 || this.value === this.getValueLimit()) { this.tryStart(); + } this.updateInstructions(); ui.playSelect(); - } else + } else { ui.playError(); + } return true; }, overrideSound: true @@ -851,7 +862,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const option = { label: allMoves[sm].name, handler: () => { - this.switchMoveHandler(i, sm, m) + this.switchMoveHandler(i, sm, m); showSwapOptions(this.starterMoveset); return true; } @@ -933,8 +944,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterData.candyCount -= passiveCost; this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { - if (!success) + if (!success) { return this.scene.reset(true); + } }); ui.setMode(Mode.STARTER_SELECT); this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); @@ -942,7 +954,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } return false; }, - item: 'candy', + item: "candy", itemArgs: starterColors[this.lastSpecies.speciesId] }); } @@ -957,18 +969,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starterData.candyCount -= reductionCost; this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { - if (!success) + if (!success) { return this.scene.reset(true); + } }); this.updateStarterValueLabel(this.cursor); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); - this.scene.playSound('buy'); + this.scene.playSound("buy"); return true; } return false; }, - item: 'candy', + item: "candy", itemArgs: starterColors[this.lastSpecies.speciesId] }); } @@ -1012,119 +1025,132 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const row = Math.floor(this.cursor / 9); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); switch (button) { - case Button.CYCLE_SHINY: - if (this.canCycleShiny) { - this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); - if (this.dexAttrCursor & DexAttr.SHINY) - this.scene.playSound('sparkle'); - else - success = true; - } - break; - case Button.CYCLE_FORM: - if (this.canCycleForm) { - const formCount = this.lastSpecies.forms.length; - let newFormIndex = props.formIndex; - do { - newFormIndex = (newFormIndex + 1) % formCount; - if (this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) - break; - } while (newFormIndex !== props.formIndex); - this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined, undefined); - success = true; - } - break; - case Button.CYCLE_GENDER: - if (this.canCycleGender) { - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined, undefined); + case Button.CYCLE_SHINY: + if (this.canCycleShiny) { + this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); + if (this.dexAttrCursor & DexAttr.SHINY) { + this.scene.playSound("sparkle"); + } else { success = true; } - break; - case Button.CYCLE_ABILITY: - if (this.canCycleAbility) { - const abilityCount = this.lastSpecies.getAbilityCount(); - const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; - let newAbilityIndex = this.abilityCursor; - do { - newAbilityIndex = (newAbilityIndex + 1) % abilityCount; - if (!newAbilityIndex) { - if (abilityAttr & AbilityAttr.ABILITY_1) - break; - } else if (newAbilityIndex === 1) { - if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN)) - break; - } else { - if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) - break; + } + break; + case Button.CYCLE_FORM: + if (this.canCycleForm) { + const formCount = this.lastSpecies.forms.length; + let newFormIndex = props.formIndex; + do { + newFormIndex = (newFormIndex + 1) % formCount; + if (this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) { + break; + } + } while (newFormIndex !== props.formIndex); + this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined, undefined); + success = true; + } + break; + case Button.CYCLE_GENDER: + if (this.canCycleGender) { + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined, undefined); + success = true; + } + break; + case Button.CYCLE_ABILITY: + if (this.canCycleAbility) { + const abilityCount = this.lastSpecies.getAbilityCount(); + const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; + let newAbilityIndex = this.abilityCursor; + do { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; + if (!newAbilityIndex) { + if (abilityAttr & AbilityAttr.ABILITY_1) { + break; } - } while (newAbilityIndex !== this.abilityCursor); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); - success = true; - } - break; - case Button.CYCLE_NATURE: - if (this.canCycleNature) { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); - const natureIndex = natures.indexOf(this.natureCursor); - const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, newNature, undefined); - success = true; - } - break; - case Button.CYCLE_VARIANT: - if (this.canCycleVariant) { - let newVariant = props.variant; - do { - newVariant = (newVariant + 1) % 3; - if (!newVariant) { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT) - break; - } else if (newVariant === 1) { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2) - break; - } else { - if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3) - break; + } else if (newAbilityIndex === 1) { + if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN)) { + break; } - } while (newVariant !== props.variant); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); - success = true; - } - break; - case Button.UP: - if (row) - success = this.setCursor(this.cursor - 9); - break; - case Button.DOWN: - if (row < rows - 2 || (row < rows - 1 && this.cursor % 9 <= (genStarters - 1) % 9)) - success = this.setCursor(this.cursor + 9); - break; - case Button.LEFT: - if (this.cursor % 9) - success = this.setCursor(this.cursor - 1); - else { - if (row >= Math.min(5, rows - 1)) - this.startCursorObj.setVisible(true); - success = this.setGenMode(true); + } else { + if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { + break; + } + } + } while (newAbilityIndex !== this.abilityCursor); + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); + success = true; + } + break; + case Button.CYCLE_NATURE: + if (this.canCycleNature) { + const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); + const natureIndex = natures.indexOf(this.natureCursor); + const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, newNature, undefined); + success = true; + } + break; + case Button.CYCLE_VARIANT: + if (this.canCycleVariant) { + let newVariant = props.variant; + do { + newVariant = (newVariant + 1) % 3; + if (!newVariant) { + if (this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT) { + break; + } + } else if (newVariant === 1) { + if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2) { + break; + } + } else { + if (this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3) { + break; + } + } + } while (newVariant !== props.variant); + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); + success = true; + } + break; + case Button.UP: + if (row) { + success = this.setCursor(this.cursor - 9); + } + break; + case Button.DOWN: + if (row < rows - 2 || (row < rows - 1 && this.cursor % 9 <= (genStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 9); + } + break; + case Button.LEFT: + if (this.cursor % 9) { + success = this.setCursor(this.cursor - 1); + } else { + if (row >= Math.min(5, rows - 1)) { + this.startCursorObj.setVisible(true); } - break; - case Button.RIGHT: - if (this.cursor % 9 < (row < rows - 1 ? 8 : (genStarters - 1) % 9)) - success = this.setCursor(this.cursor + 1); - else { - if (row >= Math.min(5, rows - 1)) - this.startCursorObj.setVisible(true); - success = this.setGenMode(true); + success = this.setGenMode(true); + } + break; + case Button.RIGHT: + if (this.cursor % 9 < (row < rows - 1 ? 8 : (genStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + if (row >= Math.min(5, rows - 1)) { + this.startCursorObj.setVisible(true); } - break; + success = this.setGenMode(true); + } + break; } } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } @@ -1133,70 +1159,84 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const speciesId = this.lastSpecies.speciesId; const existingMoveIndex = this.starterMoveset.indexOf(newMove); this.starterMoveset[i] = newMove; - if (existingMoveIndex > -1) + if (existingMoveIndex > -1) { this.starterMoveset[existingMoveIndex] = move; + } const props: DexAttrProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); // species has different forms if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) { // starterMoveData doesn't have base form moves or is using the single form format - if (!this.scene.gameData.starterData[speciesId].moveset || Array.isArray(this.scene.gameData.starterData[speciesId].moveset)) + if (!this.scene.gameData.starterData[speciesId].moveset || Array.isArray(this.scene.gameData.starterData[speciesId].moveset)) { this.scene.gameData.starterData[speciesId].moveset = { [props.formIndex]: this.starterMoveset.slice(0) as StarterMoveset }; + } const starterMoveData = this.scene.gameData.starterData[speciesId].moveset; // starterMoveData doesn't have active form moves - if (!starterMoveData.hasOwnProperty(props.formIndex)) + if (!starterMoveData.hasOwnProperty(props.formIndex)) { this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; + } // does the species' starter move data have its form's starter moves and has it been updated if (starterMoveData.hasOwnProperty(props.formIndex)) { // active form move hasn't been updated - if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) + if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) { this.scene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset.slice(0) as StarterMoveset; + } } - } else + } else { this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset; + } this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); } updateInstructions(): void { - let instructionLines = [ ]; - let cycleInstructionLines = []; + const instructionLines = [ ]; + const cycleInstructionLines = []; if (this.speciesStarterDexEntry?.caughtAttr) { - if (this.canCycleShiny) + if (this.canCycleShiny) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleShiny")); - if (this.canCycleForm) + } + if (this.canCycleForm) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleForm")); - if (this.canCycleGender) + } + if (this.canCycleGender) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleGender")); - if (this.canCycleAbility) + } + if (this.canCycleAbility) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleAbility")); - if (this.canCycleNature) + } + if (this.canCycleNature) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleNature")); - if (this.canCycleVariant) + } + if (this.canCycleVariant) { cycleInstructionLines.push(i18next.t("starterSelectUiHandler:cycleVariant")); + } } if (cycleInstructionLines.length > 2) { - cycleInstructionLines[0] += ' | ' + cycleInstructionLines.splice(1, 1); - if (cycleInstructionLines.length > 2) - cycleInstructionLines[1] += ' | ' + cycleInstructionLines.splice(2, 1); - if (cycleInstructionLines.length > 2) - cycleInstructionLines[2] += ' | ' + cycleInstructionLines.splice(3, 1); + cycleInstructionLines[0] += " | " + cycleInstructionLines.splice(1, 1); + if (cycleInstructionLines.length > 2) { + cycleInstructionLines[1] += " | " + cycleInstructionLines.splice(2, 1); + } + if (cycleInstructionLines.length > 2) { + cycleInstructionLines[2] += " | " + cycleInstructionLines.splice(3, 1); + } } - for (let cil of cycleInstructionLines) + for (const cil of cycleInstructionLines) { instructionLines.push(cil); + } - this.instructionsText.setText(instructionLines.join('\n')); + this.instructionsText.setText(instructionLines.join("\n")); } getValueLimit(): integer { switch (this.gameMode) { - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - return 15; - default: - return 10; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + return 15; + default: + return 10; } } @@ -1218,8 +1258,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.updateGenOptions(); } - if (genCursorWithScroll !== undefined) + if (genCursorWithScroll !== undefined) { this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(false); + } this.cursor = 0; this.genCursor = cursor; genCursorWithScroll = this.getGenCursorWithScroll(); @@ -1227,17 +1268,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.genCursorHighlightObj.setY(this.genCursorObj.y); this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(true); - for (let s = 0; s < this.starterCursorObjs.length; s++) + for (let s = 0; s < this.starterCursorObjs.length; s++) { this.starterCursorObjs[s].setVisible(this.starterGens[s] === genCursorWithScroll); - for (let s = 0; s < this.pokerusCursorObjs.length; s++) + } + for (let s = 0; s < this.pokerusCursorObjs.length; s++) { this.pokerusCursorObjs[s].setVisible(this.pokerusGens[s] === genCursorWithScroll); + } const genLimit = this.genSpecies[genCursorWithScroll].length; for (let s = 0; s < 81; s++) { const speciesId = s < genLimit ? this.genSpecies[genCursorWithScroll][s].speciesId : 0 as Species; const slotVisible = !!speciesId; - if (slotVisible) + if (slotVisible) { this.updateStarterValueLabel(s); + } this.starterValueLabels[s].setVisible(slotVisible); const speciesVariants = speciesId && this.scene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(this.scene.gameData.dexData[speciesId].caughtAttr & v)) @@ -1245,8 +1289,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; this.shinyIcons[s][v].setVisible(slotVisible && hasVariant); - if (hasVariant) + if (hasVariant) { this.shinyIcons[s][v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); + } } this.hiddenAbilityIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); this.classicWinIcons[s].setVisible(slotVisible && this.scene.gameData.starterData[speciesId].classicWinCount > 0); @@ -1271,19 +1316,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } updateGenOptions(): void { - let text = ''; + let text = ""; for (let g = this.genScrollCursor; g <= this.genScrollCursor + 2; g++) { - let optionText = ''; - if (g === this.genScrollCursor && this.genScrollCursor) - optionText = '↑'; - else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) - optionText = '↓' - else - optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); - text += `${text ? '\n' : ''}${optionText}`; + let optionText = ""; + if (g === this.genScrollCursor && this.genScrollCursor) { + optionText = "↑"; + } else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) { + optionText = "↓"; + } else { + optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); + } + text += `${text ? "\n" : ""}${optionText}`; } this.genOptionsText.setText(text); -} + } setGenMode(genMode: boolean): boolean { this.genCursorObj.setVisible(genMode && !this.startCursorObj.visible); @@ -1293,8 +1339,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.genMode = genMode; this.setCursor(genMode ? this.genCursor : this.cursor); - if (genMode) + if (genMode) { this.setSpecies(null); + } return true; } @@ -1344,9 +1391,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { //Growth translate let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); - let growthAux = growthReadable.replace(" ", "_") + const growthAux = growthReadable.replace(" ", "_"); if(i18next.exists("growth:" + growthAux)){ - growthReadable = i18next.t("growth:"+ growthAux as any) + growthReadable = i18next.t("growth:"+ growthAux as any); } this.pokemonGrowthRateText.setText(growthReadable); @@ -1374,16 +1421,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyCountText.setVisible(true); this.pokemonFormText.setVisible(true); - var currentFriendship = this.scene.gameData.starterData[this.lastSpecies.speciesId].friendship; - if (!currentFriendship || currentFriendship === undefined) + let currentFriendship = this.scene.gameData.starterData[this.lastSpecies.speciesId].friendship; + if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; + } const friendshipCap = getStarterValueFriendshipCap(speciesStarters[this.lastSpecies.speciesId]); const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.pokemonCandyDarknessOverlay.visible) { - this.pokemonCandyDarknessOverlay.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); - this.pokemonCandyDarknessOverlay.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + this.pokemonCandyDarknessOverlay.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); + this.pokemonCandyDarknessOverlay.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.pokemonCandyDarknessOverlay.setCrop(0,0,16, candyCropY); @@ -1419,10 +1467,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.pokemonSprite.clearTint(); - if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) + if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) { handleTutorial(this.scene, Tutorial.Pokerus); + } } else { - this.pokemonGrowthRateText.setText(''); + this.pokemonGrowthRateText.setText(""); this.pokemonGrowthRateLabelText.setVisible(false); this.type1Icon.setVisible(false); this.type2Icon.setVisible(false); @@ -1449,8 +1498,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else { this.pokemonNumberText.setText(Utils.padInt(0, 4)); - this.pokemonNameText.setText(species ? '???' : ''); - this.pokemonGrowthRateText.setText(''); + this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonGrowthRateText.setText(""); this.pokemonGrowthRateLabelText.setVisible(false); this.type1Icon.setVisible(false); this.type2Icon.setVisible(false); @@ -1480,11 +1529,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.abilityCursor = -1; this.natureCursor = -1; - if (species?.forms?.find(f => f.formKey === 'female')) { - if (female !== undefined) + if (species?.forms?.find(f => f.formKey === "female")) { + if (female !== undefined) { formIndex = female ? 1 : 0; - else if (formIndex !== undefined) + } else if (formIndex !== undefined) { female = formIndex === 1; + } } if (species) { @@ -1513,18 +1563,24 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, forSeen, !forSeen)); const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); - if (shiny === undefined || shiny !== props.shiny) + if (shiny === undefined || shiny !== props.shiny) { shiny = props.shiny; - if (formIndex === undefined || formIndex !== props.formIndex) + } + if (formIndex === undefined || formIndex !== props.formIndex) { formIndex = props.formIndex; - if (female === undefined || female !== props.female) + } + if (female === undefined || female !== props.female) { female = props.female; - if (variant === undefined || variant !== props.variant) + } + if (variant === undefined || variant !== props.variant) { variant = props.variant; - if (abilityIndex === undefined || abilityIndex !== defaultAbilityIndex) + } + if (abilityIndex === undefined || abilityIndex !== defaultAbilityIndex) { abilityIndex = defaultAbilityIndex; - if (natureIndex === undefined || natureIndex !== defaultNature) + } + if (natureIndex === undefined || natureIndex !== defaultNature) { natureIndex = defaultNature; + } } this.shinyOverlay.setVisible(shiny); @@ -1553,14 +1609,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.assetLoadCancelled = assetLoadCancelled; species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => { - if (assetLoadCancelled.value) + if (assetLoadCancelled.value) { return; + } this.assetLoadCancelled = null; this.speciesLoaded.set(species.speciesId, true); this.pokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant)); - this.pokemonSprite.setPipelineData('shiny', shiny); - this.pokemonSprite.setPipelineData('variant', variant); - this.pokemonSprite.setPipelineData('spriteKey', species.getSpriteKey(female, formIndex, shiny, variant)); + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female, formIndex, shiny, variant)); this.pokemonSprite.setVisible(!this.statsMode); }); @@ -1581,8 +1638,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonGenderText.setText(getGenderSymbol(gender)); this.pokemonGenderText.setColor(getGenderColor(gender)); this.pokemonGenderText.setShadowColor(getGenderColor(gender, true)); - } else - this.pokemonGenderText.setText(''); + } else { + this.pokemonGenderText.setText(""); + } if (dexEntry.caughtAttr) { const ability = this.lastSpecies.getAbility(abilityIndex); @@ -1600,20 +1658,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false, this.scene.uiTheme)); let levelMoves: LevelMoves; - if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) + if (pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) { levelMoves = pokemonFormLevelMoves[species.speciesId][formIndex]; - else + } else { levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; + } this.speciesStarterMoves.push(...levelMoves.filter(lm => lm[0] <= 5).map(lm => lm[1])); if (speciesEggMoves.hasOwnProperty(species.speciesId)) { for (let em = 0; em < 4; em++) { - if (this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) + if (this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) { this.speciesStarterMoves.push(speciesEggMoves[species.speciesId][em]); + } } } const speciesMoveData = this.scene.gameData.starterData[species.speciesId].moveset; - let moveData: StarterMoveset = speciesMoveData + const moveData: StarterMoveset = speciesMoveData ? Array.isArray(speciesMoveData) ? speciesMoveData as StarterMoveset : (speciesMoveData as StarterFormMoveData)[formIndex] @@ -1621,8 +1681,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const availableStarterMoves = this.speciesStarterMoves.concat(speciesEggMoves.hasOwnProperty(species.speciesId) ? speciesEggMoves[species.speciesId].filter((_, em: integer) => this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em)) : []); this.starterMoveset = (moveData || (this.speciesStarterMoves.slice(0, 4) as StarterMoveset)).filter(m => availableStarterMoves.find(sm => sm === m)) as StarterMoveset; // Consolidate move data if it contains an incompatible move - if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) + if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) { this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); + } // Remove duplicate moves this.starterMoveset = this.starterMoveset.filter( @@ -1632,37 +1693,39 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); - const formText = species?.forms[formIndex]?.formKey.split('-'); - for (let i = 0; i < formText?.length; i++) + const formText = species?.forms[formIndex]?.formKey.split("-"); + for (let i = 0; i < formText?.length; i++) { formText[i] = formText[i].charAt(0).toUpperCase() + formText[i].substring(1); + } - this.pokemonFormText.setText(formText?.join(' ')); + this.pokemonFormText.setText(formText?.join(" ")); this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { - this.pokemonAbilityText.setText(''); - this.pokemonPassiveText.setText(''); - this.pokemonNatureText.setText(''); + this.pokemonAbilityText.setText(""); + this.pokemonPassiveText.setText(""); + this.pokemonNatureText.setText(""); this.setTypeIcons(null, null); } } else { this.shinyOverlay.setVisible(false); this.pokemonNumberText.setColor(this.getTextColor(TextStyle.SUMMARY)); this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); - this.pokemonGenderText.setText(''); - this.pokemonAbilityText.setText(''); - this.pokemonPassiveText.setText(''); - this.pokemonNatureText.setText(''); + this.pokemonGenderText.setText(""); + this.pokemonAbilityText.setText(""); + this.pokemonPassiveText.setText(""); + this.pokemonNatureText.setText(""); this.setTypeIcons(null, null); } - if (!this.starterMoveset) + if (!this.starterMoveset) { this.starterMoveset = this.speciesStarterMoves.slice(0, 4) as StarterMoveset; + } for (let m = 0; m < 4; m++) { const move = m < this.starterMoveset.length ? allMoves[this.starterMoveset[m]] : null; this.pokemonMoveBgs[m].setFrame(Type[move ? move.type : Type.UNKNOWN].toString().toLowerCase()); - this.pokemonMoveLabels[m].setText(move ? move.name : '-'); + this.pokemonMoveLabels[m].setText(move ? move.name : "-"); this.pokemonMoveContainers[m].setVisible(!!move); } @@ -1672,7 +1735,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null; const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em); this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase()); - this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : '???'); + this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???"); } this.pokemonEggMovesContainer.setVisible(this.speciesStarterDexEntry?.caughtAttr && hasEggMoves); @@ -1687,13 +1750,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (type1 !== null) { this.type1Icon.setVisible(true); this.type1Icon.setFrame(Type[type1].toLowerCase()); - } else + } else { this.type1Icon.setVisible(false); + } if (type2 !== null) { this.type2Icon.setVisible(true); this.type2Icon.setFrame(Type[type2].toLowerCase()); - } else + } else { this.type2Icon.setVisible(false); + } } popStarter(): void { @@ -1704,8 +1769,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterNatures.pop(); this.starterMovesets.pop(); this.starterCursorObjs[this.starterCursors.length].setVisible(false); - this.starterIcons[this.starterCursors.length].setTexture('pokemon_icons_0'); - this.starterIcons[this.starterCursors.length].setFrame('unknown'); + this.starterIcons[this.starterCursors.length].setTexture("pokemon_icons_0"); + this.starterIcons[this.starterCursors.length].setFrame("unknown"); this.tryUpdateValue(); } @@ -1714,21 +1779,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const baseStarterValue = speciesStarters[speciesId]; const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId); let valueStr = starterValue.toString(); - if (valueStr.startsWith('0.')) + if (valueStr.startsWith("0.")) { valueStr = valueStr.slice(1); + } this.starterValueLabels[cursor].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; + case 0: + textStyle = TextStyle.WINDOW; + break; + case 1: + case 0.5: + textStyle = TextStyle.SUMMARY_BLUE; + break; + default: + textStyle = TextStyle.SUMMARY_GOLD; + break; } this.starterValueLabels[cursor].setColor(this.getTextColor(textStyle)); this.starterValueLabels[cursor].setShadowColor(this.getTextColor(textStyle, true)); @@ -1740,8 +1806,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const valueLimit = this.getValueLimit(); const overLimit = newValue > valueLimit; let newValueStr = newValue.toString(); - if (newValueStr.startsWith('0.')) + if (newValueStr.startsWith("0.")) { newValueStr = newValueStr.slice(1); + } this.valueLimitLabel.setText(`${newValueStr}/${valueLimit}`); this.valueLimitLabel.setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)); this.valueLimitLabel.setShadowColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); @@ -1750,23 +1817,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } for (let g = 0; g < this.genSpecies.length; g++) { - for (let s = 0; s < this.genSpecies[g].length; s++) + for (let s = 0; s < this.genSpecies[g].length; s++) { (this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite).setAlpha((newValue + this.scene.gameData.getSpeciesStarterValue(this.genSpecies[g][s].speciesId)) > valueLimit ? 0.375 : 1); + } } this.value = newValue; return true; } tryStart(manualTrigger: boolean = false): boolean { - if (!this.starterGens.length) + if (!this.starterGens.length) { return false; + } const ui = this.getUi(); const cancel = () => { ui.setMode(Mode.STARTER_SELECT); - if (!manualTrigger) + if (!manualTrigger) { this.popStarter(); + } this.clearText(); }; @@ -1800,8 +1870,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } toggleStatsMode(on?: boolean): void { - if (on === undefined) + if (on === undefined) { on = !this.statsMode; + } if (on) { this.showStats(); this.statsMode = true; @@ -1815,8 +1886,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } showStats(): void { - if (!this.speciesStarterDexEntry) + if (!this.speciesStarterDexEntry) { return; + } this.statsContainer.setVisible(true); @@ -1834,15 +1906,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(false); this.blockInput = false; - while (this.starterCursors.length) + while (this.starterCursors.length) { this.popStarter(); + } - if (this.statsMode) + if (this.statsMode) { this.toggleStatsMode(false); + } } checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female, formIndex, shiny, variant) { - if (icon.frame.name != species.getIconId(female, formIndex, shiny, variant)) { + if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { console.log(`${species.name}'s variant icon does not exist. Replacing with default.`); icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); icon.setFrame(species.getIconId(female, formIndex, false, variant)); diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index b8d9c59a4d7e..283f79f01a8a 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -5,7 +5,7 @@ import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./t const ivChartSize = 24; const ivChartStatCoordMultipliers = [ [ 0, -1 ], [ 0.825, -0.5 ], [ 0.825, 0.5 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ], [ 0, 1 ] ]; -const ivChartStatIndexes = [0,1,2,5,4,3] // swap special attack and speed +const ivChartStatIndexes = [0,1,2,5,4,3]; // swap special attack and speed const defaultIvChartData = new Array(12).fill(null).map(() => 0); export class StatsContainer extends Phaser.GameObjects.Container { @@ -53,8 +53,8 @@ export class StatsContainer extends Phaser.GameObjects.Container { const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[i][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[i][1] * 1.325 - 4, getStatName(i as Stat), TextStyle.TOOLTIP_CONTENT); statLabel.setOrigin(0.5); - this.ivStatValueTexts[i] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, '0', TextStyle.TOOLTIP_CONTENT); - this.ivStatValueTexts[i].setOrigin(0.5) + this.ivStatValueTexts[i] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT); + this.ivStatValueTexts[i].setOrigin(0.5); this.add(statLabel); this.add(this.ivStatValueTexts[i]); @@ -70,10 +70,11 @@ export class StatsContainer extends Phaser.GameObjects.Container { this.ivStatValueTexts.map((t: BBCodeText, i: integer) => { let label = ivs[i].toString(); if (this.showDiff && originalIvs) { - if (originalIvs[i] < ivs[i]) + if (originalIvs[i] < ivs[i]) { label += ` ([color=${getTextColor(TextStyle.SUMMARY_BLUE, false, (this.scene as BattleScene).uiTheme)}][shadow=${getTextColor(TextStyle.SUMMARY_BLUE, true, (this.scene as BattleScene).uiTheme)}]+${ivs[i] - originalIvs[i]}[/shadow][/color])`; - else - label += ' (-)'; + } else { + label += " (-)"; + } } t.setText(`[shadow]${label}[/shadow]`); }); @@ -82,7 +83,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { from: 0, to: 1, duration: 1000, - ease: 'Cubic.easeOut', + ease: "Cubic.easeOut", onUpdate: (tween: Phaser.Tweens.Tween) => { const progress = tween.getValue(); const interpolatedData = ivChartData.map((v: number, i: integer) => v * progress + (lastIvChartData[i] * (1 - progress))); @@ -94,4 +95,4 @@ export class StatsContainer extends Phaser.GameObjects.Container { this.ivChart.setTo(defaultIvChartData); } } -} \ No newline at end of file +} diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 0655880d2717..ba0c98b8941e 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -3,10 +3,10 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import * as Utils from "../utils"; import { PlayerPokemon } from "../field/pokemon"; -import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from '../data/pokemon-species'; +import { getStarterValueFriendshipCap, speciesStarters } from "../data/pokemon-species"; import { argbFromRgba } from "@material/material-color-utilities"; import { Type, getTypeRgb } from "../data/type"; -import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag, getTextColor } from "./text"; +import { TextStyle, addBBCodeTextObject, addTextObject, getBBCodeFrag } from "./text"; import Move, { MoveCategory } from "../data/move"; import { getPokeballAtlasKey } from "../data/pokeball"; import { getGenderColor, getGenderSymbol } from "../data/gender"; @@ -111,105 +111,105 @@ export default class SummaryUiHandler extends UiHandler { this.summaryContainer.setVisible(false); ui.add(this.summaryContainer); - const summaryBg = this.scene.add.image(0, 0, 'summary_bg'); + const summaryBg = this.scene.add.image(0, 0, "summary_bg"); summaryBg.setOrigin(0, 1); this.summaryContainer.add(summaryBg); - this.tabSprite = this.scene.add.sprite(134, (-summaryBg.displayHeight) + 16, 'summary_tabs_1'); + this.tabSprite = this.scene.add.sprite(134, (-summaryBg.displayHeight) + 16, "summary_tabs_1"); this.tabSprite.setOrigin(1, 1); this.summaryContainer.add(this.tabSprite); - const summaryLabel = addTextObject(this.scene, 4, -165, 'Pokémon Info', TextStyle.SUMMARY); + const summaryLabel = addTextObject(this.scene, 4, -165, "Pokémon Info", TextStyle.SUMMARY); summaryLabel.setOrigin(0, 1); this.summaryContainer.add(summaryLabel); - this.shinyOverlay = this.scene.add.image(6, -54, 'summary_overlay_shiny'); + this.shinyOverlay = this.scene.add.image(6, -54, "summary_overlay_shiny"); this.shinyOverlay.setOrigin(0, 1); this.shinyOverlay.setVisible(false); this.summaryContainer.add(this.shinyOverlay); - this.numberText = addTextObject(this.scene, 17, -149, '0000', TextStyle.SUMMARY); + this.numberText = addTextObject(this.scene, 17, -149, "0000", TextStyle.SUMMARY); this.numberText.setOrigin(0, 1); this.summaryContainer.add(this.numberText); - this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, `pkmn__sub`), null, false, true); + this.pokemonSprite = this.scene.initPokemonSprite(this.scene.add.sprite(56, -106, "pkmn__sub"), null, false, true); this.summaryContainer.add(this.pokemonSprite); - this.nameText = addTextObject(this.scene, 6, -54, '', TextStyle.SUMMARY); + this.nameText = addTextObject(this.scene, 6, -54, "", TextStyle.SUMMARY); this.nameText.setOrigin(0, 0); this.summaryContainer.add(this.nameText); - this.splicedIcon = this.scene.add.sprite(0, -54, 'icon_spliced'); + this.splicedIcon = this.scene.add.sprite(0, -54, "icon_spliced"); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); this.splicedIcon.setScale(0.75); this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.splicedIcon); - this.shinyIcon = this.scene.add.image(0, -54, 'shiny_star'); + this.shinyIcon = this.scene.add.image(0, -54, "shiny_star"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); this.shinyIcon.setScale(0.75); this.shinyIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.shinyIcon); - this.fusionShinyIcon = this.scene.add.image(0, 0, 'shiny_star_2'); + this.fusionShinyIcon = this.scene.add.image(0, 0, "shiny_star_2"); this.fusionShinyIcon.setVisible(false); this.fusionShinyIcon.setOrigin(0, 0); - this.fusionShinyIcon.setScale(0.75) + this.fusionShinyIcon.setScale(0.75); this.summaryContainer.add(this.fusionShinyIcon); - this.pokeball = this.scene.add.sprite(6, -19, 'pb'); + this.pokeball = this.scene.add.sprite(6, -19, "pb"); this.pokeball.setOrigin(0, 1); this.summaryContainer.add(this.pokeball); - this.candyIcon = this.scene.add.sprite(13, -140, 'candy'); + this.candyIcon = this.scene.add.sprite(13, -140, "candy"); this.candyIcon.setScale(0.8); this.summaryContainer.add(this.candyIcon); - this.candyOverlay = this.scene.add.sprite(13, -140, 'candy_overlay'); + this.candyOverlay = this.scene.add.sprite(13, -140, "candy_overlay"); this.candyOverlay.setScale(0.8); this.summaryContainer.add(this.candyOverlay); - this.candyShadow = this.scene.add.sprite(13, -140, 'candy'); + this.candyShadow = this.scene.add.sprite(13, -140, "candy"); this.candyShadow.setTint(0x000000); this.candyShadow.setAlpha(0.50); this.candyShadow.setScale(0.8); this.candyShadow.setInteractive(new Phaser.Geom.Rectangle(0, 0, 16, 16), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.candyShadow); - this.candyCountText = addTextObject(this.scene, 20, -146, 'x0', TextStyle.WINDOW_ALT, { fontSize: '76px' }); + this.candyCountText = addTextObject(this.scene, 20, -146, "x0", TextStyle.WINDOW_ALT, { fontSize: "76px" }); this.candyCountText.setOrigin(0, 0); this.summaryContainer.add(this.candyCountText); - this.championRibbon = this.scene.add.image(88, -146, 'champion_ribbon'); + this.championRibbon = this.scene.add.image(88, -146, "champion_ribbon"); this.championRibbon.setOrigin(0, 0); //this.championRibbon.setScale(0.8); this.championRibbon.setScale(1.25); this.summaryContainer.add(this.championRibbon); this.championRibbon.setVisible(false); - this.levelText = addTextObject(this.scene, 36, -17, '', TextStyle.SUMMARY_ALT); + this.levelText = addTextObject(this.scene, 36, -17, "", TextStyle.SUMMARY_ALT); this.levelText.setOrigin(0, 1); this.summaryContainer.add(this.levelText); - this.genderText = addTextObject(this.scene, 96, -17, '', TextStyle.SUMMARY); + this.genderText = addTextObject(this.scene, 96, -17, "", TextStyle.SUMMARY); this.genderText.setOrigin(0, 1); this.summaryContainer.add(this.genderText); this.statusContainer = this.scene.add.container(-106, -16); - const statusBg = this.scene.add.image(0, 0, 'summary_status'); + const statusBg = this.scene.add.image(0, 0, "summary_status"); statusBg.setOrigin(0, 0); this.statusContainer.add(statusBg); - const statusLabel = addTextObject(this.scene, 3, 0, 'Status', TextStyle.SUMMARY); + const statusLabel = addTextObject(this.scene, 3, 0, "Status", TextStyle.SUMMARY); statusLabel.setOrigin(0, 0); this.statusContainer.add(statusLabel); - this.status = this.scene.add.sprite(91, 4, 'statuses'); + this.status = this.scene.add.sprite(91, 4, "statuses"); this.status.setOrigin(0.5, 0); this.statusContainer.add(this.status); @@ -220,25 +220,25 @@ export default class SummaryUiHandler extends UiHandler { this.summaryContainer.add(this.moveEffectContainer); - const moveEffectBg = this.scene.add.image(0, 0, 'summary_moves_effect'); + const moveEffectBg = this.scene.add.image(0, 0, "summary_moves_effect"); moveEffectBg.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectBg); - const moveEffectLabels = addTextObject(this.scene, 8, 12, 'Power\nAccuracy\nCategory', TextStyle.SUMMARY); + const moveEffectLabels = addTextObject(this.scene, 8, 12, "Power\nAccuracy\nCategory", TextStyle.SUMMARY); moveEffectLabels.setLineSpacing(9); moveEffectLabels.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectLabels); - this.movePowerText = addTextObject(this.scene, 99, 27, '0', TextStyle.WINDOW_ALT); + this.movePowerText = addTextObject(this.scene, 99, 27, "0", TextStyle.WINDOW_ALT); this.movePowerText.setOrigin(1, 1); this.moveEffectContainer.add(this.movePowerText); - this.moveAccuracyText = addTextObject(this.scene, 99, 43, '0', TextStyle.WINDOW_ALT); + this.moveAccuracyText = addTextObject(this.scene, 99, 43, "0", TextStyle.WINDOW_ALT); this.moveAccuracyText.setOrigin(1, 1); this.moveEffectContainer.add(this.moveAccuracyText); - this.moveCategoryIcon = this.scene.add.sprite(99, 57, 'categories'); + this.moveCategoryIcon = this.scene.add.sprite(99, 57, "categories"); this.moveCategoryIcon.setOrigin(1, 1); this.moveEffectContainer.add(this.moveCategoryIcon); @@ -257,8 +257,9 @@ export default class SummaryUiHandler extends UiHandler { } getPageKey(page?: integer) { - if (page === undefined) + if (page === undefined) { page = this.cursor; + } return `summary_${Page[page].toLowerCase()}`; } @@ -284,15 +285,16 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setShadowColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true)); this.pokemonSprite.play(this.pokemon.getSpriteKey(true)); - this.pokemonSprite.setPipelineData('teraColor', getTypeRgb(this.pokemon.getTeraType())); - this.pokemonSprite.setPipelineData('ignoreTimeTint', true); - this.pokemonSprite.setPipelineData('spriteKey', this.pokemon.getSpriteKey()); - this.pokemonSprite.setPipelineData('shiny', this.pokemon.shiny); - this.pokemonSprite.setPipelineData('variant', this.pokemon.variant); - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { + this.pokemonSprite.setPipelineData("teraColor", getTypeRgb(this.pokemon.getTeraType())); + this.pokemonSprite.setPipelineData("ignoreTimeTint", true); + this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); + this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); + this.pokemonSprite.setPipelineData("variant", this.pokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; - if (this.pokemon.summonData?.speciesForm) - k += 'Base'; + if (this.pokemon.summonData?.speciesForm) { + k += "Base"; + } this.pokemonSprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); this.pokemon.cry(); @@ -304,25 +306,27 @@ export default class SummaryUiHandler extends UiHandler { this.splicedIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + 2, 3); this.splicedIcon.setVisible(isFusion); if (this.splicedIcon.visible) { - this.splicedIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${this.pokemon.species.getName(this.pokemon.formIndex)}/${this.pokemon.fusionSpecies.getName(this.pokemon.fusionFormIndex)}`, true)); - this.splicedIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + this.splicedIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${this.pokemon.species.getName(this.pokemon.formIndex)}/${this.pokemon.fusionSpecies.getName(this.pokemon.fusionFormIndex)}`, true)); + this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } - if(this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) + if(this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { this.championRibbon.setVisible(true); - else + } else { this.championRibbon.setVisible(false); + } - var currentFriendship = this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].friendship; - if (!currentFriendship || currentFriendship === undefined) + let currentFriendship = this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].friendship; + if (!currentFriendship || currentFriendship === undefined) { currentFriendship = 0; + } const friendshipCap = getStarterValueFriendshipCap(speciesStarters[this.pokemon.species.getRootSpeciesId()]); const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.candyShadow.visible) { - this.candyShadow.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); - this.candyShadow.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + this.candyShadow.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `${currentFriendship}/${friendshipCap}`, true)); + this.candyShadow.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.candyCountText.setText(`x${this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].candyCount}`); @@ -333,21 +337,22 @@ export default class SummaryUiHandler extends UiHandler { const baseVariant = !doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant; this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3); - this.shinyIcon.setTexture(`shiny_star${doubleShiny ? '_1' : ''}`); + this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(this.pokemon.isShiny()); this.shinyIcon.setTint(getVariantTint(baseVariant)); if (this.shinyIcon.visible) { const shinyDescriptor = doubleShiny || baseVariant ? - `${baseVariant === 2 ? 'Epic' : baseVariant === 1 ? 'Rare' : 'Common'}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? 'Epic' : this.pokemon.fusionVariant === 1 ? 'Rare' : 'Common'}` : ''}` - : ''; - this.shinyIcon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ''}`, true)); - this.shinyIcon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); + `${baseVariant === 2 ? "Epic" : baseVariant === 1 ? "Rare" : "Common"}${doubleShiny ? `/${this.pokemon.fusionVariant === 2 ? "Epic" : this.pokemon.fusionVariant === 1 ? "Rare" : "Common"}` : ""}` + : ""; + this.shinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); + this.shinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); this.fusionShinyIcon.setVisible(doubleShiny); - if (isFusion) + if (isFusion) { this.fusionShinyIcon.setTint(getVariantTint(this.pokemon.fusionVariant)); + } this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball)); this.levelText.setText(this.pokemon.level.toString()); @@ -356,35 +361,37 @@ export default class SummaryUiHandler extends UiHandler { this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); switch (this.summaryUiMode) { - case SummaryUiMode.DEFAULT: - const page = args.length < 2 ? Page.PROFILE : args[2] as Page; - this.hideMoveEffect(true); - this.setCursor(page); - break; - case SummaryUiMode.LEARN_MOVE: - this.newMove = args[2] as Move; - this.moveSelectFunction = args[3] as Function; - - this.showMoveEffect(true); - this.setCursor(Page.MOVES); - this.showMoveSelect(); - break; + case SummaryUiMode.DEFAULT: + const page = args.length < 2 ? Page.PROFILE : args[2] as Page; + this.hideMoveEffect(true); + this.setCursor(page); + break; + case SummaryUiMode.LEARN_MOVE: + this.newMove = args[2] as Move; + this.moveSelectFunction = args[3] as Function; + + this.showMoveEffect(true); + this.setCursor(Page.MOVES); + this.showMoveSelect(); + break; } const fromSummary = args.length >= 2; if (this.pokemon.status || this.pokemon.pokerus) { this.showStatus(!fromSummary); - this.status.setFrame(this.pokemon.status ? StatusEffect[this.pokemon.status.effect].toLowerCase() : 'pokerus'); - } else + this.status.setFrame(this.pokemon.status ? StatusEffect[this.pokemon.status.effect].toLowerCase() : "pokerus"); + } else { this.hideStatus(!fromSummary); + } return true; } processInput(button: Button): boolean { - if (this.transitioning) + if (this.transitioning) { return false; + } const ui = this.getUi(); @@ -394,9 +401,9 @@ export default class SummaryUiHandler extends UiHandler { if (this.moveSelect) { if (button === Button.ACTION) { if (this.moveCursor < this.pokemon.moveset.length) { - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.moveSelectFunction(this.moveCursor); - else { + } else { if (this.selectedMoveIndex === -1) { this.selectedMoveIndex = this.moveCursor; this.setCursor(this.moveCursor); @@ -424,34 +431,35 @@ export default class SummaryUiHandler extends UiHandler { } } success = true; - } else if (this.moveCursor === 4) + } else if (this.moveCursor === 4) { return this.processInput(Button.CANCEL); - else + } else { error = true; + } } else if (button === Button.CANCEL) { this.hideMoveSelect(); success = true; } else { switch (button) { - case Button.UP: - success = this.setCursor(this.moveCursor ? this.moveCursor - 1 : 4); + case Button.UP: + success = this.setCursor(this.moveCursor ? this.moveCursor - 1 : 4); + break; + case Button.DOWN: + success = this.setCursor(this.moveCursor < 4 ? this.moveCursor + 1 : 0); + break; + case Button.LEFT: + this.moveSelect = false; + this.setCursor(Page.STATS); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE){ + this.hideMoveEffect(); + this.destroyBlinkCursor(); + success = true; break; - case Button.DOWN: - success = this.setCursor(this.moveCursor < 4 ? this.moveCursor + 1 : 0); + } else { + this.hideMoveSelect(); + success = true; break; - case Button.LEFT: - this.moveSelect = false; - this.setCursor(Page.STATS); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE){ - this.hideMoveEffect(); - this.destroyBlinkCursor(); - success = true; - break; - } else { - this.hideMoveSelect(); - success = true; - break; - } + } } } } else { @@ -459,9 +467,8 @@ export default class SummaryUiHandler extends UiHandler { if (this.cursor === Page.MOVES) { this.showMoveSelect(); success = true; - } - // if we're on the PROFILE page and this pokemon has a passive unlocked.. - else if (this.cursor === Page.PROFILE && this.pokemon.hasPassive()) { + } else if (this.cursor === Page.PROFILE && this.pokemon.hasPassive()) { + // if we're on the PROFILE page and this pokemon has a passive unlocked.. // Since abilities are displayed by default, all we need to do is toggle visibility on all elements to show passives this.abilityContainer.nameText.setVisible(!this.abilityContainer.descriptionText.visible); this.abilityContainer.descriptionText.setVisible(!this.abilityContainer.descriptionText.visible); @@ -472,47 +479,51 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible); } } else if (button === Button.CANCEL) { - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.hideMoveSelect(); - else + } else { ui.setMode(Mode.PARTY); + } success = true; } else { const pages = Utils.getEnumValues(Page); switch (button) { - case Button.UP: - case Button.DOWN: - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) - break; - const isDown = button === Button.DOWN; - const party = this.scene.getParty(); - const partyMemberIndex = party.indexOf(this.pokemon); - if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { - const page = this.cursor; - this.clear(); - this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); - } - break; - case Button.LEFT: - if (this.cursor) - success = this.setCursor(this.cursor - 1); + case Button.UP: + case Button.DOWN: + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { break; - case Button.RIGHT: - if (this.cursor < pages.length - 1) { - success = this.setCursor(this.cursor + 1); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.cursor === Page.MOVES) { - this.moveSelect = true; - } + } + const isDown = button === Button.DOWN; + const party = this.scene.getParty(); + const partyMemberIndex = party.indexOf(this.pokemon); + if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { + const page = this.cursor; + this.clear(); + this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); + } + break; + case Button.LEFT: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (this.cursor < pages.length - 1) { + success = this.setCursor(this.cursor + 1); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.cursor === Page.MOVES) { + this.moveSelect = true; } - break; + } + break; } } } - if (success) + if (success) { ui.playSelect(); - else if (error) + } else if (error) { ui.playError(); + } return success || error; } @@ -521,48 +532,50 @@ export default class SummaryUiHandler extends UiHandler { let changed: boolean = overrideChanged || this.moveCursor !== cursor; if (this.moveSelect) { - this.moveCursor = cursor; + this.moveCursor = cursor; - const selectedMove = this.getSelectedMove(); + const selectedMove = this.getSelectedMove(); - if (selectedMove) { - this.moveDescriptionText.setY(84); - this.movePowerText.setText(selectedMove.power >= 0 ? selectedMove.power.toString() : '---'); - this.moveAccuracyText.setText(selectedMove.accuracy >= 0 ? selectedMove.accuracy.toString() : '---'); - this.moveCategoryIcon.setFrame(MoveCategory[selectedMove.category].toLowerCase()); - this.showMoveEffect(); - } else - this.hideMoveEffect(); + if (selectedMove) { + this.moveDescriptionText.setY(84); + this.movePowerText.setText(selectedMove.power >= 0 ? selectedMove.power.toString() : "---"); + this.moveAccuracyText.setText(selectedMove.accuracy >= 0 ? selectedMove.accuracy.toString() : "---"); + this.moveCategoryIcon.setFrame(MoveCategory[selectedMove.category].toLowerCase()); + this.showMoveEffect(); + } else { + this.hideMoveEffect(); + } - this.moveDescriptionText.setText(selectedMove?.effect || ''); - const moveDescriptionLineCount = Math.floor(this.moveDescriptionText.displayHeight / 14.83); + this.moveDescriptionText.setText(selectedMove?.effect || ""); + const moveDescriptionLineCount = Math.floor(this.moveDescriptionText.displayHeight / 14.83); - if (this.descriptionScrollTween) { - this.descriptionScrollTween.remove(); - this.descriptionScrollTween = null; - } + if (this.descriptionScrollTween) { + this.descriptionScrollTween.remove(); + this.descriptionScrollTween = null; + } - if (moveDescriptionLineCount > 3) { - this.descriptionScrollTween = this.scene.tweens.add({ - targets: this.moveDescriptionText, - delay: Utils.fixedInt(2000), - loop: -1, - hold: Utils.fixedInt(2000), - duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), - y: `-=${14.83 * (moveDescriptionLineCount - 3)}` - }); - } + if (moveDescriptionLineCount > 3) { + this.descriptionScrollTween = this.scene.tweens.add({ + targets: this.moveDescriptionText, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((moveDescriptionLineCount - 3) * 2000), + y: `-=${14.83 * (moveDescriptionLineCount - 3)}` + }); + } if (!this.moveCursorObj) { - this.moveCursorObj = this.scene.add.sprite(-2, 0, 'summary_moves_cursor', 'highlight'); + this.moveCursorObj = this.scene.add.sprite(-2, 0, "summary_moves_cursor", "highlight"); this.moveCursorObj.setOrigin(0, 1); this.movesContainer.add(this.moveCursorObj); } this.moveCursorObj.setY(16 * this.moveCursor + 1); - if (this.moveCursorBlinkTimer) + if (this.moveCursorBlinkTimer) { this.moveCursorBlinkTimer.destroy(); + } this.moveCursorObj.setVisible(true); this.moveCursorBlinkTimer = this.scene.time.addEvent({ loop: true, @@ -570,15 +583,16 @@ export default class SummaryUiHandler extends UiHandler { callback: () => { this.moveCursorObj.setVisible(false); this.scene.time.delayedCall(Utils.fixedInt(100), () => { - if (!this.moveCursorObj) + if (!this.moveCursorObj) { return; + } this.moveCursorObj.setVisible(true); }); } }); if (this.selectedMoveIndex > -1) { if (!this.selectedMoveCursorObj) { - this.selectedMoveCursorObj = this.scene.add.sprite(-2, 0, 'summary_moves_cursor', 'select'); + this.selectedMoveCursorObj = this.scene.add.sprite(-2, 0, "summary_moves_cursor", "select"); this.selectedMoveCursorObj.setOrigin(0, 1); this.movesContainer.add(this.selectedMoveCursorObj); this.movesContainer.moveBelow(this.selectedMoveCursorObj, this.moveCursorObj); @@ -599,13 +613,14 @@ export default class SummaryUiHandler extends UiHandler { if (this.summaryPageContainer.visible) { this.transitioning = true; this.populatePageContainer(this.summaryPageTransitionContainer, forward ? cursor : cursor + 1); - if (forward) + if (forward) { this.summaryPageTransitionContainer.x += 214; - else + } else { this.populatePageContainer(this.summaryPageContainer); + } this.scene.tweens.add({ targets: this.summaryPageTransitionContainer, - x: forward ? '-=214' : '+=214', + x: forward ? "-=214" : "+=214", duration: 250, onComplete: () => { if (forward){ @@ -615,9 +630,9 @@ export default class SummaryUiHandler extends UiHandler { this.showMoveSelect(); this.showMoveEffect(); } - } - else + } else { this.summaryPageTransitionContainer.x -= 214; + } this.summaryPageTransitionContainer.setVisible(false); this.transitioning = false; } @@ -634,13 +649,15 @@ export default class SummaryUiHandler extends UiHandler { } populatePageContainer(pageContainer: Phaser.GameObjects.Container, page?: Page) { - if (page === undefined) + if (page === undefined) { page = this.cursor; + } if (pageContainer.getAll().length > 1) { pageContainer.each((o: Phaser.GameObjects.GameObject) => { - if (o instanceof Phaser.GameObjects.Container) + if (o instanceof Phaser.GameObjects.Container) { o.removeAll(true); + } }); pageContainer.removeBetween(1, undefined, true); } @@ -653,327 +670,333 @@ export default class SummaryUiHandler extends UiHandler { } switch (page) { - case Page.PROFILE: - const profileContainer = this.scene.add.container(0, -pageBg.height); - pageContainer.add(profileContainer); - - const trainerLabel = addTextObject(this.scene, 7, 12, 'OT/', TextStyle.SUMMARY_ALT); - trainerLabel.setOrigin(0, 0); - profileContainer.add(trainerLabel); - - const trainerText = addTextObject(this.scene, 25, 12, loggedInUser?.username || 'Unknown', - this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); - trainerText.setOrigin(0, 0); - profileContainer.add(trainerText); - - const trainerIdText = addTextObject(this.scene, 174, 12, this.scene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); - trainerIdText.setOrigin(0, 0); - profileContainer.add(trainerIdText); - - const typeLabel = addTextObject(this.scene, 7, 28, 'Type/', TextStyle.WINDOW_ALT); - typeLabel.setOrigin(0, 0); - profileContainer.add(typeLabel); - - const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { - const xCoord = 39 + 34 * index; - const typeIcon = !tera - ? this.scene.add.sprite(xCoord, 42, 'types', Type[type].toLowerCase()) - : this.scene.add.sprite(xCoord, 42, 'type_tera'); - if (tera) { - typeIcon.setScale(0.5); - const typeRgb = getTypeRgb(type); - typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2])); - } - typeIcon.setOrigin(0, 1); - return typeIcon; - }; - - const types = this.pokemon.getTypes(false, false, true); - profileContainer.add(getTypeIcon(0, types[0])); - if (types.length > 1) - profileContainer.add(getTypeIcon(1, types[1])); - if (this.pokemon.isTerastallized()) - profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); - - if (this.pokemon.getLuck()) { - const luckLabelText = addTextObject(this.scene, 141, 28, 'Luck:', TextStyle.SUMMARY_ALT); - luckLabelText.setOrigin(0, 0); - profileContainer.add(luckLabelText); - - const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); - luckText.setOrigin(0, 0); - luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); - profileContainer.add(luckText); + case Page.PROFILE: + const profileContainer = this.scene.add.container(0, -pageBg.height); + pageContainer.add(profileContainer); + + const trainerLabel = addTextObject(this.scene, 7, 12, "OT/", TextStyle.SUMMARY_ALT); + trainerLabel.setOrigin(0, 0); + profileContainer.add(trainerLabel); + + const trainerText = addTextObject(this.scene, 25, 12, loggedInUser?.username || "Unknown", + this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + trainerText.setOrigin(0, 0); + profileContainer.add(trainerText); + + const trainerIdText = addTextObject(this.scene, 174, 12, this.scene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); + trainerIdText.setOrigin(0, 0); + profileContainer.add(trainerIdText); + + const typeLabel = addTextObject(this.scene, 7, 28, "Type/", TextStyle.WINDOW_ALT); + typeLabel.setOrigin(0, 0); + profileContainer.add(typeLabel); + + const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { + const xCoord = 39 + 34 * index; + const typeIcon = !tera + ? this.scene.add.sprite(xCoord, 42, "types", Type[type].toLowerCase()) + : this.scene.add.sprite(xCoord, 42, "type_tera"); + if (tera) { + typeIcon.setScale(0.5); + const typeRgb = getTypeRgb(type); + typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2])); } + typeIcon.setOrigin(0, 1); + return typeIcon; + }; + + const types = this.pokemon.getTypes(false, false, true); + profileContainer.add(getTypeIcon(0, types[0])); + if (types.length > 1) { + profileContainer.add(getTypeIcon(1, types[1])); + } + if (this.pokemon.isTerastallized()) { + profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); + } - this.abilityContainer = { - labelImage: this.scene.add.image(0, 0, 'summary_profile_ability'), - ability: this.pokemon.getAbility(true), - nameText: null, - descriptionText: null}; + if (this.pokemon.getLuck()) { + const luckLabelText = addTextObject(this.scene, 141, 28, "Luck:", TextStyle.SUMMARY_ALT); + luckLabelText.setOrigin(0, 0); + profileContainer.add(luckLabelText); + + const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); + luckText.setOrigin(0, 0); + luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); + profileContainer.add(luckText); + } + + this.abilityContainer = { + labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), + ability: this.pokemon.getAbility(true), + nameText: null, + descriptionText: null}; - const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through - // Only add to the array and set up displaying a passive if it's unlocked - if (this.pokemon.hasPassive()) { - this.passiveContainer = { - labelImage: this.scene.add.image(0, 0, 'summary_profile_passive'), - ability: this.pokemon.getPassiveAbility(), - nameText: null, - descriptionText: null}; - allAbilityInfo.push(this.passiveContainer); - - // Sets up the pixel button prompt image - this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.gamepadSupport ? 'summary_profile_prompt_z' : 'summary_profile_prompt_a'); - this.abilityPrompt.setPosition(8, 43); - this.abilityPrompt.setVisible(true); - this.abilityPrompt.setOrigin(0, 0); - profileContainer.add(this.abilityPrompt); - } + const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through + // Only add to the array and set up displaying a passive if it's unlocked + if (this.pokemon.hasPassive()) { + this.passiveContainer = { + labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), + ability: this.pokemon.getPassiveAbility(), + nameText: null, + descriptionText: null}; + allAbilityInfo.push(this.passiveContainer); + + // Sets up the pixel button prompt image + this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt.setPosition(8, 43); + this.abilityPrompt.setVisible(true); + this.abilityPrompt.setOrigin(0, 0); + profileContainer.add(this.abilityPrompt); + } - allAbilityInfo.forEach(abilityInfo => { - abilityInfo.labelImage.setPosition(17, 43); - abilityInfo.labelImage.setVisible(true); - abilityInfo.labelImage.setOrigin(0, 0); - profileContainer.add(abilityInfo.labelImage); - - abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability.name, TextStyle.SUMMARY_ALT); - abilityInfo.nameText.setOrigin(0, 1); - profileContainer.add(abilityInfo.nameText); - - abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability.description, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } }); - abilityInfo.descriptionText.setOrigin(0, 0); - profileContainer.add(abilityInfo.descriptionText); - - // Sets up the mask that hides the description text to give an illusion of scrolling - const descriptionTextMaskRect = this.scene.make.graphics({}); - descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); - descriptionTextMaskRect.beginPath(); - descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); - - const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); - - abilityInfo.descriptionText.setMask(abilityDescriptionTextMask); - - const abilityDescriptionLineCount = Math.floor(abilityInfo.descriptionText.displayHeight / 14.83); - - // Animates the description text moving upwards - if (abilityDescriptionLineCount > 2) { - abilityInfo.descriptionText.setY(69); - this.descriptionScrollTween = this.scene.tweens.add({ - targets: abilityInfo.descriptionText, - delay: Utils.fixedInt(2000), - loop: -1, - hold: Utils.fixedInt(2000), - duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), - y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` - }); - } - }); - // Turn off visibility of passive info by default - this.passiveContainer?.labelImage.setVisible(false); - this.passiveContainer?.nameText.setVisible(false); - this.passiveContainer?.descriptionText.setVisible(false); + allAbilityInfo.forEach(abilityInfo => { + abilityInfo.labelImage.setPosition(17, 43); + abilityInfo.labelImage.setVisible(true); + abilityInfo.labelImage.setOrigin(0, 0); + profileContainer.add(abilityInfo.labelImage); - let memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.getNature()]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(' nature,', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? 'apparently ' : ''}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(',', TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag('.', TextStyle.WINDOW_ALT)}`; + abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability.name, TextStyle.SUMMARY_ALT); + abilityInfo.nameText.setOrigin(0, 1); + profileContainer.add(abilityInfo.nameText); + + abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability.description, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 } }); + abilityInfo.descriptionText.setOrigin(0, 0); + profileContainer.add(abilityInfo.descriptionText); + + // Sets up the mask that hides the description text to give an illusion of scrolling + const descriptionTextMaskRect = this.scene.make.graphics({}); + descriptionTextMaskRect.setScale(6); + descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.beginPath(); + descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); + + const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); + + abilityInfo.descriptionText.setMask(abilityDescriptionTextMask); + + const abilityDescriptionLineCount = Math.floor(abilityInfo.descriptionText.displayHeight / 14.83); + + // Animates the description text moving upwards + if (abilityDescriptionLineCount > 2) { + abilityInfo.descriptionText.setY(69); + this.descriptionScrollTween = this.scene.tweens.add({ + targets: abilityInfo.descriptionText, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), + y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` + }); + } + }); + // Turn off visibility of passive info by default + this.passiveContainer?.labelImage.setVisible(false); + this.passiveContainer?.nameText.setVisible(false); + this.passiveContainer?.descriptionText.setVisible(false); + + const memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[this.pokemon.getNature()]), TextStyle.SUMMARY_RED)}${getBBCodeFrag(" nature,", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? "apparently " : ""}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(",", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag(".", TextStyle.WINDOW_ALT)}`; - const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); - memoText.setOrigin(0, 0); - profileContainer.add(memoText); - break; - case Page.STATS: - const statsContainer = this.scene.add.container(0, -pageBg.height); - pageContainer.add(statsContainer); - - const stats = Utils.getEnumValues(Stat) as Stat[]; - - stats.forEach((stat, s) => { - const statName = stat !== Stat.HP - ? getStatName(stat) - : 'HP'; - const rowIndex = s % 3; - const colIndex = Math.floor(s / 3); - - const natureStatMultiplier = getNatureStatMultiplier(this.pokemon.getNature(), s); - - const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex == 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); - statLabel.setOrigin(0.5, 0); - statsContainer.add(statLabel); - - const statValueText = stat !== Stat.HP - ? Utils.formatStat(this.pokemon.stats[s]) - : `${Utils.formatStat(this.pokemon.hp, true)}/${Utils.formatStat(this.pokemon.getMaxHp(), true)}`; - - const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); - statValue.setOrigin(1, 0); - statsContainer.add(statValue); - }); + const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); + memoText.setOrigin(0, 0); + profileContainer.add(memoText); + break; + case Page.STATS: + const statsContainer = this.scene.add.container(0, -pageBg.height); + pageContainer.add(statsContainer); + + const stats = Utils.getEnumValues(Stat) as Stat[]; + + stats.forEach((stat, s) => { + const statName = stat !== Stat.HP + ? getStatName(stat) + : "HP"; + const rowIndex = s % 3; + const colIndex = Math.floor(s / 3); + + const natureStatMultiplier = getNatureStatMultiplier(this.pokemon.getNature(), s); + + const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + statLabel.setOrigin(0.5, 0); + statsContainer.add(statLabel); + + const statValueText = stat !== Stat.HP + ? Utils.formatStat(this.pokemon.stats[s]) + : `${Utils.formatStat(this.pokemon.hp, true)}/${Utils.formatStat(this.pokemon.getMaxHp(), true)}`; + + const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); + statValue.setOrigin(1, 0); + statsContainer.add(statValue); + }); - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.pokemon.id, true) as PokemonHeldItemModifier[]; - itemModifiers.forEach((item, i) => { - const icon = item.getIcon(this.scene, true); + itemModifiers.forEach((item, i) => { + const icon = item.getIcon(this.scene, true); - icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); - statsContainer.add(icon); + icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); + statsContainer.add(icon); - icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); - icon.on('pointerover', () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); - icon.on('pointerout', () => (this.scene as BattleScene).ui.hideTooltip()); - }); + icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); + icon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); + icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + }); - const relLvExp = getLevelRelExp(this.pokemon.level + 1, this.pokemon.species.growthRate); - const expRatio = this.pokemon.level < this.scene.getMaxExpLevel() ? this.pokemon.levelExp / relLvExp : 0; + const relLvExp = getLevelRelExp(this.pokemon.level + 1, this.pokemon.species.growthRate); + const expRatio = this.pokemon.level < this.scene.getMaxExpLevel() ? this.pokemon.levelExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, 'EXP. Points', TextStyle.SUMMARY); - expLabel.setOrigin(0, 0); - statsContainer.add(expLabel); + const expLabel = addTextObject(this.scene, 6, 112, "EXP. Points", TextStyle.SUMMARY); + expLabel.setOrigin(0, 0); + statsContainer.add(expLabel); - const nextLvExpLabel = addTextObject(this.scene, 6, 128, 'Next Lv.', TextStyle.SUMMARY); - nextLvExpLabel.setOrigin(0, 0); - statsContainer.add(nextLvExpLabel); + const nextLvExpLabel = addTextObject(this.scene, 6, 128, "Next Lv.", TextStyle.SUMMARY); + nextLvExpLabel.setOrigin(0, 0); + statsContainer.add(nextLvExpLabel); - const expText = addTextObject(this.scene, 208, 112, this.pokemon.exp.toString(), TextStyle.WINDOW_ALT); - expText.setOrigin(1, 0); - statsContainer.add(expText); + const expText = addTextObject(this.scene, 208, 112, this.pokemon.exp.toString(), TextStyle.WINDOW_ALT); + expText.setOrigin(1, 0); + statsContainer.add(expText); - const nextLvExp = this.pokemon.level < this.scene.getMaxExpLevel() - ? getLevelTotalExp(this.pokemon.level + 1, this.pokemon.species.growthRate) - this.pokemon.exp - : 0; - const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); - nextLvExpText.setOrigin(1, 0); - statsContainer.add(nextLvExpText); + const nextLvExp = this.pokemon.level < this.scene.getMaxExpLevel() + ? getLevelTotalExp(this.pokemon.level + 1, this.pokemon.species.growthRate) - this.pokemon.exp + : 0; + const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); + nextLvExpText.setOrigin(1, 0); + statsContainer.add(nextLvExpText); - const expOverlay = this.scene.add.image(140, 145, 'summary_stats_overlay_exp'); - expOverlay.setOrigin(0, 0); - statsContainer.add(expOverlay); + const expOverlay = this.scene.add.image(140, 145, "summary_stats_overlay_exp"); + expOverlay.setOrigin(0, 0); + statsContainer.add(expOverlay); - const expMaskRect = this.scene.make.graphics({}); - expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); - expMaskRect.beginPath(); - expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); + const expMaskRect = this.scene.make.graphics({}); + expMaskRect.setScale(6); + expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.beginPath(); + expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); - const expMask = expMaskRect.createGeometryMask(); + const expMask = expMaskRect.createGeometryMask(); - expOverlay.setMask(expMask); - break; - case Page.MOVES: - this.movesContainer = this.scene.add.container(5, -pageBg.height + 26); - pageContainer.add(this.movesContainer); + expOverlay.setMask(expMask); + break; + case Page.MOVES: + this.movesContainer = this.scene.add.container(5, -pageBg.height + 26); + pageContainer.add(this.movesContainer); - this.extraMoveRowContainer = this.scene.add.container(0, 64); - this.extraMoveRowContainer.setVisible(false); - this.movesContainer.add(this.extraMoveRowContainer); + this.extraMoveRowContainer = this.scene.add.container(0, 64); + this.extraMoveRowContainer.setVisible(false); + this.movesContainer.add(this.extraMoveRowContainer); + + const extraRowOverlay = this.scene.add.image(-2, 1, "summary_moves_overlay_row"); + extraRowOverlay.setOrigin(0, 1); + this.extraMoveRowContainer.add(extraRowOverlay); + + const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? this.newMove.name : "Cancel", + this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); + extraRowText.setOrigin(0, 1); + this.extraMoveRowContainer.add(extraRowText); + + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { + this.extraMoveRowContainer.setVisible(true); + const newMoveTypeIcon = this.scene.add.sprite(0, 0, "types", Type[this.newMove.type].toLowerCase()); + newMoveTypeIcon.setOrigin(0, 1); + this.extraMoveRowContainer.add(newMoveTypeIcon); + + const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + ppOverlay.setOrigin(0, 1); + this.extraMoveRowContainer.add(ppOverlay); + + const pp = Utils.padInt(this.newMove.pp, 2, " "); + const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); + ppText.setOrigin(0, 1); + this.extraMoveRowContainer.add(ppText); + } - const extraRowOverlay = this.scene.add.image(-2, 1, 'summary_moves_overlay_row'); - extraRowOverlay.setOrigin(0, 1); - this.extraMoveRowContainer.add(extraRowOverlay); + this.moveRowsContainer = this.scene.add.container(0, 0); + this.movesContainer.add(this.moveRowsContainer); - const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? this.newMove.name : 'Cancel', - this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); - extraRowText.setOrigin(0, 1); - this.extraMoveRowContainer.add(extraRowText); + for (let m = 0; m < 4; m++) { + const move = m < this.pokemon.moveset.length ? this.pokemon.moveset[m] : null; + const moveRowContainer = this.scene.add.container(0, 16 * m); + this.moveRowsContainer.add(moveRowContainer); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.extraMoveRowContainer.setVisible(true); - const newMoveTypeIcon = this.scene.add.sprite(0, 0, 'types', Type[this.newMove.type].toLowerCase()); - newMoveTypeIcon.setOrigin(0, 1); - this.extraMoveRowContainer.add(newMoveTypeIcon); - - const ppOverlay = this.scene.add.image(163, -1, 'summary_moves_overlay_pp'); - ppOverlay.setOrigin(0, 1); - this.extraMoveRowContainer.add(ppOverlay); - - const pp = Utils.padInt(this.newMove.pp, 2, ' '); - const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); - ppText.setOrigin(0, 1); - this.extraMoveRowContainer.add(ppText); + if (move) { + const typeIcon = this.scene.add.sprite(0, 0, "types", Type[move.getMove().type].toLowerCase()); + typeIcon.setOrigin(0, 1); + moveRowContainer.add(typeIcon); } - this.moveRowsContainer = this.scene.add.container(0, 0); - this.movesContainer.add(this.moveRowsContainer); - - for (let m = 0; m < 4; m++) { - const move = m < this.pokemon.moveset.length ? this.pokemon.moveset[m] : null; - const moveRowContainer = this.scene.add.container(0, 16 * m); - this.moveRowsContainer.add(moveRowContainer); - - if (move) { - const typeIcon = this.scene.add.sprite(0, 0, 'types', Type[move.getMove().type].toLowerCase()); - typeIcon.setOrigin(0, 1); - moveRowContainer.add(typeIcon); - } - - const moveText = addTextObject(this.scene, 35, 0, move ? move.getName() : '-', TextStyle.SUMMARY); - moveText.setOrigin(0, 1); - moveRowContainer.add(moveText); - - const ppOverlay = this.scene.add.image(163, -1, 'summary_moves_overlay_pp'); - ppOverlay.setOrigin(0, 1); - moveRowContainer.add(ppOverlay); + const moveText = addTextObject(this.scene, 35, 0, move ? move.getName() : "-", TextStyle.SUMMARY); + moveText.setOrigin(0, 1); + moveRowContainer.add(moveText); - const ppText = addTextObject(this.scene, 173, 1, '--/--', TextStyle.WINDOW); - ppText.setOrigin(0, 1); + const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + ppOverlay.setOrigin(0, 1); + moveRowContainer.add(ppOverlay); - if (move) { - const maxPP = move.getMovePp(); - const pp = maxPP - move.ppUsed; - ppText.setText(`${Utils.padInt(pp, 2, ' ')}/${Utils.padInt(maxPP, 2, ' ')}`); - } + const ppText = addTextObject(this.scene, 173, 1, "--/--", TextStyle.WINDOW); + ppText.setOrigin(0, 1); - moveRowContainer.add(ppText); + if (move) { + const maxPP = move.getMovePp(); + const pp = maxPP - move.ppUsed; + ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); } - this.moveDescriptionText = addTextObject(this.scene, 2, 84, '', TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 } }); - this.movesContainer.add(this.moveDescriptionText); + moveRowContainer.add(ppText); + } + + this.moveDescriptionText = addTextObject(this.scene, 2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 } }); + this.movesContainer.add(this.moveDescriptionText); - const moveDescriptionTextMaskRect = this.scene.make.graphics({}); - moveDescriptionTextMaskRect.setScale(6); - moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); - moveDescriptionTextMaskRect.beginPath(); - moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); + const moveDescriptionTextMaskRect = this.scene.make.graphics({}); + moveDescriptionTextMaskRect.setScale(6); + moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); + moveDescriptionTextMaskRect.beginPath(); + moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); - const moveDescriptionTextMask = moveDescriptionTextMaskRect.createGeometryMask(); + const moveDescriptionTextMask = moveDescriptionTextMaskRect.createGeometryMask(); - this.moveDescriptionText.setMask(moveDescriptionTextMask); - break; + this.moveDescriptionText.setMask(moveDescriptionTextMask); + break; } } showStatus(instant?: boolean) { - if (this.statusVisible) + if (this.statusVisible) { return; + } this.statusVisible = true; this.scene.tweens.add({ targets: this.statusContainer, x: 0, duration: instant ? 0 : 250, - ease: 'Sine.easeOut' + ease: "Sine.easeOut" }); } hideStatus(instant?: boolean) { - if (!this.statusVisible) + if (!this.statusVisible) { return; + } this.statusVisible = false; this.scene.tweens.add({ targets: this.statusContainer, x: -106, duration: instant ? 0 : 250, - ease: 'Sine.easeIn' + ease: "Sine.easeIn" }); } getSelectedMove(): Move { - if (this.cursor !== Page.MOVES) + if (this.cursor !== Page.MOVES) { return null; + } - if (this.moveCursor < 4 && this.moveCursor < this.pokemon.moveset.length) + if (this.moveCursor < 4 && this.moveCursor < this.pokemon.moveset.length) { return this.pokemon.moveset[this.moveCursor].getMove(); - else if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) + } else if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.moveCursor === 4) { return this.newMove; + } return null; } @@ -993,7 +1016,7 @@ export default class SummaryUiHandler extends UiHandler { this.moveSelect = false; this.extraMoveRowContainer.setVisible(false); - this.moveDescriptionText.setText(''); + this.moveDescriptionText.setText(""); this.destroyBlinkCursor(); this.hideMoveEffect(); @@ -1015,26 +1038,28 @@ export default class SummaryUiHandler extends UiHandler { } showMoveEffect(instant?: boolean) { - if (this.moveEffectsVisible) + if (this.moveEffectsVisible) { return; + } this.moveEffectsVisible = true; this.scene.tweens.add({ targets: this.moveEffectContainer, x: 6, duration: instant ? 0 : 250, - ease: 'Sine.easeOut' + ease: "Sine.easeOut" }); } hideMoveEffect(instant?: boolean) { - if (!this.moveEffectsVisible) + if (!this.moveEffectsVisible) { return; + } this.moveEffectsVisible = false; this.scene.tweens.add({ targets: this.moveEffectContainer, x: 106, duration: instant ? 0 : 250, - ease: 'Sine.easeIn' + ease: "Sine.easeIn" }); } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 36588dc4784d..0f6fce3b274a 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -26,8 +26,9 @@ export default class TargetSelectUiHandler extends UiHandler { setup(): void { } show(args: any[]): boolean { - if (args.length < 3) + if (args.length < 3) { return false; + } super.show(args); @@ -37,8 +38,9 @@ export default class TargetSelectUiHandler extends UiHandler { this.targets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move).targets; - if (!this.targets.length) + if (!this.targets.length) { return false; + } this.setCursor(this.targets.indexOf(this.cursor) > -1 ? this.cursor : this.targets[0]); @@ -55,27 +57,32 @@ export default class TargetSelectUiHandler extends UiHandler { success = true; } else { switch (button) { - case Button.UP: - if (this.cursor < BattlerIndex.ENEMY && this.targets.findIndex(t => t >= BattlerIndex.ENEMY) > -1) - success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)); - break; - case Button.DOWN: - if (this.cursor >= BattlerIndex.ENEMY && this.targets.findIndex(t => t < BattlerIndex.ENEMY) > -1) - success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)); - break; - case Button.LEFT: - if (this.cursor % 2 && this.targets.findIndex(t => t === this.cursor - 1) > -1) - success = this.setCursor(this.cursor - 1); - break; - case Button.RIGHT: - if (!(this.cursor % 2) && this.targets.findIndex(t => t === this.cursor + 1) > -1) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (this.cursor < BattlerIndex.ENEMY && this.targets.findIndex(t => t >= BattlerIndex.ENEMY) > -1) { + success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)); + } + break; + case Button.DOWN: + if (this.cursor >= BattlerIndex.ENEMY && this.targets.findIndex(t => t < BattlerIndex.ENEMY) > -1) { + success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)); + } + break; + case Button.LEFT: + if (this.cursor % 2 && this.targets.findIndex(t => t === this.cursor - 1) > -1) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (!(this.cursor % 2) && this.targets.findIndex(t => t === this.cursor + 1) > -1) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } @@ -88,8 +95,9 @@ export default class TargetSelectUiHandler extends UiHandler { if (this.targetFlashTween) { this.targetFlashTween.stop(); const lastTarget = this.scene.getField()[lastCursor]; - if (lastTarget) + if (lastTarget) { lastTarget.setAlpha(1); + } } const target = this.scene.getField()[cursor]; @@ -99,11 +107,12 @@ export default class TargetSelectUiHandler extends UiHandler { alpha: 0, loop: -1, duration: Utils.fixedInt(250), - ease: 'Sine.easeIn', + ease: "Sine.easeIn", yoyo: true, onUpdate: t => { - if (target) + if (target) { target.setAlpha(t.getValue()); + } } }); @@ -116,12 +125,13 @@ export default class TargetSelectUiHandler extends UiHandler { this.targetFlashTween.stop(); this.targetFlashTween = null; } - if (target) + if (target) { target.setAlpha(1); + } } clear() { super.clear(); this.eraseCursor(); } -} \ No newline at end of file +} diff --git a/src/ui/text.ts b/src/ui/text.ts index 0021fd22b647..c9f75360f953 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -27,7 +27,7 @@ export enum TextStyle { TOOLTIP_TITLE, TOOLTIP_CONTENT, MOVE_INFO_CONTENT -}; +} interface LanguageSetting { summaryFontSize?: string, @@ -46,7 +46,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { "fr":{}, "zh_CN":{}, "pt_BR":{}, -} +}; export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text { const [ styleOptions, shadowColor, shadowXpos, shadowYpos ] = getTextStyleOptions(style, (scene as BattleScene).uiTheme, extraStyleOptions); @@ -54,8 +54,9 @@ export function addTextObject(scene: Phaser.Scene, x: number, y: number, content const ret = scene.add.text(x, y, content, styleOptions); ret.setScale(0.1666666667); ret.setShadow(shadowXpos, shadowYpos, shadowColor); - if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) + if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { ret.setLineSpacing(5); + } return ret; } @@ -67,8 +68,9 @@ export function addBBCodeTextObject(scene: Phaser.Scene, x: number, y: number, c scene.add.existing(ret); ret.setScale(0.1666666667); ret.setShadow(shadowXpos, shadowYpos, shadowColor); - if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) + if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) { ret.setLineSpacing(10); + } return ret; } @@ -85,13 +87,12 @@ export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, wi function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, integer ] { const lang = i18next.language; - let shadowColor: string; let shadowXpos = 4; let shadowYpos = 5; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { - fontFamily: 'emerald', - fontSize: '96px', + fontFamily: "emerald", + fontSize: "96px", color: getTextColor(style, false, uiTheme), padding: { bottom: 6 @@ -99,48 +100,48 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio }; switch (style) { - case TextStyle.SUMMARY: - case TextStyle.SUMMARY_ALT: - case TextStyle.SUMMARY_BLUE: - case TextStyle.SUMMARY_RED: - case TextStyle.SUMMARY_PINK: - case TextStyle.SUMMARY_GOLD: - case TextStyle.SUMMARY_GRAY: - case TextStyle.SUMMARY_GREEN: - case TextStyle.WINDOW: - case TextStyle.WINDOW_ALT: - shadowXpos = 3; - shadowYpos = 3; - case TextStyle.MESSAGE: - case TextStyle.SETTINGS_LABEL: - case TextStyle.SETTINGS_SELECTED: - styleOptions.fontSize = languageSettings[lang]?.summaryFontSize || '96px'; - break; - case TextStyle.BATTLE_INFO: - case TextStyle.MONEY: - case TextStyle.TOOLTIP_TITLE: - styleOptions.fontSize = languageSettings[lang]?.battleInfoFontSize || '72px'; - shadowXpos = 3.5; - shadowYpos = 3.5; - break; - case TextStyle.PARTY: - case TextStyle.PARTY_RED: - styleOptions.fontSize = languageSettings[lang]?.partyFontSize || '66px'; - styleOptions.fontFamily = 'pkmnems'; - break; - case TextStyle.TOOLTIP_CONTENT: - styleOptions.fontSize = languageSettings[lang]?.tooltipContentFontSize || '64px'; - shadowXpos = 3; - shadowYpos = 3; - break; - case TextStyle.MOVE_INFO_CONTENT: - styleOptions.fontSize = languageSettings[lang]?.moveInfoFontSize || '56px'; - shadowXpos = 3; - shadowYpos = 3; - break; + case TextStyle.SUMMARY: + case TextStyle.SUMMARY_ALT: + case TextStyle.SUMMARY_BLUE: + case TextStyle.SUMMARY_RED: + case TextStyle.SUMMARY_PINK: + case TextStyle.SUMMARY_GOLD: + case TextStyle.SUMMARY_GRAY: + case TextStyle.SUMMARY_GREEN: + case TextStyle.WINDOW: + case TextStyle.WINDOW_ALT: + shadowXpos = 3; + shadowYpos = 3; + case TextStyle.MESSAGE: + case TextStyle.SETTINGS_LABEL: + case TextStyle.SETTINGS_SELECTED: + styleOptions.fontSize = languageSettings[lang]?.summaryFontSize || "96px"; + break; + case TextStyle.BATTLE_INFO: + case TextStyle.MONEY: + case TextStyle.TOOLTIP_TITLE: + styleOptions.fontSize = languageSettings[lang]?.battleInfoFontSize || "72px"; + shadowXpos = 3.5; + shadowYpos = 3.5; + break; + case TextStyle.PARTY: + case TextStyle.PARTY_RED: + styleOptions.fontSize = languageSettings[lang]?.partyFontSize || "66px"; + styleOptions.fontFamily = "pkmnems"; + break; + case TextStyle.TOOLTIP_CONTENT: + styleOptions.fontSize = languageSettings[lang]?.tooltipContentFontSize || "64px"; + shadowXpos = 3; + shadowYpos = 3; + break; + case TextStyle.MOVE_INFO_CONTENT: + styleOptions.fontSize = languageSettings[lang]?.moveInfoFontSize || "56px"; + shadowXpos = 3; + shadowYpos = 3; + break; } - shadowColor = getTextColor(style, true, uiTheme); + const shadowColor = getTextColor(style, true, uiTheme); if (extraStyleOptions) { if (extraStyleOptions.fontSize) { @@ -159,77 +160,80 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { switch (textStyle) { - case TextStyle.MESSAGE: - return !shadow ? '#f8f8f8' : '#6b5a73'; - case TextStyle.WINDOW: - case TextStyle.MOVE_INFO_CONTENT: - case TextStyle.TOOLTIP_CONTENT: - if (uiTheme) - return !shadow ? '#484848' : '#d0d0c8'; - return !shadow ? '#f8f8f8' : '#6b5a73'; - case TextStyle.WINDOW_ALT: - return !shadow ? '#484848' : '#d0d0c8'; - case TextStyle.BATTLE_INFO: - if (uiTheme) - return !shadow ? '#404040' : '#ded6b5'; - return !shadow ? '#f8f8f8' : '#6b5a73'; - case TextStyle.PARTY: - return !shadow ? '#f8f8f8' : '#707070'; - case TextStyle.PARTY_RED: - return !shadow ? '#f89890' : '#984038'; - case TextStyle.SUMMARY: - return !shadow ? '#ffffff' : '#636363'; - case TextStyle.SUMMARY_ALT: - if (uiTheme) - return !shadow ? '#ffffff' : '#636363'; - return !shadow ? '#484848' : '#d0d0c8'; - case TextStyle.SUMMARY_RED: - case TextStyle.TOOLTIP_TITLE: - return !shadow ? '#e70808' : '#ffbd73'; - case TextStyle.SUMMARY_BLUE: - return !shadow ? '#40c8f8' : '#006090'; - case TextStyle.SUMMARY_PINK: - return !shadow ? '#f89890' : '#984038'; - case TextStyle.SUMMARY_GOLD: - case TextStyle.MONEY: - return !shadow ? '#e8e8a8' : '#a0a060'; - case TextStyle.SUMMARY_GRAY: - return !shadow ? '#a0a0a0' : '#636363'; - case TextStyle.SUMMARY_GREEN: - return !shadow ? '#78c850' : '#306850'; - case TextStyle.SETTINGS_LABEL: - return !shadow ? '#f8b050' : '#c07800'; - case TextStyle.SETTINGS_SELECTED: - return !shadow ? '#f88880' : '#f83018'; + case TextStyle.MESSAGE: + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.WINDOW: + case TextStyle.MOVE_INFO_CONTENT: + case TextStyle.TOOLTIP_CONTENT: + if (uiTheme) { + return !shadow ? "#484848" : "#d0d0c8"; + } + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.WINDOW_ALT: + return !shadow ? "#484848" : "#d0d0c8"; + case TextStyle.BATTLE_INFO: + if (uiTheme) { + return !shadow ? "#404040" : "#ded6b5"; + } + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.PARTY: + return !shadow ? "#f8f8f8" : "#707070"; + case TextStyle.PARTY_RED: + return !shadow ? "#f89890" : "#984038"; + case TextStyle.SUMMARY: + return !shadow ? "#ffffff" : "#636363"; + case TextStyle.SUMMARY_ALT: + if (uiTheme) { + return !shadow ? "#ffffff" : "#636363"; + } + return !shadow ? "#484848" : "#d0d0c8"; + case TextStyle.SUMMARY_RED: + case TextStyle.TOOLTIP_TITLE: + return !shadow ? "#e70808" : "#ffbd73"; + case TextStyle.SUMMARY_BLUE: + return !shadow ? "#40c8f8" : "#006090"; + case TextStyle.SUMMARY_PINK: + return !shadow ? "#f89890" : "#984038"; + case TextStyle.SUMMARY_GOLD: + case TextStyle.MONEY: + return !shadow ? "#e8e8a8" : "#a0a060"; + case TextStyle.SUMMARY_GRAY: + return !shadow ? "#a0a0a0" : "#636363"; + case TextStyle.SUMMARY_GREEN: + return !shadow ? "#78c850" : "#306850"; + case TextStyle.SETTINGS_LABEL: + return !shadow ? "#f8b050" : "#c07800"; + case TextStyle.SETTINGS_SELECTED: + return !shadow ? "#f88880" : "#f83018"; } } export function getModifierTierTextTint(tier: ModifierTier): integer { switch (tier) { - case ModifierTier.COMMON: - return 0xffffff; - case ModifierTier.GREAT: - return 0x3890f8; - case ModifierTier.ULTRA: - return 0xf8d038; - case ModifierTier.ROGUE: - return 0xd52929; - case ModifierTier.MASTER: - return 0xe020c0; - case ModifierTier.LUXURY: - return 0xe64a18; + case ModifierTier.COMMON: + return 0xffffff; + case ModifierTier.GREAT: + return 0x3890f8; + case ModifierTier.ULTRA: + return 0xf8d038; + case ModifierTier.ROGUE: + return 0xd52929; + case ModifierTier.MASTER: + return 0xe020c0; + case ModifierTier.LUXURY: + return 0xe64a18; } } export function getEggTierTextTint(tier: EggTier): integer { switch (tier) { - case EggTier.COMMON: - return getModifierTierTextTint(ModifierTier.COMMON); - case EggTier.GREAT: - return getModifierTierTextTint(ModifierTier.GREAT); - case EggTier.ULTRA: - return getModifierTierTextTint(ModifierTier.ULTRA); - case EggTier.MASTER: - return getModifierTierTextTint(ModifierTier.MASTER); + case EggTier.COMMON: + return getModifierTierTextTint(ModifierTier.COMMON); + case EggTier.GREAT: + return getModifierTierTextTint(ModifierTier.GREAT); + case EggTier.ULTRA: + return getModifierTierTextTint(ModifierTier.ULTRA); + case EggTier.MASTER: + return getModifierTierTextTint(ModifierTier.MASTER); } -} \ No newline at end of file +} diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 4da4f189f6ba..7c507cd28f78 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -29,22 +29,22 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.setAlpha(0); ui.add(this.titleContainer); - const logo = this.scene.add.image((this.scene.game.canvas.width / 6) / 2, 8, 'logo'); + const logo = this.scene.add.image((this.scene.game.canvas.width / 6) / 2, 8, "logo"); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); this.dailyRunScoreboard = new DailyRunScoreboard(this.scene, 1, 44); - this.dailyRunScoreboard.setup(); + this.dailyRunScoreboard.setup(); this.titleContainer.add(this.dailyRunScoreboard); - this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 90, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: '54px' }); + this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 90, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" }); this.playerCountLabel.setOrigin(1, 0); this.titleContainer.add(this.playerCountLabel); - this.splashMessageText = addTextObject(this.scene, logo.x + 64, logo.y + logo.displayHeight - 8, '', TextStyle.MONEY, { fontSize: '54px' }); + this.splashMessageText = addTextObject(this.scene, logo.x + 64, logo.y + logo.displayHeight - 8, "", TextStyle.MONEY, { fontSize: "54px" }); this.splashMessageText.setOrigin(0.5, 0.5); - this.splashMessageText.setAngle(-20) + this.splashMessageText.setAngle(-20); this.titleContainer.add(this.splashMessageText); const originalSplashMessageScale = this.splashMessageText.scale; @@ -55,16 +55,17 @@ export default class TitleUiHandler extends OptionSelectUiHandler { scale: originalSplashMessageScale * 1.25, loop: -1, yoyo: true, - }) + }); } updateTitleStats(): void { - Utils.apiFetch(`game/titlestats`) + Utils.apiFetch("game/titlestats") .then(request => request.json()) .then(stats => { this.playerCountLabel.setText(`${stats.playerCount} ${i18next.t("menu:playersOnline")}`); - if (this.splashMessage === getBattleCountSplashMessage()) - this.splashMessageText.setText(getBattleCountSplashMessage().replace('{COUNT}', stats.battleCount.toLocaleString('en-US'))); + if (this.splashMessage === getBattleCountSplashMessage()) { + this.splashMessageText.setText(getBattleCountSplashMessage().replace("{COUNT}", stats.battleCount.toLocaleString("en-US"))); + } }) .catch(err => { console.error("Failed to fetch title stats:\n", err); @@ -76,7 +77,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { if (ret) { this.splashMessage = Utils.randItem(getSplashMessages()); - this.splashMessageText.setText(this.splashMessage.replace('{COUNT}', '?')); + this.splashMessageText.setText(this.splashMessage.replace("{COUNT}", "?")); const ui = this.getUi(); @@ -90,7 +91,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { targets: [ this.titleContainer, ui.getMessageHandler().bg ], duration: Utils.fixedInt(325), alpha: (target: any) => target === this.titleContainer ? 1 : 0, - ease: 'Sine.easeInOut' + ease: "Sine.easeInOut" }); } @@ -109,7 +110,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { targets: [ this.titleContainer, ui.getMessageHandler().bg ], duration: Utils.fixedInt(325), alpha: (target: any) => target === this.titleContainer ? 0 : 1, - ease: 'Sine.easeInOut' + ease: "Sine.easeInOut" }); } -} \ No newline at end of file +} diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index 7fdb85d94c05..74015ed7245c 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../battle-scene"; import { TextStyle, getTextColor } from "./text"; -import UI, { Mode } from "./ui"; +import { Mode } from "./ui"; import {Button} from "../enums/buttons"; export default abstract class UiHandler { @@ -38,8 +38,9 @@ export default abstract class UiHandler { setCursor(cursor: integer): boolean { const changed = this.cursor !== cursor; - if (changed) + if (changed) { this.cursor = cursor; + } return changed; } @@ -47,4 +48,4 @@ export default abstract class UiHandler { clear() { this.active = false; } -} \ No newline at end of file +} diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index a08acc04aff7..f7eaec9d4835 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -10,35 +10,36 @@ export enum WindowVariant { export function getWindowVariantSuffix(windowVariant: WindowVariant): string { switch (windowVariant) { - case WindowVariant.THIN: - return '_thin'; - case WindowVariant.XTHIN: - return '_xthin'; - default: - return ''; + case WindowVariant.THIN: + return "_thin"; + case WindowVariant.XTHIN: + return "_xthin"; + default: + return ""; } } const windowTypeControlColors = { [UiTheme.DEFAULT]: { - 0: [ '#6b5a73', '#DD5748', '#7E4955' ], - 1: [ '#6b5a73', '#48DDAA', '#4D7574' ], - 2: [ '#6b5a73', '#C5C5C5', '#766D7E' ], - 3: [ '#6b5a73', '#EBC07C', '#836C66' ], - 4: [ '#686868', '#E8E8E8', '#919191' ] + 0: [ "#6b5a73", "#DD5748", "#7E4955" ], + 1: [ "#6b5a73", "#48DDAA", "#4D7574" ], + 2: [ "#6b5a73", "#C5C5C5", "#766D7E" ], + 3: [ "#6b5a73", "#EBC07C", "#836C66" ], + 4: [ "#686868", "#E8E8E8", "#919191" ] }, [UiTheme.LEGACY]: { - 0: [ '#706880', '#8888c8', '#484868' ], - 1: [ '#d04028', '#e0a028', '#902008' ], - 2: [ '#48b840', '#88d880', '#089040' ], - 3: [ '#2068d0', '#80b0e0', '#104888' ], - 4: [ '#706880', '#8888c8', '#484868' ] + 0: [ "#706880", "#8888c8", "#484868" ], + 1: [ "#d04028", "#e0a028", "#902008" ], + 2: [ "#48b840", "#88d880", "#089040" ], + 3: [ "#2068d0", "#80b0e0", "#104888" ], + 4: [ "#706880", "#8888c8", "#484868" ] } }; export function addWindow(scene: BattleScene, x: number, y: number, width: number, height: number, mergeMaskTop?: boolean, mergeMaskLeft?: boolean, maskOffsetX?: number, maskOffsetY?: number, windowVariant?: WindowVariant): Phaser.GameObjects.NineSlice { - if (windowVariant === undefined) + if (windowVariant === undefined) { windowVariant = WindowVariant.NORMAL; + } const borderSize = scene.uiTheme ? 6 : 8; @@ -61,53 +62,59 @@ export function updateWindowType(scene: BattleScene, windowTypeIndex: integer): const windowObjects: [Phaser.GameObjects.NineSlice, WindowVariant][] = []; const themedObjects: (Phaser.GameObjects.Image | Phaser.GameObjects.NineSlice)[] = []; const traverse = (object: any) => { - if (object.hasOwnProperty('children') && object.children instanceof Phaser.GameObjects.DisplayList) { + if (object.hasOwnProperty("children") && object.children instanceof Phaser.GameObjects.DisplayList) { const children = object.children as Phaser.GameObjects.DisplayList; - for (let child of children.getAll()) + for (const child of children.getAll()) { traverse(child); + } } else if (object instanceof Phaser.GameObjects.Container) { - for (let child of object.getAll()) + for (const child of object.getAll()) { traverse(child); + } } else if (object instanceof Phaser.GameObjects.NineSlice) { - if (object.texture.key.startsWith('window_')) + if (object.texture.key.startsWith("window_")) { windowObjects.push([ object, object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.XTHIN)) ? WindowVariant.XTHIN : object.texture.key.endsWith(getWindowVariantSuffix(WindowVariant.THIN)) ? WindowVariant.THIN : WindowVariant.NORMAL ]); - else if (object.texture?.key === 'namebox') + } else if (object.texture?.key === "namebox") { themedObjects.push(object); + } } else if (object instanceof Phaser.GameObjects.Sprite) { - if (object.texture?.key === 'bg') + if (object.texture?.key === "bg") { themedObjects.push(object); + } } - } + }; traverse(scene); scene.windowType = windowTypeIndex; const rootStyle = document.documentElement.style; - [ 'base', 'light', 'dark' ].map((k, i) => rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[scene.uiTheme][windowTypeIndex - 1][i])); + [ "base", "light", "dark" ].map((k, i) => rootStyle.setProperty(`--color-${k}`, windowTypeControlColors[scene.uiTheme][windowTypeIndex - 1][i])); const windowKey = `window_${windowTypeIndex}`; - for (let [ window, variant ] of windowObjects) + for (const [ window, variant ] of windowObjects) { window.setTexture(`${windowKey}${getWindowVariantSuffix(variant)}`); + } - for (let obj of themedObjects) + for (const obj of themedObjects) { obj.setFrame(windowTypeIndex); + } } export function addUiThemeOverrides(scene: BattleScene): void { const originalAddImage = scene.add.image; scene.add.image = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Image { let legacy = false; - if (typeof texture === 'string' && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; - texture += '_legacy'; + texture += "_legacy"; } const ret: Phaser.GameObjects.Image = originalAddImage.apply(this, [ x, y, texture, frame ]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { - key += '_legacy'; + key += "_legacy"; return originalSetTexture.apply(this, [ key, frame ]); }; } @@ -117,15 +124,15 @@ export function addUiThemeOverrides(scene: BattleScene): void { const originalAddSprite = scene.add.sprite; scene.add.sprite = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Sprite { let legacy = false; - if (typeof texture === 'string' && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; - texture += '_legacy'; + texture += "_legacy"; } const ret: Phaser.GameObjects.Sprite = originalAddSprite.apply(this, [ x, y, texture, frame ]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string, frame?: string | number) { - key += '_legacy'; + key += "_legacy"; return originalSetTexture.apply(this, [ key, frame ]); }; } @@ -135,18 +142,18 @@ export function addUiThemeOverrides(scene: BattleScene): void { const originalAddNineslice = scene.add.nineslice; scene.add.nineslice = function (x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number): Phaser.GameObjects.NineSlice { let legacy = false; - if (typeof texture === 'string' && scene.uiTheme && legacyCompatibleImages.includes(texture)) { + if (typeof texture === "string" && scene.uiTheme && legacyCompatibleImages.includes(texture)) { legacy = true; - texture += '_legacy'; + texture += "_legacy"; } const ret: Phaser.GameObjects.NineSlice = originalAddNineslice.apply(this, [ x, y, texture, frame, width, height, leftWidth, rightWidth, topHeight, bottomHeight ]); if (legacy) { const originalSetTexture = ret.setTexture; ret.setTexture = function (key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean) { - key += '_legacy'; + key += "_legacy"; return originalSetTexture.apply(this, [ key, frame, updateSize, updateOrigin ]); }; } return ret; }; -} \ No newline at end of file +} diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 09deb2bdd7a1..e5b74b332250 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -1,40 +1,40 @@ -import { default as BattleScene } from '../battle-scene'; -import UiHandler from './ui-handler'; -import BattleMessageUiHandler from './battle-message-ui-handler'; -import CommandUiHandler from './command-ui-handler'; -import PartyUiHandler from './party-ui-handler'; -import FightUiHandler from './fight-ui-handler'; -import MessageUiHandler from './message-ui-handler'; -import ConfirmUiHandler from './confirm-ui-handler'; -import ModifierSelectUiHandler from './modifier-select-ui-handler'; -import BallUiHandler from './ball-ui-handler'; -import SummaryUiHandler from './summary-ui-handler'; -import StarterSelectUiHandler from './starter-select-ui-handler'; -import EvolutionSceneHandler from './evolution-scene-handler'; -import TargetSelectUiHandler from './target-select-ui-handler'; -import SettingsUiHandler from './settings-ui-handler'; -import { TextStyle, addTextObject } from './text'; -import AchvBar from './achv-bar'; -import MenuUiHandler from './menu-ui-handler'; -import AchvsUiHandler from './achvs-ui-handler'; -import OptionSelectUiHandler from './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 VouchersUiHandler from './vouchers-ui-handler'; -import { addWindow } from './ui-theme'; -import LoginFormUiHandler from './login-form-ui-handler'; -import RegistrationFormUiHandler from './registration-form-ui-handler'; -import LoadingModalUiHandler from './loading-modal-ui-handler'; +import { default as BattleScene } from "../battle-scene"; +import UiHandler from "./ui-handler"; +import BattleMessageUiHandler from "./battle-message-ui-handler"; +import CommandUiHandler from "./command-ui-handler"; +import PartyUiHandler from "./party-ui-handler"; +import FightUiHandler from "./fight-ui-handler"; +import MessageUiHandler from "./message-ui-handler"; +import ConfirmUiHandler from "./confirm-ui-handler"; +import ModifierSelectUiHandler from "./modifier-select-ui-handler"; +import BallUiHandler from "./ball-ui-handler"; +import SummaryUiHandler from "./summary-ui-handler"; +import StarterSelectUiHandler from "./starter-select-ui-handler"; +import EvolutionSceneHandler from "./evolution-scene-handler"; +import TargetSelectUiHandler from "./target-select-ui-handler"; +import SettingsUiHandler from "./settings-ui-handler"; +import { TextStyle, addTextObject } from "./text"; +import AchvBar from "./achv-bar"; +import MenuUiHandler from "./menu-ui-handler"; +import AchvsUiHandler from "./achvs-ui-handler"; +import OptionSelectUiHandler from "./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 VouchersUiHandler from "./vouchers-ui-handler"; +import { addWindow } from "./ui-theme"; +import LoginFormUiHandler from "./login-form-ui-handler"; +import RegistrationFormUiHandler from "./registration-form-ui-handler"; +import LoadingModalUiHandler from "./loading-modal-ui-handler"; import * as Utils from "../utils"; -import GameStatsUiHandler from './game-stats-ui-handler'; -import AwaitableUiHandler from './awaitable-ui-handler'; -import SaveSlotSelectUiHandler from './save-slot-select-ui-handler'; -import TitleUiHandler from './title-ui-handler'; -import SavingIconHandler from './saving-icon-handler'; -import UnavailableModalUiHandler from './unavailable-modal-ui-handler'; -import OutdatedModalUiHandler from './outdated-modal-ui-handler'; -import SessionReloadModalUiHandler from './session-reload-modal-ui-handler'; +import GameStatsUiHandler from "./game-stats-ui-handler"; +import AwaitableUiHandler from "./awaitable-ui-handler"; +import SaveSlotSelectUiHandler from "./save-slot-select-ui-handler"; +import TitleUiHandler from "./title-ui-handler"; +import SavingIconHandler from "./saving-icon-handler"; +import UnavailableModalUiHandler from "./unavailable-modal-ui-handler"; +import OutdatedModalUiHandler from "./outdated-modal-ui-handler"; +import SessionReloadModalUiHandler from "./session-reload-modal-ui-handler"; import {Button} from "../enums/buttons"; export enum Mode { @@ -67,7 +67,7 @@ export enum Mode { SESSION_RELOAD, UNAVAILABLE, OUTDATED -}; +} const transitionModes = [ Mode.SAVE_SLOT, @@ -152,8 +152,9 @@ export default class UI extends Phaser.GameObjects.Container { } setup(): void { - for (let handler of this.handlers) + for (const handler of this.handlers) { handler.setup(); + } this.overlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0); this.overlay.setOrigin(0, 0); (this.scene as BattleScene).uiContainer.add(this.overlay); @@ -178,11 +179,11 @@ export default class UI extends Phaser.GameObjects.Container { this.tooltipBg = addWindow(this.scene as BattleScene, 0, 0, 128, 31); this.tooltipBg.setOrigin(0, 0); - this.tooltipTitle = addTextObject(this.scene, 64, 4, '', TextStyle.TOOLTIP_TITLE); + this.tooltipTitle = addTextObject(this.scene, 64, 4, "", TextStyle.TOOLTIP_TITLE); this.tooltipTitle.setOrigin(0.5, 0); - this.tooltipContent = addTextObject(this.scene, 6, 16, '', TextStyle.TOOLTIP_CONTENT); - this.tooltipContent.setWordWrapWidth(696) + this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); + this.tooltipContent.setWordWrapWidth(696); this.tooltipContainer.add(this.tooltipBg); this.tooltipContainer.add(this.tooltipTitle); @@ -200,19 +201,21 @@ export default class UI extends Phaser.GameObjects.Container { } processInput(button: Button): boolean { - if (this.overlayActive) + if (this.overlayActive) { return false; + } const handler = this.getHandler(); - if (handler instanceof AwaitableUiHandler && handler.tutorialActive) + if (handler instanceof AwaitableUiHandler && handler.tutorialActive) { return handler.processTutorialInput(button); + } return handler.processInput(button); } showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer): void { - if (prompt && text.indexOf('$') > -1) { + if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); let showMessageAndCallback = () => callback(); for (let p = messagePages.length - 1; p >= 0; p--) { @@ -222,15 +225,16 @@ export default class UI extends Phaser.GameObjects.Container { showMessageAndCallback(); } else { const handler = this.getHandler(); - if (handler instanceof MessageUiHandler) + if (handler instanceof MessageUiHandler) { (handler as MessageUiHandler).showText(text, delay, callback, callbackDelay, prompt, promptDelay); - else + } else { this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt, promptDelay); + } } } showDialogue(text: string, name: string, delay: integer = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer): void { - if (text.indexOf('$') > -1) { + if (text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); let showMessageAndCallback = () => callback(); for (let p = messagePages.length - 1; p >= 0; p--) { @@ -240,25 +244,27 @@ export default class UI extends Phaser.GameObjects.Container { showMessageAndCallback(); } else { const handler = this.getHandler(); - if (handler instanceof MessageUiHandler) + if (handler instanceof MessageUiHandler) { (handler as MessageUiHandler).showDialogue(text, name, delay, callback, callbackDelay, true, promptDelay); - else + } else { this.getMessageHandler().showDialogue(text, name, delay, callback, callbackDelay, true, promptDelay); + } } } showTooltip(title: string, content: string, overlap?: boolean): void { this.tooltipContainer.setVisible(true); - this.tooltipTitle.setText(title || ''); + this.tooltipTitle.setText(title || ""); const wrappedContent = this.tooltipContent.runWordWrap(content); this.tooltipContent.setText(wrappedContent); this.tooltipContent.y = title ? 16 : 4; this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 684); - this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split('\n').length - 1); - if (overlap) - (this.scene as BattleScene).uiContainer.moveAbove(this.tooltipContainer, this); - else - (this.scene as BattleScene).uiContainer.moveBelow(this.tooltipContainer, this); + this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1); + if (overlap) { + (this.scene as BattleScene).uiContainer.moveAbove(this.tooltipContainer, this); + } else { + (this.scene as BattleScene).uiContainer.moveBelow(this.tooltipContainer, this); + } } hideTooltip(): void { @@ -275,32 +281,35 @@ export default class UI extends Phaser.GameObjects.Container { clearText(): void { const handler = this.getHandler(); - if (handler instanceof MessageUiHandler) + if (handler instanceof MessageUiHandler) { (handler as MessageUiHandler).clearText(); - else + } else { this.getMessageHandler().clearText(); + } } setCursor(cursor: integer): boolean { const changed = this.getHandler().setCursor(cursor); - if (changed) + if (changed) { this.playSelect(); + } return changed; } playSelect(): void { - (this.scene as BattleScene).playSound('select'); + (this.scene as BattleScene).playSound("select"); } playError(): void { - (this.scene as BattleScene).playSound('error'); + (this.scene as BattleScene).playSound("error"); } fadeOut(duration: integer): Promise { return new Promise(resolve => { - if (this.overlayActive) + if (this.overlayActive) { return resolve(); + } this.overlayActive = true; this.overlay.setAlpha(0); this.overlay.setVisible(true); @@ -308,7 +317,7 @@ export default class UI extends Phaser.GameObjects.Container { targets: this.overlay, alpha: 1, duration: duration, - ease: 'Sine.easeOut', + ease: "Sine.easeOut", onComplete: () => resolve() }); }); @@ -316,13 +325,14 @@ export default class UI extends Phaser.GameObjects.Container { fadeIn(duration: integer): Promise { return new Promise(resolve => { - if (!this.overlayActive) + if (!this.overlayActive) { return resolve(); + } this.scene.tweens.add({ targets: this.overlay, alpha: 0, duration: duration, - ease: 'Sine.easeIn', + ease: "Sine.easeIn", onComplete: () => { this.overlay.setVisible(false); resolve(); @@ -340,14 +350,17 @@ export default class UI extends Phaser.GameObjects.Container { } const doSetMode = () => { if (this.mode !== mode) { - if (clear) + if (clear) { this.getHandler().clear(); - if (chainMode && this.mode && !clear) + } + if (chainMode && this.mode && !clear) { this.modeChain.push(this.mode); + } this.mode = mode; - const touchControls = document.getElementById('touchControls'); - if (touchControls) + const touchControls = document.getElementById("touchControls"); + if (touchControls) { touchControls.dataset.uiMode = Mode[mode]; + } this.getHandler().show(args); } resolve(); @@ -360,9 +373,10 @@ export default class UI extends Phaser.GameObjects.Container { doSetMode(); this.fadeIn(250); }); - }) - } else + }); + } else { doSetMode(); + } }); } @@ -388,17 +402,19 @@ export default class UI extends Phaser.GameObjects.Container { revertMode(): Promise { return new Promise(resolve => { - if (!this?.modeChain?.length) + if (!this?.modeChain?.length) { return resolve(false); + } const lastMode = this.mode; const doRevertMode = () => { this.getHandler().clear(); this.mode = this.modeChain.pop(); - const touchControls = document.getElementById('touchControls'); - if (touchControls) + const touchControls = document.getElementById("touchControls"); + if (touchControls) { touchControls.dataset.uiMode = Mode[this.mode]; + } resolve(true); }; @@ -409,16 +425,18 @@ export default class UI extends Phaser.GameObjects.Container { this.fadeIn(250); }); }); - } else + } else { doRevertMode(); + } }); } revertModes(): Promise { return new Promise(resolve => { - if (!this?.modeChain?.length) + if (!this?.modeChain?.length) { return resolve(); + } this.revertMode().then(success => Utils.executeIf(success, this.revertModes).then(() => resolve())); }); } -} \ No newline at end of file +} diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 4481746c723b..da2393f3b0db 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -13,7 +13,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { } getModalTitle(): string { - return ''; + return ""; } getWidth(): number { @@ -35,7 +35,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, 'Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.', TextStyle.WINDOW, { fontSize: '48px', align: 'center' }); + const label = addTextObject(this.scene, this.getWidth() / 2, this.getHeight() / 2, "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", TextStyle.WINDOW, { fontSize: "48px", align: "center" }); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -54,10 +54,10 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { if (response[0] || [200, 400].includes(response[1])) { clearInterval(this.reconnectTimer); this.reconnectTimer = null; - this.scene.playSound('pb_bounce_1'); + this.scene.playSound("pb_bounce_1"); this.reconnectCallback(); } - }) + }); }, 5000); return super.show([ config ]); @@ -65,4 +65,4 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { return false; } -} \ No newline at end of file +} diff --git a/src/ui/vouchers-ui-handler.ts b/src/ui/vouchers-ui-handler.ts index 55f3ac224aab..ddc09ee5f9ee 100644 --- a/src/ui/vouchers-ui-handler.ts +++ b/src/ui/vouchers-ui-handler.ts @@ -5,7 +5,7 @@ import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; import {Button} from "../enums/buttons"; -import i18next from '../plugins/i18n'; +import i18next from "../plugins/i18n"; const itemRows = 4; const itemCols = 17; @@ -56,7 +56,7 @@ export default class VouchersUiHandler extends MessageUiHandler { const x = (a % itemCols) * 18; const y = Math.floor(a / itemCols) * 18; - const icon = this.scene.add.sprite(x, y, 'items', 'unknown'); + const icon = this.scene.add.sprite(x, y, "items", "unknown"); icon.setOrigin(0, 0); icon.setScale(0.5); @@ -67,21 +67,21 @@ export default class VouchersUiHandler extends MessageUiHandler { const titleBg = addWindow(this.scene, 0, headerBg.height + this.voucherIconsBg.height, 220, 24); titleBg.setOrigin(0, 0); - this.titleText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW); + this.titleText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); this.titleText.setOrigin(0, 0); this.titleText.setPositionRelative(titleBg, 8, 4); const unlockBg = addWindow(this.scene, titleBg.x + titleBg.width, titleBg.y, 98, 24); unlockBg.setOrigin(0, 0); - this.unlockText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW); + this.unlockText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW); this.unlockText.setOrigin(0, 0); this.unlockText.setPositionRelative(unlockBg, 8, 4); const descriptionBg = addWindow(this.scene, 0, titleBg.y + titleBg.height, (this.scene.game.canvas.width / 6) - 2, 42); descriptionBg.setOrigin(0, 0); - const descriptionText = addTextObject(this.scene, 0, 0, '', TextStyle.WINDOW, { maxLines: 2 }); + const descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, { maxLines: 2 }); descriptionText.setWordWrapWidth(1870); descriptionText.setOrigin(0, 0); descriptionText.setPositionRelative(descriptionBg, 8, 4); @@ -143,49 +143,56 @@ export default class VouchersUiHandler extends MessageUiHandler { const rowIndex = Math.floor(this.cursor / itemCols); const itemOffset = (this.scrollCursor * itemCols); switch (button) { - case Button.UP: - if (this.cursor < itemCols) { - if (this.scrollCursor) - success = this.setScrollCursor(this.scrollCursor - 1); - } else - success = this.setCursor(this.cursor - itemCols); - break; - case Button.DOWN: - const canMoveDown = (this.cursor + itemOffset) + itemCols < this.itemsTotal; - if (rowIndex >= itemRows - 1) { - if (this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows && canMoveDown) - success = this.setScrollCursor(this.scrollCursor + 1); - } else if (canMoveDown) - success = this.setCursor(this.cursor + itemCols); - break; - case Button.LEFT: - if (!this.cursor && this.scrollCursor) - success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (itemCols - 1)); - else if (this.cursor) - success = this.setCursor(this.cursor - 1); - break; - case Button.RIGHT: - if (this.cursor + 1 === itemRows * itemCols && this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows) { - success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (itemCols - 1)); - } else if (this.cursor + itemOffset < Object.keys(vouchers).length - 1) - success = this.setCursor(this.cursor + 1); - break; + case Button.UP: + if (this.cursor < itemCols) { + if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } + } else { + success = this.setCursor(this.cursor - itemCols); + } + break; + case Button.DOWN: + const canMoveDown = (this.cursor + itemOffset) + itemCols < this.itemsTotal; + if (rowIndex >= itemRows - 1) { + if (this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows && canMoveDown) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + } else if (canMoveDown) { + success = this.setCursor(this.cursor + itemCols); + } + break; + case Button.LEFT: + if (!this.cursor && this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1) && this.setCursor(this.cursor + (itemCols - 1)); + } else if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (this.cursor + 1 === itemRows * itemCols && this.scrollCursor < Math.ceil(this.itemsTotal / itemCols) - itemRows) { + success = this.setScrollCursor(this.scrollCursor + 1) && this.setCursor(this.cursor - (itemCols - 1)); + } else if (this.cursor + itemOffset < Object.keys(vouchers).length - 1) { + success = this.setCursor(this.cursor + 1); + } + break; } } - if (success) + if (success) { ui.playSelect(); + } return success; } setCursor(cursor: integer): boolean { - let ret = super.setCursor(cursor); + const ret = super.setCursor(cursor); let updateVoucher = ret; if (!this.cursorObj) { - this.cursorObj = this.scene.add.nineslice(0, 0, 'select_cursor_highlight', null, 16, 16, 1, 1, 1, 1); + this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight", null, 16, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.voucherIconsContainer.add(this.cursorObj); updateVoucher = true; @@ -193,15 +200,17 @@ export default class VouchersUiHandler extends MessageUiHandler { this.cursorObj.setPositionRelative(this.voucherIcons[this.cursor], 0, 0); - if (updateVoucher) + if (updateVoucher) { this.showVoucher(vouchers[Object.keys(vouchers)[cursor + this.scrollCursor * itemCols]]); + } return ret; } setScrollCursor(scrollCursor: integer): boolean { - if (scrollCursor === this.scrollCursor) + if (scrollCursor === this.scrollCursor) { return false; + } this.scrollCursor = scrollCursor; @@ -226,14 +235,16 @@ export default class VouchersUiHandler extends MessageUiHandler { icon.setFrame(getVoucherTypeIcon(voucher.voucherType)); icon.setVisible(true); - if (!unlocked) + if (!unlocked) { icon.setTintFill(0); - else + } else { icon.clearTint(); + } }); - if (voucherRange.length < this.voucherIcons.length) + if (voucherRange.length < this.voucherIcons.length) { this.voucherIcons.slice(voucherRange.length).map(i => i.setVisible(false)); + } } clear() { @@ -243,8 +254,9 @@ export default class VouchersUiHandler extends MessageUiHandler { } eraseCursor() { - if (this.cursorObj) + if (this.cursorObj) { this.cursorObj.destroy(); + } this.cursorObj = null; } } diff --git a/src/utils.test.ts b/src/utils.test.ts index 22ccbfc6320f..01bdd5db5422 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -23,22 +23,22 @@ describe("utils", () => { describe("padInt", () => { it("should return a string", () => { const result = padInt(1, 10); - expect(typeof result).toBe('string'); + expect(typeof result).toBe("string"); }); it("should return a padded result with default padWith", () => { const result = padInt(1, 3); - expect(result).toBe('001'); + expect(result).toBe("001"); }); it("should return a padded result using a custom padWith", () => { - const result = padInt(1, 10, 'yes') - expect(result).toBe('yesyesyes1'); + const result = padInt(1, 10, "yes"); + expect(result).toBe("yesyesyes1"); }); it("should return inputted value when zero length is entered", () => { const result = padInt(1, 0); - expect(result).toBe('1') - }) + expect(result).toBe("1"); + }); }); }); diff --git a/src/utils.ts b/src/utils.ts index 0526caacd597..1afa8e37eda5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,12 +1,12 @@ -export const MissingTextureKey = '__MISSING'; +export const MissingTextureKey = "__MISSING"; export function toReadableString(str: string): string { - return str.replace(/\_/g, ' ').split(' ').map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`).join(' '); + return str.replace(/\_/g, " ").split(" ").map(s => `${s.slice(0, 1)}${s.slice(1).toLowerCase()}`).join(" "); } export function randomString(length: integer, seeded: boolean = false) { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - let result = ''; + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let result = ""; for (let i = 0; i < length; i++) { const randomIndex = seeded ? randSeedInt(characters.length) : Math.floor(Math.random() * characters.length); @@ -17,15 +17,16 @@ export function randomString(length: integer, seeded: boolean = false) { } export function shiftCharCodes(str: string, shiftCount: integer) { - if (!shiftCount) + if (!shiftCount) { shiftCount = 0; + } - let newStr = ''; + let newStr = ""; for (let i = 0; i < str.length; i++) { - let charCode = str.charCodeAt(i); - let newCharCode = charCode + shiftCount; - newStr += String.fromCharCode(newCharCode); + const charCode = str.charCodeAt(i); + const newCharCode = charCode + shiftCount; + newStr += String.fromCharCode(newCharCode); } return newStr; @@ -36,8 +37,9 @@ export function clampInt(value: integer, min: integer, max: integer): integer { } export function randGauss(stdev: number, mean: number = 0): number { - if (!stdev) + if (!stdev) { return 0; + } const u = 1 - Math.random(); const v = Math.random(); const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); @@ -45,8 +47,9 @@ export function randGauss(stdev: number, mean: number = 0): number { } export function randSeedGauss(stdev: number, mean: number = 0): number { - if (!stdev) + if (!stdev) { return 0; + } const u = 1 - Phaser.Math.RND.realInRange(0, 1); const v = Phaser.Math.RND.realInRange(0, 1); const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); @@ -54,11 +57,13 @@ export function randSeedGauss(stdev: number, mean: number = 0): number { } export function padInt(value: integer, length: integer, padWith?: string): string { - if (!padWith) - padWith = '0'; + if (!padWith) { + padWith = "0"; + } let valueStr = value.toString(); - while (valueStr.length < length) + while (valueStr.length < length) { valueStr = `${padWith}${valueStr}`; + } return valueStr; } @@ -68,14 +73,16 @@ export function padInt(value: integer, length: integer, padWith?: string): strin * @param min The starting number */ export function randInt(range: integer, min: integer = 0): integer { - if (range === 1) + if (range === 1) { return min; + } return Math.floor(Math.random() * range) + min; } export function randSeedInt(range: integer, min: integer = 0): integer { - if (range <= 1) + if (range <= 1) { return min; + } return Phaser.Math.RND.integerInRange(min, (range - 1) + min); } @@ -106,11 +113,13 @@ export function randSeedWeightedItem(items: T[]): T { : Phaser.Math.RND.weightedPick(items); } -export function randSeedEasedWeightedItem(items: T[], easingFunction: string = 'Sine.easeIn'): T { - if (!items.length) +export function randSeedEasedWeightedItem(items: T[], easingFunction: string = "Sine.easeIn"): T { + if (!items.length) { return null; - if (items.length === 1) + } + if (items.length === 1) { return items[0]; + } const value = Phaser.Math.RND.realInRange(0, 1); const easedValue = Phaser.Tweens.Builders.GetEaseFunction(easingFunction)(value); return items[Math.floor(easedValue * items.length)]; @@ -133,12 +142,12 @@ export function getPlayTimeString(totalSeconds: integer): string { const minutes = `${Math.floor(totalSeconds % secondsInHour / 60)}`; const seconds = `${Math.floor(totalSeconds % 60)}`; - return `${days.padStart(2, '0')}:${hours.padStart(2, '0')}:${minutes.padStart(2, '0')}:${seconds.padStart(2, '0')}`; + return `${days.padStart(2, "0")}:${hours.padStart(2, "0")}:${minutes.padStart(2, "0")}:${seconds.padStart(2, "0")}`; } export function binToDec(input: string): integer { - let place: integer[] = []; - let binary: string[] = []; + const place: integer[] = []; + const binary: string[] = []; let decimalNum = 0; @@ -152,7 +161,7 @@ export function binToDec(input: string): integer { } export function decToBin(input: integer): string { - let bin = ''; + let bin = ""; let intNum = input; while (intNum > 0) { bin = intNum % 2 ? `1${bin}` : `0${bin}`; @@ -174,34 +183,36 @@ export function getIvsFromId(id: integer): integer[] { } export function formatLargeNumber(count: integer, threshold: integer): string { - if (count < threshold) + if (count < threshold) { return count.toString(); - let ret = count.toString(); - let suffix = ''; + } + const ret = count.toString(); + let suffix = ""; switch (Math.ceil(ret.length / 3) - 1) { - case 1: - suffix = 'K'; - break; - case 2: - suffix = 'M'; - break; - case 3: - suffix = 'B'; - break; - case 4: - suffix = 'T'; - break; - case 5: - suffix = 'q'; - break; - default: - return '?'; + case 1: + suffix = "K"; + break; + case 2: + suffix = "M"; + break; + case 3: + suffix = "B"; + break; + case 4: + suffix = "T"; + break; + case 5: + suffix = "q"; + break; + default: + return "?"; } const digits = ((ret.length + 2) % 3) + 1; let decimalNumber = ret.slice(digits, digits + 2); - while (decimalNumber.endsWith('0')) - decimalNumber = decimalNumber.slice(0, -1); - return `${ret.slice(0, digits)}${decimalNumber ? `.${decimalNumber}` : ''}${suffix}`; + while (decimalNumber.endsWith("0")) { + decimalNumber = decimalNumber.slice(0, -1); + } + return `${ret.slice(0, digits)}${decimalNumber ? `.${decimalNumber}` : ""}${suffix}`; } export function formatStat(stat: integer, forHp: boolean = false): string { @@ -220,10 +231,10 @@ export function executeIf(condition: boolean, promiseFunc: () => Promise): return condition ? promiseFunc() : new Promise(resolve => resolve(null)); } -export const sessionIdKey = 'pokerogue_sessionId'; -export const isLocal = window.location.hostname === 'localhost' || window.location.hostname === ''; -export const serverUrl = isLocal ? 'http://localhost:8001' : ''; -export const apiUrl = isLocal ? serverUrl : 'https://api.pokerogue.net'; +export const sessionIdKey = "pokerogue_sessionId"; +export const isLocal = window.location.hostname === "localhost" || window.location.hostname === ""; +export const serverUrl = isLocal ? "http://localhost:8001" : ""; +export const apiUrl = isLocal ? serverUrl : "https://api.pokerogue.net"; export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); @@ -233,15 +244,17 @@ export function setCookie(cName: string, cValue: string): void { export function getCookie(cName: string): string { const name = `${cName}=`; - const ca = document.cookie.split(';'); + const ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { let c = ca[i]; - while (c.charAt(0) === ' ') + while (c.charAt(0) === " ") { c = c.substring(1); - if (c.indexOf(name) === 0) + } + if (c.indexOf(name) === 0) { return c.substring(name.length, c.length); + } } - return ''; + return ""; } export function apiFetch(path: string, authed: boolean = false): Promise { @@ -249,8 +262,9 @@ export function apiFetch(path: string, authed: boolean = false): Promise resolve(response)) @@ -258,18 +272,19 @@ export function apiFetch(path: string, authed: boolean = false): Promise { +export function apiPost(path: string, data?: any, contentType: string = "application/json", authed: boolean = false): Promise { return new Promise((resolve, reject) => { const headers = { - 'Accept': contentType, - 'Content-Type': contentType, + "Accept": contentType, + "Content-Type": contentType, }; if (authed) { const sId = getCookie(sessionIdKey); - if (sId) - headers['Authorization'] = sId; + if (sId) { + headers["Authorization"] = sId; + } } - fetch(`${apiUrl}/${path}`, { method: 'POST', headers: headers, body: data }) + fetch(`${apiUrl}/${path}`, { method: "POST", headers: headers, body: data }) .then(response => resolve(response)) .catch(err => reject(err)); }); @@ -308,9 +323,9 @@ export function fixedInt(value: integer): integer { } export function rgbToHsv(r: integer, g: integer, b: integer) { - let v = Math.max(r, g, b); - let c = v - Math.min(r, g, b); - let h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); + const v = Math.max(r, g, b); + const c = v - Math.min(r, g, b); + const h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); return [ 60 * (h < 0 ? h + 6 : h), v && c / v, v]; } @@ -333,13 +348,13 @@ export function deltaRgb(rgb1: integer[], rgb2: integer[]): integer { export function rgbHexToRgba(hex: string) { const color = hex.match(/^([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i); return { - r: parseInt(color[1], 16), - g: parseInt(color[2], 16), - b: parseInt(color[3], 16), - a: 255 + r: parseInt(color[1], 16), + g: parseInt(color[2], 16), + b: parseInt(color[3], 16), + a: 255 }; } export function rgbaToInt(rgba: integer[]): integer { return (rgba[0] << 24) + (rgba[1] << 16) + (rgba[2] << 8) + rgba[3]; -} \ No newline at end of file +}