diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs new file mode 100644 index 00000000000..25f7b64ce85 --- /dev/null +++ b/.dependency-cruiser.cjs @@ -0,0 +1,384 @@ +/** @type {import('dependency-cruiser').IConfiguration} */ +module.exports = { + forbidden: [ + { + name: 'no-circular-at-runtime', + severity: 'warn', + comment: + 'This dependency is part of a circular relationship. You might want to revise ' + + 'your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ', + from: {}, + to: { + circular: true, + viaOnly: { + dependencyTypesNot: [ + 'type-only' + ] + } + } + }, + { + name: 'no-orphans', + comment: + "This is an orphan module - it's likely not used (anymore?). Either use it or " + + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + + "add an exception for it in your dependency-cruiser configuration. By default " + + "this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " + + "files (.d.ts), tsconfig.json and some of the babel and webpack configs.", + severity: 'warn', + from: { + orphan: true, + pathNot: [ + '(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files + '[.]d[.]ts$', // TypeScript declaration files + '(^|/)tsconfig[.]json$', // TypeScript config + '(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs + ] + }, + to: {}, + }, + { + name: 'no-deprecated-core', + comment: + 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + + "bound to exist - node doesn't deprecate lightly.", + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'core' + ], + path: [ + '^v8/tools/codemap$', + '^v8/tools/consarray$', + '^v8/tools/csvparser$', + '^v8/tools/logreader$', + '^v8/tools/profile_view$', + '^v8/tools/profile$', + '^v8/tools/SourceMap$', + '^v8/tools/splaytree$', + '^v8/tools/tickprocessor-driver$', + '^v8/tools/tickprocessor$', + '^node-inspect/lib/_inspect$', + '^node-inspect/lib/internal/inspect_client$', + '^node-inspect/lib/internal/inspect_repl$', + '^async_hooks$', + '^punycode$', + '^domain$', + '^constants$', + '^sys$', + '^_linklist$', + '^_stream_wrap$' + ], + } + }, + { + name: 'not-to-deprecated', + comment: + 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + + 'version of that module, or find an alternative. Deprecated modules are a security risk.', + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'deprecated' + ] + } + }, + { + name: 'no-non-package-json', + severity: 'error', + comment: + "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + + "available on live with an non-guaranteed version. Fix it by adding the package to the dependencies " + + "in your package.json.", + from: {}, + to: { + dependencyTypes: [ + 'npm-no-pkg', + 'npm-unknown' + ] + } + }, + { + name: 'not-to-unresolvable', + comment: + "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + + 'module: add it to your package.json. In all other cases you likely already know what to do.', + severity: 'error', + from: {}, + to: { + couldNotResolve: true + } + }, + { + name: 'no-duplicate-dep-types', + comment: + "Likely this module depends on an external ('npm') package that occurs more than once " + + "in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " + + "maintenance problems later on.", + severity: 'warn', + from: {}, + to: { + moreThanOneDependencyType: true, + // as it's pretty common to have a type import be a type only import + // _and_ (e.g.) a devDependency - don't consider type-only dependency + // types for this rule + dependencyTypesNot: ["type-only"] + } + }, + + /* rules you might want to tweak for your specific situation: */ + + { + name: 'not-to-spec', + comment: + 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + + "If there's something in a spec that's of use to other modules, it doesn't have that single " + + 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', + severity: 'error', + from: {}, + to: { + path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$' + } + }, + { + name: 'not-to-dev-dep', + severity: 'error', + comment: + "This module depends on an npm package from the 'devDependencies' section of your " + + 'package.json. It looks like something that ships to production, though. To prevent problems ' + + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + + 'section of your package.json. If this module is development only - add it to the ' + + 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', + from: { + path: '^(src)', + pathNot: [ + '[.](?:spec|test|setup|script)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx)$', + 'src/test' + ] + }, + to: { + dependencyTypes: [ + 'npm-dev', + ], + // type only dependencies are not a problem as they don't end up in the + // production code or are ignored by the runtime. + dependencyTypesNot: [ + 'type-only' + ], + pathNot: [ + 'node_modules/@types/' + ] + } + }, + { + name: 'optional-deps-used', + severity: 'info', + comment: + "This module depends on an npm package that is declared as an optional dependency " + + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + + "If you're using an optional dependency here by design - add an exception to your" + + "dependency-cruiser configuration.", + from: {}, + to: { + dependencyTypes: [ + 'npm-optional' + ] + } + }, + { + name: 'peer-deps-used', + comment: + "This module depends on an npm package that is declared as a peer dependency " + + "in your package.json. This makes sense if your package is e.g. a plugin, but in " + + "other cases - maybe not so much. If the use of a peer dependency is intentional " + + "add an exception to your dependency-cruiser configuration.", + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'npm-peer' + ] + } + } + ], + options: { + + /* Which modules not to follow further when encountered */ + doNotFollow: { + /* path: an array of regular expressions in strings to match against */ + path: ['node_modules'] + }, + + /* Which modules to exclude */ + // exclude : { + // /* path: an array of regular expressions in strings to match against */ + // path: '', + // }, + + /* Which modules to exclusively include (array of regular expressions in strings) + dependency-cruiser will skip everything not matching this pattern + */ + // includeOnly : [''], + + /* List of module systems to cruise. + When left out dependency-cruiser will fall back to the list of _all_ + module systems it knows of. It's the default because it's the safe option + It might come at a performance penalty, though. + moduleSystems: ['amd', 'cjs', 'es6', 'tsd'] + + As in practice only commonjs ('cjs') and ecmascript modules ('es6') + are widely used, you can limit the moduleSystems to those. + */ + + // moduleSystems: ['cjs', 'es6'], + + /* prefix for links in html and svg output (e.g. 'https://github.com/you/yourrepo/blob/main/' + to open it on your online repo or `vscode://file/${process.cwd()}/` to + open it in visual studio code), + */ + // prefix: `vscode://file/${process.cwd()}/`, + + /* false (the default): ignore dependencies that only exist before typescript-to-javascript compilation + true: also detect dependencies that only exist before typescript-to-javascript compilation + "specify": for each dependency identify whether it only exists before compilation or also after + */ + // tsPreCompilationDeps: false, + + /* list of extensions to scan that aren't javascript or compile-to-javascript. + Empty by default. Only put extensions in here that you want to take into + account that are _not_ parsable. + */ + // extraExtensionsToScan: [".json", ".jpg", ".png", ".svg", ".webp"], + + /* if true combines the package.jsons found from the module up to the base + folder the cruise is initiated from. Useful for how (some) mono-repos + manage dependencies & dependency definitions. + */ + // combinedDependencies: false, + + /* if true leave symlinks untouched, otherwise use the realpath */ + // preserveSymlinks: false, + + /* TypeScript project file ('tsconfig.json') to use for + (1) compilation and + (2) resolution (e.g. with the paths property) + + The (optional) fileName attribute specifies which file to take (relative to + dependency-cruiser's current working directory). When not provided + defaults to './tsconfig.json'. + */ + tsConfig: { + fileName: 'tsconfig.json' + }, + + /* Webpack configuration to use to get resolve options from. + + The (optional) fileName attribute specifies which file to take (relative + to dependency-cruiser's current working directory. When not provided defaults + to './webpack.conf.js'. + + The (optional) `env` and `arguments` attributes contain the parameters + to be passed if your webpack config is a function and takes them (see + webpack documentation for details) + */ + // webpackConfig: { + // fileName: 'webpack.config.js', + // env: {}, + // arguments: {} + // }, + + /* Babel config ('.babelrc', '.babelrc.json', '.babelrc.json5', ...) to use + for compilation + */ + // babelConfig: { + // fileName: '.babelrc', + // }, + + /* List of strings you have in use in addition to cjs/ es6 requires + & imports to declare module dependencies. Use this e.g. if you've + re-declared require, use a require-wrapper or use window.require as + a hack. + */ + // exoticRequireStrings: [], + + /* options to pass on to enhanced-resolve, the package dependency-cruiser + uses to resolve module references to disk. The values below should be + suitable for most situations + + If you use webpack: you can also set these in webpack.conf.js. The set + there will override the ones specified here. + */ + enhancedResolveOptions: { + /* What to consider as an 'exports' field in package.jsons */ + exportsFields: ["exports"], + /* List of conditions to check for in the exports field. + Only works when the 'exportsFields' array is non-empty. + */ + conditionNames: ["import", "require", "node", "default", "types"], + /* + The extensions, by default are the same as the ones dependency-cruiser + can access (run `npx depcruise --info` to see which ones that are in + _your_ environment). If that list is larger than you need you can pass + the extensions you actually use (e.g. [".js", ".jsx"]). This can speed + up module resolution, which is the most expensive step. + */ + // extensions: [".js", ".jsx", ".ts", ".tsx", ".d.ts"], + /* What to consider a 'main' field in package.json */ + mainFields: ["module", "main", "types", "typings"], + /* + A list of alias fields in package.jsons + See [this specification](https://github.com/defunctzombie/package-browser-field-spec) and + the webpack [resolve.alias](https://webpack.js.org/configuration/resolve/#resolvealiasfields) + documentation + + Defaults to an empty array (= don't use alias fields). + */ + // aliasFields: ["browser"], + }, + reporterOptions: { + dot: { + /* pattern of modules that can be consolidated in the detailed + graphical dependency graph. The default pattern in this configuration + collapses everything in node_modules to one folder deep so you see + the external modules, but their innards. + */ + collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)', + + /* Options to tweak the appearance of your graph.See + https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions + for details and some examples. If you don't specify a theme + dependency-cruiser falls back to a built-in one. + */ + // theme: { + // graph: { + // /* splines: "ortho" gives straight lines, but is slow on big graphs + // splines: "true" gives bezier curves (fast, not as nice as ortho) + // */ + // splines: "true" + // }, + // } + }, + archi: { + /* pattern of modules that can be consolidated in the high level + graphical dependency graph. If you use the high level graphical + dependency graph reporter (`archi`) you probably want to tweak + this collapsePattern to your situation. + */ + collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)', + + /* Options to tweak the appearance of your graph. If you don't specify a + theme for 'archi' dependency-cruiser will use the one specified in the + dot section above and otherwise use the default one. + */ + // theme: { }, + }, + "text": { + "highlightFocused": true + }, + } + } +}; +// generated: dependency-cruiser@16.3.3 on 2024-06-13T23:26:36.169Z diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index aa63792bbea..ce52e8d9772 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -47,7 +47,6 @@ jobs: run: | cd pokerogue_docs npm ci - npm install typedoc --save-dev - name: Generate Typedoc docs working-directory: ${{env.api-dir}} diff --git a/.gitignore b/.gitignore index 669f8df003f..0ae49fe9e1c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ coverage # Local Documentation /typedoc +/dependency-graph.svg \ No newline at end of file diff --git a/README.md b/README.md index 839bfa3ae45..d1b46e630bf 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - Pokémon Ultra Sun/Ultra Moon - Pokémon Sword/Shield - Pokémon Scarlet/Violet - - Firel (Custom Metropolis and Laboratory biome music) + - Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music) - Lmz (Custom Jungle biome music) ### 🎵 Sound Effects diff --git a/dependency-graph.js b/dependency-graph.js new file mode 100644 index 00000000000..627aa3dcf13 --- /dev/null +++ b/dependency-graph.js @@ -0,0 +1,13 @@ +import { Graphviz } from "@hpcc-js/wasm/graphviz"; + +const graphviz = await Graphviz.load(); + +const inputFile = []; +for await (const chunk of process.stdin) { + inputFile.push(chunk); +} + +const file = Buffer.concat(inputFile).toString("utf-8"); + +const svg = graphviz.dot(file, "svg"); +process.stdout.write(svg); \ No newline at end of file diff --git a/index.html b/index.html index a86f7832fc7..3722bdd3422 100644 --- a/index.html +++ b/index.html @@ -31,11 +31,6 @@ font-family: 'emerald'; src: url('./fonts/pokemon-emerald-pro.ttf') format('truetype'); } - @font-face { - font-family: 'unifont'; - src: url('./fonts/unifont-15.1.05.otf') format('opentype'); - size-adjust: 70%; - } @font-face { font-family: 'pkmnems'; diff --git a/package-lock.json b/package-lock.json index 7f71787cb4d..638a173d7e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,11 @@ "name": "pokemon-rogue-battle", "version": "1.0.4", "dependencies": { + "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", + "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", + "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", @@ -815,6 +818,17 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@hpcc-js/wasm": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@hpcc-js/wasm/-/wasm-2.16.2.tgz", + "integrity": "sha512-THiidUMYR8/cIfFT3MVcWuRE7bQKh295nrFBxGvUNc4Nq8e2uU1LtiplHs7AUkJ0GxgvZoR+8TQ1/E3Qb/uE2g==", + "dependencies": { + "yargs": "17.7.2" + }, + "bin": { + "dot-wasm": "bin/dot-wasm.js" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -1177,6 +1191,16 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -1187,11 +1211,15 @@ "version": "20.12.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", @@ -1603,7 +1631,6 @@ "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" }, @@ -1615,16 +1642,30 @@ "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" } }, + "node_modules/acorn-jsx-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==" + }, + "node_modules/acorn-loose": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", + "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -1661,7 +1702,6 @@ "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" } @@ -2022,6 +2062,19 @@ "node": ">=4" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2071,6 +2124,14 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2364,6 +2425,155 @@ "node": ">= 0.8" } }, + "node_modules/dependency-cruiser": { + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-16.3.3.tgz", + "integrity": "sha512-+YHPbd6RqM1nLUUbRVkbYO6mVeeq+VEL+bBkR+KFkYVU20vs1D0TalZ9z/hDLxiYiYCSTctUaoWWaUrRc1I+mw==", + "dependencies": { + "acorn": "8.11.3", + "acorn-jsx": "5.3.2", + "acorn-jsx-walk": "2.0.0", + "acorn-loose": "8.4.0", + "acorn-walk": "8.3.2", + "ajv": "8.16.0", + "chalk": "5.3.0", + "commander": "12.1.0", + "enhanced-resolve": "5.17.0", + "figures": "6.1.0", + "ignore": "5.3.1", + "indent-string": "5.0.0", + "interpret": "^3.1.1", + "is-installed-globally": "1.0.0", + "json5": "2.2.3", + "lodash": "4.17.21", + "memoize": "10.0.0", + "picomatch": "4.0.2", + "prompts": "2.4.2", + "rechoir": "^0.8.0", + "safe-regex": "2.1.1", + "semver": "^7.6.2", + "semver-try-require": "7.0.0", + "teamcity-service-messages": "0.1.14", + "tsconfig-paths-webpack-plugin": "4.1.0", + "watskeburt": "4.0.2", + "wrap-ansi": "9.0.0" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" + }, + "engines": { + "node": "^18.17||>=20" + } + }, + "node_modules/dependency-cruiser/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/dependency-cruiser/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/dependency-cruiser/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/dependency-cruiser/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/dependency-cruiser/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/dependency-cruiser/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dependency-cruiser/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/dependency-cruiser/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -2419,6 +2629,11 @@ "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", "dev": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -2428,11 +2643,22 @@ "node": ">= 0.8" } }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -2612,7 +2838,6 @@ "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" } @@ -3027,8 +3252,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-defer": { "version": "1.1.8", @@ -3085,6 +3309,20 @@ "reusify": "^1.0.4" } }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3261,6 +3499,25 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -3349,6 +3606,20 @@ "node": ">=10.13.0" } }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3411,6 +3682,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3647,7 +3923,6 @@ "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" } @@ -3677,6 +3952,17 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflation": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", @@ -3703,6 +3989,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -3717,6 +4011,14 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -3777,7 +4079,6 @@ "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, "dependencies": { "hasown": "^2.0.0" }, @@ -3824,6 +4125,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -3851,6 +4160,32 @@ "node": ">=0.10.0" } }, + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "dependencies": { + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -3990,6 +4325,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4261,7 +4607,6 @@ "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" }, @@ -4304,6 +4649,14 @@ "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, "node_modules/koa": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", @@ -4562,6 +4915,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4648,6 +5006,20 @@ "node": ">= 0.6" } }, + "node_modules/memoize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", + "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4718,6 +5090,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4734,7 +5117,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5071,7 +5453,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, "dependencies": { "entities": "^4.4.0" }, @@ -5118,8 +5499,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "6.2.2", @@ -5207,7 +5587,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "engines": { "node": ">=12" }, @@ -5314,6 +5693,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5330,7 +5721,6 @@ "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" } @@ -5434,11 +5824,30 @@ "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", "dev": true }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -5457,6 +5866,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -5467,7 +5892,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5597,6 +6021,14 @@ } ] }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -5633,13 +6065,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -5647,24 +6075,17 @@ "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, + "node_modules/semver-try-require": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver-try-require/-/semver-try-require-7.0.0.tgz", + "integrity": "sha512-LI7GzDuAZmNKOY0/LY4nB3ifh6kYMvBimFTHVpA6wNEl3gw59QrLbTAnJb7vQzPd1qXPz+BtKJZaYORXWMerrA==", "dependencies": { - "yallist": "^4.0.0" + "semver": "^7.6.0" }, "engines": { - "node": ">=10" + "node": "^18.17||>=20" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5771,6 +6192,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5810,6 +6236,19 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -5863,7 +6302,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5875,7 +6313,6 @@ "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, "engines": { "node": ">=4" } @@ -5938,7 +6375,6 @@ "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, "engines": { "node": ">= 0.4" }, @@ -5952,6 +6388,19 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/teamcity-service-messages": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz", + "integrity": "sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==" + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6090,6 +6539,96 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/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==" + }, + "node_modules/tsconfig-paths-webpack-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -6338,8 +6877,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universalify": { "version": "0.2.0", @@ -6393,7 +6931,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -7649,6 +8186,17 @@ "node": ">=18" } }, + "node_modules/watskeburt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.0.2.tgz", + "integrity": "sha512-w7X8AGrBZExP5/3e3c1X/CUY8Yod/aiAazQCvrg7n8Un6piD+NFFK926G15zRq4+wu0XAEWpSsZ4C+fEfVOCYw==", + "bin": { + "watskeburt": "dist/run-cli.js" + }, + "engines": { + "node": "^18||>=20" + } + }, "node_modules/webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", @@ -7764,6 +8312,52 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7771,9 +8365,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7806,12 +8400,45 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/ylru": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", diff --git a/package.json b/package.json index 7ee9010acda..29a956f19c6 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "test:silent": "vitest run --silent", "eslint": "eslint --fix .", "eslint-ci": "eslint .", - "docs": "typedoc" + "docs": "typedoc", + "depcruise": "depcruise src", + "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg" }, "devDependencies": { "@eslint/js": "^9.3.0", @@ -41,8 +43,11 @@ "vitest-canvas-mock": "^0.3.3" }, "dependencies": { + "@hpcc-js/wasm": "^2.16.2", "@material/material-color-utilities": "^0.2.7", + "@types/jsdom": "^21.1.7", "crypto-js": "^4.2.0", + "dependency-cruiser": "^16.3.3", "i18next": "^23.11.1", "i18next-browser-languagedetector": "^7.2.1", "i18next-korean-postposition-processor": "^1.0.0", diff --git a/public/audio/bgm/abyss.mp3 b/public/audio/bgm/abyss.mp3 index 3347d89d7e5..08882ac7e09 100644 Binary files a/public/audio/bgm/abyss.mp3 and b/public/audio/bgm/abyss.mp3 differ diff --git a/public/audio/bgm/badlands.mp3 b/public/audio/bgm/badlands.mp3 index 40b3cf94156..386cf09c6a3 100644 Binary files a/public/audio/bgm/badlands.mp3 and b/public/audio/bgm/badlands.mp3 differ diff --git a/public/audio/bgm/battle_alola_champion.mp3 b/public/audio/bgm/battle_alola_champion.mp3 index 94173ca69fd..9fdefa52414 100644 Binary files a/public/audio/bgm/battle_alola_champion.mp3 and b/public/audio/bgm/battle_alola_champion.mp3 differ diff --git a/public/audio/bgm/battle_alola_elite.mp3 b/public/audio/bgm/battle_alola_elite.mp3 index d87a4a89968..2d595c25f1e 100644 Binary files a/public/audio/bgm/battle_alola_elite.mp3 and b/public/audio/bgm/battle_alola_elite.mp3 differ diff --git a/public/audio/bgm/battle_aqua_magma_boss.mp3 b/public/audio/bgm/battle_aqua_magma_boss.mp3 new file mode 100644 index 00000000000..1bee013e5c5 Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_boss.mp3 differ diff --git a/public/audio/bgm/battle_aqua_magma_grunt.mp3 b/public/audio/bgm/battle_aqua_magma_grunt.mp3 new file mode 100644 index 00000000000..019d7d40e35 Binary files /dev/null and b/public/audio/bgm/battle_aqua_magma_grunt.mp3 differ diff --git a/public/audio/bgm/battle_bb_elite.mp3 b/public/audio/bgm/battle_bb_elite.mp3 index e0ec0dbd518..64420ab3b96 100644 Binary files a/public/audio/bgm/battle_bb_elite.mp3 and b/public/audio/bgm/battle_bb_elite.mp3 differ diff --git a/public/audio/bgm/battle_champion_alder.mp3 b/public/audio/bgm/battle_champion_alder.mp3 index 8b58b5ad6de..001d442c461 100644 Binary files a/public/audio/bgm/battle_champion_alder.mp3 and b/public/audio/bgm/battle_champion_alder.mp3 differ diff --git a/public/audio/bgm/battle_champion_geeta.mp3 b/public/audio/bgm/battle_champion_geeta.mp3 index 1b654e33ee2..4deb395e1d1 100644 Binary files a/public/audio/bgm/battle_champion_geeta.mp3 and b/public/audio/bgm/battle_champion_geeta.mp3 differ diff --git a/public/audio/bgm/battle_champion_iris.mp3 b/public/audio/bgm/battle_champion_iris.mp3 index 7583574e8e0..e412925cebc 100644 Binary files a/public/audio/bgm/battle_champion_iris.mp3 and b/public/audio/bgm/battle_champion_iris.mp3 differ diff --git a/public/audio/bgm/battle_champion_kieran.mp3 b/public/audio/bgm/battle_champion_kieran.mp3 index e43a1c904cd..d6896e401a3 100644 Binary files a/public/audio/bgm/battle_champion_kieran.mp3 and b/public/audio/bgm/battle_champion_kieran.mp3 differ diff --git a/public/audio/bgm/battle_champion_nemona.mp3 b/public/audio/bgm/battle_champion_nemona.mp3 index 9d835030e49..9174fca4284 100644 Binary files a/public/audio/bgm/battle_champion_nemona.mp3 and b/public/audio/bgm/battle_champion_nemona.mp3 differ diff --git a/public/audio/bgm/battle_final.mp3 b/public/audio/bgm/battle_final.mp3 index 6f5cb5d1265..31a79f5eaee 100644 Binary files a/public/audio/bgm/battle_final.mp3 and b/public/audio/bgm/battle_final.mp3 differ diff --git a/public/audio/bgm/battle_final_encounter.mp3 b/public/audio/bgm/battle_final_encounter.mp3 index 818e84cc264..a0fe790e433 100644 Binary files a/public/audio/bgm/battle_final_encounter.mp3 and b/public/audio/bgm/battle_final_encounter.mp3 differ diff --git a/public/audio/bgm/battle_flare_boss.mp3 b/public/audio/bgm/battle_flare_boss.mp3 new file mode 100644 index 00000000000..fd2e2a544d9 Binary files /dev/null and b/public/audio/bgm/battle_flare_boss.mp3 differ diff --git a/public/audio/bgm/battle_flare_grunt.mp3 b/public/audio/bgm/battle_flare_grunt.mp3 new file mode 100644 index 00000000000..7e2805f8675 Binary files /dev/null and b/public/audio/bgm/battle_flare_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galactic_boss.mp3 b/public/audio/bgm/battle_galactic_boss.mp3 new file mode 100644 index 00000000000..3d6c624130e Binary files /dev/null and b/public/audio/bgm/battle_galactic_boss.mp3 differ diff --git a/public/audio/bgm/battle_galactic_grunt.mp3 b/public/audio/bgm/battle_galactic_grunt.mp3 new file mode 100644 index 00000000000..17d8295c50c Binary files /dev/null and b/public/audio/bgm/battle_galactic_grunt.mp3 differ diff --git a/public/audio/bgm/battle_galar_champion.mp3 b/public/audio/bgm/battle_galar_champion.mp3 index 9dd43f9bbc8..01e089de9d2 100644 Binary files a/public/audio/bgm/battle_galar_champion.mp3 and b/public/audio/bgm/battle_galar_champion.mp3 differ diff --git a/public/audio/bgm/battle_galar_elite.mp3 b/public/audio/bgm/battle_galar_elite.mp3 index 34587edcbd1..5074172310d 100644 Binary files a/public/audio/bgm/battle_galar_elite.mp3 and b/public/audio/bgm/battle_galar_elite.mp3 differ diff --git a/public/audio/bgm/battle_galar_gym.mp3 b/public/audio/bgm/battle_galar_gym.mp3 index a10b284cf4b..539b389bb3a 100644 Binary files a/public/audio/bgm/battle_galar_gym.mp3 and b/public/audio/bgm/battle_galar_gym.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_champion.mp3 b/public/audio/bgm/battle_hoenn_champion.mp3 index 0fd09d5f4cd..37fd25b6a7b 100644 Binary files a/public/audio/bgm/battle_hoenn_champion.mp3 and b/public/audio/bgm/battle_hoenn_champion.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_elite.mp3 b/public/audio/bgm/battle_hoenn_elite.mp3 index 7d352d4332a..798d8c34241 100644 Binary files a/public/audio/bgm/battle_hoenn_elite.mp3 and b/public/audio/bgm/battle_hoenn_elite.mp3 differ diff --git a/public/audio/bgm/battle_hoenn_gym.mp3 b/public/audio/bgm/battle_hoenn_gym.mp3 index 9bf06628c6a..02b36ebefea 100644 Binary files a/public/audio/bgm/battle_hoenn_gym.mp3 and b/public/audio/bgm/battle_hoenn_gym.mp3 differ diff --git a/public/audio/bgm/battle_johto_champion.mp3 b/public/audio/bgm/battle_johto_champion.mp3 index 47c4af88e23..dcc64a13502 100644 Binary files a/public/audio/bgm/battle_johto_champion.mp3 and b/public/audio/bgm/battle_johto_champion.mp3 differ diff --git a/public/audio/bgm/battle_johto_gym.mp3 b/public/audio/bgm/battle_johto_gym.mp3 index 3cb7e075428..6b9a51b5401 100644 Binary files a/public/audio/bgm/battle_johto_gym.mp3 and b/public/audio/bgm/battle_johto_gym.mp3 differ diff --git a/public/audio/bgm/battle_kalos_champion.mp3 b/public/audio/bgm/battle_kalos_champion.mp3 index c9dd6b80133..eab36818e27 100644 Binary files a/public/audio/bgm/battle_kalos_champion.mp3 and b/public/audio/bgm/battle_kalos_champion.mp3 differ diff --git a/public/audio/bgm/battle_kalos_elite.mp3 b/public/audio/bgm/battle_kalos_elite.mp3 index f4a0181544d..3c4d2dfed02 100644 Binary files a/public/audio/bgm/battle_kalos_elite.mp3 and b/public/audio/bgm/battle_kalos_elite.mp3 differ diff --git a/public/audio/bgm/battle_kalos_gym.mp3 b/public/audio/bgm/battle_kalos_gym.mp3 index 9031274519f..46c3fd04eb7 100644 Binary files a/public/audio/bgm/battle_kalos_gym.mp3 and b/public/audio/bgm/battle_kalos_gym.mp3 differ diff --git a/public/audio/bgm/battle_kanto_champion.mp3 b/public/audio/bgm/battle_kanto_champion.mp3 index c084453287c..a98c3a3c0da 100644 Binary files a/public/audio/bgm/battle_kanto_champion.mp3 and b/public/audio/bgm/battle_kanto_champion.mp3 differ diff --git a/public/audio/bgm/battle_kanto_gym.mp3 b/public/audio/bgm/battle_kanto_gym.mp3 index 3d9a9c30e19..82c705fc05a 100644 Binary files a/public/audio/bgm/battle_kanto_gym.mp3 and b/public/audio/bgm/battle_kanto_gym.mp3 differ diff --git a/public/audio/bgm/battle_legendary_arceus.mp3 b/public/audio/bgm/battle_legendary_arceus.mp3 index 03dab3878f2..ee060912ddf 100644 Binary files a/public/audio/bgm/battle_legendary_arceus.mp3 and b/public/audio/bgm/battle_legendary_arceus.mp3 differ diff --git a/public/audio/bgm/battle_legendary_birds_galar.mp3 b/public/audio/bgm/battle_legendary_birds_galar.mp3 index 79bedb5c500..807a38fe095 100644 Binary files a/public/audio/bgm/battle_legendary_birds_galar.mp3 and b/public/audio/bgm/battle_legendary_birds_galar.mp3 differ diff --git a/public/audio/bgm/battle_legendary_calyrex.mp3 b/public/audio/bgm/battle_legendary_calyrex.mp3 index 8d22a5df963..7fd44b5e9c6 100644 Binary files a/public/audio/bgm/battle_legendary_calyrex.mp3 and b/public/audio/bgm/battle_legendary_calyrex.mp3 differ diff --git a/public/audio/bgm/battle_legendary_deoxys.mp3 b/public/audio/bgm/battle_legendary_deoxys.mp3 index da91a5f76bc..351b4bb02b4 100644 Binary files a/public/audio/bgm/battle_legendary_deoxys.mp3 and b/public/audio/bgm/battle_legendary_deoxys.mp3 differ diff --git a/public/audio/bgm/battle_legendary_dia_pal.mp3 b/public/audio/bgm/battle_legendary_dia_pal.mp3 index 07998098afe..4cb361933fc 100644 Binary files a/public/audio/bgm/battle_legendary_dia_pal.mp3 and b/public/audio/bgm/battle_legendary_dia_pal.mp3 differ diff --git a/public/audio/bgm/battle_legendary_dusk_dawn.mp3 b/public/audio/bgm/battle_legendary_dusk_dawn.mp3 index 20b883a4ca7..b7340af5d4b 100644 Binary files a/public/audio/bgm/battle_legendary_dusk_dawn.mp3 and b/public/audio/bgm/battle_legendary_dusk_dawn.mp3 differ diff --git a/public/audio/bgm/battle_legendary_entei.mp3 b/public/audio/bgm/battle_legendary_entei.mp3 index 30d1f87748c..993a513689e 100644 Binary files a/public/audio/bgm/battle_legendary_entei.mp3 and b/public/audio/bgm/battle_legendary_entei.mp3 differ diff --git a/public/audio/bgm/battle_legendary_giratina.mp3 b/public/audio/bgm/battle_legendary_giratina.mp3 index 87674e003ca..5b9894fc346 100644 Binary files a/public/audio/bgm/battle_legendary_giratina.mp3 and b/public/audio/bgm/battle_legendary_giratina.mp3 differ diff --git a/public/audio/bgm/battle_legendary_glas_spec.mp3 b/public/audio/bgm/battle_legendary_glas_spec.mp3 index 52988510ea6..a11e9c0dc1b 100644 Binary files a/public/audio/bgm/battle_legendary_glas_spec.mp3 and b/public/audio/bgm/battle_legendary_glas_spec.mp3 differ diff --git a/public/audio/bgm/battle_legendary_gro_kyo.mp3 b/public/audio/bgm/battle_legendary_gro_kyo.mp3 index b3401da3f6e..49ecc6b0496 100644 Binary files a/public/audio/bgm/battle_legendary_gro_kyo.mp3 and b/public/audio/bgm/battle_legendary_gro_kyo.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ho_oh.mp3 b/public/audio/bgm/battle_legendary_ho_oh.mp3 index 46740297f77..ae41e2196be 100644 Binary files a/public/audio/bgm/battle_legendary_ho_oh.mp3 and b/public/audio/bgm/battle_legendary_ho_oh.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kanto.mp3 b/public/audio/bgm/battle_legendary_kanto.mp3 index 0b9946ec9fe..aa7cfdec1c5 100644 Binary files a/public/audio/bgm/battle_legendary_kanto.mp3 and b/public/audio/bgm/battle_legendary_kanto.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kor_mir.mp3 b/public/audio/bgm/battle_legendary_kor_mir.mp3 new file mode 100644 index 00000000000..4b18a94d423 Binary files /dev/null and b/public/audio/bgm/battle_legendary_kor_mir.mp3 differ diff --git a/public/audio/bgm/battle_legendary_kyurem.mp3 b/public/audio/bgm/battle_legendary_kyurem.mp3 index f2a325d427c..d7ad9630031 100644 Binary files a/public/audio/bgm/battle_legendary_kyurem.mp3 and b/public/audio/bgm/battle_legendary_kyurem.mp3 differ diff --git a/public/audio/bgm/battle_legendary_lake_trio.mp3 b/public/audio/bgm/battle_legendary_lake_trio.mp3 index dc6bb08d13f..dddcc34712f 100644 Binary files a/public/audio/bgm/battle_legendary_lake_trio.mp3 and b/public/audio/bgm/battle_legendary_lake_trio.mp3 differ diff --git a/public/audio/bgm/battle_legendary_loyal_three.mp3 b/public/audio/bgm/battle_legendary_loyal_three.mp3 index d753e58a0a7..d37930b33bf 100644 Binary files a/public/audio/bgm/battle_legendary_loyal_three.mp3 and b/public/audio/bgm/battle_legendary_loyal_three.mp3 differ diff --git a/public/audio/bgm/battle_legendary_lugia.mp3 b/public/audio/bgm/battle_legendary_lugia.mp3 index 37031c8a642..a68f3df6557 100644 Binary files a/public/audio/bgm/battle_legendary_lugia.mp3 and b/public/audio/bgm/battle_legendary_lugia.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ogerpon.mp3 b/public/audio/bgm/battle_legendary_ogerpon.mp3 index 2ac0d9756a8..0e26dafb5aa 100644 Binary files a/public/audio/bgm/battle_legendary_ogerpon.mp3 and b/public/audio/bgm/battle_legendary_ogerpon.mp3 differ diff --git a/public/audio/bgm/battle_legendary_pecharunt.mp3 b/public/audio/bgm/battle_legendary_pecharunt.mp3 index 48f205d97d1..21383c2ea0e 100644 Binary files a/public/audio/bgm/battle_legendary_pecharunt.mp3 and b/public/audio/bgm/battle_legendary_pecharunt.mp3 differ diff --git a/public/audio/bgm/battle_legendary_raikou.mp3 b/public/audio/bgm/battle_legendary_raikou.mp3 index 8daa7083faa..e89ac31d678 100644 Binary files a/public/audio/bgm/battle_legendary_raikou.mp3 and b/public/audio/bgm/battle_legendary_raikou.mp3 differ diff --git a/public/audio/bgm/battle_legendary_rayquaza.mp3 b/public/audio/bgm/battle_legendary_rayquaza.mp3 index 843596779bd..3747edef71b 100644 Binary files a/public/audio/bgm/battle_legendary_rayquaza.mp3 and b/public/audio/bgm/battle_legendary_rayquaza.mp3 differ diff --git a/public/audio/bgm/battle_legendary_regis_g5.mp3 b/public/audio/bgm/battle_legendary_regis_g5.mp3 index 227d544d91b..f7b18dc9170 100644 Binary files a/public/audio/bgm/battle_legendary_regis_g5.mp3 and b/public/audio/bgm/battle_legendary_regis_g5.mp3 differ diff --git a/public/audio/bgm/battle_legendary_regis_g6.mp3 b/public/audio/bgm/battle_legendary_regis_g6.mp3 index ebe1a44d18a..c87d61d0b79 100644 Binary files a/public/audio/bgm/battle_legendary_regis_g6.mp3 and b/public/audio/bgm/battle_legendary_regis_g6.mp3 differ diff --git a/public/audio/bgm/battle_legendary_res_zek.mp3 b/public/audio/bgm/battle_legendary_res_zek.mp3 index 4df08c10df8..5e26b7822ff 100644 Binary files a/public/audio/bgm/battle_legendary_res_zek.mp3 and b/public/audio/bgm/battle_legendary_res_zek.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ruinous.mp3 b/public/audio/bgm/battle_legendary_ruinous.mp3 index dc1aeeaee26..804b0f39a6f 100644 Binary files a/public/audio/bgm/battle_legendary_ruinous.mp3 and b/public/audio/bgm/battle_legendary_ruinous.mp3 differ diff --git a/public/audio/bgm/battle_legendary_sinnoh.mp3 b/public/audio/bgm/battle_legendary_sinnoh.mp3 index 6332a3e1cc2..6345689ebb3 100644 Binary files a/public/audio/bgm/battle_legendary_sinnoh.mp3 and b/public/audio/bgm/battle_legendary_sinnoh.mp3 differ diff --git a/public/audio/bgm/battle_legendary_sol_lun.mp3 b/public/audio/bgm/battle_legendary_sol_lun.mp3 index 4aa9d5111b8..9793c1b6560 100644 Binary files a/public/audio/bgm/battle_legendary_sol_lun.mp3 and b/public/audio/bgm/battle_legendary_sol_lun.mp3 differ diff --git a/public/audio/bgm/battle_legendary_suicune.mp3 b/public/audio/bgm/battle_legendary_suicune.mp3 index 7e7e4901386..4df599bbbc1 100644 Binary files a/public/audio/bgm/battle_legendary_suicune.mp3 and b/public/audio/bgm/battle_legendary_suicune.mp3 differ diff --git a/public/audio/bgm/battle_legendary_tapu.mp3 b/public/audio/bgm/battle_legendary_tapu.mp3 index 7f251a387a2..7536065ddfb 100644 Binary files a/public/audio/bgm/battle_legendary_tapu.mp3 and b/public/audio/bgm/battle_legendary_tapu.mp3 differ diff --git a/public/audio/bgm/battle_legendary_terapagos.mp3 b/public/audio/bgm/battle_legendary_terapagos.mp3 index b820d7dba6a..3cfea347224 100644 Binary files a/public/audio/bgm/battle_legendary_terapagos.mp3 and b/public/audio/bgm/battle_legendary_terapagos.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ub.mp3 b/public/audio/bgm/battle_legendary_ub.mp3 index 7a6bdb3a678..3aefc713441 100644 Binary files a/public/audio/bgm/battle_legendary_ub.mp3 and b/public/audio/bgm/battle_legendary_ub.mp3 differ diff --git a/public/audio/bgm/battle_legendary_ultra_nec.mp3 b/public/audio/bgm/battle_legendary_ultra_nec.mp3 index 63d8b0fa505..e24c93cd4c2 100644 Binary files a/public/audio/bgm/battle_legendary_ultra_nec.mp3 and b/public/audio/bgm/battle_legendary_ultra_nec.mp3 differ diff --git a/public/audio/bgm/battle_legendary_unova.mp3 b/public/audio/bgm/battle_legendary_unova.mp3 index e4977d5b3b3..3bae8a6a49f 100644 Binary files a/public/audio/bgm/battle_legendary_unova.mp3 and b/public/audio/bgm/battle_legendary_unova.mp3 differ diff --git a/public/audio/bgm/battle_legendary_xern_yvel.mp3 b/public/audio/bgm/battle_legendary_xern_yvel.mp3 index 856bebb0f61..2487f60b28b 100644 Binary files a/public/audio/bgm/battle_legendary_xern_yvel.mp3 and b/public/audio/bgm/battle_legendary_xern_yvel.mp3 differ diff --git a/public/audio/bgm/battle_legendary_zac_zam.mp3 b/public/audio/bgm/battle_legendary_zac_zam.mp3 index 6725625bedf..5a8b8471c5b 100644 Binary files a/public/audio/bgm/battle_legendary_zac_zam.mp3 and b/public/audio/bgm/battle_legendary_zac_zam.mp3 differ diff --git a/public/audio/bgm/battle_paldea_elite.mp3 b/public/audio/bgm/battle_paldea_elite.mp3 index 9a598dfaf64..f3a71ee8340 100644 Binary files a/public/audio/bgm/battle_paldea_elite.mp3 and b/public/audio/bgm/battle_paldea_elite.mp3 differ diff --git a/public/audio/bgm/battle_paldea_gym.mp3 b/public/audio/bgm/battle_paldea_gym.mp3 index eb9a19bacfe..2cef63209fb 100644 Binary files a/public/audio/bgm/battle_paldea_gym.mp3 and b/public/audio/bgm/battle_paldea_gym.mp3 differ diff --git a/public/audio/bgm/battle_plasma_boss.mp3 b/public/audio/bgm/battle_plasma_boss.mp3 new file mode 100644 index 00000000000..124b8f4a230 Binary files /dev/null and b/public/audio/bgm/battle_plasma_boss.mp3 differ diff --git a/public/audio/bgm/battle_plasma_grunt.mp3 b/public/audio/bgm/battle_plasma_grunt.mp3 index fe371f21f9f..7d1bf710bc5 100644 Binary files a/public/audio/bgm/battle_plasma_grunt.mp3 and b/public/audio/bgm/battle_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/battle_rival.mp3 b/public/audio/bgm/battle_rival.mp3 index 3ccf4898491..82ff586576a 100644 Binary files a/public/audio/bgm/battle_rival.mp3 and b/public/audio/bgm/battle_rival.mp3 differ diff --git a/public/audio/bgm/battle_rival_2.mp3 b/public/audio/bgm/battle_rival_2.mp3 index 3f19f990dce..7f063ed5fd0 100644 Binary files a/public/audio/bgm/battle_rival_2.mp3 and b/public/audio/bgm/battle_rival_2.mp3 differ diff --git a/public/audio/bgm/battle_rival_3.mp3 b/public/audio/bgm/battle_rival_3.mp3 index f6254c24cf4..911438b4f83 100644 Binary files a/public/audio/bgm/battle_rival_3.mp3 and b/public/audio/bgm/battle_rival_3.mp3 differ diff --git a/public/audio/bgm/battle_rocket_boss.mp3 b/public/audio/bgm/battle_rocket_boss.mp3 new file mode 100644 index 00000000000..757eaa38c70 Binary files /dev/null and b/public/audio/bgm/battle_rocket_boss.mp3 differ diff --git a/public/audio/bgm/battle_rocket_grunt.mp3 b/public/audio/bgm/battle_rocket_grunt.mp3 new file mode 100644 index 00000000000..e8f5faf86d7 Binary files /dev/null and b/public/audio/bgm/battle_rocket_grunt.mp3 differ diff --git a/public/audio/bgm/battle_sinnoh_champion.mp3 b/public/audio/bgm/battle_sinnoh_champion.mp3 index e6240c5a02a..a662ca20cbb 100644 Binary files a/public/audio/bgm/battle_sinnoh_champion.mp3 and b/public/audio/bgm/battle_sinnoh_champion.mp3 differ diff --git a/public/audio/bgm/battle_sinnoh_gym.mp3 b/public/audio/bgm/battle_sinnoh_gym.mp3 index 3bf7e96f77f..280c33a09e5 100644 Binary files a/public/audio/bgm/battle_sinnoh_gym.mp3 and b/public/audio/bgm/battle_sinnoh_gym.mp3 differ diff --git a/public/audio/bgm/battle_trainer.mp3 b/public/audio/bgm/battle_trainer.mp3 index 1155d72a53c..d90c7bd845f 100644 Binary files a/public/audio/bgm/battle_trainer.mp3 and b/public/audio/bgm/battle_trainer.mp3 differ diff --git a/public/audio/bgm/battle_unova_elite.mp3 b/public/audio/bgm/battle_unova_elite.mp3 index cab27a0de59..8c150acb9e3 100644 Binary files a/public/audio/bgm/battle_unova_elite.mp3 and b/public/audio/bgm/battle_unova_elite.mp3 differ diff --git a/public/audio/bgm/battle_unova_gym.mp3 b/public/audio/bgm/battle_unova_gym.mp3 index 3995e675bfe..46a4600bbca 100644 Binary files a/public/audio/bgm/battle_unova_gym.mp3 and b/public/audio/bgm/battle_unova_gym.mp3 differ diff --git a/public/audio/bgm/battle_wild.mp3 b/public/audio/bgm/battle_wild.mp3 index 98f7fe20150..f8d484ab51e 100644 Binary files a/public/audio/bgm/battle_wild.mp3 and b/public/audio/bgm/battle_wild.mp3 differ diff --git a/public/audio/bgm/battle_wild_strong.mp3 b/public/audio/bgm/battle_wild_strong.mp3 index 166ac3825c5..cf02ef8d1d5 100644 Binary files a/public/audio/bgm/battle_wild_strong.mp3 and b/public/audio/bgm/battle_wild_strong.mp3 differ diff --git a/public/audio/bgm/beach.mp3 b/public/audio/bgm/beach.mp3 index a22386a9dc3..af0486a0c78 100644 Binary files a/public/audio/bgm/beach.mp3 and b/public/audio/bgm/beach.mp3 differ diff --git a/public/audio/bgm/bw/evolution.mp3 b/public/audio/bgm/bw/evolution.mp3 index 0d7ae190bda..ecfd085da26 100644 Binary files a/public/audio/bgm/bw/evolution.mp3 and b/public/audio/bgm/bw/evolution.mp3 differ diff --git a/public/audio/bgm/bw/evolution_fanfare.mp3 b/public/audio/bgm/bw/evolution_fanfare.mp3 index cb394470f1f..6f554a4189e 100644 Binary files a/public/audio/bgm/bw/evolution_fanfare.mp3 and b/public/audio/bgm/bw/evolution_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/heal.mp3 b/public/audio/bgm/bw/heal.mp3 index 22b2d9fb8a3..9300bf35099 100644 Binary files a/public/audio/bgm/bw/heal.mp3 and b/public/audio/bgm/bw/heal.mp3 differ diff --git a/public/audio/bgm/bw/item_fanfare.mp3 b/public/audio/bgm/bw/item_fanfare.mp3 index 336a12dc1a6..7f128ff1c22 100644 Binary files a/public/audio/bgm/bw/item_fanfare.mp3 and b/public/audio/bgm/bw/item_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/level_up_fanfare.mp3 b/public/audio/bgm/bw/level_up_fanfare.mp3 index 3e4bdbdc947..9501092f9dd 100644 Binary files a/public/audio/bgm/bw/level_up_fanfare.mp3 and b/public/audio/bgm/bw/level_up_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/minor_fanfare.mp3 b/public/audio/bgm/bw/minor_fanfare.mp3 index 464a579a38f..2e6104022f1 100644 Binary files a/public/audio/bgm/bw/minor_fanfare.mp3 and b/public/audio/bgm/bw/minor_fanfare.mp3 differ diff --git a/public/audio/bgm/bw/victory_champion.mp3 b/public/audio/bgm/bw/victory_champion.mp3 index 2f6e6096bcb..3711aadcc53 100644 Binary files a/public/audio/bgm/bw/victory_champion.mp3 and b/public/audio/bgm/bw/victory_champion.mp3 differ diff --git a/public/audio/bgm/bw/victory_gym.mp3 b/public/audio/bgm/bw/victory_gym.mp3 index 5968b154ed6..9b93a90dd5d 100644 Binary files a/public/audio/bgm/bw/victory_gym.mp3 and b/public/audio/bgm/bw/victory_gym.mp3 differ diff --git a/public/audio/bgm/bw/victory_team_plasma.mp3 b/public/audio/bgm/bw/victory_team_plasma.mp3 new file mode 100644 index 00000000000..1f2c6229f5d Binary files /dev/null and b/public/audio/bgm/bw/victory_team_plasma.mp3 differ diff --git a/public/audio/bgm/bw/victory_trainer.mp3 b/public/audio/bgm/bw/victory_trainer.mp3 index c8ab465a7b9..f5adb6deacc 100644 Binary files a/public/audio/bgm/bw/victory_trainer.mp3 and b/public/audio/bgm/bw/victory_trainer.mp3 differ diff --git a/public/audio/bgm/cave.mp3 b/public/audio/bgm/cave.mp3 index f27d110d341..59f4063867c 100644 Binary files a/public/audio/bgm/cave.mp3 and b/public/audio/bgm/cave.mp3 differ diff --git a/public/audio/bgm/construction_site.mp3 b/public/audio/bgm/construction_site.mp3 index 841f623a2d5..a5c5f5b1879 100644 Binary files a/public/audio/bgm/construction_site.mp3 and b/public/audio/bgm/construction_site.mp3 differ diff --git a/public/audio/bgm/desert.mp3 b/public/audio/bgm/desert.mp3 index 546cc0c3377..febbacc0100 100644 Binary files a/public/audio/bgm/desert.mp3 and b/public/audio/bgm/desert.mp3 differ diff --git a/public/audio/bgm/dojo.mp3 b/public/audio/bgm/dojo.mp3 index cb4a67b831c..d8621b5b7fc 100644 Binary files a/public/audio/bgm/dojo.mp3 and b/public/audio/bgm/dojo.mp3 differ diff --git a/public/audio/bgm/encounter_ace_trainer.mp3 b/public/audio/bgm/encounter_ace_trainer.mp3 index 835d7fbb56d..ea507898900 100644 Binary files a/public/audio/bgm/encounter_ace_trainer.mp3 and b/public/audio/bgm/encounter_ace_trainer.mp3 differ diff --git a/public/audio/bgm/encounter_backpacker.mp3 b/public/audio/bgm/encounter_backpacker.mp3 index c1e3d7f0ad5..1b95c48c1f8 100644 Binary files a/public/audio/bgm/encounter_backpacker.mp3 and b/public/audio/bgm/encounter_backpacker.mp3 differ diff --git a/public/audio/bgm/encounter_clerk.mp3 b/public/audio/bgm/encounter_clerk.mp3 index 8542a641edc..8e1a45f43d2 100644 Binary files a/public/audio/bgm/encounter_clerk.mp3 and b/public/audio/bgm/encounter_clerk.mp3 differ diff --git a/public/audio/bgm/encounter_cyclist.mp3 b/public/audio/bgm/encounter_cyclist.mp3 index 3603947d999..dda81f48b71 100644 Binary files a/public/audio/bgm/encounter_cyclist.mp3 and b/public/audio/bgm/encounter_cyclist.mp3 differ diff --git a/public/audio/bgm/encounter_final.mp3 b/public/audio/bgm/encounter_final.mp3 index 34e37132e90..ea47aa4bea4 100644 Binary files a/public/audio/bgm/encounter_final.mp3 and b/public/audio/bgm/encounter_final.mp3 differ diff --git a/public/audio/bgm/encounter_lass.mp3 b/public/audio/bgm/encounter_lass.mp3 index 2f8be45c5ea..31ea20e3c02 100644 Binary files a/public/audio/bgm/encounter_lass.mp3 and b/public/audio/bgm/encounter_lass.mp3 differ diff --git a/public/audio/bgm/encounter_parasol_lady.mp3 b/public/audio/bgm/encounter_parasol_lady.mp3 index 1eb632a403c..1fca7bae31a 100644 Binary files a/public/audio/bgm/encounter_parasol_lady.mp3 and b/public/audio/bgm/encounter_parasol_lady.mp3 differ diff --git a/public/audio/bgm/encounter_plasma_grunt.mp3 b/public/audio/bgm/encounter_plasma_grunt.mp3 index 478d3f8edc5..53e73cc0106 100644 Binary files a/public/audio/bgm/encounter_plasma_grunt.mp3 and b/public/audio/bgm/encounter_plasma_grunt.mp3 differ diff --git a/public/audio/bgm/encounter_pokefan.mp3 b/public/audio/bgm/encounter_pokefan.mp3 index 9c8f60aac0f..cc3fafb158b 100644 Binary files a/public/audio/bgm/encounter_pokefan.mp3 and b/public/audio/bgm/encounter_pokefan.mp3 differ diff --git a/public/audio/bgm/encounter_psychic.mp3 b/public/audio/bgm/encounter_psychic.mp3 index 75a2808569b..111e41833a2 100644 Binary files a/public/audio/bgm/encounter_psychic.mp3 and b/public/audio/bgm/encounter_psychic.mp3 differ diff --git a/public/audio/bgm/encounter_rich.mp3 b/public/audio/bgm/encounter_rich.mp3 index cca97e6188e..2df9dfcceab 100644 Binary files a/public/audio/bgm/encounter_rich.mp3 and b/public/audio/bgm/encounter_rich.mp3 differ diff --git a/public/audio/bgm/encounter_rival.mp3 b/public/audio/bgm/encounter_rival.mp3 index 613c1b552cf..b814879b70e 100644 Binary files a/public/audio/bgm/encounter_rival.mp3 and b/public/audio/bgm/encounter_rival.mp3 differ diff --git a/public/audio/bgm/encounter_roughneck.mp3 b/public/audio/bgm/encounter_roughneck.mp3 index 9e239191133..630e1d0263d 100644 Binary files a/public/audio/bgm/encounter_roughneck.mp3 and b/public/audio/bgm/encounter_roughneck.mp3 differ diff --git a/public/audio/bgm/encounter_scientist.mp3 b/public/audio/bgm/encounter_scientist.mp3 index 8cb180cd6ab..a2d2ce7754d 100644 Binary files a/public/audio/bgm/encounter_scientist.mp3 and b/public/audio/bgm/encounter_scientist.mp3 differ diff --git a/public/audio/bgm/encounter_twins.mp3 b/public/audio/bgm/encounter_twins.mp3 index cb6b0ef8a26..8564a101dbe 100644 Binary files a/public/audio/bgm/encounter_twins.mp3 and b/public/audio/bgm/encounter_twins.mp3 differ diff --git a/public/audio/bgm/encounter_youngster.mp3 b/public/audio/bgm/encounter_youngster.mp3 index 33e900b28d0..8ad8bd158e9 100644 Binary files a/public/audio/bgm/encounter_youngster.mp3 and b/public/audio/bgm/encounter_youngster.mp3 differ diff --git a/public/audio/bgm/end.mp3 b/public/audio/bgm/end.mp3 index 83b1273627a..c37973fd9cc 100644 Binary files a/public/audio/bgm/end.mp3 and b/public/audio/bgm/end.mp3 differ diff --git a/public/audio/bgm/end_summit.mp3 b/public/audio/bgm/end_summit.mp3 index 840d888bdd5..413fb4af384 100644 Binary files a/public/audio/bgm/end_summit.mp3 and b/public/audio/bgm/end_summit.mp3 differ diff --git a/public/audio/bgm/factory.mp3 b/public/audio/bgm/factory.mp3 index 78f21dc44d6..72304168306 100644 Binary files a/public/audio/bgm/factory.mp3 and b/public/audio/bgm/factory.mp3 differ diff --git a/public/audio/bgm/fairy_cave.mp3 b/public/audio/bgm/fairy_cave.mp3 index 5de3f702b21..4e1c9ea0eb4 100644 Binary files a/public/audio/bgm/fairy_cave.mp3 and b/public/audio/bgm/fairy_cave.mp3 differ diff --git a/public/audio/bgm/forest.mp3 b/public/audio/bgm/forest.mp3 index 0f5af3b56f3..a1d9ecb4b28 100644 Binary files a/public/audio/bgm/forest.mp3 and b/public/audio/bgm/forest.mp3 differ diff --git a/public/audio/bgm/grass.mp3 b/public/audio/bgm/grass.mp3 index f9555ec2a7d..898da6d42c5 100644 Binary files a/public/audio/bgm/grass.mp3 and b/public/audio/bgm/grass.mp3 differ diff --git a/public/audio/bgm/graveyard.mp3 b/public/audio/bgm/graveyard.mp3 index 343ad3eda98..48092fa3ec2 100644 Binary files a/public/audio/bgm/graveyard.mp3 and b/public/audio/bgm/graveyard.mp3 differ diff --git a/public/audio/bgm/heal.mp3 b/public/audio/bgm/heal.mp3 index 22b2d9fb8a3..9300bf35099 100644 Binary files a/public/audio/bgm/heal.mp3 and b/public/audio/bgm/heal.mp3 differ diff --git a/public/audio/bgm/ice_cave.mp3 b/public/audio/bgm/ice_cave.mp3 index bc23973b9ee..5d1b9e9e354 100644 Binary files a/public/audio/bgm/ice_cave.mp3 and b/public/audio/bgm/ice_cave.mp3 differ diff --git a/public/audio/bgm/island.mp3 b/public/audio/bgm/island.mp3 index 08aecab84a9..27d5ff64562 100644 Binary files a/public/audio/bgm/island.mp3 and b/public/audio/bgm/island.mp3 differ diff --git a/public/audio/bgm/jungle.mp3 b/public/audio/bgm/jungle.mp3 index 5db42ba8d0d..3a21c9bdb41 100644 Binary files a/public/audio/bgm/jungle.mp3 and b/public/audio/bgm/jungle.mp3 differ diff --git a/public/audio/bgm/laboratory.mp3 b/public/audio/bgm/laboratory.mp3 index 38b2b71b62a..e2b617e590a 100644 Binary files a/public/audio/bgm/laboratory.mp3 and b/public/audio/bgm/laboratory.mp3 differ diff --git a/public/audio/bgm/lake.mp3 b/public/audio/bgm/lake.mp3 index e93228ba565..c61fef15e42 100644 Binary files a/public/audio/bgm/lake.mp3 and b/public/audio/bgm/lake.mp3 differ diff --git a/public/audio/bgm/meadow.mp3 b/public/audio/bgm/meadow.mp3 index 5990f79e5da..1c9b6c47325 100644 Binary files a/public/audio/bgm/meadow.mp3 and b/public/audio/bgm/meadow.mp3 differ diff --git a/public/audio/bgm/menu.mp3 b/public/audio/bgm/menu.mp3 index a57ba45bd14..286e986d570 100644 Binary files a/public/audio/bgm/menu.mp3 and b/public/audio/bgm/menu.mp3 differ diff --git a/public/audio/bgm/metropolis.mp3 b/public/audio/bgm/metropolis.mp3 index ff67771bdb9..98c2eb396b6 100644 Binary files a/public/audio/bgm/metropolis.mp3 and b/public/audio/bgm/metropolis.mp3 differ diff --git a/public/audio/bgm/mountain.mp3 b/public/audio/bgm/mountain.mp3 index d71cd687057..e4ca51cf4fd 100644 Binary files a/public/audio/bgm/mountain.mp3 and b/public/audio/bgm/mountain.mp3 differ diff --git a/public/audio/bgm/plains.mp3 b/public/audio/bgm/plains.mp3 index 3deb8f4b27d..6c7a008bce6 100644 Binary files a/public/audio/bgm/plains.mp3 and b/public/audio/bgm/plains.mp3 differ diff --git a/public/audio/bgm/power_plant.mp3 b/public/audio/bgm/power_plant.mp3 index a7ab54305c2..9813ad40a11 100644 Binary files a/public/audio/bgm/power_plant.mp3 and b/public/audio/bgm/power_plant.mp3 differ diff --git a/public/audio/bgm/rse/evolution.mp3 b/public/audio/bgm/rse/evolution.mp3 index 5f1b739f14f..a74cbedb594 100644 Binary files a/public/audio/bgm/rse/evolution.mp3 and b/public/audio/bgm/rse/evolution.mp3 differ diff --git a/public/audio/bgm/rse/evolution_fanfare.mp3 b/public/audio/bgm/rse/evolution_fanfare.mp3 index 165d1d2d8eb..8acfb2f3a95 100644 Binary files a/public/audio/bgm/rse/evolution_fanfare.mp3 and b/public/audio/bgm/rse/evolution_fanfare.mp3 differ diff --git a/public/audio/bgm/rse/level_up_fanfare.mp3 b/public/audio/bgm/rse/level_up_fanfare.mp3 index bc85163c15e..78aea15156d 100644 Binary files a/public/audio/bgm/rse/level_up_fanfare.mp3 and b/public/audio/bgm/rse/level_up_fanfare.mp3 differ diff --git a/public/audio/bgm/rse/victory.mp3 b/public/audio/bgm/rse/victory.mp3 index 871889af615..7bf1d7a5282 100644 Binary files a/public/audio/bgm/rse/victory.mp3 and b/public/audio/bgm/rse/victory.mp3 differ diff --git a/public/audio/bgm/ruins.mp3 b/public/audio/bgm/ruins.mp3 index 096161d8bef..62f31893423 100644 Binary files a/public/audio/bgm/ruins.mp3 and b/public/audio/bgm/ruins.mp3 differ diff --git a/public/audio/bgm/sea.mp3 b/public/audio/bgm/sea.mp3 index 0bf44bcc3e4..8bdaaa696f1 100644 Binary files a/public/audio/bgm/sea.mp3 and b/public/audio/bgm/sea.mp3 differ diff --git a/public/audio/bgm/seabed.mp3 b/public/audio/bgm/seabed.mp3 index afa282cb4db..d0c405b4e1d 100644 Binary files a/public/audio/bgm/seabed.mp3 and b/public/audio/bgm/seabed.mp3 differ diff --git a/public/audio/bgm/slum.mp3 b/public/audio/bgm/slum.mp3 index 2df06608e64..1315c7838fc 100644 Binary files a/public/audio/bgm/slum.mp3 and b/public/audio/bgm/slum.mp3 differ diff --git a/public/audio/bgm/snowy_forest.mp3 b/public/audio/bgm/snowy_forest.mp3 index c0e94538910..1469ef56bde 100644 Binary files a/public/audio/bgm/snowy_forest.mp3 and b/public/audio/bgm/snowy_forest.mp3 differ diff --git a/public/audio/bgm/space.mp3 b/public/audio/bgm/space.mp3 index 9585351c9af..87a53fb84ff 100644 Binary files a/public/audio/bgm/space.mp3 and b/public/audio/bgm/space.mp3 differ diff --git a/public/audio/bgm/swamp.mp3 b/public/audio/bgm/swamp.mp3 index e92045d18d2..eb42c8a7a46 100644 Binary files a/public/audio/bgm/swamp.mp3 and b/public/audio/bgm/swamp.mp3 differ diff --git a/public/audio/bgm/tall_grass.mp3 b/public/audio/bgm/tall_grass.mp3 index 68c587547cf..ba2200b64fc 100644 Binary files a/public/audio/bgm/tall_grass.mp3 and b/public/audio/bgm/tall_grass.mp3 differ diff --git a/public/audio/bgm/temple.mp3 b/public/audio/bgm/temple.mp3 index 810b9f97311..81fa4416575 100644 Binary files a/public/audio/bgm/temple.mp3 and b/public/audio/bgm/temple.mp3 differ diff --git a/public/audio/bgm/title.mp3 b/public/audio/bgm/title.mp3 index 373b56e3acd..86d4be0da35 100644 Binary files a/public/audio/bgm/title.mp3 and b/public/audio/bgm/title.mp3 differ diff --git a/public/audio/bgm/town.mp3 b/public/audio/bgm/town.mp3 index dd8d3fa6666..fb197ade121 100644 Binary files a/public/audio/bgm/town.mp3 and b/public/audio/bgm/town.mp3 differ diff --git a/public/audio/bgm/volcano.mp3 b/public/audio/bgm/volcano.mp3 index 8e5a6ff8d95..093bb86813b 100644 Binary files a/public/audio/bgm/volcano.mp3 and b/public/audio/bgm/volcano.mp3 differ diff --git a/public/audio/bgm/wasteland.mp3 b/public/audio/bgm/wasteland.mp3 index ee068ac2eac..646cbd89a1f 100644 Binary files a/public/audio/bgm/wasteland.mp3 and b/public/audio/bgm/wasteland.mp3 differ diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 16c4a726390..d514814d3f6 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -29,8 +29,8 @@ "15-mega", "150-mega", "150-mega", - "150-mega", - "150-mega", + "150-mega-x", + "150-mega-y", "18-mega", "18-mega", "181-mega", @@ -127,8 +127,8 @@ "384-mega", "4052", "4052", - "4053", - "4053", + "2053", + "2053", "4077", "4077", "4078", @@ -185,8 +185,8 @@ "531-mega", "6-mega", "6-mega", - "6-mega", - "6-mega", + "6-mega-x", + "6-mega-y", "6058", "6058", "6059", @@ -621,7 +621,7 @@ "777", "778-busted", "778-busted", - "778", + "778-disguised", "778", "779", "779", @@ -1161,8 +1161,8 @@ "15b-mega", "150b-mega", "150b-mega", - "150b-mega", - "150b-mega", + "150b-mega-x", + "150b-mega-y", "18b-mega", "18b-mega", "181b-mega", @@ -1259,8 +1259,8 @@ "384b-mega", "4052b", "4052b", - "4053b", - "4053b", + "2053b", + "2053b", "4077b", "4077b", "4078b", @@ -1317,8 +1317,8 @@ "531b-mega", "6b-mega", "6b-mega", - "6b-mega", - "6b-mega", + "6b-mega-x", + "6b-mega-y", "6058b", "6058b", "6059b", @@ -1753,7 +1753,7 @@ "777b", "778b-busted", "778b-busted", - "778b", + "778b-disguised", "778b", "779b", "779b", @@ -2295,8 +2295,8 @@ "15sb-mega", "150sb-mega", "150sb-mega", - "150sb-mega", - "150sb-mega", + "150sb-mega-x", + "150sb-mega-y", "18sb-mega", "18sb-mega", "181sb-mega", @@ -2393,8 +2393,8 @@ "384sb-mega", "4052sb", "4052sb", - "4053sb", - "4053sb", + "2053sb", + "2053sb", "4077sb", "4077sb", "4078sb", @@ -2451,8 +2451,8 @@ "531sb-mega", "6sb-mega", "6sb-mega", - "6sb-mega", - "6sb-mega", + "6sb-mega-x", + "6sb-mega-y", "6058sb", "6058sb", "6059sb", @@ -2885,7 +2885,7 @@ "777sb", "778sb-busted", "778sb-busted", - "778sb", + "778sb-disguised", "778sb", "779sb", "779sb", @@ -3432,8 +3432,8 @@ "15s-mega", "150s-mega", "150s-mega", - "150s-mega", - "150s-mega", + "150s-mega-x", + "150s-mega-y", "18s-mega", "18s-mega", "181s-mega", @@ -3530,8 +3530,8 @@ "384s-mega", "4052s", "4052s", - "4053s", - "4053s", + "2053s", + "2053s", "4077s", "4077s", "4078s", @@ -3588,8 +3588,8 @@ "531s-mega", "6s-mega", "6s-mega", - "6s-mega", - "6s-mega", + "6s-mega-x", + "6s-mega-y", "6058s", "6058s", "6059s", @@ -4024,7 +4024,7 @@ "777s", "778s-busted", "778s-busted", - "778s", + "778s-disguised", "778s", "779s", "779s", diff --git a/public/images/items.json b/public/images/items.json index 6af2029efd9..33dcf8f5e9a 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,13 +4,13 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 414, - "h": 414 + "w": 415, + "h": 415 }, "scale": 1, "frames": [ { - "filename": "relic_gold", + "filename": "galarica_cuff", "rotated": false, "trimmed": true, "sourceSize": { @@ -18,20 +18,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 + "x": 1, + "y": 1, + "w": 29, + "h": 30 }, "frame": { "x": 0, "y": 0, - "w": 15, - "h": 11 + "w": 29, + "h": 30 } }, { - "filename": "ability_capsule", + "filename": "galarica_wreath", "rotated": false, "trimmed": true, "sourceSize": { @@ -39,545 +39,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 15, - "y": 0, - "w": 24, - "h": 14 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 39, - "y": 0, - "w": 16, - "h": 15 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 55, - "y": 0, - "w": 15, - "h": 15 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 70, - "y": 0, - "w": 24, - "h": 15 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 94, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 110, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 126, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 142, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 158, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 174, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 190, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 206, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 222, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "beedrillite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 238, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "blastoisinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 254, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "blazikenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 270, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "cameruptite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 286, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "charizardite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 302, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "charizardite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 318, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "diancite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 334, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "galladite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 350, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "garchompite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 366, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "gardevoirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 382, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 398, - "y": 0, - "w": 16, - "h": 16 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { "x": 0, - "y": 11, - "w": 12, - "h": 17 - } - }, - { - "filename": "glalitite", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 3, "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "h": 27 }, "frame": { - "x": 12, - "y": 14, - "w": 16, - "h": 16 + "x": 29, + "y": 0, + "w": 32, + "h": 27 } }, { - "filename": "gyaradosite", + "filename": "max_mushrooms", "rotated": false, "trimmed": true, "sourceSize": { @@ -585,503 +60,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 28, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "heracronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 44, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "houndoominite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 60, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "kangaskhanite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 76, - "y": 15, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 92, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 108, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "lopunnite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 124, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "lucarionite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 140, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "manectite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 156, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mawilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 172, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "medichamite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 188, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 204, - "y": 16, - "w": 20, - "h": 16 - } - }, - { - "filename": "metagrossite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 224, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 240, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 256, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 272, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "pidgeotite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 288, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "pinsirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 304, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "rayquazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 320, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 336, - "y": 16, - "w": 17, - "h": 16 - } - }, - { - "filename": "sablenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 353, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "salamencite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 369, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "sceptilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 385, - "y": 16, - "w": 16, - "h": 16 - } - }, - { - "filename": "scizorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 1, + "y": 3, + "w": 29, + "h": 28 }, "frame": { "x": 0, "y": 30, - "w": 16, - "h": 16 + "w": 29, + "h": 28 } }, { - "filename": "sharpedonite", + "filename": "bronze_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1089,20 +81,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 5, + "y": 1, + "w": 22, + "h": 31 }, "frame": { - "x": 16, - "y": 31, - "w": 16, - "h": 16 + "x": 29, + "y": 27, + "w": 22, + "h": 31 } }, { - "filename": "slowbronite", + "filename": "great_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1110,419 +102,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 32, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "soul_dew", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 48, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "steelixite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 64, - "y": 31, - "w": 16, - "h": 16 - } - }, - { - "filename": "strawberry_sweet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 16, - "h": 16 - }, - "frame": { - "x": 80, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "swampertite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 96, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "tyranitarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 112, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "venusaurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 128, - "y": 32, - "w": 16, - "h": 16 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 144, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 167, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 190, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 213, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 236, - "y": 32, - "w": 20, - "h": 17 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 256, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 279, - "y": 32, - "w": 23, - "h": 17 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 302, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 320, - "y": 32, - "w": 24, - "h": 18 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 344, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 362, - "y": 32, - "w": 24, - "h": 18 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 386, - "y": 32, - "w": 18, - "h": 18 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 + "x": 5, + "y": 1, + "w": 22, + "h": 31 }, "frame": { "x": 0, - "y": 46, - "w": 16, - "h": 18 + "y": 58, + "w": 22, + "h": 31 } }, { - "filename": "light_stone", + "filename": "linking_cord", "rotated": false, "trimmed": true, "sourceSize": { @@ -1530,20 +123,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 3, + "y": 3, + "w": 27, + "h": 26 }, "frame": { - "x": 16, - "y": 47, - "w": 18, - "h": 18 + "x": 61, + "y": 0, + "w": 27, + "h": 26 } }, { - "filename": "masterpiece_teacup", + "filename": "master_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -1552,670 +145,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 34, - "y": 47, - "w": 21, - "h": 18 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 55, - "y": 47, - "w": 23, - "h": 18 - } - }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 78, - "y": 48, - "w": 21, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 99, - "y": 48, - "w": 18, - "h": 18 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 117, - "y": 48, - "w": 21, - "h": 18 - } - }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 138, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 158, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 178, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 198, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 218, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 238, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 258, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 278, - "y": 49, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 298, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 318, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 338, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 358, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 378, - "y": 50, - "w": 20, - "h": 18 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 398, - "y": 50, - "w": 15, - "h": 22 - } - }, - { - "filename": "wl_item_drop", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 + "y": 1, + "w": 22, + "h": 31 }, "frame": { "x": 0, - "y": 65, - "w": 20, - "h": 18 + "y": 89, + "w": 22, + "h": 31 } }, { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 20, - "y": 65, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 40, - "y": 65, - "w": 20, - "h": 18 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 60, - "y": 65, - "w": 18, - "h": 19 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 78, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 98, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 118, - "y": 66, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 138, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 158, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 178, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 198, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 218, - "y": 67, - "w": 20, - "h": 18 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 238, - "y": 67, - "w": 19, - "h": 19 - } - }, - { - "filename": "blunder_policy", + "filename": "rogue_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -2224,61 +166,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 1, "w": 22, - "h": 19 + "h": 31 }, "frame": { - "x": 257, - "y": 67, + "x": 22, + "y": 58, "w": 22, - "h": 19 + "h": 31 } }, { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 279, - "y": 67, - "w": 19, - "h": 19 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 298, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "dubious_disc", + "filename": "ultra_ribbon", "rotated": false, "trimmed": true, "sourceSize": { @@ -2287,103 +187,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 1, "w": 22, - "h": 19 - }, - "frame": { - "x": 321, - "y": 68, - "w": 22, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 343, - "y": 68, - "w": 23, - "h": 19 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 366, - "y": 68, - "w": 20, - "h": 19 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 386, - "y": 72, - "w": 21, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "h": 31 }, "frame": { "x": 0, - "y": 83, - "w": 23, - "h": 19 + "y": 120, + "w": 22, + "h": 31 } }, { - "filename": "pair_of_tickets", + "filename": "cornerstone_mask", "rotated": false, "trimmed": true, "sourceSize": { @@ -2392,166 +208,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 23, - "y": 83, - "w": 23, - "h": 19 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 46, - "y": 84, - "w": 20, - "h": 19 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 66, - "y": 84, - "w": 22, - "h": 19 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 + "y": 3, + "w": 24, + "h": 26 }, "frame": { "x": 88, - "y": 84, - "w": 19, - "h": 20 + "y": 0, + "w": 24, + "h": 26 } }, { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 107, - "y": 84, - "w": 20, - "h": 20 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 127, - "y": 85, - "w": 23, - "h": 20 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 150, - "y": 85, - "w": 20, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 170, - "y": 85, - "w": 19, - "h": 20 - } - }, - { - "filename": "chipped_pot", + "filename": "ability_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,40 +229,19 @@ }, "spriteSourceSize": { "x": 3, - "y": 6, - "w": 26, - "h": 20 + "y": 3, + "w": 23, + "h": 26 }, "frame": { - "x": 189, - "y": 85, - "w": 26, - "h": 20 + "x": 112, + "y": 0, + "w": 23, + "h": 26 } }, { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 215, - "y": 85, - "w": 22, - "h": 20 - } - }, - { - "filename": "cracked_pot", + "filename": "map", "rotated": false, "trimmed": true, "sourceSize": { @@ -2602,710 +250,17 @@ }, "spriteSourceSize": { "x": 3, - "y": 6, - "w": 26, - "h": 20 - }, - "frame": { - "x": 237, - "y": 86, - "w": 26, - "h": 20 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 263, - "y": 86, - "w": 22, - "h": 20 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 285, - "y": 87, - "w": 20, - "h": 20 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 305, - "y": 87, - "w": 17, - "h": 20 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 322, - "y": 87, - "w": 19, - "h": 20 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 341, - "y": 87, - "w": 24, - "h": 20 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 365, - "y": 87, - "w": 17, - "h": 20 - } - }, - { - "filename": "legend_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 25, - "h": 20 - }, - "frame": { - "x": 382, - "y": 91, - "w": 25, - "h": 20 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 0, - "y": 102, - "w": 20, - "h": 20 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 20, - "y": 102, - "w": 22, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 42, - "y": 103, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 62, - "y": 103, - "w": 20, - "h": 20 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 82, - "y": 104, - "w": 20, - "h": 20 - } - }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 102, - "y": 104, - "w": 18, - "h": 20 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 120, - "y": 105, - "w": 20, - "h": 20 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 140, - "y": 105, - "w": 23, - "h": 20 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 163, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 187, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 211, - "y": 105, - "w": 24, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 235, - "y": 106, - "w": 23, - "h": 20 - } - }, - { - "filename": "smooth_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 258, - "y": 106, - "w": 20, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 278, - "y": 107, - "w": 24, - "h": 20 - } - }, - { - "filename": "strange_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 302, - "y": 107, - "w": 20, - "h": 20 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 322, - "y": 107, - "w": 22, - "h": 20 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 344, - "y": 107, - "w": 20, - "h": 20 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, "y": 5, - "w": 18, + "w": 27, "h": 22 }, "frame": { - "x": 364, - "y": 107, - "w": 18, + "x": 135, + "y": 0, + "w": 27, "h": 22 } }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 382, - "y": 111, - "w": 23, - "h": 21 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 0, - "y": 122, - "w": 23, - "h": 21 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 23, - "y": 122, - "w": 19, - "h": 21 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 42, - "y": 123, - "w": 23, - "h": 21 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 65, - "y": 124, - "w": 20, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 85, - "y": 124, - "w": 22, - "h": 21 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 107, - "y": 125, - "w": 21, - "h": 21 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 128, - "y": 125, - "w": 22, - "h": 21 - } - }, { "filename": "mint_atk", "rotated": false, @@ -3321,8 +276,8 @@ "h": 21 }, "frame": { - "x": 150, - "y": 125, + "x": 162, + "y": 0, "w": 28, "h": 21 } @@ -3342,8 +297,8 @@ "h": 21 }, "frame": { - "x": 178, - "y": 125, + "x": 190, + "y": 0, "w": 28, "h": 21 } @@ -3363,8 +318,8 @@ "h": 21 }, "frame": { - "x": 206, - "y": 125, + "x": 218, + "y": 0, "w": 28, "h": 21 } @@ -3384,8 +339,8 @@ "h": 21 }, "frame": { - "x": 234, - "y": 126, + "x": 246, + "y": 0, "w": 28, "h": 21 } @@ -3405,8 +360,8 @@ "h": 21 }, "frame": { - "x": 262, - "y": 127, + "x": 274, + "y": 0, "w": 28, "h": 21 } @@ -3426,56 +381,14 @@ "h": 21 }, "frame": { - "x": 290, - "y": 127, + "x": 302, + "y": 0, "w": 28, "h": 21 } }, { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 318, - "y": 127, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 341, - "y": 127, - "w": 23, - "h": 21 - } - }, - { - "filename": "metronome", + "filename": "exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3484,19 +397,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, + "y": 1, "w": 17, - "h": 22 + "h": 31 }, "frame": { - "x": 364, - "y": 129, + "x": 22, + "y": 89, "w": 17, - "h": 22 + "h": 31 } }, { - "filename": "n_solarizer", + "filename": "golden_exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3504,62 +417,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 381, - "y": 132, - "w": 23, - "h": 21 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 + "x": 7, + "y": 1, + "w": 17, + "h": 31 }, "frame": { "x": 0, - "y": 143, - "w": 21, - "h": 21 + "y": 151, + "w": 17, + "h": 31 } }, { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 21, - "y": 143, - "w": 21, - "h": 21 - } - }, - { - "filename": "spell_tag", + "filename": "super_exp_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -3568,19 +439,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, - "w": 19, - "h": 21 + "y": 1, + "w": 17, + "h": 31 }, "frame": { - "x": 42, - "y": 144, - "w": 19, - "h": 21 + "x": 22, + "y": 120, + "w": 17, + "h": 31 } }, { - "filename": "sweet_apple", + "filename": "black_augurite", "rotated": false, "trimmed": true, "sourceSize": { @@ -3589,19 +460,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 3, "w": 22, - "h": 21 + "h": 25 }, "frame": { - "x": 61, - "y": 145, + "x": 17, + "y": 151, "w": 22, - "h": 21 + "h": 25 } }, { - "filename": "syrupy_apple", + "filename": "prison_bottle", "rotated": false, "trimmed": true, "sourceSize": { @@ -3609,41 +480,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 + "x": 7, + "y": 1, + "w": 17, + "h": 30 }, "frame": { - "x": 83, - "y": 145, - "w": 22, - "h": 21 + "x": 0, + "y": 182, + "w": 17, + "h": 30 } }, { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 105, - "y": 146, - "w": 22, - "h": 21 - } - }, - { - "filename": "wellspring_mask", + "filename": "big_root", "rotated": false, "trimmed": true, "sourceSize": { @@ -3652,19 +502,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 23, - "h": 21 + "h": 24 }, "frame": { - "x": 127, - "y": 146, + "x": 17, + "y": 176, "w": 23, - "h": 21 + "h": 24 } }, { - "filename": "zoom_lens", + "filename": "chipped_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -3672,20 +522,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 3, "y": 6, - "w": 21, - "h": 21 + "w": 26, + "h": 20 }, "frame": { - "x": 150, - "y": 146, - "w": 21, - "h": 21 + "x": 330, + "y": 0, + "w": 26, + "h": 20 } }, { - "filename": "blank_memory", + "filename": "cracked_pot", "rotated": false, "trimmed": true, "sourceSize": { @@ -3693,20 +543,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 3, + "y": 6, + "w": 26, + "h": 20 }, "frame": { - "x": 171, - "y": 146, - "w": 22, - "h": 22 + "x": 356, + "y": 0, + "w": 26, + "h": 20 } }, { - "filename": "bug_memory", + "filename": "legend_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,20 +564,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 3, + "y": 6, + "w": 25, + "h": 20 }, "frame": { - "x": 193, - "y": 146, - "w": 22, - "h": 22 + "x": 382, + "y": 0, + "w": 25, + "h": 20 } }, { - "filename": "lock_capsule", + "filename": "blank_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,20 +585,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 215, - "y": 146, - "w": 19, - "h": 22 + "x": 0, + "y": 212, + "w": 24, + "h": 24 } }, { - "filename": "charcoal", + "filename": "choice_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -3756,20 +606,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 234, - "y": 147, - "w": 22, - "h": 22 + "x": 0, + "y": 236, + "w": 24, + "h": 24 } }, { - "filename": "dark_memory", + "filename": "draco_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3777,20 +627,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 256, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 260, + "w": 24, + "h": 24 } }, { - "filename": "dire_hit", + "filename": "dread_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,20 +648,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 278, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 284, + "w": 24, + "h": 24 } }, { - "filename": "dna_splicers", + "filename": "earth_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3819,20 +669,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 300, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 308, + "w": 24, + "h": 24 } }, { - "filename": "dragon_memory", + "filename": "fist_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3840,20 +690,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 322, - "y": 148, - "w": 22, - "h": 22 + "x": 0, + "y": 332, + "w": 24, + "h": 24 } }, { - "filename": "hard_meteorite", + "filename": "flame_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -3861,20 +711,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 344, - "y": 148, - "w": 20, - "h": 22 + "x": 0, + "y": 356, + "w": 24, + "h": 24 } }, { - "filename": "soothe_bell", + "filename": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 0, + "y": 380, + "w": 24, + "h": 24 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 0, + "y": 404, + "w": 15, + "h": 11 + } + }, + { + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -3883,19 +775,838 @@ }, "spriteSourceSize": { "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 51, + "y": 27, + "w": 16, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 67, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 91, + "y": 26, + "w": 24, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 115, + "y": 26, + "w": 21, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 136, + "y": 22, + "w": 24, + "h": 24 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 44, + "y": 58, + "w": 16, + "h": 24 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 89, + "w": 18, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 113, + "w": 18, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 39, + "y": 137, + "w": 18, + "h": 24 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 39, + "y": 161, + "w": 24, + "h": 15 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 40, + "y": 176, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 200, + "w": 24, + "h": 24 + } + }, + { + "filename": "iron_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 224, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 248, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 272, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 296, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 320, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 344, + "w": 24, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, + "y": 368, + "w": 24, + "h": 24 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 24, + "y": 392, + "w": 24, + "h": 23 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 48, + "y": 200, + "w": 16, + "h": 24 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 48, + "y": 224, + "w": 16, + "h": 24 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 48, + "y": 248, + "w": 23, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 272, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 296, + "w": 24, + "h": 24 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 320, + "w": 24, + "h": 24 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 344, + "w": 24, + "h": 24 + } + }, + { + "filename": "scanner", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 48, + "y": 368, + "w": 24, + "h": 24 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 48, + "y": 392, + "w": 24, + "h": 23 + } + }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 136, + "y": 46, + "w": 24, + "h": 14 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, "w": 17, - "h": 22 + "h": 24 }, "frame": { - "x": 364, - "y": 151, + "x": 160, + "y": 22, "w": 17, - "h": 22 + "h": 24 } }, { - "filename": "electirizer", + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 177, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 201, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 225, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 249, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 273, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 297, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 321, + "y": 21, + "w": 18, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 339, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 363, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -3904,19 +1615,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, + "y": 4, "w": 22, - "h": 22 + "h": 24 }, "frame": { - "x": 381, - "y": 153, + "x": 387, + "y": 20, "w": 22, - "h": 22 + "h": 24 } }, { - "filename": "electric_memory", + "filename": "adamant_crystal", "rotated": false, "trimmed": true, "sourceSize": { @@ -3924,100 +1635,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 0, - "y": 164, - "w": 22, - "h": 22 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 22, - "y": 164, - "w": 19, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 41, - "y": 165, - "w": 20, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 61, - "y": 166, - "w": 22, - "h": 22 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 83, - "y": 166, - "w": 22, - "h": 22 + "x": 160, + "y": 46, + "w": 23, + "h": 21 } }, { @@ -4035,8 +1662,8 @@ "h": 22 }, "frame": { - "x": 105, - "y": 167, + "x": 183, + "y": 45, "w": 24, "h": 22 } @@ -4056,14 +1683,266 @@ "h": 22 }, "frame": { - "x": 129, - "y": 167, + "x": 207, + "y": 45, "w": 24, "h": 22 } }, { - "filename": "fighting_memory", + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 231, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 255, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 279, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 303, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 327, + "y": 45, + "w": 23, + "h": 23 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 350, + "y": 44, + "w": 23, + "h": 24 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 373, + "y": 44, + "w": 24, + "h": 23 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 397, + "y": 44, + "w": 18, + "h": 24 + } + }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 373, + "y": 67, + "w": 24, + "h": 18 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 397, + "y": 68, + "w": 18, + "h": 24 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 67, + "y": 50, + "w": 24, + "h": 18 + } + }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 91, + "y": 50, + "w": 24, + "h": 20 + } + }, + { + "filename": "dragon_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -4073,18 +1952,81 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, + "w": 21, + "h": 23 + }, + "frame": { + "x": 115, + "y": 50, + "w": 21, + "h": 23 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 136, + "y": 60, + "w": 24, + "h": 20 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, "h": 22 }, "frame": { - "x": 153, - "y": 168, - "w": 22, + "x": 160, + "y": 67, + "w": 24, "h": 22 } }, { - "filename": "fire_memory", + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 184, + "y": 67, + "w": 23, + "h": 23 + } + }, + { + "filename": "griseous_core", "rotated": false, "trimmed": true, "sourceSize": { @@ -4094,18 +2036,333 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, + "w": 23, + "h": 23 + }, + "frame": { + "x": 207, + "y": 67, + "w": 23, + "h": 23 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, "h": 22 }, "frame": { - "x": 175, - "y": 168, - "w": 22, + "x": 230, + "y": 68, + "w": 23, "h": 22 } }, { - "filename": "flying_memory", + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 253, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 276, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "stick", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 299, + "y": 68, + "w": 23, + "h": 23 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 322, + "y": 68, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 344, + "y": 68, + "w": 22, + "h": 23 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 60, + "y": 68, + "w": 24, + "h": 20 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 88, + "w": 22, + "h": 23 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 57, + "y": 134, + "w": 22, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 84, + "y": 70, + "w": 24, + "h": 20 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 79, + "y": 90, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 79, + "y": 113, + "w": 22, + "h": 23 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 79, + "y": 136, + "w": 23, + "h": 21 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 63, + "y": 157, + "w": 23, + "h": 19 + } + }, + { + "filename": "fire_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4116,13 +2373,139 @@ "x": 5, "y": 5, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 197, - "y": 168, + "x": 64, + "y": 176, "w": 22, - "h": 22 + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 64, + "y": 199, + "w": 22, + "h": 23 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 64, + "y": 222, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 86, + "y": 157, + "w": 17, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 86, + "y": 181, + "w": 21, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 86, + "y": 205, + "w": 21, + "h": 24 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 86, + "y": 229, + "w": 23, + "h": 21 } }, { @@ -4140,14 +2523,329 @@ "h": 23 }, "frame": { - "x": 219, - "y": 168, + "x": 71, + "y": 245, "w": 15, "h": 23 } }, { - "filename": "ganlon_berry", + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 86, + "y": 250, + "w": 23, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 108, + "y": 73, + "w": 24, + "h": 20 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 101, + "y": 93, + "w": 22, + "h": 23 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 101, + "y": 116, + "w": 22, + "h": 20 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 102, + "y": 136, + "w": 22, + "h": 21 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 103, + "y": 157, + "w": 20, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 107, + "y": 181, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 107, + "y": 205, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 109, + "y": 229, + "w": 16, + "h": 24 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 109, + "y": 253, + "w": 19, + "h": 20 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 123, + "y": 93, + "w": 16, + "h": 24 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 139, + "y": 80, + "w": 21, + "h": 23 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 160, + "y": 89, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 184, + "y": 90, + "w": 24, + "h": 20 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 208, + "y": 90, + "w": 23, + "h": 21 + } + }, + { + "filename": "blank_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4161,14 +2859,14 @@ "h": 22 }, "frame": { - "x": 234, - "y": 169, + "x": 231, + "y": 90, "w": 22, "h": 22 } }, { - "filename": "ghost_memory", + "filename": "n_lunarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,20 +2874,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 256, - "y": 170, - "w": 22, - "h": 22 + "x": 253, + "y": 91, + "w": 23, + "h": 21 } }, { - "filename": "grass_memory", + "filename": "n_solarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4197,20 +2895,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 278, - "y": 170, - "w": 22, - "h": 22 + "x": 276, + "y": 91, + "w": 23, + "h": 21 } }, { - "filename": "ground_memory", + "filename": "rusted_sword", "rotated": false, "trimmed": true, "sourceSize": { @@ -4218,20 +2916,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, + "w": 23, "h": 22 }, "frame": { - "x": 300, - "y": 170, - "w": 22, + "x": 299, + "y": 91, + "w": 23, "h": 22 } }, { - "filename": "guard_spec", + "filename": "bug_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4246,8 +2944,890 @@ }, "frame": { "x": 322, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 344, + "y": 91, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 139, + "y": 103, + "w": 21, + "h": 21 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 123, + "y": 117, + "w": 16, + "h": 18 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 160, + "y": 109, + "w": 23, + "h": 17 + } + }, + { + "filename": "burn_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 183, + "y": 110, + "w": 23, + "h": 17 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 366, + "y": 85, + "w": 22, + "h": 23 + } + }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 206, + "y": 111, + "w": 23, + "h": 17 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 229, + "y": 112, + "w": 23, + "h": 17 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 252, + "y": 112, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 275, + "y": 112, + "w": 23, + "h": 19 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 298, + "y": 113, + "w": 23, + "h": 19 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 321, + "y": 113, + "w": 23, + "h": 20 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 344, + "y": 113, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 366, + "y": 108, + "w": 22, + "h": 23 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 124, + "y": 135, + "w": 18, + "h": 22 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 157, + "w": 22, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 180, + "w": 22, + "h": 23 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 123, + "y": 203, + "w": 22, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 125, + "y": 226, + "w": 21, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 128, + "y": 249, + "w": 20, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 388, + "y": 92, + "w": 22, + "h": 23 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 388, + "y": 115, + "w": 22, + "h": 19 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 142, + "y": 124, + "w": 18, + "h": 23 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 160, + "y": 126, + "w": 23, + "h": 21 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 183, + "y": 127, + "w": 23, + "h": 20 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 206, + "y": 128, + "w": 23, + "h": 18 + } + }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 229, + "y": 129, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 252, + "y": 131, + "w": 23, + "h": 17 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 132, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 133, + "w": 22, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 341, + "y": 135, + "w": 22, + "h": 22 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, + "y": 147, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 147, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, "y": 170, "w": 22, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 145, + "y": 193, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 170, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 167, + "y": 193, + "w": 22, + "h": 23 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 189, + "y": 147, + "w": 17, + "h": 24 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 206, + "y": 146, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 228, + "y": 146, + "w": 22, + "h": 23 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 148, + "w": 22, "h": 22 } }, @@ -4266,14 +3846,14 @@ "h": 23 }, "frame": { - "x": 344, - "y": 170, + "x": 189, + "y": 171, "w": 17, "h": 23 } }, { - "filename": "mystic_water", + "filename": "wide_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -4281,20 +3861,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, + "x": 5, + "y": 4, + "w": 22, "h": 23 }, "frame": { - "x": 361, - "y": 173, - "w": 20, + "x": 206, + "y": 169, + "w": 22, "h": 23 } }, { - "filename": "healing_charm", + "filename": "enigma_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -4304,13 +3884,265 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 23, + "w": 22, "h": 22 }, "frame": { - "x": 381, + "x": 228, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 170, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 154, + "w": 22, + "h": 22 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 272, "y": 175, - "w": 23, + "w": 22, + "h": 19 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 294, + "y": 176, + "w": 22, + "h": 20 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 157, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 189, + "y": 194, + "w": 22, + "h": 22 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 211, + "y": 192, + "w": 17, + "h": 23 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 191, + "w": 22, "h": 22 } }, @@ -4328,237 +4160,6 @@ "w": 22, "h": 22 }, - "frame": { - "x": 0, - "y": 186, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 22, - "y": 187, - "w": 22, - "h": 22 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 44, - "y": 188, - "w": 22, - "h": 22 - } - }, - { - "filename": "map", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 27, - "h": 22 - }, - "frame": { - "x": 66, - "y": 188, - "w": 27, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 93, - "y": 189, - "w": 22, - "h": 22 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 115, - "y": 189, - "w": 24, - "h": 22 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 139, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 161, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 183, - "y": 190, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 205, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 227, - "y": 191, - "w": 23, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, "frame": { "x": 250, "y": 192, @@ -4567,7 +4168,7 @@ } }, { - "filename": "scroll_of_waters", + "filename": "ice_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4582,7 +4183,238 @@ }, "frame": { "x": 272, - "y": 192, + "y": 194, + "w": 22, + "h": 22 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 294, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 338, + "y": 201, + "w": 22, + "h": 20 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 146, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 168, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 190, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 212, + "y": 215, + "w": 16, + "h": 24 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 214, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 216, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 217, "w": 22, "h": 22 } @@ -4602,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 294, - "y": 192, + "x": 316, + "y": 221, "w": 22, "h": 22 } @@ -4623,12 +4455,33 @@ "h": 22 }, "frame": { - "x": 316, - "y": 192, + "x": 338, + "y": 221, "w": 22, "h": 22 } }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 148, + "y": 238, + "w": 21, + "h": 23 + } + }, { "filename": "steel_memory", "rotated": false, @@ -4644,14 +4497,77 @@ "h": 22 }, "frame": { - "x": 338, - "y": 193, + "x": 169, + "y": 238, "w": 22, "h": 22 } }, { - "filename": "dragon_fang", + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 191, + "y": 238, + "w": 21, + "h": 23 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 212, + "y": 239, + "w": 20, + "h": 22 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 232, + "y": 235, + "w": 17, + "h": 23 + } + }, + { + "filename": "thick_club", "rotated": false, "trimmed": true, "sourceSize": { @@ -4661,14 +4577,77 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 21, - "h": 23 + "w": 22, + "h": 22 }, "frame": { - "x": 360, - "y": 196, - "w": 21, - "h": 23 + "x": 249, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 271, + "y": 238, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 293, + "y": 239, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 315, + "y": 243, + "w": 22, + "h": 21 } }, { @@ -4686,12 +4665,54 @@ "h": 22 }, "frame": { - "x": 381, - "y": 197, + "x": 337, + "y": 243, "w": 22, "h": 22 } }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 148, + "y": 261, + "w": 21, + "h": 18 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 169, + "y": 260, + "w": 22, + "h": 20 + } + }, { "filename": "tm_bug", "rotated": false, @@ -4707,12 +4728,33 @@ "h": 22 }, "frame": { - "x": 0, - "y": 208, + "x": 191, + "y": 261, "w": 22, "h": 22 } }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 213, + "y": 261, + "w": 19, + "h": 22 + } + }, { "filename": "tm_dark", "rotated": false, @@ -4728,12 +4770,33 @@ "h": 22 }, "frame": { - "x": 22, - "y": 209, + "x": 232, + "y": 258, "w": 22, "h": 22 } }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 254, + "y": 258, + "w": 17, + "h": 22 + } + }, { "filename": "tm_dragon", "rotated": false, @@ -4749,8 +4812,8 @@ "h": 22 }, "frame": { - "x": 44, - "y": 210, + "x": 271, + "y": 259, "w": 22, "h": 22 } @@ -4770,8 +4833,8 @@ "h": 22 }, "frame": { - "x": 66, - "y": 210, + "x": 293, + "y": 260, "w": 22, "h": 22 } @@ -4791,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 88, - "y": 211, + "x": 315, + "y": 264, "w": 22, "h": 22 } @@ -4812,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 211, + "x": 337, + "y": 265, "w": 22, "h": 22 } @@ -4833,8 +4896,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 212, + "x": 366, + "y": 131, "w": 22, "h": 22 } @@ -4854,12 +4917,54 @@ "h": 22 }, "frame": { - "x": 154, - "y": 212, + "x": 388, + "y": 134, "w": 22, "h": 22 } }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 128, + "y": 272, + "w": 20, + "h": 20 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 148, + "y": 279, + "w": 21, + "h": 19 + } + }, { "filename": "tm_ghost", "rotated": false, @@ -4875,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 176, - "y": 212, + "x": 169, + "y": 280, "w": 22, "h": 22 } @@ -4896,12 +5001,33 @@ "h": 22 }, "frame": { - "x": 198, - "y": 213, + "x": 191, + "y": 283, "w": 22, "h": 22 } }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 213, + "y": 283, + "w": 19, + "h": 22 + } + }, { "filename": "tm_ground", "rotated": false, @@ -4917,12 +5043,33 @@ "h": 22 }, "frame": { - "x": 220, - "y": 213, + "x": 232, + "y": 280, "w": 22, "h": 22 } }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 254, + "y": 280, + "w": 17, + "h": 22 + } + }, { "filename": "tm_ice", "rotated": false, @@ -4938,8 +5085,8 @@ "h": 22 }, "frame": { - "x": 242, - "y": 214, + "x": 271, + "y": 281, "w": 22, "h": 22 } @@ -4959,8 +5106,8 @@ "h": 22 }, "frame": { - "x": 264, - "y": 214, + "x": 293, + "y": 282, "w": 22, "h": 22 } @@ -4980,8 +5127,8 @@ "h": 22 }, "frame": { - "x": 286, - "y": 214, + "x": 315, + "y": 286, "w": 22, "h": 22 } @@ -5001,8 +5148,8 @@ "h": 22 }, "frame": { - "x": 308, - "y": 214, + "x": 337, + "y": 287, "w": 22, "h": 22 } @@ -5022,8 +5169,8 @@ "h": 22 }, "frame": { - "x": 330, - "y": 215, + "x": 72, + "y": 270, "w": 22, "h": 22 } @@ -5043,8 +5190,8 @@ "h": 22 }, "frame": { - "x": 352, - "y": 219, + "x": 72, + "y": 292, "w": 22, "h": 22 } @@ -5064,33 +5211,12 @@ "h": 22 }, "frame": { - "x": 374, - "y": 219, + "x": 72, + "y": 314, "w": 22, "h": 22 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 396, - "y": 219, - "w": 17, - "h": 23 - } - }, { "filename": "water_memory", "rotated": false, @@ -5106,8 +5232,8 @@ "h": 22 }, "frame": { - "x": 0, - "y": 230, + "x": 72, + "y": 336, "w": 22, "h": 22 } @@ -5127,8 +5253,8 @@ "h": 22 }, "frame": { - "x": 22, - "y": 231, + "x": 72, + "y": 358, "w": 22, "h": 22 } @@ -5148,12 +5274,54 @@ "h": 22 }, "frame": { - "x": 44, - "y": 232, + "x": 72, + "y": 380, "w": 22, "h": 22 } }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 94, + "y": 270, + "w": 15, + "h": 22 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 109, + "y": 273, + "w": 19, + "h": 19 + } + }, { "filename": "x_attack", "rotated": false, @@ -5169,8 +5337,8 @@ "h": 22 }, "frame": { - "x": 66, - "y": 232, + "x": 94, + "y": 292, "w": 22, "h": 22 } @@ -5190,8 +5358,8 @@ "h": 22 }, "frame": { - "x": 88, - "y": 233, + "x": 116, + "y": 292, "w": 22, "h": 22 } @@ -5211,8 +5379,8 @@ "h": 22 }, "frame": { - "x": 110, - "y": 233, + "x": 94, + "y": 314, "w": 22, "h": 22 } @@ -5232,8 +5400,8 @@ "h": 22 }, "frame": { - "x": 132, - "y": 234, + "x": 94, + "y": 336, "w": 22, "h": 22 } @@ -5253,14 +5421,14 @@ "h": 22 }, "frame": { - "x": 154, - "y": 234, + "x": 116, + "y": 314, "w": 22, "h": 22 } }, { - "filename": "black_belt", + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -5269,292 +5437,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 176, - "y": 234, - "w": 22, - "h": 23 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 198, - "y": 235, - "w": 23, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 221, - "y": 235, + "x": 94, + "y": 358, "w": 21, - "h": 23 + "h": 21 } }, { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 242, - "y": 236, - "w": 22, - "h": 23 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 264, - "y": 236, - "w": 24, - "h": 23 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 288, - "y": 236, - "w": 24, - "h": 23 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 312, - "y": 236, - "w": 18, - "h": 23 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 330, - "y": 237, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 352, - "y": 241, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 374, - "y": 241, - "w": 22, - "h": 23 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 396, - "y": 242, - "w": 17, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 0, - "y": 252, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 22, - "y": 253, - "w": 22, - "h": 23 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 44, - "y": 254, - "w": 23, - "h": 23 - } - }, - { - "filename": "leaf_stone", + "filename": "shiny_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5563,19 +5458,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 67, - "y": 254, + "x": 116, + "y": 336, "w": 21, - "h": 23 + "h": 21 } }, { - "filename": "expert_belt", + "filename": "sitrus_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5583,41 +5478,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 + "x": 6, + "y": 5, + "w": 20, + "h": 22 }, "frame": { - "x": 88, - "y": 255, - "w": 24, - "h": 23 + "x": 94, + "y": 379, + "w": 20, + "h": 22 } }, { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 112, - "y": 255, - "w": 16, - "h": 24 - } - }, - { - "filename": "fire_stone", + "filename": "zoom_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -5626,1447 +5500,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 128, - "y": 256, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 150, - "y": 256, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 172, - "y": 257, - "w": 22, - "h": 23 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 194, - "y": 258, - "w": 22, - "h": 23 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 216, - "y": 258, - "w": 22, - "h": 23 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 238, - "y": 259, - "w": 22, - "h": 23 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 260, - "y": 259, - "w": 23, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 283, - "y": 259, - "w": 22, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 305, - "y": 259, - "w": 24, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 329, - "y": 260, - "w": 22, - "h": 23 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 351, - "y": 264, - "w": 24, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, + "y": 6, "w": 21, - "h": 23 + "h": 21 }, "frame": { - "x": 375, - "y": 264, - "w": 21, - "h": 23 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 396, - "y": 265, - "w": 16, - "h": 24 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 0, - "y": 275, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 22, - "y": 276, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 44, - "y": 277, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 66, - "y": 277, - "w": 22, - "h": 23 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 88, - "y": 278, - "w": 22, - "h": 23 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 110, - "y": 279, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 133, - "y": 279, - "w": 23, - "h": 23 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 156, - "y": 279, - "w": 16, - "h": 24 - } - }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 172, - "y": 280, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 194, - "y": 281, - "w": 22, - "h": 23 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 216, - "y": 281, - "w": 22, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 238, - "y": 282, - "w": 24, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 262, - "y": 282, - "w": 22, - "h": 23 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 284, - "y": 282, - "w": 23, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 307, - "y": 282, - "w": 22, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 329, - "y": 283, - "w": 21, - "h": 23 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 350, - "y": 287, - "w": 24, - "h": 23 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 374, - "y": 287, - "w": 22, - "h": 23 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 396, - "y": 289, - "w": 18, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 0, + "x": 138, "y": 298, "w": 21, - "h": 24 + "h": 21 } }, { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 21, - "y": 299, - "w": 23, - "h": 24 - } - }, - { - "filename": "blank_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 300, - "w": 24, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 68, - "y": 300, - "w": 18, - "h": 24 - } - }, - { - "filename": "choice_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 86, - "y": 301, - "w": 24, - "h": 24 - } - }, - { - "filename": "draco_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 110, - "y": 302, - "w": 24, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 134, - "y": 302, - "w": 18, - "h": 24 - } - }, - { - "filename": "dread_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 152, - "y": 303, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 176, - "y": 303, - "w": 16, - "h": 24 - } - }, - { - "filename": "earth_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 304, - "w": 24, - "h": 24 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 216, - "y": 304, - "w": 17, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 233, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "flame_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 257, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 281, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 305, - "y": 305, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 329, - "y": 306, - "w": 18, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 347, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 371, - "y": 310, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 395, - "y": 313, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 0, - "y": 322, - "w": 17, - "h": 24 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 17, - "y": 323, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 41, - "y": 324, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 65, - "y": 324, - "w": 18, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 83, - "y": 325, - "w": 24, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 107, - "y": 326, - "w": 23, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 130, - "y": 326, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 146, - "y": 327, - "w": 24, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 170, - "y": 327, - "w": 22, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 328, - "w": 24, - "h": 24 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 216, - "y": 328, - "w": 16, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 232, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_ultra", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 256, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 280, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 304, - "y": 329, - "w": 24, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 328, - "y": 330, - "w": 16, - "h": 24 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 344, - "y": 334, - "w": 24, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 368, - "y": 334, - "w": 24, - "h": 24 - } - }, - { - "filename": "oval_charm", + "filename": "sharp_meteorite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7075,61 +5521,40 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, + "y": 8, "w": 21, - "h": 24 + "h": 18 }, "frame": { - "x": 392, + "x": 138, + "y": 319, + "w": 21, + "h": 18 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 137, "y": 337, - "w": 21, - "h": 24 + "w": 22, + "h": 19 } }, { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 0, - "y": 346, - "w": 16, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 16, - "y": 347, - "w": 24, - "h": 24 - } - }, - { - "filename": "red_orb", + "filename": "dawn_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -7138,82 +5563,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, + "y": 6, "w": 20, - "h": 24 + "h": 21 }, "frame": { - "x": 40, - "y": 348, + "x": 159, + "y": 302, "w": 20, - "h": 24 + "h": 21 } }, { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 60, - "y": 348, - "w": 16, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 76, - "y": 349, - "w": 23, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 99, - "y": 350, - "w": 24, - "h": 24 - } - }, - { - "filename": "shiny_charm", + "filename": "blue_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7222,19 +5584,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, - "w": 21, - "h": 24 + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 123, - "y": 350, - "w": 21, - "h": 24 + "x": 159, + "y": 323, + "w": 20, + "h": 20 } }, { - "filename": "scanner", + "filename": "everstone", "rotated": false, "trimmed": true, "sourceSize": { @@ -7242,20 +5604,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 6, + "y": 8, + "w": 20, + "h": 17 }, "frame": { - "x": 144, - "y": 351, - "w": 24, - "h": 24 + "x": 159, + "y": 343, + "w": 20, + "h": 17 } }, { - "filename": "silk_scarf", + "filename": "revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -7263,37 +5625,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { - "x": 168, - "y": 351, - "w": 24, - "h": 24 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 192, - "y": 352, - "w": 24, - "h": 24 + "x": 179, + "y": 302, + "w": 12, + "h": 17 } }, { @@ -7311,14 +5652,14 @@ "h": 24 }, "frame": { - "x": 216, - "y": 352, + "x": 179, + "y": 319, "w": 16, "h": 24 } }, { - "filename": "splash_plate", + "filename": "candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -7326,79 +5667,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 + "x": 7, + "y": 11, + "w": 18, + "h": 18 }, "frame": { - "x": 232, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 256, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 280, - "y": 353, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 304, - "y": 353, - "w": 24, - "h": 24 + "x": 179, + "y": 343, + "w": 18, + "h": 18 } }, { @@ -7416,75 +5694,12 @@ "h": 24 }, "frame": { - "x": 328, - "y": 354, + "x": 360, + "y": 157, "w": 16, "h": 24 } }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 344, - "y": 358, - "w": 17, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 361, - "y": 358, - "w": 24, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 385, - "y": 361, - "w": 24, - "h": 24 - } - }, { "filename": "zinc", "rotated": false, @@ -7500,14 +5715,14 @@ "h": 24 }, "frame": { - "x": 0, - "y": 370, + "x": 360, + "y": 181, "w": 16, "h": 24 } }, { - "filename": "black_augurite", + "filename": "quick_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -7515,20 +5730,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 + "x": 6, + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 16, - "y": 371, - "w": 22, - "h": 25 + "x": 360, + "y": 205, + "w": 19, + "h": 21 } }, { - "filename": "ability_charm", + "filename": "candy_jar", "rotated": false, "trimmed": true, "sourceSize": { @@ -7536,20 +5751,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 23, - "h": 26 + "x": 6, + "y": 6, + "w": 19, + "h": 20 }, "frame": { - "x": 38, - "y": 372, - "w": 23, - "h": 26 + "x": 360, + "y": 226, + "w": 19, + "h": 20 } }, { - "filename": "cornerstone_mask", + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7557,20 +5772,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 24, - "h": 26 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 61, - "y": 373, - "w": 24, - "h": 26 + "x": 359, + "y": 246, + "w": 20, + "h": 20 } }, { - "filename": "linking_cord", + "filename": "magnet", "rotated": false, "trimmed": true, "sourceSize": { @@ -7578,20 +5793,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 27, - "h": 26 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 85, - "y": 374, - "w": 27, - "h": 26 + "x": 359, + "y": 266, + "w": 20, + "h": 20 } }, { - "filename": "galarica_wreath", + "filename": "mb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7599,20 +5814,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 32, - "h": 27 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 112, - "y": 374, - "w": 32, - "h": 27 + "x": 359, + "y": 286, + "w": 20, + "h": 20 } }, { - "filename": "max_mushrooms", + "filename": "pb", "rotated": false, "trimmed": true, "sourceSize": { @@ -7620,20 +5835,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 29, - "h": 28 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 144, - "y": 375, - "w": 29, - "h": 28 + "x": 376, + "y": 156, + "w": 20, + "h": 20 } }, { - "filename": "prison_bottle", + "filename": "spell_tag", "rotated": false, "trimmed": true, "sourceSize": { @@ -7642,19 +5857,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 1, - "w": 17, - "h": 30 + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 173, - "y": 375, - "w": 17, - "h": 30 + "x": 396, + "y": 156, + "w": 19, + "h": 21 } }, { - "filename": "galarica_cuff", + "filename": "pb_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -7662,20 +5877,1091 @@ "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 29, - "h": 30 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 190, + "x": 376, + "y": 176, + "w": 20, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 396, + "y": 177, + "w": 19, + "h": 20 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 379, + "y": 196, + "w": 17, + "h": 20 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 396, + "y": 197, + "w": 19, + "h": 19 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 216, + "w": 20, + "h": 20 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 216, + "w": 16, + "h": 16 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 236, + "w": 20, + "h": 20 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 232, + "w": 16, + "h": 16 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 248, + "w": 16, + "h": 16 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 256, + "w": 20, + "h": 20 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 264, + "w": 16, + "h": 16 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 379, + "y": 276, + "w": 20, + "h": 20 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 280, + "w": 16, + "h": 16 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 379, + "y": 296, + "w": 21, + "h": 18 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 400, + "y": 296, + "w": 15, + "h": 15 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 400, + "y": 311, + "w": 15, + "h": 15 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 359, + "y": 306, + "w": 20, + "h": 19 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 379, + "y": 314, + "w": 20, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 399, + "y": 326, + "w": 16, + "h": 16 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 195, + "y": 305, + "w": 20, + "h": 19 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 195, + "y": 324, + "w": 18, + "h": 19 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 215, + "y": 305, + "w": 17, + "h": 20 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 232, + "y": 302, + "w": 18, + "h": 20 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 250, + "y": 302, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 270, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 213, + "y": 325, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 197, + "y": 343, + "w": 20, + "h": 18 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 217, + "y": 343, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 290, + "y": 304, + "w": 20, + "h": 18 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 233, + "y": 322, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 251, + "y": 320, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 322, + "w": 20, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 235, + "y": 340, + "w": 18, + "h": 18 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 338, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 339, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 340, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 310, + "y": 308, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 326, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 344, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 330, + "y": 309, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 327, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 345, + "w": 20, + "h": 18 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 354, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 357, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, + "y": 358, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 309, + "y": 362, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 363, + "w": 20, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 235, + "y": 358, + "w": 18, + "h": 18 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 253, + "y": 370, + "w": 16, + "h": 16 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 269, + "y": 375, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 289, "y": 376, - "w": 29, - "h": 30 + "w": 20, + "h": 18 } }, { - "filename": "bronze_ribbon", + "filename": "wl_reset_urge", "rotated": false, "trimmed": true, "sourceSize": { @@ -7683,20 +6969,62 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 6, + "y": 8, + "w": 20, + "h": 18 }, "frame": { - "x": 219, - "y": 377, - "w": 22, - "h": 31 + "x": 309, + "y": 380, + "w": 20, + "h": 18 } }, { - "filename": "exp_charm", + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 329, + "y": 381, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 116, + "y": 357, + "w": 20, + "h": 18 + } + }, + { + "filename": "relic_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -7705,19 +7033,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 1, + "y": 9, "w": 17, - "h": 31 + "h": 16 }, "frame": { - "x": 241, - "y": 377, + "x": 115, + "y": 375, "w": 17, - "h": 31 + "h": 16 } }, { - "filename": "golden_exp_charm", + "filename": "beedrillite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7725,20 +7053,209 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 114, + "y": 391, + "w": 16, + "h": 16 + } + }, + { + "filename": "blastoisinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 130, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "blazikenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 146, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "cameruptite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 162, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 178, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "charizardite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 194, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "diancite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 210, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "galladite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 226, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "garchompite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 242, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "gardevoirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { "x": 258, - "y": 377, - "w": 17, - "h": 31 + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "great_ribbon", + "filename": "gengarite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7746,20 +7263,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 275, - "y": 377, - "w": 22, - "h": 31 + "x": 274, + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "master_ribbon", + "filename": "glalitite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7767,20 +7284,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 297, - "y": 377, - "w": 22, - "h": 31 + "x": 290, + "y": 399, + "w": 16, + "h": 16 } }, { - "filename": "rogue_ribbon", + "filename": "gyaradosite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7788,58 +7305,646 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 + "x": 8, + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 319, + "x": 306, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "heracronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 322, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "houndoominite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 338, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "kangaskhanite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 132, + "y": 375, + "w": 16, + "h": 16 + } + }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 136, + "y": 360, + "w": 16, + "h": 15 + } + }, + { + "filename": "latiasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 152, + "y": 360, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 148, + "y": 376, + "w": 16, + "h": 16 + } + }, + { + "filename": "lopunnite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 168, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "lucarionite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 184, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "manectite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 200, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "mawilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 216, + "y": 361, + "w": 16, + "h": 16 + } + }, + { + "filename": "medichamite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 164, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "metagrossite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 180, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 196, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 212, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 228, + "y": 377, + "w": 16, + "h": 16 + } + }, + { + "filename": "pidgeotite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 327, + "w": 16, + "h": 16 + } + }, + { + "filename": "pinsirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 343, + "w": 16, + "h": 16 + } + }, + { + "filename": "rayquazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 359, + "w": 16, + "h": 16 + } + }, + { + "filename": "sablenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 349, + "y": 375, + "w": 16, + "h": 16 + } + }, + { + "filename": "salamencite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 354, + "y": 391, + "w": 16, + "h": 16 + } + }, + { + "filename": "sceptilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 330, + "w": 16, + "h": 16 + } + }, + { + "filename": "scizorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 330, + "w": 16, + "h": 16 + } + }, + { + "filename": "sharpedonite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 346, + "w": 16, + "h": 16 + } + }, + { + "filename": "slowbronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 365, + "y": 362, + "w": 16, + "h": 16 + } + }, + { + "filename": "soul_dew", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 346, + "w": 16, + "h": 16 + } + }, + { + "filename": "steelixite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 381, + "y": 362, + "w": 16, + "h": 16 + } + }, + { + "filename": "strawberry_sweet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 7, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 342, + "w": 16, + "h": 16 + } + }, + { + "filename": "swampertite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 358, + "w": 16, + "h": 16 + } + }, + { + "filename": "tyranitarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 397, + "y": 374, + "w": 16, + "h": 16 + } + }, + { + "filename": "venusaurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 370, "y": 378, - "w": 22, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 341, - "y": 382, - "w": 17, - "h": 31 - } - }, - { - "filename": "ultra_ribbon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 22, - "h": 31 - }, - "frame": { - "x": 358, - "y": 382, - "w": 22, - "h": 31 + "w": 16, + "h": 16 } } ] @@ -7848,6 +7953,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b516eabbda93be0375a8d45471c54e6c:5bf73f118de19726fc5d5a538ddc6f22:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:60db8f4653a650759cd9189e91c38a40:439307cbef9c000f6c45603b2d82d107:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 51d692b1c73..6d9434d0454 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/eviolite.png b/public/images/items/eviolite.png new file mode 100644 index 00000000000..8eb195ece2a Binary files /dev/null and b/public/images/items/eviolite.png differ diff --git a/public/images/items/light_ball.png b/public/images/items/light_ball.png new file mode 100644 index 00000000000..cd421446608 Binary files /dev/null and b/public/images/items/light_ball.png differ diff --git a/public/images/items/metal_powder.png b/public/images/items/metal_powder.png new file mode 100644 index 00000000000..11c3a39314c Binary files /dev/null and b/public/images/items/metal_powder.png differ diff --git a/public/images/items/quick_powder.png b/public/images/items/quick_powder.png new file mode 100644 index 00000000000..c73ec09eb05 Binary files /dev/null and b/public/images/items/quick_powder.png differ diff --git a/public/images/items/thick_club.png b/public/images/items/thick_club.png new file mode 100644 index 00000000000..a4459aa7701 Binary files /dev/null and b/public/images/items/thick_club.png differ diff --git a/public/images/pokemon/431.json b/public/images/pokemon/431.json index 532fee12a28..53197576127 100644 --- a/public/images/pokemon/431.json +++ b/public/images/pokemon/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a9e29c91fa37ffaea686ff7357e6ad1e:1cbeeb823df6c103f770105557067022:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:d8465d4aec9ba28092cd923067d60408:7d16f4c01fa5addbf3868ea484affc7a:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/431.png b/public/images/pokemon/431.png index 45fca814c3f..e56ee99b0a2 100644 Binary files a/public/images/pokemon/431.png and b/public/images/pokemon/431.png differ diff --git a/public/images/pokemon/678ms.png b/public/images/pokemon/678ms.png deleted file mode 100644 index d2b6f348a0b..00000000000 Binary files a/public/images/pokemon/678ms.png and /dev/null differ diff --git a/public/images/pokemon/678msb.png b/public/images/pokemon/678msb.png deleted file mode 100644 index c32e3064451..00000000000 Binary files a/public/images/pokemon/678msb.png and /dev/null differ diff --git a/public/images/pokemon/778-busted.png b/public/images/pokemon/778-busted.png index 689da764398..dbc478381cd 100644 Binary files a/public/images/pokemon/778-busted.png and b/public/images/pokemon/778-busted.png differ diff --git a/public/images/pokemon/778.json b/public/images/pokemon/778-disguised.json similarity index 95% rename from public/images/pokemon/778.json rename to public/images/pokemon/778-disguised.json index fb77b7834af..fb56a6612d0 100644 --- a/public/images/pokemon/778.json +++ b/public/images/pokemon/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 48, diff --git a/public/images/pokemon/778.png b/public/images/pokemon/778-disguised.png similarity index 100% rename from public/images/pokemon/778.png rename to public/images/pokemon/778-disguised.png diff --git a/public/images/pokemon/back/431.json b/public/images/pokemon/back/431.json index 41b5acaa48c..298dfa78b58 100644 --- a/public/images/pokemon/back/431.json +++ b/public/images/pokemon/back/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d859178994686d479f3197554b49a5d0:4865cb1c68e23bfe2c333b4936466c12:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:58e51c630d2f71df7e68c399b2be62b4:05493809e98cbba93f8bf51723c495a4:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/431.png b/public/images/pokemon/back/431.png index b727d199975..f67604890f0 100644 Binary files a/public/images/pokemon/back/431.png and b/public/images/pokemon/back/431.png differ diff --git a/public/images/pokemon/back/778.json b/public/images/pokemon/back/778-disguised.json similarity index 95% rename from public/images/pokemon/back/778.json rename to public/images/pokemon/back/778-disguised.json index 7e7176217f0..a5818c08d03 100644 --- a/public/images/pokemon/back/778.json +++ b/public/images/pokemon/back/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 51, diff --git a/public/images/pokemon/back/778.png b/public/images/pokemon/back/778-disguised.png similarity index 100% rename from public/images/pokemon/back/778.png rename to public/images/pokemon/back/778-disguised.png diff --git a/public/images/pokemon/back/shiny/431.json b/public/images/pokemon/back/shiny/431.json index 93318f104cd..dc406e42b59 100644 --- a/public/images/pokemon/back/shiny/431.json +++ b/public/images/pokemon/back/shiny/431.json @@ -4,954 +4,114 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 442, + "h": 442 }, "scale": 1, "frames": [ { - "filename": "0103.png", + "filename": "0079.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 0, - "y": 6, - "w": 71, + "y": 11, + "w": 70, "h": 53 }, "frame": { - "x": 0, - "y": 0, - "w": 71, + "x": 1, + "y": 1, + "w": 70, "h": 53 } }, { - "filename": "0104.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 71, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 71, - "h": 53 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, + "x": 1, + "y": 11, "w": 69, "h": 53 }, "frame": { - "x": 0, - "y": 53, + "x": 1, + "y": 56, "w": 69, "h": 53 } }, { - "filename": "0106.png", + "filename": "0081.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 69, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 69, - "h": 53 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 65, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 65, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 5, - "y": 7, + "y": 10, + "w": 65, + "h": 54 + }, + "frame": { + "x": 1, + "y": 111, + "w": 65, + "h": 54 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 4, + "y": 12, "w": 66, "h": 52 }, "frame": { - "x": 71, - "y": 0, + "x": 73, + "y": 1, "w": 66, "h": 52 } }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 66, - "h": 52 - }, - "frame": { - "x": 71, - "y": 0, - "w": 66, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 64, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 64, - "h": 53 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 63, - "h": 53 - }, - "frame": { - "x": 0, - "y": 213, - "w": 63, - "h": 53 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 61, - "h": 54 - }, - "frame": { - "x": 0, - "y": 266, - "w": 61, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 0, - "y": 320, - "w": 60, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 0, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 61, - "h": 52 - }, - "frame": { - "x": 137, - "y": 0, - "w": 61, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 198, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 258, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 318, - "y": 0, - "w": 60, - "h": 54 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 24, - "y": 3, - "w": 47, - "h": 56 - }, - "frame": { - "x": 378, - "y": 0, - "w": 47, - "h": 56 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 57, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, { "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 + "x": 6, + "y": 11, + "w": 64, + "h": 53 }, "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 + "x": 1, + "y": 167, + "w": 64, + "h": 53 } }, { @@ -960,522 +120,18 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 60, - "y": 320, - "w": 59, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 61, - "y": 266, - "w": 59, - "h": 54 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 114, - "y": 374, - "w": 57, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, + "x": 7, + "y": 11, + "w": 63, "h": 53 }, "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 63, - "y": 213, - "w": 59, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 64, - "y": 160, - "w": 59, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 65, - "y": 106, - "w": 60, - "h": 54 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 60, - "h": 54 - }, - "frame": { - "x": 71, - "y": 52, - "w": 60, - "h": 54 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 59, - "h": 54 - }, - "frame": { - "x": 131, - "y": 52, - "w": 59, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 6, - "w": 59, - "h": 53 - }, - "frame": { - "x": 125, - "y": 106, - "w": 59, + "x": 1, + "y": 222, + "w": 63, "h": 53 } }, @@ -1485,166 +141,292 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, + "x": 9, + "y": 10, + "w": 61, "h": 54 }, "frame": { - "x": 119, - "y": 320, - "w": 52, + "x": 1, + "y": 277, + "w": 61, "h": 54 } }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 1, + "y": 333, + "w": 59, + "h": 55 + } + }, { "filename": "0092.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 19, - "y": 5, - "w": 52, - "h": 54 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 119, - "y": 320, - "w": 52, - "h": 54 + "x": 1, + "y": 333, + "w": 59, + "h": 55 } }, { - "filename": "0113.png", + "filename": "0010.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 15, - "y": 5, - "w": 56, - "h": 54 - }, - "frame": { - "x": 120, - "y": 266, - "w": 56, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0051.png", + "filename": "0045.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 122, - "y": 213, - "w": 58, - "h": 53 + "x": 1, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0008.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 9, + "y": 11, + "w": 61, "h": 53 }, "frame": { - "x": 123, - "y": 160, - "w": 58, + "x": 141, + "y": 1, + "w": 61, "h": 53 } }, { - "filename": "0052.png", + "filename": "0002.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, - "h": 53 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 123, - "y": 160, - "w": 58, - "h": 53 + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 204, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 265, + "y": 1, + "w": 59, + "h": 55 } }, { @@ -1653,81 +435,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0062.png", + "filename": "0053.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 6, + "x": 11, + "y": 9, "w": 59, - "h": 53 + "h": 55 }, "frame": { - "x": 190, - "y": 54, + "x": 326, + "y": 1, "w": 59, - "h": 53 + "h": 55 } }, { - "filename": "0015.png", + "filename": "0011.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, - "h": 53 + "y": 13, + "w": 57, + "h": 51 }, "frame": { - "x": 249, - "y": 54, - "w": 58, - "h": 53 + "x": 60, + "y": 390, + "w": 57, + "h": 51 } }, { - "filename": "0059.png", + "filename": "0046.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { "x": 13, - "y": 6, - "w": 58, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 60, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 62, + "y": 333, + "w": 59, + "h": 55 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 119, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 2, + "w": 52, + "h": 62 + }, + "frame": { + "x": 387, + "y": 1, + "w": 52, + "h": 62 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 249, - "y": 54, - "w": 58, + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 73, + "y": 55, + "w": 59, + "h": 53 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, + "h": 53 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 134, + "y": 56, + "w": 59, "h": 53 } }, @@ -1737,145 +708,145 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0060.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 6, - "w": 58, + "x": 11, + "y": 11, + "w": 59, "h": 53 }, "frame": { - "x": 307, - "y": 54, - "w": 58, + "x": 195, + "y": 58, + "w": 59, "h": 53 } }, { - "filename": "0009.png", + "filename": "0017.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0053.png", + "filename": "0052.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 184, - "y": 107, - "w": 58, - "h": 52 + "x": 256, + "y": 58, + "w": 59, + "h": 53 } }, { - "filename": "0010.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0054.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 242, - "y": 107, - "w": 58, - "h": 52 + "x": 317, + "y": 58, + "w": 59, + "h": 55 } }, { - "filename": "0013.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { @@ -1884,40 +855,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 300, - "y": 107, - "w": 58, - "h": 52 + "x": 378, + "y": 65, + "w": 59, + "h": 53 } }, { - "filename": "0014.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { @@ -1926,40 +897,103 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 181, - "y": 159, - "w": 58, - "h": 52 + "x": 72, + "y": 110, + "w": 59, + "h": 53 } }, { - "filename": "0027.png", + "filename": "0034.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 11, + "w": 59, + "h": 53 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 133, + "y": 111, + "w": 59, + "h": 53 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 11, + "y": 11, + "w": 59, + "h": 53 + }, + "frame": { + "x": 194, + "y": 113, + "w": 59, + "h": 53 } }, { @@ -1968,334 +1002,19 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 + "x": 11, + "y": 9, + "w": 59, + "h": 55 }, "frame": { - "x": 239, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 297, - "y": 159, - "w": 58, - "h": 52 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 365, - "y": 56, - "w": 58, - "h": 52 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 12, - "y": 7, - "w": 58, - "h": 52 - }, - "frame": { - "x": 358, - "y": 108, - "w": 58, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 355, - "y": 160, - "w": 57, - "h": 52 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 59 - }, - "frame": { - "x": 171, - "y": 320, - "w": 48, - "h": 59 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 181, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 238, - "y": 211, - "w": 57, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, - "h": 52 - }, - "frame": { - "x": 295, - "y": 211, - "w": 57, - "h": 52 + "x": 255, + "y": 113, + "w": 59, + "h": 55 } }, { @@ -2304,18 +1023,270 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 7, - "w": 57, + "x": 11, + "y": 9, + "w": 59, + "h": 55 + }, + "frame": { + "x": 316, + "y": 115, + "w": 59, + "h": 55 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 377, + "y": 120, + "w": 58, + "h": 53 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 68, + "y": 165, + "w": 58, + "h": 53 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 128, + "y": 166, + "w": 58, + "h": 53 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 58, + "h": 53 + }, + "frame": { + "x": 188, + "y": 168, + "w": 58, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 295, - "y": 211, - "w": 57, + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 248, + "y": 170, + "w": 58, + "h": 52 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, + "h": 52 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 308, + "y": 172, + "w": 58, "h": 52 } }, @@ -2325,375 +1296,39 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 352, - "y": 212, - "w": 57, - "h": 51 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 19, - "y": 2, - "w": 52, - "h": 57 - }, - "frame": { - "x": 180, - "y": 263, - "w": 52, - "h": 57 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, { - "filename": "0100.png", + "filename": "0067.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 57, + "x": 12, + "y": 12, + "w": 58, "h": 52 }, "frame": { - "x": 232, - "y": 263, - "w": 57, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 289, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 57, - "h": 51 - }, - "frame": { - "x": 346, - "y": 263, - "w": 57, - "h": 51 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 27, - "y": 2, - "w": 45, - "h": 57 - }, - "frame": { - "x": 219, - "y": 320, - "w": 45, - "h": 57 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 23, - "y": 3, - "w": 48, - "h": 56 - }, - "frame": { - "x": 264, - "y": 315, - "w": 48, - "h": 56 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 18, - "y": 3, - "w": 53, - "h": 56 - }, - "frame": { - "x": 312, - "y": 314, - "w": 53, - "h": 56 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, - "h": 52 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 59 - }, - "spriteSourceSize": { - "x": 14, - "y": 7, - "w": 56, - "h": 52 - }, - "frame": { - "x": 365, - "y": 314, - "w": 56, + "x": 368, + "y": 175, + "w": 58, "h": 52 } }, @@ -2703,19 +1338,40 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, - "w": 56, - "h": 50 + "x": 12, + "y": 12, + "w": 58, + "h": 52 }, "frame": { - "x": 365, - "y": 366, - "w": 56, - "h": 50 + "x": 67, + "y": 220, + "w": 58, + "h": 52 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 58, + "h": 52 + }, + "frame": { + "x": 67, + "y": 220, + "w": 58, + "h": 52 } }, { @@ -2724,62 +1380,566 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 66, + "y": 274, + "w": 57, + "h": 57 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 127, + "y": 221, + "w": 57, + "h": 52 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 7, + "w": 57, + "h": 57 + }, + "frame": { + "x": 125, + "y": 275, + "w": 57, + "h": 57 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 123, + "y": 334, + "w": 57, + "h": 52 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 186, + "y": 223, + "w": 57, + "h": 52 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 }, "spriteSourceSize": { "x": 14, - "y": 9, + "y": 6, + "w": 56, + "h": 58 + }, + "frame": { + "x": 184, + "y": 277, + "w": 56, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 57, + "h": 52 + }, + "frame": { + "x": 245, + "y": 224, + "w": 57, + "h": 52 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 18, + "y": 3, + "w": 52, + "h": 61 + }, + "frame": { + "x": 242, + "y": 278, + "w": 52, + "h": 61 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 182, + "y": 337, + "w": 57, + "h": 51 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 178, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 13, + "w": 57, + "h": 51 + }, + "frame": { + "x": 237, + "y": 390, + "w": 57, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 365, - "y": 366, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0034.png", + "filename": "0063.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 304, + "y": 226, "w": 56, "h": 50 } }, { - "filename": "0078.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 59 + "h": 64 }, "spriteSourceSize": { - "x": 14, - "y": 9, + "x": 19, + "y": 6, + "w": 51, + "h": 58 + }, + "frame": { + "x": 296, + "y": 278, + "w": 51, + "h": 58 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, "w": 56, "h": 50 }, "frame": { - "x": 264, - "y": 371, + "x": 362, + "y": 229, "w": 56, "h": 50 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 13, + "y": 14, + "w": 56, + "h": 50 + }, + "frame": { + "x": 362, + "y": 229, + "w": 56, + "h": 50 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 22, + "y": 5, + "w": 48, + "h": 59 + }, + "frame": { + "x": 349, + "y": 281, + "w": 48, + "h": 59 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 47, + "h": 64 + }, + "frame": { + "x": 296, + "y": 338, + "w": 47, + "h": 64 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 23, + "y": 5, + "w": 47, + "h": 59 + }, + "frame": { + "x": 345, + "y": 342, + "w": 47, + "h": 59 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 64 + }, + "spriteSourceSize": { + "x": 27, + "y": 7, + "w": 45, + "h": 57 + }, + "frame": { + "x": 394, + "y": 342, + "w": 45, + "h": 57 + } } ] } @@ -2787,6 +1947,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9ebc8034f2bcafe3ce6ab17b95a0f671:79e5c7024ab4d617b896435d49ee6160:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:e3e0553fc99b75c9f0a499716eabc86f:42d213ec7c63d2c551ed86c1abf4ffa6:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/back/shiny/431.png b/public/images/pokemon/back/shiny/431.png index e44ada40ef6..26248938782 100644 Binary files a/public/images/pokemon/back/shiny/431.png and b/public/images/pokemon/back/shiny/431.png differ diff --git a/public/images/pokemon/back/shiny/778.json b/public/images/pokemon/back/shiny/778-disguised.json similarity index 95% rename from public/images/pokemon/back/shiny/778.json rename to public/images/pokemon/back/shiny/778-disguised.json index b4a769a5fcc..5e6ab612903 100644 --- a/public/images/pokemon/back/shiny/778.json +++ b/public/images/pokemon/back/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 51, diff --git a/public/images/pokemon/back/shiny/778.png b/public/images/pokemon/back/shiny/778-disguised.png similarity index 100% rename from public/images/pokemon/back/shiny/778.png rename to public/images/pokemon/back/shiny/778-disguised.png diff --git a/public/images/pokemon/exp/130-mega.png b/public/images/pokemon/exp/130-mega.png index 4785caffc9f..00fc5316581 100644 Binary files a/public/images/pokemon/exp/130-mega.png and b/public/images/pokemon/exp/130-mega.png differ diff --git a/public/images/pokemon/exp/4053.json b/public/images/pokemon/exp/2053.json similarity index 99% rename from public/images/pokemon/exp/4053.json rename to public/images/pokemon/exp/2053.json index 741a0be5a78..3f7ce8e6d9b 100644 --- a/public/images/pokemon/exp/4053.json +++ b/public/images/pokemon/exp/2053.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "4053.png", + "image": "2053.png", "format": "RGBA8888", "size": { "w": 328, diff --git a/public/images/pokemon/exp/4053.png b/public/images/pokemon/exp/2053.png similarity index 100% rename from public/images/pokemon/exp/4053.png rename to public/images/pokemon/exp/2053.png diff --git a/public/images/pokemon/exp/777.json b/public/images/pokemon/exp/777.json index cf428246297..4181c495c7c 100644 --- a/public/images/pokemon/exp/777.json +++ b/public/images/pokemon/exp/777.json @@ -1,2120 +1,1071 @@ -{ - "textures": [ - { - "image": "777.png", - "format": "RGBA8888", - "size": { - "w": 128, - "h": 128 - }, - "scale": 1, - "frames": [ - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 44, - "h": 38 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 44, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 87, - "y": 0, - "w": 41, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 43, - "h": 39 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 43, - "y": 39, - "w": 43, - "h": 40 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 86, - "y": 40, - "w": 42, - "h": 40 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 86, - "y": 40, - "w": 42, - "h": 40 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 86, - "y": 40, - "w": 42, - "h": 40 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 86, - "y": 40, - "w": 42, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 45, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 40 - }, - "frame": { - "x": 45, - "y": 80, - "w": 45, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f7ea3f0da99775f55033547cefdf79c0:187e311aafa6bff27efd6b8d1f7b0cdb:1aa6e90a0c99d7990e17ee8433a9373d$" - } -} +{ + "textures": [ + { + "image": "777.png", + "format": "RGBA8888", + "size": { + "w": 163, + "h": 163 + }, + "scale": 1, + "frames": [ + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 37, + "h": 44 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 37, + "h": 44 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "00012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 41, + "w": 40, + "h": 41 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 37, + "y": 43, + "w": 40, + "h": 41 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 117, + "y": 119, + "w": 37, + "h": 44 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 117, + "y": 119, + "w": 37, + "h": 44 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 42 + }, + "frame": { + "x": 37, + "y": 84, + "w": 39, + "h": 42 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 42 + }, + "frame": { + "x": 76, + "y": 120, + "w": 39, + "h": 42 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ad3e4de865d1d9392fed3533c75e9da4:53906d0c8828810f510b3b49c46d0af5:1aa6e90a0c99d7990e17ee8433a9373d$" + } +} diff --git a/public/images/pokemon/exp/778-busted.png b/public/images/pokemon/exp/778-busted.png index 98a02bdad69..67740699c02 100644 Binary files a/public/images/pokemon/exp/778-busted.png and b/public/images/pokemon/exp/778-busted.png differ diff --git a/public/images/pokemon/exp/778.json b/public/images/pokemon/exp/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/778.json rename to public/images/pokemon/exp/778-disguised.json index d3e2f8680b0..9668c6d8d59 100644 --- a/public/images/pokemon/exp/778.json +++ b/public/images/pokemon/exp/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 219, diff --git a/public/images/pokemon/exp/778-disguised.png b/public/images/pokemon/exp/778-disguised.png new file mode 100644 index 00000000000..ba26b8db997 Binary files /dev/null and b/public/images/pokemon/exp/778-disguised.png differ diff --git a/public/images/pokemon/exp/778.png b/public/images/pokemon/exp/778.png deleted file mode 100644 index 7830266be07..00000000000 Binary files a/public/images/pokemon/exp/778.png and /dev/null differ diff --git a/public/images/pokemon/exp/864.png b/public/images/pokemon/exp/864.png index 079b1f6a681..036e2b9e40f 100644 Binary files a/public/images/pokemon/exp/864.png and b/public/images/pokemon/exp/864.png differ diff --git a/public/images/pokemon/exp/back/4053.json b/public/images/pokemon/exp/back/2053.json similarity index 99% rename from public/images/pokemon/exp/back/4053.json rename to public/images/pokemon/exp/back/2053.json index ffa3e356cac..1cf3867377b 100644 --- a/public/images/pokemon/exp/back/4053.json +++ b/public/images/pokemon/exp/back/2053.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "4053.png", + "image": "2053.png", "format": "RGBA8888", "size": { "w": 201, diff --git a/public/images/pokemon/exp/back/4053.png b/public/images/pokemon/exp/back/2053.png similarity index 100% rename from public/images/pokemon/exp/back/4053.png rename to public/images/pokemon/exp/back/2053.png diff --git a/public/images/pokemon/exp/back/777.json b/public/images/pokemon/exp/back/777.json index 887eb7bdf53..11ba80d2829 100644 --- a/public/images/pokemon/exp/back/777.json +++ b/public/images/pokemon/exp/back/777.json @@ -1,2120 +1,965 @@ -{ - "textures": [ - { - "image": "777.png", - "format": "RGBA8888", - "size": { - "w": 124, - "h": 124 - }, - "scale": 1, - "frames": [ - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 39 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 39 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 43, - "h": 38 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 38 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 43, - "y": 38, - "w": 42, - "h": 40 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 39, - "w": 42, - "h": 40 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 39, - "w": 42, - "h": 40 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 39, - "w": 42, - "h": 40 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 39, - "w": 42, - "h": 40 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 79, - "w": 41, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 42, - "h": 38 - }, - "frame": { - "x": 41, - "y": 79, - "w": 42, - "h": 38 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 40 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 41, - "h": 37 - }, - "frame": { - "x": 83, - "y": 78, - "w": 41, - "h": 37 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2dbd46b9793f162e90106f1b36821a1f:3d27ff415f06e64d0035cfc97a637a97:1aa6e90a0c99d7990e17ee8433a9373d$" - } -} +{ + "textures": [ + { + "image": "777.png", + "format": "RGBA8888", + "size": { + "w": 150, + "h": 150 + }, + "scale": 1, + "frames": [ + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 41, + "h": 42 + }, + "frame": { + "x": 0, + "y": 0, + "w": 41, + "h": 42 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 41, + "h": 42 + }, + "frame": { + "x": 0, + "y": 0, + "w": 41, + "h": 42 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 41, + "h": 42 + }, + "frame": { + "x": 0, + "y": 0, + "w": 41, + "h": 42 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 41, + "h": 42 + }, + "frame": { + "x": 0, + "y": 0, + "w": 41, + "h": 42 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 41, + "h": 42 + }, + "frame": { + "x": 0, + "y": 0, + "w": 41, + "h": 42 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 40, + "h": 43 + }, + "frame": { + "x": 0, + "y": 42, + "w": 40, + "h": 43 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 40, + "h": 43 + }, + "frame": { + "x": 0, + "y": 42, + "w": 40, + "h": 43 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 40, + "h": 43 + }, + "frame": { + "x": 0, + "y": 42, + "w": 40, + "h": 43 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 40, + "h": 43 + }, + "frame": { + "x": 0, + "y": 42, + "w": 40, + "h": 43 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 40, + "h": 43 + }, + "frame": { + "x": 0, + "y": 42, + "w": 40, + "h": 43 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 39, + "h": 44 + }, + "frame": { + "x": 0, + "y": 85, + "w": 39, + "h": 44 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 39, + "h": 44 + }, + "frame": { + "x": 0, + "y": 85, + "w": 39, + "h": 44 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 39, + "y": 85, + "w": 37, + "h": 46 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 39, + "y": 85, + "w": 37, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 41, + "h": 41 + }, + "frame": { + "x": 40, + "y": 42, + "w": 41, + "h": 41 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 41, + "h": 40 + }, + "frame": { + "x": 41, + "y": 0, + "w": 41, + "h": 40 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 41, + "h": 40 + }, + "frame": { + "x": 41, + "y": 0, + "w": 41, + "h": 40 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 41, + "h": 40 + }, + "frame": { + "x": 41, + "y": 0, + "w": 41, + "h": 40 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 41, + "h": 40 + }, + "frame": { + "x": 41, + "y": 0, + "w": 41, + "h": 40 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 41, + "h": 40 + }, + "frame": { + "x": 41, + "y": 0, + "w": 41, + "h": 40 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 76, + "y": 83, + "w": 37, + "h": 46 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 76, + "y": 83, + "w": 37, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 41, + "h": 39 + }, + "frame": { + "x": 81, + "y": 40, + "w": 41, + "h": 39 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 41, + "h": 39 + }, + "frame": { + "x": 81, + "y": 40, + "w": 41, + "h": 39 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 41, + "h": 39 + }, + "frame": { + "x": 81, + "y": 40, + "w": 41, + "h": 39 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 41, + "h": 39 + }, + "frame": { + "x": 81, + "y": 40, + "w": 41, + "h": 39 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 41, + "h": 39 + }, + "frame": { + "x": 81, + "y": 40, + "w": 41, + "h": 39 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 113, + "y": 79, + "w": 37, + "h": 46 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 113, + "y": 79, + "w": 37, + "h": 46 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 113, + "y": 79, + "w": 37, + "h": 46 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 113, + "y": 79, + "w": 37, + "h": 46 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 37, + "h": 46 + }, + "frame": { + "x": 113, + "y": 79, + "w": 37, + "h": 46 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 41, + "h": 37 + }, + "frame": { + "x": 82, + "y": 0, + "w": 41, + "h": 37 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 41, + "h": 37 + }, + "frame": { + "x": 82, + "y": 0, + "w": 41, + "h": 37 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 41, + "h": 37 + }, + "frame": { + "x": 82, + "y": 0, + "w": 41, + "h": 37 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 41, + "h": 37 + }, + "frame": { + "x": 82, + "y": 0, + "w": 41, + "h": 37 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 41, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 41, + "h": 37 + }, + "frame": { + "x": 82, + "y": 0, + "w": 41, + "h": 37 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ea3aa51a897b4eb2472f9262bd2f4ae1:daca7bf6ec12e75114380eb80da152a5:1aa6e90a0c99d7990e17ee8433a9373d$" + } +} diff --git a/public/images/pokemon/exp/back/778.json b/public/images/pokemon/exp/back/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/back/778.json rename to public/images/pokemon/exp/back/778-disguised.json index 72555e22d19..04d18782d0d 100644 --- a/public/images/pokemon/exp/back/778.json +++ b/public/images/pokemon/exp/back/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 210, diff --git a/public/images/pokemon/exp/back/778.png b/public/images/pokemon/exp/back/778-disguised.png similarity index 100% rename from public/images/pokemon/exp/back/778.png rename to public/images/pokemon/exp/back/778-disguised.png diff --git a/public/images/pokemon/exp/back/shiny/4053.json b/public/images/pokemon/exp/back/shiny/2053.json similarity index 99% rename from public/images/pokemon/exp/back/shiny/4053.json rename to public/images/pokemon/exp/back/shiny/2053.json index fccdca77c4c..4751a11a59f 100644 --- a/public/images/pokemon/exp/back/shiny/4053.json +++ b/public/images/pokemon/exp/back/shiny/2053.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "4053.png", + "image": "2053.png", "format": "RGBA8888", "size": { "w": 201, diff --git a/public/images/pokemon/exp/back/shiny/4053.png b/public/images/pokemon/exp/back/shiny/2053.png similarity index 100% rename from public/images/pokemon/exp/back/shiny/4053.png rename to public/images/pokemon/exp/back/shiny/2053.png diff --git a/public/images/pokemon/exp/back/shiny/4555.json b/public/images/pokemon/exp/back/shiny/4555.json index 23306700045..24b0847bc3c 100644 --- a/public/images/pokemon/exp/back/shiny/4555.json +++ b/public/images/pokemon/exp/back/shiny/4555.json @@ -1,1091 +1,230 @@ -{ - "textures": [ - { - "image": "4555.png", - "format": "RGBA8888", - "size": { - "w": 159, - "h": 159 - }, - "scale": 1, - "frames": [ - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 38 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 40, - "h": 38 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 38 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 39 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 39 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 41, - "h": 39 - }, - "frame": { - "x": 80, - "y": 0, - "w": 41, - "h": 39 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 39, - "h": 39 - }, - "frame": { - "x": 0, - "y": 38, - "w": 39, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 39, - "y": 39, - "w": 41, - "h": 40 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 80, - "y": 39, - "w": 40, - "h": 40 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 39, - "h": 40 - }, - "frame": { - "x": 120, - "y": 39, - "w": 39, - "h": 40 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 39, - "h": 40 - }, - "frame": { - "x": 0, - "y": 77, - "w": 39, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 39, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 40, - "h": 40 - }, - "frame": { - "x": 79, - "y": 79, - "w": 40, - "h": 40 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 39, - "h": 40 - }, - "frame": { - "x": 119, - "y": 79, - "w": 39, - "h": 40 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 119, - "w": 41, - "h": 40 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 41, - "h": 40 - }, - "frame": { - "x": 0, - "y": 119, - "w": 41, - "h": 40 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 42, - "h": 40 - }, - "frame": { - "x": 41, - "y": 119, - "w": 42, - "h": 40 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 46, - "h": 47 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 42, - "h": 40 - }, - "frame": { - "x": 83, - "y": 119, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3a0b5f67665759f212123a47de22e79d:d133311823cafabf0f343822a0a0197f:b1fe411cd93ff8f39d0ba407d084a2a9$" - } -} +{ + "textures": [ + { + "image": "4555.png", + "format": "RGBA8888", + "size": { + "w": 162, + "h": 162 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 54, + "h": 66 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 66 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 54, + "h": 64 + }, + "frame": { + "x": 108, + "y": 0, + "w": 54, + "h": 64 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 54, + "h": 64 + }, + "frame": { + "x": 108, + "y": 0, + "w": 54, + "h": 64 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 63 + }, + "frame": { + "x": 108, + "y": 64, + "w": 54, + "h": 63 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 63 + }, + "frame": { + "x": 108, + "y": 64, + "w": 54, + "h": 63 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 62 + }, + "frame": { + "x": 0, + "y": 66, + "w": 54, + "h": 62 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 62 + }, + "frame": { + "x": 0, + "y": 66, + "w": 54, + "h": 62 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 66 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 54, + "h": 61 + }, + "frame": { + "x": 54, + "y": 66, + "w": 54, + "h": 61 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ebbf6c9db863403fcc56899bb963c8fe:60a7f95a9e0afed849e5735b36d1ca41:b1fe411cd93ff8f39d0ba407d084a2a9$" + } +} diff --git a/public/images/pokemon/exp/back/shiny/4555.png b/public/images/pokemon/exp/back/shiny/4555.png index 1b06edcaada..3ce57019abe 100644 Binary files a/public/images/pokemon/exp/back/shiny/4555.png and b/public/images/pokemon/exp/back/shiny/4555.png differ diff --git a/public/images/pokemon/exp/back/shiny/778.json b/public/images/pokemon/exp/back/shiny/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/back/shiny/778.json rename to public/images/pokemon/exp/back/shiny/778-disguised.json index 77ae7d76ba7..53684eb62dc 100644 --- a/public/images/pokemon/exp/back/shiny/778.json +++ b/public/images/pokemon/exp/back/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 210, diff --git a/public/images/pokemon/exp/back/shiny/778-disguised.png b/public/images/pokemon/exp/back/shiny/778-disguised.png new file mode 100644 index 00000000000..2b1c9ecf3c9 Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/778-disguised.png differ diff --git a/public/images/pokemon/exp/back/shiny/778.png b/public/images/pokemon/exp/back/shiny/778.png deleted file mode 100644 index 16ed247e24a..00000000000 Binary files a/public/images/pokemon/exp/back/shiny/778.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/130-mega.png b/public/images/pokemon/exp/shiny/130-mega.png index eb87c24325b..fb4f81bf629 100644 Binary files a/public/images/pokemon/exp/shiny/130-mega.png and b/public/images/pokemon/exp/shiny/130-mega.png differ diff --git a/public/images/pokemon/exp/shiny/4053.json b/public/images/pokemon/exp/shiny/2053.json similarity index 99% rename from public/images/pokemon/exp/shiny/4053.json rename to public/images/pokemon/exp/shiny/2053.json index a895e4d8a07..c43a863e79f 100644 --- a/public/images/pokemon/exp/shiny/4053.json +++ b/public/images/pokemon/exp/shiny/2053.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "4053.png", + "image": "2053.png", "format": "RGBA8888", "size": { "w": 328, diff --git a/public/images/pokemon/exp/shiny/4053.png b/public/images/pokemon/exp/shiny/2053.png similarity index 100% rename from public/images/pokemon/exp/shiny/4053.png rename to public/images/pokemon/exp/shiny/2053.png diff --git a/public/images/pokemon/exp/shiny/4555.json b/public/images/pokemon/exp/shiny/4555.json index f6f5dae33e7..8a1e2934687 100644 --- a/public/images/pokemon/exp/shiny/4555.json +++ b/public/images/pokemon/exp/shiny/4555.json @@ -1,1427 +1,272 @@ -{ - "textures": [ - { - "image": "4555.png", - "format": "RGBA8888", - "size": { - "w": 167, - "h": 167 - }, - "scale": 1, - "frames": [ - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 45, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 42 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 45, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 44, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 44, - "h": 42 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 45, - "h": 41 - }, - "frame": { - "x": 45, - "y": 0, - "w": 45, - "h": 41 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 45, - "h": 41 - }, - "frame": { - "x": 90, - "y": 0, - "w": 45, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 43, - "h": 42 - }, - "frame": { - "x": 0, - "y": 84, - "w": 43, - "h": 42 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 43, - "h": 41 - }, - "frame": { - "x": 0, - "y": 126, - "w": 43, - "h": 41 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 44, - "h": 40 - }, - "frame": { - "x": 45, - "y": 41, - "w": 44, - "h": 40 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 89, - "y": 41, - "w": 43, - "h": 40 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 43, - "h": 40 - }, - "frame": { - "x": 89, - "y": 41, - "w": 43, - "h": 40 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 42, - "h": 41 - }, - "frame": { - "x": 44, - "y": 81, - "w": 42, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 3, - "y": 7, - "w": 41, - "h": 41 - }, - "frame": { - "x": 86, - "y": 81, - "w": 41, - "h": 41 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 42 - }, - "frame": { - "x": 127, - "y": 81, - "w": 40, - "h": 42 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 41, - "h": 42 - }, - "frame": { - "x": 43, - "y": 122, - "w": 41, - "h": 42 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 41, - "h": 42 - }, - "frame": { - "x": 84, - "y": 122, - "w": 41, - "h": 42 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 49 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 41, - "h": 41 - }, - "frame": { - "x": 125, - "y": 123, - "w": 41, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:265fdf7e226496ba08465dfaf7110126:d3c7e5104ff35ad1a1d1e07ba8a2af96:b1fe411cd93ff8f39d0ba407d084a2a9$" - } -} +{ + "textures": [ + { + "image": "4555.png", + "format": "RGBA8888", + "size": { + "w": 218, + "h": 218 + }, + "scale": 1, + "frames": [ + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + }, + "frame": { + "x": 0, + "y": 0, + "w": 60, + "h": 75 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 0, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 58, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 58, + "h": 75 + }, + "frame": { + "x": 58, + "y": 75, + "w": 58, + "h": 75 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 57, + "h": 75 + }, + "frame": { + "x": 60, + "y": 0, + "w": 57, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 117, + "y": 0, + "w": 59, + "h": 74 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 59, + "h": 74 + }, + "frame": { + "x": 117, + "y": 0, + "w": 59, + "h": 74 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 117, + "y": 74, + "w": 59, + "h": 73 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 59, + "h": 73 + }, + "frame": { + "x": 117, + "y": 74, + "w": 59, + "h": 73 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 61, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 59, + "h": 71 + }, + "frame": { + "x": 116, + "y": 147, + "w": 59, + "h": 71 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:8c03d5a85bd38061e1546639fec46360:c82e507fba00c56a331f2f65db25d979:b1fe411cd93ff8f39d0ba407d084a2a9$" + } +} diff --git a/public/images/pokemon/exp/shiny/4555.png b/public/images/pokemon/exp/shiny/4555.png index c5da9b8ec1e..1fc84012eed 100644 Binary files a/public/images/pokemon/exp/shiny/4555.png and b/public/images/pokemon/exp/shiny/4555.png differ diff --git a/public/images/pokemon/exp/shiny/777.json b/public/images/pokemon/exp/shiny/777.json index 9e02c6e3fd2..4181c495c7c 100644 --- a/public/images/pokemon/exp/shiny/777.json +++ b/public/images/pokemon/exp/shiny/777.json @@ -1,965 +1,1071 @@ -{ - "textures": [ - { - "image": "777.png", - "format": "RGBA8888", - "size": { - "w": 163, - "h": 163 - }, - "scale": 1, - "frames": [ - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 44, - "w": 37, - "h": 44 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 0, - "y": 88, - "w": 37, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 37, - "y": 0, - "w": 40, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 37, - "y": 0, - "w": 40, - "h": 43 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 37, - "y": 0, - "w": 40, - "h": 43 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 37, - "y": 0, - "w": 40, - "h": 43 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 43 - }, - "frame": { - "x": 37, - "y": 0, - "w": 40, - "h": 43 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 117, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 117, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 117, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 117, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 117, - "y": 0, - "w": 40, - "h": 41 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 77, - "y": 41, - "w": 40, - "h": 41 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 40, - "h": 41 - }, - "frame": { - "x": 37, - "y": 43, - "w": 40, - "h": 41 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 41, - "w": 40, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 41, - "w": 40, - "h": 39 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 41, - "w": 40, - "h": 39 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 41, - "w": 40, - "h": 39 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 41, - "w": 40, - "h": 39 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 80, - "w": 40, - "h": 39 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 80, - "w": 40, - "h": 39 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 80, - "w": 40, - "h": 39 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 80, - "w": 40, - "h": 39 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 40, - "h": 39 - }, - "frame": { - "x": 117, - "y": 80, - "w": 40, - "h": 39 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 40, - "h": 38 - }, - "frame": { - "x": 77, - "y": 82, - "w": 40, - "h": 38 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 40, - "h": 38 - }, - "frame": { - "x": 77, - "y": 82, - "w": 40, - "h": 38 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 40, - "h": 38 - }, - "frame": { - "x": 77, - "y": 82, - "w": 40, - "h": 38 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 40, - "h": 38 - }, - "frame": { - "x": 77, - "y": 82, - "w": 40, - "h": 38 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 40, - "h": 38 - }, - "frame": { - "x": 77, - "y": 82, - "w": 40, - "h": 38 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 117, - "y": 119, - "w": 37, - "h": 44 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 37, - "h": 44 - }, - "frame": { - "x": 117, - "y": 119, - "w": 37, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 39, - "h": 42 - }, - "frame": { - "x": 37, - "y": 84, - "w": 39, - "h": 42 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 44 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 39, - "h": 42 - }, - "frame": { - "x": 76, - "y": 120, - "w": 39, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ad3e4de865d1d9392fed3533c75e9da4:53906d0c8828810f510b3b49c46d0af5:1aa6e90a0c99d7990e17ee8433a9373d$" - } -} +{ + "textures": [ + { + "image": "777.png", + "format": "RGBA8888", + "size": { + "w": 163, + "h": 163 + }, + "scale": 1, + "frames": [ + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 37, + "h": 44 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 44, + "w": 37, + "h": 44 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 0, + "y": 88, + "w": 37, + "h": 44 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 43 + }, + "frame": { + "x": 37, + "y": 0, + "w": 40, + "h": 43 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "00012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 117, + "y": 0, + "w": 40, + "h": 41 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 77, + "y": 41, + "w": 40, + "h": 41 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 40, + "h": 41 + }, + "frame": { + "x": 37, + "y": 43, + "w": 40, + "h": 41 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 41, + "w": 40, + "h": 39 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 40, + "h": 39 + }, + "frame": { + "x": 117, + "y": 80, + "w": 40, + "h": 39 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 40, + "h": 38 + }, + "frame": { + "x": 77, + "y": 82, + "w": 40, + "h": 38 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 117, + "y": 119, + "w": 37, + "h": 44 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 37, + "h": 44 + }, + "frame": { + "x": 117, + "y": 119, + "w": 37, + "h": 44 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 42 + }, + "frame": { + "x": 37, + "y": 84, + "w": 39, + "h": 42 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 44 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 39, + "h": 42 + }, + "frame": { + "x": 76, + "y": 120, + "w": 39, + "h": 42 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:ad3e4de865d1d9392fed3533c75e9da4:53906d0c8828810f510b3b49c46d0af5:1aa6e90a0c99d7990e17ee8433a9373d$" + } +} diff --git a/public/images/pokemon/exp/shiny/778.json b/public/images/pokemon/exp/shiny/778-disguised.json similarity index 99% rename from public/images/pokemon/exp/shiny/778.json rename to public/images/pokemon/exp/shiny/778-disguised.json index 44a236b129d..1ba5c6899c4 100644 --- a/public/images/pokemon/exp/shiny/778.json +++ b/public/images/pokemon/exp/shiny/778-disguised.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { "w": 219, diff --git a/public/images/pokemon/exp/shiny/778-disguised.png b/public/images/pokemon/exp/shiny/778-disguised.png new file mode 100644 index 00000000000..13fecc069c6 Binary files /dev/null and b/public/images/pokemon/exp/shiny/778-disguised.png differ diff --git a/public/images/pokemon/exp/shiny/778.png b/public/images/pokemon/exp/shiny/778.png deleted file mode 100644 index e29b2b2fc20..00000000000 Binary files a/public/images/pokemon/exp/shiny/778.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/864.png b/public/images/pokemon/exp/shiny/864.png index 0c244ebfa53..079b1f6a681 100644 Binary files a/public/images/pokemon/exp/shiny/864.png and b/public/images/pokemon/exp/shiny/864.png differ diff --git a/public/images/pokemon/icons/7/778.png b/public/images/pokemon/icons/7/778-disguised.png similarity index 100% rename from public/images/pokemon/icons/7/778.png rename to public/images/pokemon/icons/7/778-disguised.png diff --git a/public/images/pokemon/icons/7/778s.png b/public/images/pokemon/icons/7/778s-disguised.png similarity index 100% rename from public/images/pokemon/icons/7/778s.png rename to public/images/pokemon/icons/7/778s-disguised.png diff --git a/public/images/pokemon/icons/variant/7/778_2.png b/public/images/pokemon/icons/variant/7/778-disguised_2.png similarity index 100% rename from public/images/pokemon/icons/variant/7/778_2.png rename to public/images/pokemon/icons/variant/7/778-disguised_2.png diff --git a/public/images/pokemon/icons/variant/7/778_3.png b/public/images/pokemon/icons/variant/7/778-disguised_3.png similarity index 100% rename from public/images/pokemon/icons/variant/7/778_3.png rename to public/images/pokemon/icons/variant/7/778-disguised_3.png diff --git a/public/images/pokemon/shiny/431.json b/public/images/pokemon/shiny/431.json index cd49a96600d..027f15263b8 100644 --- a/public/images/pokemon/shiny/431.json +++ b/public/images/pokemon/shiny/431.json @@ -4,1206 +4,51 @@ "image": "431.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 417, + "h": 417 }, "scale": 1, "frames": [ { - "filename": "0011.png", + "filename": "0072.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 54, - "h": 48 + "y": 10, + "w": 72, + "h": 57 }, "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 54, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 108, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 54, - "h": 48 - }, - "frame": { - "x": 162, - "y": 0, - "w": 54, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 216, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 271, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 326, - "y": 0, - "w": 55, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 46, - "h": 51 - }, - "frame": { - "x": 381, - "y": 0, - "w": 46, - "h": 51 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 0, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 55, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 110, - "y": 48, - "w": 55, - "h": 50 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 165, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 55, - "h": 50 - }, - "frame": { - "x": 220, - "y": 50, - "w": 55, - "h": 50 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 50, - "w": 55, - "h": 52 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 51, - "h": 52 - }, - "frame": { - "x": 330, - "y": 50, - "w": 51, - "h": 52 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 0, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 55, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 110, - "y": 98, - "w": 55, - "h": 52 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 165, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 220, - "y": 100, - "w": 55, - "h": 52 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 275, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 55, - "h": 52 - }, - "frame": { - "x": 330, - "y": 102, - "w": 55, - "h": 52 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 53, - "h": 53 - }, - "frame": { - "x": 0, - "y": 150, - "w": 53, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 + "w": 72, + "h": 57 } }, { - "filename": "0049.png", + "filename": "0070.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 53, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 109, - "y": 150, - "w": 56, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 165, - "y": 152, - "w": 56, - "h": 54 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 54 - }, - "frame": { - "x": 221, - "y": 152, - "w": 48, - "h": 54 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 269, - "y": 154, - "w": 56, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { @@ -1212,229 +57,229 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 6, + "w": 66, + "h": 61 }, "frame": { - "x": 325, - "y": 154, - "w": 56, - "h": 54 + "x": 1, + "y": 60, + "w": 66, + "h": 61 } }, { - "filename": "0028.png", + "filename": "0073.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0072.png", + "filename": "0074.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 1, - "w": 56, - "h": 54 + "y": 5, + "w": 63, + "h": 62 }, "frame": { - "x": 0, - "y": 204, - "w": 56, - "h": 54 + "x": 1, + "y": 123, + "w": 63, + "h": 62 } }, { - "filename": "0039.png", + "filename": "0088.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 56, - "y": 204, - "w": 56, - "h": 54 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0102.png", + "filename": "0089.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 48, - "h": 55 + "w": 58, + "h": 67 }, "frame": { - "x": 112, - "y": 204, - "w": 48, - "h": 55 + "x": 1, + "y": 187, + "w": 58, + "h": 67 } }, { - "filename": "0040.png", + "filename": "0087.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 2, + "w": 58, + "h": 65 + }, + "frame": { + "x": 1, + "y": 256, + "w": 58, + "h": 65 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 55, + "h": 65 + }, + "frame": { + "x": 1, + "y": 323, + "w": 55, + "h": 65 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 62, + "h": 61 + }, + "frame": { + "x": 75, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 62, + "h": 61 } }, { - "filename": "0084.png", + "filename": "0085.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, + "y": 5, + "w": 57, + "h": 62 + }, + "frame": { + "x": 139, "y": 1, - "w": 56, - "h": 54 - }, - "frame": { - "x": 160, - "y": 206, - "w": 56, - "h": 54 + "w": 57, + "h": 62 } }, { - "filename": "0107.png", + "filename": "0086.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 57, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 139, + "y": 1, + "w": 57, + "h": 62 } }, { - "filename": "0108.png", + "filename": "0075.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 51, - "h": 55 + "y": 5, + "w": 54, + "h": 62 }, "frame": { - "x": 216, - "y": 206, - "w": 51, - "h": 55 + "x": 198, + "y": 1, + "w": 54, + "h": 62 } }, { @@ -1443,19 +288,1006 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 8, "w": 56, - "h": 55 + "h": 59 }, "frame": { - "x": 267, - "y": 208, + "x": 254, + "y": 1, "w": 56, - "h": 55 + "h": 59 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 254, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 312, + "y": 1, + "w": 56, + "h": 59 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 15, + "w": 46, + "h": 52 + }, + "frame": { + "x": 370, + "y": 1, + "w": 46, + "h": 52 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 69, + "y": 64, + "w": 56, + "h": 59 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 66, + "y": 125, + "w": 56, + "h": 59 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 127, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 185, + "y": 65, + "w": 56, + "h": 59 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 124, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 182, + "y": 126, + "w": 56, + "h": 59 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 53, + "h": 62 + }, + "frame": { + "x": 243, + "y": 65, + "w": 53, + "h": 62 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 56, + "h": 59 + }, + "frame": { + "x": 298, + "y": 62, + "w": 56, + "h": 59 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 240, + "y": 129, + "w": 56, + "h": 57 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 298, + "y": 123, + "w": 56, + "h": 57 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 48, + "h": 58 + }, + "frame": { + "x": 356, + "y": 62, + "w": 48, + "h": 58 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 51, + "h": 58 + }, + "frame": { + "x": 356, + "y": 122, + "w": 51, + "h": 58 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 9, + "w": 52, + "h": 58 + }, + "frame": { + "x": 61, + "y": 187, + "w": 52, + "h": 58 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 9, + "w": 55, + "h": 58 + }, + "frame": { + "x": 61, + "y": 247, + "w": 55, + "h": 58 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 115, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 173, + "y": 187, + "w": 56, + "h": 57 } }, { @@ -1464,101 +1296,248 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 118, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 10, + "w": 56, + "h": 57 + }, + "frame": { + "x": 176, + "y": 246, + "w": 56, + "h": 57 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 11, + "w": 53, + "h": 56 + }, + "frame": { + "x": 231, + "y": 188, + "w": 53, + "h": 56 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0022.png", + "filename": "0039.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 246, "w": 56, "h": 55 } }, { - "filename": "0023.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0043.png", + "filename": "0040.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 + "x": 61, + "y": 307, + "w": 55, + "h": 53 } }, { - "filename": "0044.png", + "filename": "0094.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 51, + "h": 54 + }, + "frame": { + "x": 58, + "y": 362, + "w": 51, + "h": 54 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } @@ -1569,502 +1548,124 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 118, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0065.png", + "filename": "0022.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0066.png", + "filename": "0055.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 176, + "y": 305, "w": 56, "h": 55 } }, { - "filename": "0067.png", + "filename": "0023.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0087.png", + "filename": "0056.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 267, - "y": 208, + "x": 234, + "y": 303, "w": 56, "h": 55 } }, { - "filename": "0088.png", + "filename": "0008.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, - "h": 55 + "y": 14, + "w": 55, + "h": 53 }, "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 267, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 323, - "y": 208, - "w": 56, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 0, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 56, - "y": 258, - "w": 56, - "h": 55 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 112, - "y": 260, - "w": 56, - "h": 55 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 168, - "y": 261, - "w": 56, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 224, - "y": 263, - "w": 56, - "h": 55 + "x": 111, + "y": 362, + "w": 55, + "h": 53 } }, { @@ -2073,711 +1674,438 @@ "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 111, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 168, + "y": 362, + "w": 55, + "h": 53 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, "w": 56, "h": 55 }, "frame": { - "x": 280, - "y": 263, + "x": 286, + "y": 188, "w": 56, "h": 55 } }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 286, + "y": 188, + "w": 56, + "h": 55 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 56, + "h": 55 + }, + "frame": { + "x": 344, + "y": 182, + "w": 56, + "h": 55 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 245, + "w": 55, + "h": 53 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 292, + "y": 300, + "w": 55, + "h": 53 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 14, + "w": 55, + "h": 53 + }, + "frame": { + "x": 349, + "y": 239, + "w": 55, + "h": 53 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, { "filename": "0042.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 16, + "w": 54, + "h": 51 + }, + "frame": { + "x": 349, + "y": 294, + "w": 54, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 349, + "y": 347, + "w": 53, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 1, + "y": 16, + "w": 53, + "h": 51 + }, + "frame": { + "x": 225, + "y": 362, + "w": 53, + "h": 51 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 72, + "h": 67 + }, + "spriteSourceSize": { + "x": 0, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, + "y": 360, + "w": 48, "h": 55 } }, { - "filename": "0085.png", + "filename": "0080.png", "rotated": false, "trimmed": true, "sourceSize": { "w": 72, - "h": 55 + "h": 67 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 56, + "y": 12, + "w": 48, "h": 55 }, "frame": { "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 280, - "y": 263, - "w": 56, - "h": 55 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 55 - }, - "frame": { - "x": 336, - "y": 263, - "w": 61, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 65, - "h": 55 - }, - "frame": { - "x": 0, - "y": 313, - "w": 65, - "h": 55 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 72, - "h": 55 - }, - "frame": { - "x": 65, - "y": 315, - "w": 72, - "h": 55 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 62, - "h": 55 - }, - "frame": { - "x": 137, - "y": 316, - "w": 62, - "h": 55 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 199, - "y": 318, - "w": 54, - "h": 55 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 253, - "y": 318, - "w": 56, - "h": 55 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 57, - "h": 55 - }, - "frame": { - "x": 309, - "y": 318, - "w": 57, - "h": 55 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 366, - "y": 318, - "w": 58, - "h": 55 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 58, - "h": 55 - }, - "frame": { - "x": 0, - "y": 368, - "w": 58, - "h": 55 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 58, - "y": 370, - "w": 56, - "h": 55 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 55 - }, - "frame": { - "x": 114, - "y": 371, - "w": 54, - "h": 55 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 53, - "h": 55 - }, - "frame": { - "x": 168, - "y": 373, - "w": 53, - "h": 55 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 55, - "h": 55 - }, - "frame": { - "x": 221, - "y": 373, - "w": 55, - "h": 55 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, - "h": 55 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 72, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 55 - }, - "frame": { - "x": 276, - "y": 373, - "w": 56, + "y": 360, + "w": 48, "h": 55 } } @@ -2787,6 +2115,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9d1aec9d42e64e77286a76abe5dbf02d:e582b0881efa16424743e0ecc7e8a9e9:7586c0ba0fc3c95eb3d51f575fb44867$" + "smartupdate": "$TexturePacker:SmartUpdate:6ae8e0153c224f59d2b8e14aafe30b2d:75902c7192d93b439a34817a7b78859e:7586c0ba0fc3c95eb3d51f575fb44867$" } } diff --git a/public/images/pokemon/shiny/431.png b/public/images/pokemon/shiny/431.png index 6eae96da2f2..9ada8fdb6f1 100644 Binary files a/public/images/pokemon/shiny/431.png and b/public/images/pokemon/shiny/431.png differ diff --git a/public/images/pokemon/shiny/778.json b/public/images/pokemon/shiny/778-disguised.json similarity index 93% rename from public/images/pokemon/shiny/778.json rename to public/images/pokemon/shiny/778-disguised.json index 0d4975c4ec7..eafdd271342 100644 --- a/public/images/pokemon/shiny/778.json +++ b/public/images/pokemon/shiny/778-disguised.json @@ -1,10 +1,10 @@ { "textures": [ { - "image": "778.png", + "image": "778-disguised.png", "format": "RGBA8888", "size": { - "w": 48, + "w": 39, "h": 48 }, "scale": 1, diff --git a/public/images/pokemon/shiny/778-disguised.png b/public/images/pokemon/shiny/778-disguised.png new file mode 100644 index 00000000000..941fc6c284e Binary files /dev/null and b/public/images/pokemon/shiny/778-disguised.png differ diff --git a/public/images/pokemon/shiny/778.png b/public/images/pokemon/shiny/778.png deleted file mode 100644 index f6c14926a12..00000000000 Binary files a/public/images/pokemon/shiny/778.png and /dev/null differ diff --git a/public/images/pokemon/variant/778-busted.json b/public/images/pokemon/variant/778-busted.json new file mode 100644 index 00000000000..c3f37914667 --- /dev/null +++ b/public/images/pokemon/variant/778-busted.json @@ -0,0 +1,26 @@ +{ + "1": { + "101010": "000000", + "404040": "3a200c", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "f28b24": "d9ae6c", + "a55c18": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "404039": "381a15" + }, + "2": { + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "f28b24": "69a3cb", + "a55c18": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "404039": "ff766e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/778.json b/public/images/pokemon/variant/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/778.json rename to public/images/pokemon/variant/778-disguised.json index 3b8eca6ee7f..3fb6d0c98c2 100644 --- a/public/images/pokemon/variant/778.json +++ b/public/images/pokemon/variant/778-disguised.json @@ -31,4 +31,4 @@ "805933": "6d80a4", "3c3838": "ff766e" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 2a589d1c958..0c48fed625b 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -2464,7 +2464,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -5832,7 +5837,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -7371,10 +7381,15 @@ 1, 1 ], - "778": [ + "778-busted": [ 0, 1, - 2 + 1 + ], + "778-disguised": [ + 0, + 1, + 1 ], "779": [ 0, @@ -7931,16 +7946,16 @@ 1, 1 ], + "2053": [ + 0, + 1, + 0 + ], "4052": [ 0, 1, 1 ], - "4053": [ - 0, - 1, - 0 - ], "4077": [ 0, 1, @@ -8653,7 +8668,12 @@ 1, 1 ], - "778": [ + "778-busted": [ + 0, + 1, + 1 + ], + "778-disguised": [ 0, 1, 1 @@ -9208,12 +9228,12 @@ 1, 1 ], - "4052": [ + "2053": [ 0, 1, 1 ], - "4053": [ + "4052": [ 0, 1, 1 @@ -9320,4 +9340,4 @@ 1 ] } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/778-busted.json b/public/images/pokemon/variant/back/778-busted.json new file mode 100644 index 00000000000..70c365d1ff7 --- /dev/null +++ b/public/images/pokemon/variant/back/778-busted.json @@ -0,0 +1,22 @@ +{ + "1": { + "101010": "101010", + "404040": "2d1818", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "4d361f": "844b20", + "b37d47": "fabc5f", + "805933": "b97d2c" + }, + "2": { + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/778.json b/public/images/pokemon/variant/back/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/back/778.json rename to public/images/pokemon/variant/back/778-disguised.json index 2c6ce68a299..9b8340c7562 100644 --- a/public/images/pokemon/variant/back/778.json +++ b/public/images/pokemon/variant/back/778-disguised.json @@ -19,4 +19,4 @@ "b37d47": "8eb5cd", "805933": "6d80a4" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/982-three-segment_3.png b/public/images/pokemon/variant/back/982-three-segment_3.png index b6b0ef0c2f4..3286d3331a5 100644 Binary files a/public/images/pokemon/variant/back/982-three-segment_3.png and b/public/images/pokemon/variant/back/982-three-segment_3.png differ diff --git a/public/images/pokemon/variant/back/982_3.png b/public/images/pokemon/variant/back/982_3.png index 3286d3331a5..b6b0ef0c2f4 100644 Binary files a/public/images/pokemon/variant/back/982_3.png and b/public/images/pokemon/variant/back/982_3.png differ diff --git a/public/images/pokemon/variant/exp/130-mega.json b/public/images/pokemon/variant/exp/130-mega.json index e2b765e489d..a2818168ba8 100644 --- a/public/images/pokemon/variant/exp/130-mega.json +++ b/public/images/pokemon/variant/exp/130-mega.json @@ -1,92 +1,36 @@ -{ - "1": { - "207cc1": "c67429", - "44b4f4": "eea747", - "1d5486": "923d13", - "826c4d": "dd493b", - "f8eaba": "fff3ec", - "cdac7b": "bd9b8e", - "0d0d0d": "101010", - "090909": "101010", - "3b3f47": "c32625", - "3c3f47": "c32625", - "1f2025": "101010", - "202226": "101010", - "5e5f62": "dd493b", - "1c5486": "923d13", - "1f7cc1": "c67429", - "826b4d": "dd493b", - "992137": "8691d5", - "e6414a": "c9d4ff", - "000000": "101010", - "f4f4f4": "f8f8f8", - "992035": "8691d5", - "2b2d33": "682a23", - "2a2c31": "682a23", - "282a2e": "682a23", - "e0e0e0": "f37754", - "030303": "101010", - "393f47": "c32625", - "1c1d22": "101010", - "195486": "923d13", - "1c7cc1": "c67429", - "82694d": "dd493b", - "991d31": "8691d5", - "ffffff": "f8f8f8", - "26282c": "682a23", - "060606": "101010", - "3a3f47": "c32625", - "1d1f24": "101010", - "1a5486": "923d13", - "1d7cc1": "c67429", - "826a4d": "dd493b", - "991f33": "8691d5", - "292b2f": "682a23", - "27292d": "682a23" - }, - "2": { - "207cc1": "582c81", - "44b4f4": "7b43a1", - "1d5486": "411f70", - "826c4d": "f2a366", - "f8eaba": "ffedf4", - "cdac7b": "d7aec0", - "0d0d0d": "101010", - "090909": "101010", - "3b3f47": "bc6532", - "3c3f47": "bc6532", - "1f2025": "101010", - "202226": "101010", - "5e5f62": "f2a366", - "1c5486": "411f70", - "1f7cc1": "582c81", - "826b4d": "f2a366", - "992137": "a62869", - "e6414a": "e15693", - "000000": "101010", - "f4f4f4": "f8f8f8", - "992035": "a62869", - "2b2d33": "202b47", - "2a2c31": "202b47", - "282a2e": "202b47", - "e0e0e0": "ffdb85", - "030303": "101010", - "393f47": "bc6532", - "1c1d22": "101010", - "195486": "411f70", - "1c7cc1": "582c81", - "82694d": "f2a366", - "991d31": "a62869", - "ffffff": "f8f8f8", - "26282c": "202b47", - "060606": "101010", - "3a3f47": "bc6532", - "1d1f24": "101010", - "1a5486": "411f70", - "1d7cc1": "582c81", - "826a4d": "f2a366", - "991f33": "a62869", - "292b2f": "202b47", - "27292d": "202b47" - } +{ + "1": { + "44b4f4": "eea747", + "826c4d": "dd493b", + "f8eaba": "fff3ec", + "cdac7b": "bd9b8e", + "5e5f62": "dd493b", + "1f7cc1": "c67429", + "e6414a": "c9d4ff", + "f4f4f4": "f8f8f8", + "e0e0e0": "f37754", + "991d31": "8691d5", + "060606": "101010", + "3a3f47": "c32625", + "1a5486": "923d13", + "1d7cc1": "c67429", + "27292d": "682a23" + }, + "2": { + "44b4f4": "7b43a1", + "826c4d": "f2a366", + "f8eaba": "ffedf4", + "cdac7b": "d7aec0", + "5e5f62": "f2a366", + "1f7cc1": "582c81", + "e6414a": "e15693", + "f4f4f4": "f8f8f8", + "e0e0e0": "ffdb85", + "991d31": "a62869", + "060606": "101010", + "3a3f47": "bc6532", + "1a5486": "411f70", + "1d7cc1": "582c81", + "27292d": "202b47" + } } \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/4053.json b/public/images/pokemon/variant/exp/2053.json similarity index 100% rename from public/images/pokemon/variant/exp/4053.json rename to public/images/pokemon/variant/exp/2053.json diff --git a/public/images/pokemon/variant/exp/778-busted.json b/public/images/pokemon/variant/exp/778-busted.json new file mode 100644 index 00000000000..679ebbb5f31 --- /dev/null +++ b/public/images/pokemon/variant/exp/778-busted.json @@ -0,0 +1,30 @@ +{ + "1": { + "000000": "000000", + "101010": "101010", + "404040": "180c05", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "382313", + "f28b24": "d9ae6c", + "b3671b": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "805933": "d18e33", + "404039": "180c05" + }, + "2": { + "000000": "000000", + "101010": "000000", + "404040": "0b1231", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "25213a", + "f28b24": "69a3cb", + "b3671b": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4", + "404039": "ff766e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778-disguised.json b/public/images/pokemon/variant/exp/778-disguised.json new file mode 100644 index 00000000000..7dfb153ed7e --- /dev/null +++ b/public/images/pokemon/variant/exp/778-disguised.json @@ -0,0 +1,28 @@ +{ + "1": { + "000000": "000000", + "404040": "180c05", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "382313", + "f28b24": "d9ae6c", + "b3671b": "c58850", + "4d361f": "a0561d", + "b37d47": "fabc5f", + "805933": "d18e33", + "404039": "180c05" + }, + "2": { + "000000": "000000", + "404040": "0b1231", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "25213a", + "f28b24": "69a3cb", + "b3671b": "5b8abd", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4", + "404039": "ff766e" + } +} diff --git a/public/images/pokemon/variant/exp/778.json b/public/images/pokemon/variant/exp/778.json deleted file mode 100644 index 5b4d0baa505..00000000000 --- a/public/images/pokemon/variant/exp/778.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "1": { - "000000": "000000", - "404040": "180c05", - "b3a76b": "8d4f3d", - "f2e291": "aa6f46", - "665f3d": "382313", - "f28b24": "d9ae6c", - "b3671b": "c58850", - "4d361f": "a0561d", - "b37d47": "fabc5f", - "805933": "d18e33" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778_3.json b/public/images/pokemon/variant/exp/778_3.json deleted file mode 100644 index a51f14647c1..00000000000 --- a/public/images/pokemon/variant/exp/778_3.json +++ /dev/null @@ -1,1343 +0,0 @@ -{ - "textures": [ - { - "image": "778_3.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0056.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 60, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 60, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 60, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 60, - "h": 47 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 48 - }, - "frame": { - "x": 60, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 48 - }, - "frame": { - "x": 0, - "y": 95, - "w": 54, - "h": 48 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 52, - "h": 48 - }, - "frame": { - "x": 117, - "y": 0, - "w": 52, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 48, - "h": 48 - }, - "frame": { - "x": 0, - "y": 143, - "w": 48, - "h": 48 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 47, - "h": 48 - }, - "frame": { - "x": 169, - "y": 0, - "w": 47, - "h": 48 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 16, - "y": 1, - "w": 44, - "h": 47 - }, - "frame": { - "x": 60, - "y": 48, - "w": 44, - "h": 47 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 15, - "y": 0, - "w": 44, - "h": 48 - }, - "frame": { - "x": 54, - "y": 95, - "w": 44, - "h": 48 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 15, - "y": 0, - "w": 44, - "h": 48 - }, - "frame": { - "x": 48, - "y": 143, - "w": 44, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 104, - "y": 48, - "w": 43, - "h": 48 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 42, - "h": 48 - }, - "frame": { - "x": 147, - "y": 48, - "w": 42, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 98, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 17, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 139, - "y": 96, - "w": 41, - "h": 48 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 92, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 92, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 41, - "h": 48 - }, - "frame": { - "x": 133, - "y": 144, - "w": 41, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 180, - "y": 96, - "w": 39, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 60, - "h": 48 - }, - "spriteSourceSize": { - "x": 18, - "y": 0, - "w": 39, - "h": 48 - }, - "frame": { - "x": 174, - "y": 144, - "w": 39, - "h": 48 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cf70bf2fa66c37035eb9b4da1a4c93ff:11ac0c3ddb365960d306dba5909a72c7:92ecadef6e0cb53020b8cd41fbeaf2cd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/778_3.png b/public/images/pokemon/variant/exp/778_3.png deleted file mode 100644 index 87a4cbefc8d..00000000000 Binary files a/public/images/pokemon/variant/exp/778_3.png and /dev/null differ diff --git a/public/images/pokemon/678msb.json b/public/images/pokemon/variant/exp/9-mega_2.json similarity index 56% rename from public/images/pokemon/678msb.json rename to public/images/pokemon/variant/exp/9-mega_2.json index 78125f1c5ee..ab160a44451 100644 --- a/public/images/pokemon/678msb.json +++ b/public/images/pokemon/variant/exp/9-mega_2.json @@ -1,41 +1,41 @@ -{ - "textures": [ - { - "image": "678msb.png", - "format": "RGBA8888", - "size": { - "w": 55, - "h": 55 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 46, - "h": 55 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:979291307687f1a4af47bc4d29542ccf:f61247ececc23f282bb95c5bfe49e179:bbcc2663448733722c64bc1ebafbf9c6$" - } -} +{ + "textures": [ + { + "image": "9-mega_2.png", + "format": "RGBA8888", + "size": { + "w": 88, + "h": 88 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 87 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 87 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:9b1bebbbe735399ba2678aa35a42b156:2dc7c20135acd855e9e97cb010985396:00f61506d33ec61875296e0fb5a82ee9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/9-mega_2.png b/public/images/pokemon/variant/exp/9-mega_2.png new file mode 100644 index 00000000000..c3c06c1eca7 Binary files /dev/null and b/public/images/pokemon/variant/exp/9-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/9-mega_3.json b/public/images/pokemon/variant/exp/9-mega_3.json new file mode 100644 index 00000000000..24363c06a12 --- /dev/null +++ b/public/images/pokemon/variant/exp/9-mega_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "9-mega_3.png", + "format": "RGBA8888", + "size": { + "w": 88, + "h": 88 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 88, + "h": 87 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 88, + "h": 87 + }, + "frame": { + "x": 0, + "y": 0, + "w": 88, + "h": 87 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:9b1bebbbe735399ba2678aa35a42b156:2dc7c20135acd855e9e97cb010985396:00f61506d33ec61875296e0fb5a82ee9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/9-mega_3.png b/public/images/pokemon/variant/exp/9-mega_3.png new file mode 100644 index 00000000000..d7a4b6f9140 Binary files /dev/null and b/public/images/pokemon/variant/exp/9-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/back/4053.json b/public/images/pokemon/variant/exp/back/2053.json similarity index 100% rename from public/images/pokemon/variant/exp/back/4053.json rename to public/images/pokemon/variant/exp/back/2053.json diff --git a/public/images/pokemon/variant/exp/back/778-busted.json b/public/images/pokemon/variant/exp/back/778-busted.json new file mode 100644 index 00000000000..21f796f0657 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/778-busted.json @@ -0,0 +1,26 @@ +{ + "1": { + "000000": "000000", + "101010": "101010", + "404040": "2d1818", + "b3a76b": "8d4f3d", + "f2e291": "aa6f46", + "665f3d": "542c21", + "000000": "101010", + "4d361f": "844b20", + "b37d47": "fabc5f", + "805933": "b97d2c" + }, + "2": { + "000000": "000000", + "101010": "000000", + "404040": "0c123a", + "b3a76b": "3d2e4f", + "f2e291": "5b496b", + "665f3d": "1b1031", + "000000": "000000", + "4d361f": "3e5075", + "b37d47": "8eb5cd", + "805933": "6d80a4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/778.json b/public/images/pokemon/variant/exp/back/778-disguised.json similarity index 99% rename from public/images/pokemon/variant/exp/back/778.json rename to public/images/pokemon/variant/exp/back/778-disguised.json index d1171e22173..3ebf48117fb 100644 --- a/public/images/pokemon/variant/exp/back/778.json +++ b/public/images/pokemon/variant/exp/back/778-disguised.json @@ -21,4 +21,4 @@ "b37d47": "8eb5cd", "805933": "6d80a4" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/back/9-mega_2.json b/public/images/pokemon/variant/exp/back/9-mega_2.json new file mode 100644 index 00000000000..42d17ca7d0a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/9-mega_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "9-mega_2.png", + "format": "RGBA8888", + "size": { + "w": 77, + "h": 77 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 77, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 77, + "h": 77 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 77 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5d9f38fc4da0e99e00a40be3452a927c:2c58504a78e2752d4c536f8a79dab703:00f61506d33ec61875296e0fb5a82ee9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/9-mega_2.png b/public/images/pokemon/variant/exp/back/9-mega_2.png new file mode 100644 index 00000000000..e961ace2e5c Binary files /dev/null and b/public/images/pokemon/variant/exp/back/9-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/back/9-mega_3.json b/public/images/pokemon/variant/exp/back/9-mega_3.json new file mode 100644 index 00000000000..f108154d97a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/9-mega_3.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "9-mega_3.png", + "format": "RGBA8888", + "size": { + "w": 77, + "h": 77 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 77, + "h": 77 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 77, + "h": 77 + }, + "frame": { + "x": 0, + "y": 0, + "w": 77, + "h": 77 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:5d9f38fc4da0e99e00a40be3452a927c:2c58504a78e2752d4c536f8a79dab703:00f61506d33ec61875296e0fb5a82ee9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/9-mega_3.png b/public/images/pokemon/variant/exp/back/9-mega_3.png new file mode 100644 index 00000000000..95a7babe58b Binary files /dev/null and b/public/images/pokemon/variant/exp/back/9-mega_3.png differ diff --git a/public/images/pokemon/variant/icons/1/113_1.png b/public/images/pokemon/variant/icons/1/113_1.png deleted file mode 100644 index 36b1728fda4..00000000000 Binary files a/public/images/pokemon/variant/icons/1/113_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/113_2.png b/public/images/pokemon/variant/icons/1/113_2.png deleted file mode 100644 index c954640e755..00000000000 Binary files a/public/images/pokemon/variant/icons/1/113_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/113_3.png b/public/images/pokemon/variant/icons/1/113_3.png deleted file mode 100644 index 536e0686905..00000000000 Binary files a/public/images/pokemon/variant/icons/1/113_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/118_2.png b/public/images/pokemon/variant/icons/1/118_2.png deleted file mode 100644 index 4a04afddbba..00000000000 Binary files a/public/images/pokemon/variant/icons/1/118_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/118_3.png b/public/images/pokemon/variant/icons/1/118_3.png deleted file mode 100644 index a1e0173d2d7..00000000000 Binary files a/public/images/pokemon/variant/icons/1/118_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/119_1.png b/public/images/pokemon/variant/icons/1/119_1.png deleted file mode 100644 index abc2f0727ae..00000000000 Binary files a/public/images/pokemon/variant/icons/1/119_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/119_2.png b/public/images/pokemon/variant/icons/1/119_2.png deleted file mode 100644 index 37d8dee0fd6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/119_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/119_3.png b/public/images/pokemon/variant/icons/1/119_3.png deleted file mode 100644 index e71c46a0291..00000000000 Binary files a/public/images/pokemon/variant/icons/1/119_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/123_1.png b/public/images/pokemon/variant/icons/1/123_1.png deleted file mode 100644 index 0bc5a3f6872..00000000000 Binary files a/public/images/pokemon/variant/icons/1/123_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/123_2.png b/public/images/pokemon/variant/icons/1/123_2.png deleted file mode 100644 index 08df4b1b366..00000000000 Binary files a/public/images/pokemon/variant/icons/1/123_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/123_3.png b/public/images/pokemon/variant/icons/1/123_3.png deleted file mode 100644 index 95533340fad..00000000000 Binary files a/public/images/pokemon/variant/icons/1/123_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/125_1.png b/public/images/pokemon/variant/icons/1/125_1.png deleted file mode 100644 index 61f088c7401..00000000000 Binary files a/public/images/pokemon/variant/icons/1/125_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/125_2.png b/public/images/pokemon/variant/icons/1/125_2.png deleted file mode 100644 index 8cffc1df234..00000000000 Binary files a/public/images/pokemon/variant/icons/1/125_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/125_3.png b/public/images/pokemon/variant/icons/1/125_3.png deleted file mode 100644 index bb67e1a08db..00000000000 Binary files a/public/images/pokemon/variant/icons/1/125_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/127-mega_2.png b/public/images/pokemon/variant/icons/1/127-mega_2.png deleted file mode 100644 index a9f5e703d2c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/127-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/127-mega_3.png b/public/images/pokemon/variant/icons/1/127-mega_3.png deleted file mode 100644 index 62b2992582d..00000000000 Binary files a/public/images/pokemon/variant/icons/1/127-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/127_2.png b/public/images/pokemon/variant/icons/1/127_2.png deleted file mode 100644 index 8b4a0c358e6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/127_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/127_3.png b/public/images/pokemon/variant/icons/1/127_3.png deleted file mode 100644 index 59390f17575..00000000000 Binary files a/public/images/pokemon/variant/icons/1/127_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/131-gigantamax_2.png b/public/images/pokemon/variant/icons/1/131-gigantamax_2.png deleted file mode 100644 index 6032d52a1ad..00000000000 Binary files a/public/images/pokemon/variant/icons/1/131-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/131-gigantamax_3.png b/public/images/pokemon/variant/icons/1/131-gigantamax_3.png deleted file mode 100644 index 229d6ae864e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/131-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/131_2.png b/public/images/pokemon/variant/icons/1/131_2.png deleted file mode 100644 index eb7dc097a35..00000000000 Binary files a/public/images/pokemon/variant/icons/1/131_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/131_3.png b/public/images/pokemon/variant/icons/1/131_3.png deleted file mode 100644 index 6a2e2436e3f..00000000000 Binary files a/public/images/pokemon/variant/icons/1/131_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/133_2.png b/public/images/pokemon/variant/icons/1/133_2.png deleted file mode 100644 index 7ab496699f7..00000000000 Binary files a/public/images/pokemon/variant/icons/1/133_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/133_3.png b/public/images/pokemon/variant/icons/1/133_3.png deleted file mode 100644 index f999dd0fff7..00000000000 Binary files a/public/images/pokemon/variant/icons/1/133_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/134_2.png b/public/images/pokemon/variant/icons/1/134_2.png deleted file mode 100644 index 9cffe29a5e9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/134_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/134_3.png b/public/images/pokemon/variant/icons/1/134_3.png deleted file mode 100644 index 5c1c1384110..00000000000 Binary files a/public/images/pokemon/variant/icons/1/134_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/135_1.png b/public/images/pokemon/variant/icons/1/135_1.png deleted file mode 100644 index 259dca57c06..00000000000 Binary files a/public/images/pokemon/variant/icons/1/135_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/135_2.png b/public/images/pokemon/variant/icons/1/135_2.png deleted file mode 100644 index 3b8b864196b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/135_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/135_3.png b/public/images/pokemon/variant/icons/1/135_3.png deleted file mode 100644 index f7f98152dfe..00000000000 Binary files a/public/images/pokemon/variant/icons/1/135_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/136_1.png b/public/images/pokemon/variant/icons/1/136_1.png deleted file mode 100644 index bbf577e442e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/136_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/136_2.png b/public/images/pokemon/variant/icons/1/136_2.png deleted file mode 100644 index 78c6844c47c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/136_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/136_3.png b/public/images/pokemon/variant/icons/1/136_3.png deleted file mode 100644 index fc5c63dc0a2..00000000000 Binary files a/public/images/pokemon/variant/icons/1/136_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/138_2.png b/public/images/pokemon/variant/icons/1/138_2.png deleted file mode 100644 index 4ebcad71b93..00000000000 Binary files a/public/images/pokemon/variant/icons/1/138_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/138_3.png b/public/images/pokemon/variant/icons/1/138_3.png deleted file mode 100644 index d66ea50a627..00000000000 Binary files a/public/images/pokemon/variant/icons/1/138_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/139_2.png b/public/images/pokemon/variant/icons/1/139_2.png deleted file mode 100644 index f3934cbe1e9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/139_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/139_3.png b/public/images/pokemon/variant/icons/1/139_3.png deleted file mode 100644 index 58327e471f6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/139_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/140_2.png b/public/images/pokemon/variant/icons/1/140_2.png deleted file mode 100644 index c0c7c8b9c4c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/140_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/140_3.png b/public/images/pokemon/variant/icons/1/140_3.png deleted file mode 100644 index 1e2a3f740d9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/140_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/141_2.png b/public/images/pokemon/variant/icons/1/141_2.png deleted file mode 100644 index 351f2935fbf..00000000000 Binary files a/public/images/pokemon/variant/icons/1/141_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/141_3.png b/public/images/pokemon/variant/icons/1/141_3.png deleted file mode 100644 index 512e4b8663a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/141_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/142-mega_2.png b/public/images/pokemon/variant/icons/1/142-mega_2.png deleted file mode 100644 index 692f5114dcb..00000000000 Binary files a/public/images/pokemon/variant/icons/1/142-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/142-mega_3.png b/public/images/pokemon/variant/icons/1/142-mega_3.png deleted file mode 100644 index 21d23365120..00000000000 Binary files a/public/images/pokemon/variant/icons/1/142-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/142_2.png b/public/images/pokemon/variant/icons/1/142_2.png deleted file mode 100644 index 521fdc7ee4b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/142_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/142_3.png b/public/images/pokemon/variant/icons/1/142_3.png deleted file mode 100644 index 5ed3a1fe4ff..00000000000 Binary files a/public/images/pokemon/variant/icons/1/142_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/144_1.png b/public/images/pokemon/variant/icons/1/144_1.png deleted file mode 100644 index a67ae72dc05..00000000000 Binary files a/public/images/pokemon/variant/icons/1/144_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/144_2.png b/public/images/pokemon/variant/icons/1/144_2.png deleted file mode 100644 index cb73a0f3b9f..00000000000 Binary files a/public/images/pokemon/variant/icons/1/144_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/144_3.png b/public/images/pokemon/variant/icons/1/144_3.png deleted file mode 100644 index f330cdeb62e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/144_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/145_1.png b/public/images/pokemon/variant/icons/1/145_1.png deleted file mode 100644 index 8bf9b8c94fd..00000000000 Binary files a/public/images/pokemon/variant/icons/1/145_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/145_2.png b/public/images/pokemon/variant/icons/1/145_2.png deleted file mode 100644 index 4fdadb9990b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/145_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/145_3.png b/public/images/pokemon/variant/icons/1/145_3.png deleted file mode 100644 index 07502c60e22..00000000000 Binary files a/public/images/pokemon/variant/icons/1/145_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/146_1.png b/public/images/pokemon/variant/icons/1/146_1.png deleted file mode 100644 index e264b024ba9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/146_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/146_2.png b/public/images/pokemon/variant/icons/1/146_2.png deleted file mode 100644 index a6f78c0e917..00000000000 Binary files a/public/images/pokemon/variant/icons/1/146_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/146_3.png b/public/images/pokemon/variant/icons/1/146_3.png deleted file mode 100644 index a0c4b9656bb..00000000000 Binary files a/public/images/pokemon/variant/icons/1/146_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/147_2.png b/public/images/pokemon/variant/icons/1/147_2.png deleted file mode 100644 index 1f66a5f5e6c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/147_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/147_3.png b/public/images/pokemon/variant/icons/1/147_3.png deleted file mode 100644 index 9e61342b2c9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/147_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/148_2.png b/public/images/pokemon/variant/icons/1/148_2.png deleted file mode 100644 index 0b38dd92640..00000000000 Binary files a/public/images/pokemon/variant/icons/1/148_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/148_3.png b/public/images/pokemon/variant/icons/1/148_3.png deleted file mode 100644 index e9be6110f95..00000000000 Binary files a/public/images/pokemon/variant/icons/1/148_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/149_2.png b/public/images/pokemon/variant/icons/1/149_2.png deleted file mode 100644 index 5a0cab35949..00000000000 Binary files a/public/images/pokemon/variant/icons/1/149_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/149_3.png b/public/images/pokemon/variant/icons/1/149_3.png deleted file mode 100644 index 3defe1c15fa..00000000000 Binary files a/public/images/pokemon/variant/icons/1/149_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/150_2.png b/public/images/pokemon/variant/icons/1/150_2.png deleted file mode 100644 index f2fbe81988c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/150_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/150_3.png b/public/images/pokemon/variant/icons/1/150_3.png deleted file mode 100644 index 47742c993f4..00000000000 Binary files a/public/images/pokemon/variant/icons/1/150_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/151_2.png b/public/images/pokemon/variant/icons/1/151_2.png deleted file mode 100644 index 63baee99844..00000000000 Binary files a/public/images/pokemon/variant/icons/1/151_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/151_3.png b/public/images/pokemon/variant/icons/1/151_3.png deleted file mode 100644 index 1ba138538b4..00000000000 Binary files a/public/images/pokemon/variant/icons/1/151_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/1_2.png b/public/images/pokemon/variant/icons/1/1_2.png deleted file mode 100644 index 03b966143a5..00000000000 Binary files a/public/images/pokemon/variant/icons/1/1_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/1_3.png b/public/images/pokemon/variant/icons/1/1_3.png deleted file mode 100644 index 6fa0c416b34..00000000000 Binary files a/public/images/pokemon/variant/icons/1/1_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/29_2.png b/public/images/pokemon/variant/icons/1/29_2.png deleted file mode 100644 index 12d66fb1579..00000000000 Binary files a/public/images/pokemon/variant/icons/1/29_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/29_3.png b/public/images/pokemon/variant/icons/1/29_3.png deleted file mode 100644 index c5f1f4aae94..00000000000 Binary files a/public/images/pokemon/variant/icons/1/29_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/2_2.png b/public/images/pokemon/variant/icons/1/2_2.png deleted file mode 100644 index f9fc69a4756..00000000000 Binary files a/public/images/pokemon/variant/icons/1/2_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/2_3.png b/public/images/pokemon/variant/icons/1/2_3.png deleted file mode 100644 index 0ba316759b6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/2_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3-gigantamax_2.png b/public/images/pokemon/variant/icons/1/3-gigantamax_2.png deleted file mode 100644 index 71db40e400e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3-gigantamax_3.png b/public/images/pokemon/variant/icons/1/3-gigantamax_3.png deleted file mode 100644 index caa9477dfe2..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3-mega_2.png b/public/images/pokemon/variant/icons/1/3-mega_2.png deleted file mode 100644 index 33664417a54..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3-mega_3.png b/public/images/pokemon/variant/icons/1/3-mega_3.png deleted file mode 100644 index 529740cfccc..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/30_2.png b/public/images/pokemon/variant/icons/1/30_2.png deleted file mode 100644 index 29e97832b44..00000000000 Binary files a/public/images/pokemon/variant/icons/1/30_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/30_3.png b/public/images/pokemon/variant/icons/1/30_3.png deleted file mode 100644 index 5d292322fee..00000000000 Binary files a/public/images/pokemon/variant/icons/1/30_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/31_1.png b/public/images/pokemon/variant/icons/1/31_1.png deleted file mode 100644 index 51ab04f75f6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/31_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/31_2.png b/public/images/pokemon/variant/icons/1/31_2.png deleted file mode 100644 index 709a6e7bbbf..00000000000 Binary files a/public/images/pokemon/variant/icons/1/31_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/31_3.png b/public/images/pokemon/variant/icons/1/31_3.png deleted file mode 100644 index 020c42185e9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/31_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/35_2.png b/public/images/pokemon/variant/icons/1/35_2.png deleted file mode 100644 index 3a2914fcbf9..00000000000 Binary files a/public/images/pokemon/variant/icons/1/35_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/35_3.png b/public/images/pokemon/variant/icons/1/35_3.png deleted file mode 100644 index e6f4fb4f527..00000000000 Binary files a/public/images/pokemon/variant/icons/1/35_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/36_2.png b/public/images/pokemon/variant/icons/1/36_2.png deleted file mode 100644 index 47211bebbba..00000000000 Binary files a/public/images/pokemon/variant/icons/1/36_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/36_3.png b/public/images/pokemon/variant/icons/1/36_3.png deleted file mode 100644 index 159deb7ac9c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/36_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/37_2.png b/public/images/pokemon/variant/icons/1/37_2.png deleted file mode 100644 index 0ba82d7d8c2..00000000000 Binary files a/public/images/pokemon/variant/icons/1/37_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/37_3.png b/public/images/pokemon/variant/icons/1/37_3.png deleted file mode 100644 index c075627889c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/37_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/38_2.png b/public/images/pokemon/variant/icons/1/38_2.png deleted file mode 100644 index 2cdcc9acd02..00000000000 Binary files a/public/images/pokemon/variant/icons/1/38_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/38_3.png b/public/images/pokemon/variant/icons/1/38_3.png deleted file mode 100644 index 0834d588d5a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/38_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3_2.png b/public/images/pokemon/variant/icons/1/3_2.png deleted file mode 100644 index 42f3828a8f3..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/3_3.png b/public/images/pokemon/variant/icons/1/3_3.png deleted file mode 100644 index dc29fbd74d4..00000000000 Binary files a/public/images/pokemon/variant/icons/1/3_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/41_1.png b/public/images/pokemon/variant/icons/1/41_1.png deleted file mode 100644 index a5b99e23d6b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/41_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/41_2.png b/public/images/pokemon/variant/icons/1/41_2.png deleted file mode 100644 index c73a279ff4d..00000000000 Binary files a/public/images/pokemon/variant/icons/1/41_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/41_3.png b/public/images/pokemon/variant/icons/1/41_3.png deleted file mode 100644 index e82afadc93d..00000000000 Binary files a/public/images/pokemon/variant/icons/1/41_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/42_1.png b/public/images/pokemon/variant/icons/1/42_1.png deleted file mode 100644 index 713ff4dce46..00000000000 Binary files a/public/images/pokemon/variant/icons/1/42_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/42_2.png b/public/images/pokemon/variant/icons/1/42_2.png deleted file mode 100644 index 2ecf6caa41e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/42_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/42_3.png b/public/images/pokemon/variant/icons/1/42_3.png deleted file mode 100644 index 7975ca4b1f6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/42_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/46_1.png b/public/images/pokemon/variant/icons/1/46_1.png deleted file mode 100644 index 6f29d16ed7d..00000000000 Binary files a/public/images/pokemon/variant/icons/1/46_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/46_2.png b/public/images/pokemon/variant/icons/1/46_2.png deleted file mode 100644 index 45bd33c6230..00000000000 Binary files a/public/images/pokemon/variant/icons/1/46_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/46_3.png b/public/images/pokemon/variant/icons/1/46_3.png deleted file mode 100644 index c2a0e958745..00000000000 Binary files a/public/images/pokemon/variant/icons/1/46_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/47_1.png b/public/images/pokemon/variant/icons/1/47_1.png deleted file mode 100644 index 6dfafffe8de..00000000000 Binary files a/public/images/pokemon/variant/icons/1/47_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/47_2.png b/public/images/pokemon/variant/icons/1/47_2.png deleted file mode 100644 index 193a3e786fb..00000000000 Binary files a/public/images/pokemon/variant/icons/1/47_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/47_3.png b/public/images/pokemon/variant/icons/1/47_3.png deleted file mode 100644 index 6a19f28aab5..00000000000 Binary files a/public/images/pokemon/variant/icons/1/47_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/4_2.png b/public/images/pokemon/variant/icons/1/4_2.png deleted file mode 100644 index 3c0d01766f6..00000000000 Binary files a/public/images/pokemon/variant/icons/1/4_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/4_3.png b/public/images/pokemon/variant/icons/1/4_3.png deleted file mode 100644 index eedc19d87e8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/4_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/50_2.png b/public/images/pokemon/variant/icons/1/50_2.png deleted file mode 100644 index f5d80fa0a98..00000000000 Binary files a/public/images/pokemon/variant/icons/1/50_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/50_3.png b/public/images/pokemon/variant/icons/1/50_3.png deleted file mode 100644 index 05d01766e24..00000000000 Binary files a/public/images/pokemon/variant/icons/1/50_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/51_2.png b/public/images/pokemon/variant/icons/1/51_2.png deleted file mode 100644 index 23a34ae4ca8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/51_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/51_3.png b/public/images/pokemon/variant/icons/1/51_3.png deleted file mode 100644 index 63a57aaa17e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/51_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52-gigantamax_1.png b/public/images/pokemon/variant/icons/1/52-gigantamax_1.png deleted file mode 100644 index b5a46b1af7a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52-gigantamax_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52-gigantamax_2.png b/public/images/pokemon/variant/icons/1/52-gigantamax_2.png deleted file mode 100644 index 657f44d5b27..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52-gigantamax_3.png b/public/images/pokemon/variant/icons/1/52-gigantamax_3.png deleted file mode 100644 index a61ef7f1f3a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52_1.png b/public/images/pokemon/variant/icons/1/52_1.png deleted file mode 100644 index b8fd1ea80c8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52_2.png b/public/images/pokemon/variant/icons/1/52_2.png deleted file mode 100644 index 4ba9daced0a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/52_3.png b/public/images/pokemon/variant/icons/1/52_3.png deleted file mode 100644 index ed9e423096b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/52_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/53_1.png b/public/images/pokemon/variant/icons/1/53_1.png deleted file mode 100644 index bcd50545860..00000000000 Binary files a/public/images/pokemon/variant/icons/1/53_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/53_2.png b/public/images/pokemon/variant/icons/1/53_2.png deleted file mode 100644 index 337b037b9c8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/53_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/53_3.png b/public/images/pokemon/variant/icons/1/53_3.png deleted file mode 100644 index 749bac6b911..00000000000 Binary files a/public/images/pokemon/variant/icons/1/53_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/56_1.png b/public/images/pokemon/variant/icons/1/56_1.png deleted file mode 100644 index 0a70d34ca47..00000000000 Binary files a/public/images/pokemon/variant/icons/1/56_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/56_2.png b/public/images/pokemon/variant/icons/1/56_2.png deleted file mode 100644 index 1e718f4faf5..00000000000 Binary files a/public/images/pokemon/variant/icons/1/56_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/56_3.png b/public/images/pokemon/variant/icons/1/56_3.png deleted file mode 100644 index 0e0ccccb5b8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/56_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/57_1.png b/public/images/pokemon/variant/icons/1/57_1.png deleted file mode 100644 index 52fb69f39ca..00000000000 Binary files a/public/images/pokemon/variant/icons/1/57_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/57_2.png b/public/images/pokemon/variant/icons/1/57_2.png deleted file mode 100644 index 9158341d642..00000000000 Binary files a/public/images/pokemon/variant/icons/1/57_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/57_3.png b/public/images/pokemon/variant/icons/1/57_3.png deleted file mode 100644 index 79ef7408b7b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/57_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/5_2.png b/public/images/pokemon/variant/icons/1/5_2.png deleted file mode 100644 index 28aeb6a9322..00000000000 Binary files a/public/images/pokemon/variant/icons/1/5_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/5_3.png b/public/images/pokemon/variant/icons/1/5_3.png deleted file mode 100644 index e9b40fbf8a8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/5_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-gigantamax_2.png b/public/images/pokemon/variant/icons/1/6-gigantamax_2.png deleted file mode 100644 index f917731b2cc..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-gigantamax_3.png b/public/images/pokemon/variant/icons/1/6-gigantamax_3.png deleted file mode 100644 index 6f7ce2ad77e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-mega-x_2.png b/public/images/pokemon/variant/icons/1/6-mega-x_2.png deleted file mode 100644 index d5a30fab623..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-mega-x_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-mega-x_3.png b/public/images/pokemon/variant/icons/1/6-mega-x_3.png deleted file mode 100644 index 301f399c3d3..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-mega-x_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-mega-y_2.png b/public/images/pokemon/variant/icons/1/6-mega-y_2.png deleted file mode 100644 index 7664588bdfc..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-mega-y_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6-mega-y_3.png b/public/images/pokemon/variant/icons/1/6-mega-y_3.png deleted file mode 100644 index f91d543dc4b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6-mega-y_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/69_2.png b/public/images/pokemon/variant/icons/1/69_2.png deleted file mode 100644 index 6924dccf989..00000000000 Binary files a/public/images/pokemon/variant/icons/1/69_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/69_3.png b/public/images/pokemon/variant/icons/1/69_3.png deleted file mode 100644 index 87b86a7cbeb..00000000000 Binary files a/public/images/pokemon/variant/icons/1/69_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6_2.png b/public/images/pokemon/variant/icons/1/6_2.png deleted file mode 100644 index a71f806daeb..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/6_3.png b/public/images/pokemon/variant/icons/1/6_3.png deleted file mode 100644 index 34886972cb0..00000000000 Binary files a/public/images/pokemon/variant/icons/1/6_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/70_2.png b/public/images/pokemon/variant/icons/1/70_2.png deleted file mode 100644 index 6095f7032af..00000000000 Binary files a/public/images/pokemon/variant/icons/1/70_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/70_3.png b/public/images/pokemon/variant/icons/1/70_3.png deleted file mode 100644 index 4c1d563931e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/70_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/71_2.png b/public/images/pokemon/variant/icons/1/71_2.png deleted file mode 100644 index 4cac71faaf7..00000000000 Binary files a/public/images/pokemon/variant/icons/1/71_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/71_3.png b/public/images/pokemon/variant/icons/1/71_3.png deleted file mode 100644 index 6eda69191fd..00000000000 Binary files a/public/images/pokemon/variant/icons/1/71_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/79_1.png b/public/images/pokemon/variant/icons/1/79_1.png deleted file mode 100644 index 5471915d489..00000000000 Binary files a/public/images/pokemon/variant/icons/1/79_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/7_2.png b/public/images/pokemon/variant/icons/1/7_2.png deleted file mode 100644 index 5e784bf6a06..00000000000 Binary files a/public/images/pokemon/variant/icons/1/7_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/7_3.png b/public/images/pokemon/variant/icons/1/7_3.png deleted file mode 100644 index 23b5c38cb94..00000000000 Binary files a/public/images/pokemon/variant/icons/1/7_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/83_2.png b/public/images/pokemon/variant/icons/1/83_2.png deleted file mode 100644 index 7ad8070e016..00000000000 Binary files a/public/images/pokemon/variant/icons/1/83_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/83_3.png b/public/images/pokemon/variant/icons/1/83_3.png deleted file mode 100644 index d2ddf78079e..00000000000 Binary files a/public/images/pokemon/variant/icons/1/83_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/86_1.png b/public/images/pokemon/variant/icons/1/86_1.png deleted file mode 100644 index 33032e875bd..00000000000 Binary files a/public/images/pokemon/variant/icons/1/86_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/86_2.png b/public/images/pokemon/variant/icons/1/86_2.png deleted file mode 100644 index e6495963b07..00000000000 Binary files a/public/images/pokemon/variant/icons/1/86_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/86_3.png b/public/images/pokemon/variant/icons/1/86_3.png deleted file mode 100644 index 7ab2eecbe79..00000000000 Binary files a/public/images/pokemon/variant/icons/1/86_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/87_1.png b/public/images/pokemon/variant/icons/1/87_1.png deleted file mode 100644 index ddeeec97b98..00000000000 Binary files a/public/images/pokemon/variant/icons/1/87_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/87_2.png b/public/images/pokemon/variant/icons/1/87_2.png deleted file mode 100644 index 2631944bbe0..00000000000 Binary files a/public/images/pokemon/variant/icons/1/87_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/87_3.png b/public/images/pokemon/variant/icons/1/87_3.png deleted file mode 100644 index a53c4e6830c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/87_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/8_2.png b/public/images/pokemon/variant/icons/1/8_2.png deleted file mode 100644 index 6474c98bbda..00000000000 Binary files a/public/images/pokemon/variant/icons/1/8_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/8_3.png b/public/images/pokemon/variant/icons/1/8_3.png deleted file mode 100644 index 7eda6afd272..00000000000 Binary files a/public/images/pokemon/variant/icons/1/8_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9-gigantamax_2.png b/public/images/pokemon/variant/icons/1/9-gigantamax_2.png deleted file mode 100644 index 9b0525f73e3..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9-gigantamax_3.png b/public/images/pokemon/variant/icons/1/9-gigantamax_3.png deleted file mode 100644 index 61b0b406149..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9-mega_2.png b/public/images/pokemon/variant/icons/1/9-mega_2.png deleted file mode 100644 index 43bd581bf85..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9-mega_3.png b/public/images/pokemon/variant/icons/1/9-mega_3.png deleted file mode 100644 index e8097fb2665..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/92_1.png b/public/images/pokemon/variant/icons/1/92_1.png deleted file mode 100644 index 630edf8dd65..00000000000 Binary files a/public/images/pokemon/variant/icons/1/92_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/92_2.png b/public/images/pokemon/variant/icons/1/92_2.png deleted file mode 100644 index bcfd934e262..00000000000 Binary files a/public/images/pokemon/variant/icons/1/92_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/92_3.png b/public/images/pokemon/variant/icons/1/92_3.png deleted file mode 100644 index 2a63286ab71..00000000000 Binary files a/public/images/pokemon/variant/icons/1/92_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/93_1.png b/public/images/pokemon/variant/icons/1/93_1.png deleted file mode 100644 index 6b234888e7c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/93_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/93_2.png b/public/images/pokemon/variant/icons/1/93_2.png deleted file mode 100644 index bbac824bb92..00000000000 Binary files a/public/images/pokemon/variant/icons/1/93_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/93_3.png b/public/images/pokemon/variant/icons/1/93_3.png deleted file mode 100644 index f8dda577d8a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/93_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-gigantamax_1.png b/public/images/pokemon/variant/icons/1/94-gigantamax_1.png deleted file mode 100644 index 44410e1bb6b..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-gigantamax_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-gigantamax_2.png b/public/images/pokemon/variant/icons/1/94-gigantamax_2.png deleted file mode 100644 index c48eaa9bc3c..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-gigantamax_3.png b/public/images/pokemon/variant/icons/1/94-gigantamax_3.png deleted file mode 100644 index 19f9ca86395..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-mega_1.png b/public/images/pokemon/variant/icons/1/94-mega_1.png deleted file mode 100644 index 8be3900458d..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-mega_2.png b/public/images/pokemon/variant/icons/1/94-mega_2.png deleted file mode 100644 index 07306aec370..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94-mega_3.png b/public/images/pokemon/variant/icons/1/94-mega_3.png deleted file mode 100644 index dca0a75b535..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94_1.png b/public/images/pokemon/variant/icons/1/94_1.png deleted file mode 100644 index 53589398a5a..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94_2.png b/public/images/pokemon/variant/icons/1/94_2.png deleted file mode 100644 index e4f015c6604..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/94_3.png b/public/images/pokemon/variant/icons/1/94_3.png deleted file mode 100644 index b5809b798c4..00000000000 Binary files a/public/images/pokemon/variant/icons/1/94_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9_2.png b/public/images/pokemon/variant/icons/1/9_2.png deleted file mode 100644 index 86f283ccf05..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/1/9_3.png b/public/images/pokemon/variant/icons/1/9_3.png deleted file mode 100644 index b8facd38ae8..00000000000 Binary files a/public/images/pokemon/variant/icons/1/9_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/169_1.png b/public/images/pokemon/variant/icons/2/169_1.png deleted file mode 100644 index 5d27b5a5b00..00000000000 Binary files a/public/images/pokemon/variant/icons/2/169_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/169_2.png b/public/images/pokemon/variant/icons/2/169_2.png deleted file mode 100644 index 48b0dfb09fc..00000000000 Binary files a/public/images/pokemon/variant/icons/2/169_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/169_3.png b/public/images/pokemon/variant/icons/2/169_3.png deleted file mode 100644 index 86f8ddd9b74..00000000000 Binary files a/public/images/pokemon/variant/icons/2/169_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/173_2.png b/public/images/pokemon/variant/icons/2/173_2.png deleted file mode 100644 index cdd5d978554..00000000000 Binary files a/public/images/pokemon/variant/icons/2/173_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/175_1.png b/public/images/pokemon/variant/icons/2/175_1.png deleted file mode 100644 index 3908363e380..00000000000 Binary files a/public/images/pokemon/variant/icons/2/175_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/175_2.png b/public/images/pokemon/variant/icons/2/175_2.png deleted file mode 100644 index b602ce368b8..00000000000 Binary files a/public/images/pokemon/variant/icons/2/175_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/175_3.png b/public/images/pokemon/variant/icons/2/175_3.png deleted file mode 100644 index 842cb52abfc..00000000000 Binary files a/public/images/pokemon/variant/icons/2/175_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/176_1.png b/public/images/pokemon/variant/icons/2/176_1.png deleted file mode 100644 index e51a7a45c3c..00000000000 Binary files a/public/images/pokemon/variant/icons/2/176_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/176_2.png b/public/images/pokemon/variant/icons/2/176_2.png deleted file mode 100644 index 22df84f66e1..00000000000 Binary files a/public/images/pokemon/variant/icons/2/176_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/176_3.png b/public/images/pokemon/variant/icons/2/176_3.png deleted file mode 100644 index 5663e2bbf51..00000000000 Binary files a/public/images/pokemon/variant/icons/2/176_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/179_2.png b/public/images/pokemon/variant/icons/2/179_2.png deleted file mode 100644 index 3edfe9fd44e..00000000000 Binary files a/public/images/pokemon/variant/icons/2/179_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/179_3.png b/public/images/pokemon/variant/icons/2/179_3.png deleted file mode 100644 index 6a93e4d9ed7..00000000000 Binary files a/public/images/pokemon/variant/icons/2/179_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/180_2.png b/public/images/pokemon/variant/icons/2/180_2.png deleted file mode 100644 index 45b2e052738..00000000000 Binary files a/public/images/pokemon/variant/icons/2/180_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/180_3.png b/public/images/pokemon/variant/icons/2/180_3.png deleted file mode 100644 index c3c7278a8fd..00000000000 Binary files a/public/images/pokemon/variant/icons/2/180_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/181-mega_2.png b/public/images/pokemon/variant/icons/2/181-mega_2.png deleted file mode 100644 index 69619852229..00000000000 Binary files a/public/images/pokemon/variant/icons/2/181-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/181-mega_3.png b/public/images/pokemon/variant/icons/2/181-mega_3.png deleted file mode 100644 index 94c351a8093..00000000000 Binary files a/public/images/pokemon/variant/icons/2/181-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/181_2.png b/public/images/pokemon/variant/icons/2/181_2.png deleted file mode 100644 index 246ccf2f753..00000000000 Binary files a/public/images/pokemon/variant/icons/2/181_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/181_3.png b/public/images/pokemon/variant/icons/2/181_3.png deleted file mode 100644 index fb087c93669..00000000000 Binary files a/public/images/pokemon/variant/icons/2/181_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/183_2.png b/public/images/pokemon/variant/icons/2/183_2.png deleted file mode 100644 index 85d0e27c1fd..00000000000 Binary files a/public/images/pokemon/variant/icons/2/183_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/183_3.png b/public/images/pokemon/variant/icons/2/183_3.png deleted file mode 100644 index eb5cf58d247..00000000000 Binary files a/public/images/pokemon/variant/icons/2/183_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/184_2.png b/public/images/pokemon/variant/icons/2/184_2.png deleted file mode 100644 index 6244dde636a..00000000000 Binary files a/public/images/pokemon/variant/icons/2/184_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/184_3.png b/public/images/pokemon/variant/icons/2/184_3.png deleted file mode 100644 index 8bbddd75f79..00000000000 Binary files a/public/images/pokemon/variant/icons/2/184_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/196_1.png b/public/images/pokemon/variant/icons/2/196_1.png deleted file mode 100644 index 720839e6852..00000000000 Binary files a/public/images/pokemon/variant/icons/2/196_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/196_2.png b/public/images/pokemon/variant/icons/2/196_2.png deleted file mode 100644 index e67145e663f..00000000000 Binary files a/public/images/pokemon/variant/icons/2/196_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/196_3.png b/public/images/pokemon/variant/icons/2/196_3.png deleted file mode 100644 index 7a7254f30f5..00000000000 Binary files a/public/images/pokemon/variant/icons/2/196_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/197_2.png b/public/images/pokemon/variant/icons/2/197_2.png deleted file mode 100644 index af71d57d4d6..00000000000 Binary files a/public/images/pokemon/variant/icons/2/197_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/197_3.png b/public/images/pokemon/variant/icons/2/197_3.png deleted file mode 100644 index d411e501061..00000000000 Binary files a/public/images/pokemon/variant/icons/2/197_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/199_1.png b/public/images/pokemon/variant/icons/2/199_1.png deleted file mode 100644 index d78a8eee824..00000000000 Binary files a/public/images/pokemon/variant/icons/2/199_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/200_1.png b/public/images/pokemon/variant/icons/2/200_1.png deleted file mode 100644 index 675b37bf5b3..00000000000 Binary files a/public/images/pokemon/variant/icons/2/200_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/200_2.png b/public/images/pokemon/variant/icons/2/200_2.png deleted file mode 100644 index 3e269f2ed79..00000000000 Binary files a/public/images/pokemon/variant/icons/2/200_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/200_3.png b/public/images/pokemon/variant/icons/2/200_3.png deleted file mode 100644 index 82a7ea6c5d9..00000000000 Binary files a/public/images/pokemon/variant/icons/2/200_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212-mega_1.png b/public/images/pokemon/variant/icons/2/212-mega_1.png deleted file mode 100644 index 53bc17210d1..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212-mega_2.png b/public/images/pokemon/variant/icons/2/212-mega_2.png deleted file mode 100644 index 3ad0313c637..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212-mega_3.png b/public/images/pokemon/variant/icons/2/212-mega_3.png deleted file mode 100644 index 4b2754eda64..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212_1.png b/public/images/pokemon/variant/icons/2/212_1.png deleted file mode 100644 index e465191ec6b..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212_2.png b/public/images/pokemon/variant/icons/2/212_2.png deleted file mode 100644 index a266908d132..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/212_3.png b/public/images/pokemon/variant/icons/2/212_3.png deleted file mode 100644 index 238baec2bf9..00000000000 Binary files a/public/images/pokemon/variant/icons/2/212_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/216_1.png b/public/images/pokemon/variant/icons/2/216_1.png deleted file mode 100644 index 576aa7bb06c..00000000000 Binary files a/public/images/pokemon/variant/icons/2/216_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/216_2.png b/public/images/pokemon/variant/icons/2/216_2.png deleted file mode 100644 index 0c834a3e48d..00000000000 Binary files a/public/images/pokemon/variant/icons/2/216_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/216_3.png b/public/images/pokemon/variant/icons/2/216_3.png deleted file mode 100644 index 1e665cb2ac9..00000000000 Binary files a/public/images/pokemon/variant/icons/2/216_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/217_1.png b/public/images/pokemon/variant/icons/2/217_1.png deleted file mode 100644 index e78f591eb1e..00000000000 Binary files a/public/images/pokemon/variant/icons/2/217_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/217_2.png b/public/images/pokemon/variant/icons/2/217_2.png deleted file mode 100644 index df6320e8e27..00000000000 Binary files a/public/images/pokemon/variant/icons/2/217_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/217_3.png b/public/images/pokemon/variant/icons/2/217_3.png deleted file mode 100644 index d71bfd65040..00000000000 Binary files a/public/images/pokemon/variant/icons/2/217_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/222_2.png b/public/images/pokemon/variant/icons/2/222_2.png deleted file mode 100644 index fdbd3e71ee3..00000000000 Binary files a/public/images/pokemon/variant/icons/2/222_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/222_3.png b/public/images/pokemon/variant/icons/2/222_3.png deleted file mode 100644 index eca313aead0..00000000000 Binary files a/public/images/pokemon/variant/icons/2/222_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/226_2.png b/public/images/pokemon/variant/icons/2/226_2.png deleted file mode 100644 index 8eea84d7002..00000000000 Binary files a/public/images/pokemon/variant/icons/2/226_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/226_3.png b/public/images/pokemon/variant/icons/2/226_3.png deleted file mode 100644 index 655ce9e32a7..00000000000 Binary files a/public/images/pokemon/variant/icons/2/226_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/227_2.png b/public/images/pokemon/variant/icons/2/227_2.png deleted file mode 100644 index 8f75169a731..00000000000 Binary files a/public/images/pokemon/variant/icons/2/227_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/227_3.png b/public/images/pokemon/variant/icons/2/227_3.png deleted file mode 100644 index 941e215da94..00000000000 Binary files a/public/images/pokemon/variant/icons/2/227_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/228_2.png b/public/images/pokemon/variant/icons/2/228_2.png deleted file mode 100644 index 3aeb0afed72..00000000000 Binary files a/public/images/pokemon/variant/icons/2/228_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/228_3.png b/public/images/pokemon/variant/icons/2/228_3.png deleted file mode 100644 index 955a885c5bd..00000000000 Binary files a/public/images/pokemon/variant/icons/2/228_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/229-mega_2.png b/public/images/pokemon/variant/icons/2/229-mega_2.png deleted file mode 100644 index 4adddebdfeb..00000000000 Binary files a/public/images/pokemon/variant/icons/2/229-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/229-mega_3.png b/public/images/pokemon/variant/icons/2/229-mega_3.png deleted file mode 100644 index 6cc092843e3..00000000000 Binary files a/public/images/pokemon/variant/icons/2/229-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/229_2.png b/public/images/pokemon/variant/icons/2/229_2.png deleted file mode 100644 index e3b8402d724..00000000000 Binary files a/public/images/pokemon/variant/icons/2/229_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/229_3.png b/public/images/pokemon/variant/icons/2/229_3.png deleted file mode 100644 index 88781b55c18..00000000000 Binary files a/public/images/pokemon/variant/icons/2/229_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/231_2.png b/public/images/pokemon/variant/icons/2/231_2.png deleted file mode 100644 index 9647697984d..00000000000 Binary files a/public/images/pokemon/variant/icons/2/231_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/231_3.png b/public/images/pokemon/variant/icons/2/231_3.png deleted file mode 100644 index 6151d0752c0..00000000000 Binary files a/public/images/pokemon/variant/icons/2/231_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/232_2.png b/public/images/pokemon/variant/icons/2/232_2.png deleted file mode 100644 index 5e92f389f95..00000000000 Binary files a/public/images/pokemon/variant/icons/2/232_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/232_3.png b/public/images/pokemon/variant/icons/2/232_3.png deleted file mode 100644 index 644393c86df..00000000000 Binary files a/public/images/pokemon/variant/icons/2/232_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/239_1.png b/public/images/pokemon/variant/icons/2/239_1.png deleted file mode 100644 index e4fe2ae4e14..00000000000 Binary files a/public/images/pokemon/variant/icons/2/239_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/239_2.png b/public/images/pokemon/variant/icons/2/239_2.png deleted file mode 100644 index 7a3c759ff62..00000000000 Binary files a/public/images/pokemon/variant/icons/2/239_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/239_3.png b/public/images/pokemon/variant/icons/2/239_3.png deleted file mode 100644 index f2d33133fab..00000000000 Binary files a/public/images/pokemon/variant/icons/2/239_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/242_1.png b/public/images/pokemon/variant/icons/2/242_1.png deleted file mode 100644 index cb486161264..00000000000 Binary files a/public/images/pokemon/variant/icons/2/242_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/242_2.png b/public/images/pokemon/variant/icons/2/242_2.png deleted file mode 100644 index 478db55af73..00000000000 Binary files a/public/images/pokemon/variant/icons/2/242_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/242_3.png b/public/images/pokemon/variant/icons/2/242_3.png deleted file mode 100644 index 6a22a1ebbf1..00000000000 Binary files a/public/images/pokemon/variant/icons/2/242_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/243_2.png b/public/images/pokemon/variant/icons/2/243_2.png deleted file mode 100644 index 586b706f4e8..00000000000 Binary files a/public/images/pokemon/variant/icons/2/243_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/243_3.png b/public/images/pokemon/variant/icons/2/243_3.png deleted file mode 100644 index 58aa6b3470c..00000000000 Binary files a/public/images/pokemon/variant/icons/2/243_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/244_2.png b/public/images/pokemon/variant/icons/2/244_2.png deleted file mode 100644 index 753fce18f2e..00000000000 Binary files a/public/images/pokemon/variant/icons/2/244_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/244_3.png b/public/images/pokemon/variant/icons/2/244_3.png deleted file mode 100644 index 3ce134570d5..00000000000 Binary files a/public/images/pokemon/variant/icons/2/244_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/245_2.png b/public/images/pokemon/variant/icons/2/245_2.png deleted file mode 100644 index 54a5eccc7bb..00000000000 Binary files a/public/images/pokemon/variant/icons/2/245_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/245_3.png b/public/images/pokemon/variant/icons/2/245_3.png deleted file mode 100644 index 91a195809d7..00000000000 Binary files a/public/images/pokemon/variant/icons/2/245_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/249_2.png b/public/images/pokemon/variant/icons/2/249_2.png deleted file mode 100644 index 87b8525c716..00000000000 Binary files a/public/images/pokemon/variant/icons/2/249_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/249_3.png b/public/images/pokemon/variant/icons/2/249_3.png deleted file mode 100644 index b8142d29758..00000000000 Binary files a/public/images/pokemon/variant/icons/2/249_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/250_2.png b/public/images/pokemon/variant/icons/2/250_2.png deleted file mode 100644 index cbdd7d6c17f..00000000000 Binary files a/public/images/pokemon/variant/icons/2/250_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/250_3.png b/public/images/pokemon/variant/icons/2/250_3.png deleted file mode 100644 index 160bc12a516..00000000000 Binary files a/public/images/pokemon/variant/icons/2/250_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/251_2.png b/public/images/pokemon/variant/icons/2/251_2.png deleted file mode 100644 index 05ba4721a89..00000000000 Binary files a/public/images/pokemon/variant/icons/2/251_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/2/251_3.png b/public/images/pokemon/variant/icons/2/251_3.png deleted file mode 100644 index 05084ac8687..00000000000 Binary files a/public/images/pokemon/variant/icons/2/251_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/263_2.png b/public/images/pokemon/variant/icons/3/263_2.png deleted file mode 100644 index b638deec648..00000000000 Binary files a/public/images/pokemon/variant/icons/3/263_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/263_3.png b/public/images/pokemon/variant/icons/3/263_3.png deleted file mode 100644 index 5c5f447c79a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/263_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/264_2.png b/public/images/pokemon/variant/icons/3/264_2.png deleted file mode 100644 index 42f87b76058..00000000000 Binary files a/public/images/pokemon/variant/icons/3/264_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/264_3.png b/public/images/pokemon/variant/icons/3/264_3.png deleted file mode 100644 index 88d700d9a9e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/264_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/280_2.png b/public/images/pokemon/variant/icons/3/280_2.png deleted file mode 100644 index 41b3f16cf7b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/280_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/280_3.png b/public/images/pokemon/variant/icons/3/280_3.png deleted file mode 100644 index ccda545679a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/280_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/281_2.png b/public/images/pokemon/variant/icons/3/281_2.png deleted file mode 100644 index 0fdc825165d..00000000000 Binary files a/public/images/pokemon/variant/icons/3/281_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/281_3.png b/public/images/pokemon/variant/icons/3/281_3.png deleted file mode 100644 index c391b0a70c9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/281_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/282-mega_2.png b/public/images/pokemon/variant/icons/3/282-mega_2.png deleted file mode 100644 index c13887e02a9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/282-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/282-mega_3.png b/public/images/pokemon/variant/icons/3/282-mega_3.png deleted file mode 100644 index ac55c249e16..00000000000 Binary files a/public/images/pokemon/variant/icons/3/282-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/282_2.png b/public/images/pokemon/variant/icons/3/282_2.png deleted file mode 100644 index cdfea76c6f3..00000000000 Binary files a/public/images/pokemon/variant/icons/3/282_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/282_3.png b/public/images/pokemon/variant/icons/3/282_3.png deleted file mode 100644 index 932b8834224..00000000000 Binary files a/public/images/pokemon/variant/icons/3/282_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/285_2.png b/public/images/pokemon/variant/icons/3/285_2.png deleted file mode 100644 index b05cc520bbe..00000000000 Binary files a/public/images/pokemon/variant/icons/3/285_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/285_3.png b/public/images/pokemon/variant/icons/3/285_3.png deleted file mode 100644 index 890a902003f..00000000000 Binary files a/public/images/pokemon/variant/icons/3/285_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/286_2.png b/public/images/pokemon/variant/icons/3/286_2.png deleted file mode 100644 index a0b4f9ba99d..00000000000 Binary files a/public/images/pokemon/variant/icons/3/286_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/286_3.png b/public/images/pokemon/variant/icons/3/286_3.png deleted file mode 100644 index 96d11a91d18..00000000000 Binary files a/public/images/pokemon/variant/icons/3/286_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/290_1.png b/public/images/pokemon/variant/icons/3/290_1.png deleted file mode 100644 index 579e4b838ed..00000000000 Binary files a/public/images/pokemon/variant/icons/3/290_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/290_2.png b/public/images/pokemon/variant/icons/3/290_2.png deleted file mode 100644 index 659f57722eb..00000000000 Binary files a/public/images/pokemon/variant/icons/3/290_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/290_3.png b/public/images/pokemon/variant/icons/3/290_3.png deleted file mode 100644 index 962386bea49..00000000000 Binary files a/public/images/pokemon/variant/icons/3/290_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/291_1.png b/public/images/pokemon/variant/icons/3/291_1.png deleted file mode 100644 index ab56b0f6763..00000000000 Binary files a/public/images/pokemon/variant/icons/3/291_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/291_2.png b/public/images/pokemon/variant/icons/3/291_2.png deleted file mode 100644 index 55706b1ad44..00000000000 Binary files a/public/images/pokemon/variant/icons/3/291_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/291_3.png b/public/images/pokemon/variant/icons/3/291_3.png deleted file mode 100644 index 4e4a5aa421b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/291_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/292_1.png b/public/images/pokemon/variant/icons/3/292_1.png deleted file mode 100644 index b03645b1550..00000000000 Binary files a/public/images/pokemon/variant/icons/3/292_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/292_2.png b/public/images/pokemon/variant/icons/3/292_2.png deleted file mode 100644 index 2b3a097c067..00000000000 Binary files a/public/images/pokemon/variant/icons/3/292_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/292_3.png b/public/images/pokemon/variant/icons/3/292_3.png deleted file mode 100644 index d8cd945026a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/292_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/298_2.png b/public/images/pokemon/variant/icons/3/298_2.png deleted file mode 100644 index 2c959be835a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/298_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/298_3.png b/public/images/pokemon/variant/icons/3/298_3.png deleted file mode 100644 index 559bc8434cd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/298_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/300_1.png b/public/images/pokemon/variant/icons/3/300_1.png deleted file mode 100644 index 3e3665320b0..00000000000 Binary files a/public/images/pokemon/variant/icons/3/300_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/300_2.png b/public/images/pokemon/variant/icons/3/300_2.png deleted file mode 100644 index a436bc177c3..00000000000 Binary files a/public/images/pokemon/variant/icons/3/300_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/300_3.png b/public/images/pokemon/variant/icons/3/300_3.png deleted file mode 100644 index ec4565df0d5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/300_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/301_1.png b/public/images/pokemon/variant/icons/3/301_1.png deleted file mode 100644 index a32df44a3cd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/301_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/301_2.png b/public/images/pokemon/variant/icons/3/301_2.png deleted file mode 100644 index 38aa20f736e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/301_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/301_3.png b/public/images/pokemon/variant/icons/3/301_3.png deleted file mode 100644 index 6ca7830a437..00000000000 Binary files a/public/images/pokemon/variant/icons/3/301_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/303-mega_1.png b/public/images/pokemon/variant/icons/3/303-mega_1.png deleted file mode 100644 index 0290f7c2662..00000000000 Binary files a/public/images/pokemon/variant/icons/3/303-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/303-mega_2.png b/public/images/pokemon/variant/icons/3/303-mega_2.png deleted file mode 100644 index f0132c2e149..00000000000 Binary files a/public/images/pokemon/variant/icons/3/303-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/303-mega_3.png b/public/images/pokemon/variant/icons/3/303-mega_3.png deleted file mode 100644 index 4e81c96c1b8..00000000000 Binary files a/public/images/pokemon/variant/icons/3/303-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/303_2.png b/public/images/pokemon/variant/icons/3/303_2.png deleted file mode 100644 index 394d3676be4..00000000000 Binary files a/public/images/pokemon/variant/icons/3/303_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/303_3.png b/public/images/pokemon/variant/icons/3/303_3.png deleted file mode 100644 index 7f862199926..00000000000 Binary files a/public/images/pokemon/variant/icons/3/303_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/304_1.png b/public/images/pokemon/variant/icons/3/304_1.png deleted file mode 100644 index a32ec0a4a33..00000000000 Binary files a/public/images/pokemon/variant/icons/3/304_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/304_2.png b/public/images/pokemon/variant/icons/3/304_2.png deleted file mode 100644 index c670ee0ee21..00000000000 Binary files a/public/images/pokemon/variant/icons/3/304_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/304_3.png b/public/images/pokemon/variant/icons/3/304_3.png deleted file mode 100644 index e83399a5ff7..00000000000 Binary files a/public/images/pokemon/variant/icons/3/304_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/305_1.png b/public/images/pokemon/variant/icons/3/305_1.png deleted file mode 100644 index c98222a0bdd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/305_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/305_2.png b/public/images/pokemon/variant/icons/3/305_2.png deleted file mode 100644 index d1db8f49dcc..00000000000 Binary files a/public/images/pokemon/variant/icons/3/305_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/305_3.png b/public/images/pokemon/variant/icons/3/305_3.png deleted file mode 100644 index 404d304f493..00000000000 Binary files a/public/images/pokemon/variant/icons/3/305_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306-mega_1.png b/public/images/pokemon/variant/icons/3/306-mega_1.png deleted file mode 100644 index c2a5bde0654..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306-mega_2.png b/public/images/pokemon/variant/icons/3/306-mega_2.png deleted file mode 100644 index 87eb1a366b7..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306-mega_3.png b/public/images/pokemon/variant/icons/3/306-mega_3.png deleted file mode 100644 index 5a87dae0a45..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306_1.png b/public/images/pokemon/variant/icons/3/306_1.png deleted file mode 100644 index dc4cdd8fb54..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306_2.png b/public/images/pokemon/variant/icons/3/306_2.png deleted file mode 100644 index 4d5ed76f0c5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/306_3.png b/public/images/pokemon/variant/icons/3/306_3.png deleted file mode 100644 index de5e70eb4e6..00000000000 Binary files a/public/images/pokemon/variant/icons/3/306_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/307_2.png b/public/images/pokemon/variant/icons/3/307_2.png deleted file mode 100644 index 13af3fbcf5e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/307_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/307_3.png b/public/images/pokemon/variant/icons/3/307_3.png deleted file mode 100644 index 1ad23e2038d..00000000000 Binary files a/public/images/pokemon/variant/icons/3/307_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/308-mega_2.png b/public/images/pokemon/variant/icons/3/308-mega_2.png deleted file mode 100644 index 8a5213092f9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/308-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/308-mega_3.png b/public/images/pokemon/variant/icons/3/308-mega_3.png deleted file mode 100644 index 7e3d7ddc258..00000000000 Binary files a/public/images/pokemon/variant/icons/3/308-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/308_2.png b/public/images/pokemon/variant/icons/3/308_2.png deleted file mode 100644 index d72c502ea22..00000000000 Binary files a/public/images/pokemon/variant/icons/3/308_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/308_3.png b/public/images/pokemon/variant/icons/3/308_3.png deleted file mode 100644 index 135e7bc80a0..00000000000 Binary files a/public/images/pokemon/variant/icons/3/308_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/309_2.png b/public/images/pokemon/variant/icons/3/309_2.png deleted file mode 100644 index 96321bed7b4..00000000000 Binary files a/public/images/pokemon/variant/icons/3/309_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/309_3.png b/public/images/pokemon/variant/icons/3/309_3.png deleted file mode 100644 index a186f8caf08..00000000000 Binary files a/public/images/pokemon/variant/icons/3/309_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/310-mega_2.png b/public/images/pokemon/variant/icons/3/310-mega_2.png deleted file mode 100644 index 0d5e9c9d949..00000000000 Binary files a/public/images/pokemon/variant/icons/3/310-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/310-mega_3.png b/public/images/pokemon/variant/icons/3/310-mega_3.png deleted file mode 100644 index 0bf7151a167..00000000000 Binary files a/public/images/pokemon/variant/icons/3/310-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/310_2.png b/public/images/pokemon/variant/icons/3/310_2.png deleted file mode 100644 index 9740c5d90bd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/310_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/310_3.png b/public/images/pokemon/variant/icons/3/310_3.png deleted file mode 100644 index d6c98bd3345..00000000000 Binary files a/public/images/pokemon/variant/icons/3/310_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/311_1.png b/public/images/pokemon/variant/icons/3/311_1.png deleted file mode 100644 index cc452edb63e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/311_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/311_2.png b/public/images/pokemon/variant/icons/3/311_2.png deleted file mode 100644 index 576dc178357..00000000000 Binary files a/public/images/pokemon/variant/icons/3/311_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/311_3.png b/public/images/pokemon/variant/icons/3/311_3.png deleted file mode 100644 index 211f761c5f9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/311_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/312_2.png b/public/images/pokemon/variant/icons/3/312_2.png deleted file mode 100644 index 140653e6303..00000000000 Binary files a/public/images/pokemon/variant/icons/3/312_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/312_3.png b/public/images/pokemon/variant/icons/3/312_3.png deleted file mode 100644 index edf091157b5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/312_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/328_2.png b/public/images/pokemon/variant/icons/3/328_2.png deleted file mode 100644 index 8fa26e80d4b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/328_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/328_3.png b/public/images/pokemon/variant/icons/3/328_3.png deleted file mode 100644 index 10b2d3cf6e2..00000000000 Binary files a/public/images/pokemon/variant/icons/3/328_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/329_2.png b/public/images/pokemon/variant/icons/3/329_2.png deleted file mode 100644 index ec4da909118..00000000000 Binary files a/public/images/pokemon/variant/icons/3/329_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/329_3.png b/public/images/pokemon/variant/icons/3/329_3.png deleted file mode 100644 index c58ca1f9b4b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/329_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/330_2.png b/public/images/pokemon/variant/icons/3/330_2.png deleted file mode 100644 index db09dd178c0..00000000000 Binary files a/public/images/pokemon/variant/icons/3/330_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/330_3.png b/public/images/pokemon/variant/icons/3/330_3.png deleted file mode 100644 index 457139323d8..00000000000 Binary files a/public/images/pokemon/variant/icons/3/330_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/333_2.png b/public/images/pokemon/variant/icons/3/333_2.png deleted file mode 100644 index dba83c56e4c..00000000000 Binary files a/public/images/pokemon/variant/icons/3/333_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/333_3.png b/public/images/pokemon/variant/icons/3/333_3.png deleted file mode 100644 index 052e9cdbb6e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/333_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/334-mega_2.png b/public/images/pokemon/variant/icons/3/334-mega_2.png deleted file mode 100644 index dbd6e0d6d2e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/334-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/334-mega_3.png b/public/images/pokemon/variant/icons/3/334-mega_3.png deleted file mode 100644 index 6386fd580a5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/334-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/334_2.png b/public/images/pokemon/variant/icons/3/334_2.png deleted file mode 100644 index ed4a145fa40..00000000000 Binary files a/public/images/pokemon/variant/icons/3/334_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/334_3.png b/public/images/pokemon/variant/icons/3/334_3.png deleted file mode 100644 index 08d3ac09a40..00000000000 Binary files a/public/images/pokemon/variant/icons/3/334_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/335_2.png b/public/images/pokemon/variant/icons/3/335_2.png deleted file mode 100644 index d80d7eed180..00000000000 Binary files a/public/images/pokemon/variant/icons/3/335_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/335_3.png b/public/images/pokemon/variant/icons/3/335_3.png deleted file mode 100644 index 99dd3396f6b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/335_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/336_2.png b/public/images/pokemon/variant/icons/3/336_2.png deleted file mode 100644 index 385bb807f1a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/336_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/336_3.png b/public/images/pokemon/variant/icons/3/336_3.png deleted file mode 100644 index b2d2add9558..00000000000 Binary files a/public/images/pokemon/variant/icons/3/336_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/338_2.png b/public/images/pokemon/variant/icons/3/338_2.png deleted file mode 100644 index 16abeba277a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/338_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/338_3.png b/public/images/pokemon/variant/icons/3/338_3.png deleted file mode 100644 index f11206858a5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/338_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/339_2.png b/public/images/pokemon/variant/icons/3/339_2.png deleted file mode 100644 index d4a6b9c0c63..00000000000 Binary files a/public/images/pokemon/variant/icons/3/339_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/339_3.png b/public/images/pokemon/variant/icons/3/339_3.png deleted file mode 100644 index 2f5399ce5fb..00000000000 Binary files a/public/images/pokemon/variant/icons/3/339_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/340_2.png b/public/images/pokemon/variant/icons/3/340_2.png deleted file mode 100644 index a53af7dd28f..00000000000 Binary files a/public/images/pokemon/variant/icons/3/340_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/340_3.png b/public/images/pokemon/variant/icons/3/340_3.png deleted file mode 100644 index 55844131ca8..00000000000 Binary files a/public/images/pokemon/variant/icons/3/340_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-rainy_1.png b/public/images/pokemon/variant/icons/3/351-rainy_1.png deleted file mode 100644 index 7038b441db7..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-rainy_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-rainy_2.png b/public/images/pokemon/variant/icons/3/351-rainy_2.png deleted file mode 100644 index 87617e2761e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-rainy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-rainy_3.png b/public/images/pokemon/variant/icons/3/351-rainy_3.png deleted file mode 100644 index 9be0fd449ae..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-rainy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-snowy_1.png b/public/images/pokemon/variant/icons/3/351-snowy_1.png deleted file mode 100644 index 12527d321ce..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-snowy_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-snowy_2.png b/public/images/pokemon/variant/icons/3/351-snowy_2.png deleted file mode 100644 index 22ee53ee9e9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-snowy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-snowy_3.png b/public/images/pokemon/variant/icons/3/351-snowy_3.png deleted file mode 100644 index af0437e2599..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-snowy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-sunny_1.png b/public/images/pokemon/variant/icons/3/351-sunny_1.png deleted file mode 100644 index 2b24ac4d0b1..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-sunny_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-sunny_2.png b/public/images/pokemon/variant/icons/3/351-sunny_2.png deleted file mode 100644 index cb1584e4c69..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-sunny_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351-sunny_3.png b/public/images/pokemon/variant/icons/3/351-sunny_3.png deleted file mode 100644 index 6c92a04864b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351-sunny_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351_2.png b/public/images/pokemon/variant/icons/3/351_2.png deleted file mode 100644 index f318301a31b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/351_3.png b/public/images/pokemon/variant/icons/3/351_3.png deleted file mode 100644 index 9035c6243ad..00000000000 Binary files a/public/images/pokemon/variant/icons/3/351_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/352_1.png b/public/images/pokemon/variant/icons/3/352_1.png deleted file mode 100644 index f6e0f96024a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/352_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/352_2.png b/public/images/pokemon/variant/icons/3/352_2.png deleted file mode 100644 index 88d67f91e1a..00000000000 Binary files a/public/images/pokemon/variant/icons/3/352_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/352_3.png b/public/images/pokemon/variant/icons/3/352_3.png deleted file mode 100644 index e4f659efac0..00000000000 Binary files a/public/images/pokemon/variant/icons/3/352_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/353_2.png b/public/images/pokemon/variant/icons/3/353_2.png deleted file mode 100644 index 347bf7d92f9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/353_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/353_3.png b/public/images/pokemon/variant/icons/3/353_3.png deleted file mode 100644 index b2b6fe99fd1..00000000000 Binary files a/public/images/pokemon/variant/icons/3/353_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/354_2.png b/public/images/pokemon/variant/icons/3/354_2.png deleted file mode 100644 index 502385a3d7c..00000000000 Binary files a/public/images/pokemon/variant/icons/3/354_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/354_3.png b/public/images/pokemon/variant/icons/3/354_3.png deleted file mode 100644 index 91b04e826a9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/354_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/357_2.png b/public/images/pokemon/variant/icons/3/357_2.png deleted file mode 100644 index 8ba7b0439f3..00000000000 Binary files a/public/images/pokemon/variant/icons/3/357_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/357_3.png b/public/images/pokemon/variant/icons/3/357_3.png deleted file mode 100644 index 820201b7159..00000000000 Binary files a/public/images/pokemon/variant/icons/3/357_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/358_1.png b/public/images/pokemon/variant/icons/3/358_1.png deleted file mode 100644 index 14deda92d58..00000000000 Binary files a/public/images/pokemon/variant/icons/3/358_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/358_2.png b/public/images/pokemon/variant/icons/3/358_2.png deleted file mode 100644 index 181fe4226c1..00000000000 Binary files a/public/images/pokemon/variant/icons/3/358_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/358_3.png b/public/images/pokemon/variant/icons/3/358_3.png deleted file mode 100644 index a5b66165185..00000000000 Binary files a/public/images/pokemon/variant/icons/3/358_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/369_2.png b/public/images/pokemon/variant/icons/3/369_2.png deleted file mode 100644 index 5f247e91802..00000000000 Binary files a/public/images/pokemon/variant/icons/3/369_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/369_3.png b/public/images/pokemon/variant/icons/3/369_3.png deleted file mode 100644 index 5e1a40f149c..00000000000 Binary files a/public/images/pokemon/variant/icons/3/369_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/371_2.png b/public/images/pokemon/variant/icons/3/371_2.png deleted file mode 100644 index ab0c5d20606..00000000000 Binary files a/public/images/pokemon/variant/icons/3/371_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/371_3.png b/public/images/pokemon/variant/icons/3/371_3.png deleted file mode 100644 index b0f27c88ed3..00000000000 Binary files a/public/images/pokemon/variant/icons/3/371_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/372_2.png b/public/images/pokemon/variant/icons/3/372_2.png deleted file mode 100644 index 9ee2adbfa07..00000000000 Binary files a/public/images/pokemon/variant/icons/3/372_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/372_3.png b/public/images/pokemon/variant/icons/3/372_3.png deleted file mode 100644 index 00ad94a4fe7..00000000000 Binary files a/public/images/pokemon/variant/icons/3/372_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/373-mega_2.png b/public/images/pokemon/variant/icons/3/373-mega_2.png deleted file mode 100644 index 1ec3b8409e5..00000000000 Binary files a/public/images/pokemon/variant/icons/3/373-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/373-mega_3.png b/public/images/pokemon/variant/icons/3/373-mega_3.png deleted file mode 100644 index 9f0952fd6ef..00000000000 Binary files a/public/images/pokemon/variant/icons/3/373-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/373_2.png b/public/images/pokemon/variant/icons/3/373_2.png deleted file mode 100644 index 38401abab0e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/373_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/373_3.png b/public/images/pokemon/variant/icons/3/373_3.png deleted file mode 100644 index 8e2d3eabf26..00000000000 Binary files a/public/images/pokemon/variant/icons/3/373_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/374_2.png b/public/images/pokemon/variant/icons/3/374_2.png deleted file mode 100644 index 356f1d29177..00000000000 Binary files a/public/images/pokemon/variant/icons/3/374_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/374_3.png b/public/images/pokemon/variant/icons/3/374_3.png deleted file mode 100644 index 19eb72b7eba..00000000000 Binary files a/public/images/pokemon/variant/icons/3/374_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/375_2.png b/public/images/pokemon/variant/icons/3/375_2.png deleted file mode 100644 index de4efa75503..00000000000 Binary files a/public/images/pokemon/variant/icons/3/375_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/375_3.png b/public/images/pokemon/variant/icons/3/375_3.png deleted file mode 100644 index 2b6b637f48e..00000000000 Binary files a/public/images/pokemon/variant/icons/3/375_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/376-mega_2.png b/public/images/pokemon/variant/icons/3/376-mega_2.png deleted file mode 100644 index 86557ca063f..00000000000 Binary files a/public/images/pokemon/variant/icons/3/376-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/376-mega_3.png b/public/images/pokemon/variant/icons/3/376-mega_3.png deleted file mode 100644 index 01b165922bd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/376-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/376_2.png b/public/images/pokemon/variant/icons/3/376_2.png deleted file mode 100644 index f07844d885b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/376_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/376_3.png b/public/images/pokemon/variant/icons/3/376_3.png deleted file mode 100644 index 19b62f2eee7..00000000000 Binary files a/public/images/pokemon/variant/icons/3/376_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/380-mega_2.png b/public/images/pokemon/variant/icons/3/380-mega_2.png deleted file mode 100644 index fcec45a699d..00000000000 Binary files a/public/images/pokemon/variant/icons/3/380-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/380-mega_3.png b/public/images/pokemon/variant/icons/3/380-mega_3.png deleted file mode 100644 index 6d0f0be1a47..00000000000 Binary files a/public/images/pokemon/variant/icons/3/380-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/380_2.png b/public/images/pokemon/variant/icons/3/380_2.png deleted file mode 100644 index 397465205dd..00000000000 Binary files a/public/images/pokemon/variant/icons/3/380_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/380_3.png b/public/images/pokemon/variant/icons/3/380_3.png deleted file mode 100644 index 85b4b46b4f0..00000000000 Binary files a/public/images/pokemon/variant/icons/3/380_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/381-mega_2.png b/public/images/pokemon/variant/icons/3/381-mega_2.png deleted file mode 100644 index b1a8b998122..00000000000 Binary files a/public/images/pokemon/variant/icons/3/381-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/381-mega_3.png b/public/images/pokemon/variant/icons/3/381-mega_3.png deleted file mode 100644 index 9dfbc4851fe..00000000000 Binary files a/public/images/pokemon/variant/icons/3/381-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/381_2.png b/public/images/pokemon/variant/icons/3/381_2.png deleted file mode 100644 index 43038b9374f..00000000000 Binary files a/public/images/pokemon/variant/icons/3/381_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/381_3.png b/public/images/pokemon/variant/icons/3/381_3.png deleted file mode 100644 index 4bf798dcedc..00000000000 Binary files a/public/images/pokemon/variant/icons/3/381_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/382-primal_2.png b/public/images/pokemon/variant/icons/3/382-primal_2.png deleted file mode 100644 index c39b5333c00..00000000000 Binary files a/public/images/pokemon/variant/icons/3/382-primal_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/382-primal_3.png b/public/images/pokemon/variant/icons/3/382-primal_3.png deleted file mode 100644 index 4a2eba5f6c9..00000000000 Binary files a/public/images/pokemon/variant/icons/3/382-primal_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/382_2.png b/public/images/pokemon/variant/icons/3/382_2.png deleted file mode 100644 index ce4f0476e86..00000000000 Binary files a/public/images/pokemon/variant/icons/3/382_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/382_3.png b/public/images/pokemon/variant/icons/3/382_3.png deleted file mode 100644 index 6765d49f856..00000000000 Binary files a/public/images/pokemon/variant/icons/3/382_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/383-primal_2.png b/public/images/pokemon/variant/icons/3/383-primal_2.png deleted file mode 100644 index 32abb4b9132..00000000000 Binary files a/public/images/pokemon/variant/icons/3/383-primal_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/383-primal_3.png b/public/images/pokemon/variant/icons/3/383-primal_3.png deleted file mode 100644 index 952e08e33d2..00000000000 Binary files a/public/images/pokemon/variant/icons/3/383-primal_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/383_2.png b/public/images/pokemon/variant/icons/3/383_2.png deleted file mode 100644 index 3f5353822a1..00000000000 Binary files a/public/images/pokemon/variant/icons/3/383_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/383_3.png b/public/images/pokemon/variant/icons/3/383_3.png deleted file mode 100644 index 2549558a301..00000000000 Binary files a/public/images/pokemon/variant/icons/3/383_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/384-mega_2.png b/public/images/pokemon/variant/icons/3/384-mega_2.png deleted file mode 100644 index 4715d127ff6..00000000000 Binary files a/public/images/pokemon/variant/icons/3/384-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/384-mega_3.png b/public/images/pokemon/variant/icons/3/384-mega_3.png deleted file mode 100644 index ee344250831..00000000000 Binary files a/public/images/pokemon/variant/icons/3/384-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/384_2.png b/public/images/pokemon/variant/icons/3/384_2.png deleted file mode 100644 index 2835499beca..00000000000 Binary files a/public/images/pokemon/variant/icons/3/384_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/384_3.png b/public/images/pokemon/variant/icons/3/384_3.png deleted file mode 100644 index 84ff706b9fa..00000000000 Binary files a/public/images/pokemon/variant/icons/3/384_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/385_1.png b/public/images/pokemon/variant/icons/3/385_1.png deleted file mode 100644 index 5b66629d94b..00000000000 Binary files a/public/images/pokemon/variant/icons/3/385_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/385_2.png b/public/images/pokemon/variant/icons/3/385_2.png deleted file mode 100644 index f9efafe0634..00000000000 Binary files a/public/images/pokemon/variant/icons/3/385_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/3/385_3.png b/public/images/pokemon/variant/icons/3/385_3.png deleted file mode 100644 index 6b2bdaa1fac..00000000000 Binary files a/public/images/pokemon/variant/icons/3/385_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/387_2.png b/public/images/pokemon/variant/icons/4/387_2.png deleted file mode 100644 index 21715e2567c..00000000000 Binary files a/public/images/pokemon/variant/icons/4/387_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/387_3.png b/public/images/pokemon/variant/icons/4/387_3.png deleted file mode 100644 index d393d716862..00000000000 Binary files a/public/images/pokemon/variant/icons/4/387_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/388_2.png b/public/images/pokemon/variant/icons/4/388_2.png deleted file mode 100644 index 06a4de56e25..00000000000 Binary files a/public/images/pokemon/variant/icons/4/388_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/388_3.png b/public/images/pokemon/variant/icons/4/388_3.png deleted file mode 100644 index fa936198abb..00000000000 Binary files a/public/images/pokemon/variant/icons/4/388_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/389_2.png b/public/images/pokemon/variant/icons/4/389_2.png deleted file mode 100644 index d9d68f081b6..00000000000 Binary files a/public/images/pokemon/variant/icons/4/389_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/389_3.png b/public/images/pokemon/variant/icons/4/389_3.png deleted file mode 100644 index a785dea429c..00000000000 Binary files a/public/images/pokemon/variant/icons/4/389_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/399_2.png b/public/images/pokemon/variant/icons/4/399_2.png deleted file mode 100644 index bdf0093d408..00000000000 Binary files a/public/images/pokemon/variant/icons/4/399_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/399_3.png b/public/images/pokemon/variant/icons/4/399_3.png deleted file mode 100644 index 5459fc5a8a1..00000000000 Binary files a/public/images/pokemon/variant/icons/4/399_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/400_2.png b/public/images/pokemon/variant/icons/4/400_2.png deleted file mode 100644 index b7a5ad3e272..00000000000 Binary files a/public/images/pokemon/variant/icons/4/400_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/400_3.png b/public/images/pokemon/variant/icons/4/400_3.png deleted file mode 100644 index 2d4c4c03c3d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/400_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/401_2.png b/public/images/pokemon/variant/icons/4/401_2.png deleted file mode 100644 index aa9b4aa0ed9..00000000000 Binary files a/public/images/pokemon/variant/icons/4/401_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/401_3.png b/public/images/pokemon/variant/icons/4/401_3.png deleted file mode 100644 index 69fb5864f87..00000000000 Binary files a/public/images/pokemon/variant/icons/4/401_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/402_2.png b/public/images/pokemon/variant/icons/4/402_2.png deleted file mode 100644 index 1ce8776332b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/402_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/402_3.png b/public/images/pokemon/variant/icons/4/402_3.png deleted file mode 100644 index d020e81ef43..00000000000 Binary files a/public/images/pokemon/variant/icons/4/402_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/425_2.png b/public/images/pokemon/variant/icons/4/425_2.png deleted file mode 100644 index 5387e9cce3c..00000000000 Binary files a/public/images/pokemon/variant/icons/4/425_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/425_3.png b/public/images/pokemon/variant/icons/4/425_3.png deleted file mode 100644 index efe3d656964..00000000000 Binary files a/public/images/pokemon/variant/icons/4/425_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/426_2.png b/public/images/pokemon/variant/icons/4/426_2.png deleted file mode 100644 index 5f1805f8acb..00000000000 Binary files a/public/images/pokemon/variant/icons/4/426_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/426_3.png b/public/images/pokemon/variant/icons/4/426_3.png deleted file mode 100644 index 2a7b3be7ab9..00000000000 Binary files a/public/images/pokemon/variant/icons/4/426_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/427_2.png b/public/images/pokemon/variant/icons/4/427_2.png deleted file mode 100644 index 1b5d9271624..00000000000 Binary files a/public/images/pokemon/variant/icons/4/427_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/427_3.png b/public/images/pokemon/variant/icons/4/427_3.png deleted file mode 100644 index a3f90ea6dfa..00000000000 Binary files a/public/images/pokemon/variant/icons/4/427_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/428-mega_2.png b/public/images/pokemon/variant/icons/4/428-mega_2.png deleted file mode 100644 index 43dfa05d438..00000000000 Binary files a/public/images/pokemon/variant/icons/4/428-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/428-mega_3.png b/public/images/pokemon/variant/icons/4/428-mega_3.png deleted file mode 100644 index 4d6194bd554..00000000000 Binary files a/public/images/pokemon/variant/icons/4/428-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/428_2.png b/public/images/pokemon/variant/icons/4/428_2.png deleted file mode 100644 index 1e42720c78b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/428_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/428_3.png b/public/images/pokemon/variant/icons/4/428_3.png deleted file mode 100644 index b8bf01bb20d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/428_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/429_1.png b/public/images/pokemon/variant/icons/4/429_1.png deleted file mode 100644 index 7354a6a6be7..00000000000 Binary files a/public/images/pokemon/variant/icons/4/429_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/429_2.png b/public/images/pokemon/variant/icons/4/429_2.png deleted file mode 100644 index 9ec7cd5e76e..00000000000 Binary files a/public/images/pokemon/variant/icons/4/429_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/429_3.png b/public/images/pokemon/variant/icons/4/429_3.png deleted file mode 100644 index 48f7068ced8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/429_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/433_1.png b/public/images/pokemon/variant/icons/4/433_1.png deleted file mode 100644 index 04e9fbcaf3a..00000000000 Binary files a/public/images/pokemon/variant/icons/4/433_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/433_2.png b/public/images/pokemon/variant/icons/4/433_2.png deleted file mode 100644 index fbccdb13cd0..00000000000 Binary files a/public/images/pokemon/variant/icons/4/433_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/433_3.png b/public/images/pokemon/variant/icons/4/433_3.png deleted file mode 100644 index 72b3389978f..00000000000 Binary files a/public/images/pokemon/variant/icons/4/433_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/436_2.png b/public/images/pokemon/variant/icons/4/436_2.png deleted file mode 100644 index fe76bf3b86e..00000000000 Binary files a/public/images/pokemon/variant/icons/4/436_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/436_3.png b/public/images/pokemon/variant/icons/4/436_3.png deleted file mode 100644 index b0051761e60..00000000000 Binary files a/public/images/pokemon/variant/icons/4/436_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/437_2.png b/public/images/pokemon/variant/icons/4/437_2.png deleted file mode 100644 index d03d8075fad..00000000000 Binary files a/public/images/pokemon/variant/icons/4/437_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/437_3.png b/public/images/pokemon/variant/icons/4/437_3.png deleted file mode 100644 index 41e630e5d08..00000000000 Binary files a/public/images/pokemon/variant/icons/4/437_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/440_1.png b/public/images/pokemon/variant/icons/4/440_1.png deleted file mode 100644 index 221f382a21b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/440_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/440_2.png b/public/images/pokemon/variant/icons/4/440_2.png deleted file mode 100644 index 13b7a152372..00000000000 Binary files a/public/images/pokemon/variant/icons/4/440_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/440_3.png b/public/images/pokemon/variant/icons/4/440_3.png deleted file mode 100644 index a97c51cd646..00000000000 Binary files a/public/images/pokemon/variant/icons/4/440_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/442_2.png b/public/images/pokemon/variant/icons/4/442_2.png deleted file mode 100644 index 9859bb7ce98..00000000000 Binary files a/public/images/pokemon/variant/icons/4/442_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/442_3.png b/public/images/pokemon/variant/icons/4/442_3.png deleted file mode 100644 index d64848ac40d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/442_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/443_1.png b/public/images/pokemon/variant/icons/4/443_1.png deleted file mode 100644 index 53d93aab99e..00000000000 Binary files a/public/images/pokemon/variant/icons/4/443_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/443_2.png b/public/images/pokemon/variant/icons/4/443_2.png deleted file mode 100644 index e7dfb3fdb5c..00000000000 Binary files a/public/images/pokemon/variant/icons/4/443_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/443_3.png b/public/images/pokemon/variant/icons/4/443_3.png deleted file mode 100644 index abf81433d96..00000000000 Binary files a/public/images/pokemon/variant/icons/4/443_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/444_1.png b/public/images/pokemon/variant/icons/4/444_1.png deleted file mode 100644 index 1cb56ea2b84..00000000000 Binary files a/public/images/pokemon/variant/icons/4/444_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/444_2.png b/public/images/pokemon/variant/icons/4/444_2.png deleted file mode 100644 index 00c4eefefb4..00000000000 Binary files a/public/images/pokemon/variant/icons/4/444_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/444_3.png b/public/images/pokemon/variant/icons/4/444_3.png deleted file mode 100644 index 477505c805b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/444_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445-mega_1.png b/public/images/pokemon/variant/icons/4/445-mega_1.png deleted file mode 100644 index ad7b058c3c1..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445-mega_2.png b/public/images/pokemon/variant/icons/4/445-mega_2.png deleted file mode 100644 index c7260ae2013..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445-mega_3.png b/public/images/pokemon/variant/icons/4/445-mega_3.png deleted file mode 100644 index e05693129d3..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445_1.png b/public/images/pokemon/variant/icons/4/445_1.png deleted file mode 100644 index 955f80fc48d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445_2.png b/public/images/pokemon/variant/icons/4/445_2.png deleted file mode 100644 index aa36c7791af..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/445_3.png b/public/images/pokemon/variant/icons/4/445_3.png deleted file mode 100644 index a0b6ed9cd1d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/445_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/447_1.png b/public/images/pokemon/variant/icons/4/447_1.png deleted file mode 100644 index 03173395ac8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/447_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/447_2.png b/public/images/pokemon/variant/icons/4/447_2.png deleted file mode 100644 index 3fd9c515de9..00000000000 Binary files a/public/images/pokemon/variant/icons/4/447_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/447_3.png b/public/images/pokemon/variant/icons/4/447_3.png deleted file mode 100644 index 45f1b14a992..00000000000 Binary files a/public/images/pokemon/variant/icons/4/447_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448-mega_1.png b/public/images/pokemon/variant/icons/4/448-mega_1.png deleted file mode 100644 index 9c694d8915a..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448-mega_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448-mega_2.png b/public/images/pokemon/variant/icons/4/448-mega_2.png deleted file mode 100644 index 2bb37f8df08..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448-mega_3.png b/public/images/pokemon/variant/icons/4/448-mega_3.png deleted file mode 100644 index 5dbdb78b839..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448_1.png b/public/images/pokemon/variant/icons/4/448_1.png deleted file mode 100644 index 362927f30c3..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448_2.png b/public/images/pokemon/variant/icons/4/448_2.png deleted file mode 100644 index 83a9783c4c1..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/448_3.png b/public/images/pokemon/variant/icons/4/448_3.png deleted file mode 100644 index 65684e49bd8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/448_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/458_2.png b/public/images/pokemon/variant/icons/4/458_2.png deleted file mode 100644 index 9d4114f8263..00000000000 Binary files a/public/images/pokemon/variant/icons/4/458_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/458_3.png b/public/images/pokemon/variant/icons/4/458_3.png deleted file mode 100644 index 6cf77428ebe..00000000000 Binary files a/public/images/pokemon/variant/icons/4/458_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/466_1.png b/public/images/pokemon/variant/icons/4/466_1.png deleted file mode 100644 index 32423eb1384..00000000000 Binary files a/public/images/pokemon/variant/icons/4/466_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/466_2.png b/public/images/pokemon/variant/icons/4/466_2.png deleted file mode 100644 index 0d39f0798c7..00000000000 Binary files a/public/images/pokemon/variant/icons/4/466_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/466_3.png b/public/images/pokemon/variant/icons/4/466_3.png deleted file mode 100644 index eca9ef7724c..00000000000 Binary files a/public/images/pokemon/variant/icons/4/466_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/468_1.png b/public/images/pokemon/variant/icons/4/468_1.png deleted file mode 100644 index 686326a1aa8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/468_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/468_2.png b/public/images/pokemon/variant/icons/4/468_2.png deleted file mode 100644 index 96f525ce43e..00000000000 Binary files a/public/images/pokemon/variant/icons/4/468_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/468_3.png b/public/images/pokemon/variant/icons/4/468_3.png deleted file mode 100644 index 7e907f3eae3..00000000000 Binary files a/public/images/pokemon/variant/icons/4/468_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/470_1.png b/public/images/pokemon/variant/icons/4/470_1.png deleted file mode 100644 index 4ba723592e3..00000000000 Binary files a/public/images/pokemon/variant/icons/4/470_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/470_2.png b/public/images/pokemon/variant/icons/4/470_2.png deleted file mode 100644 index 87324b2666a..00000000000 Binary files a/public/images/pokemon/variant/icons/4/470_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/470_3.png b/public/images/pokemon/variant/icons/4/470_3.png deleted file mode 100644 index 421ce166559..00000000000 Binary files a/public/images/pokemon/variant/icons/4/470_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/471_1.png b/public/images/pokemon/variant/icons/4/471_1.png deleted file mode 100644 index d37a7515a00..00000000000 Binary files a/public/images/pokemon/variant/icons/4/471_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/471_2.png b/public/images/pokemon/variant/icons/4/471_2.png deleted file mode 100644 index 429544cc591..00000000000 Binary files a/public/images/pokemon/variant/icons/4/471_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/471_3.png b/public/images/pokemon/variant/icons/4/471_3.png deleted file mode 100644 index 95b8e481818..00000000000 Binary files a/public/images/pokemon/variant/icons/4/471_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/475-mega_2.png b/public/images/pokemon/variant/icons/4/475-mega_2.png deleted file mode 100644 index 91978784c80..00000000000 Binary files a/public/images/pokemon/variant/icons/4/475-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/475-mega_3.png b/public/images/pokemon/variant/icons/4/475-mega_3.png deleted file mode 100644 index af231e2fc3b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/475-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/475_2.png b/public/images/pokemon/variant/icons/4/475_2.png deleted file mode 100644 index 4bfe88f1f88..00000000000 Binary files a/public/images/pokemon/variant/icons/4/475_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/475_3.png b/public/images/pokemon/variant/icons/4/475_3.png deleted file mode 100644 index 8bc62d70b0f..00000000000 Binary files a/public/images/pokemon/variant/icons/4/475_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/480_1.png b/public/images/pokemon/variant/icons/4/480_1.png deleted file mode 100644 index 3b9a496e3f9..00000000000 Binary files a/public/images/pokemon/variant/icons/4/480_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/480_2.png b/public/images/pokemon/variant/icons/4/480_2.png deleted file mode 100644 index 5db1971cb61..00000000000 Binary files a/public/images/pokemon/variant/icons/4/480_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/480_3.png b/public/images/pokemon/variant/icons/4/480_3.png deleted file mode 100644 index e7ca3ff5bc8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/480_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/481_1.png b/public/images/pokemon/variant/icons/4/481_1.png deleted file mode 100644 index 382851af42b..00000000000 Binary files a/public/images/pokemon/variant/icons/4/481_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/481_2.png b/public/images/pokemon/variant/icons/4/481_2.png deleted file mode 100644 index 8c62541d898..00000000000 Binary files a/public/images/pokemon/variant/icons/4/481_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/481_3.png b/public/images/pokemon/variant/icons/4/481_3.png deleted file mode 100644 index c42845e9ed7..00000000000 Binary files a/public/images/pokemon/variant/icons/4/481_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/482_1.png b/public/images/pokemon/variant/icons/4/482_1.png deleted file mode 100644 index 3e479c3c1c6..00000000000 Binary files a/public/images/pokemon/variant/icons/4/482_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/482_2.png b/public/images/pokemon/variant/icons/4/482_2.png deleted file mode 100644 index a636973b33a..00000000000 Binary files a/public/images/pokemon/variant/icons/4/482_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/482_3.png b/public/images/pokemon/variant/icons/4/482_3.png deleted file mode 100644 index 28ec6f85f47..00000000000 Binary files a/public/images/pokemon/variant/icons/4/482_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/485_3.png b/public/images/pokemon/variant/icons/4/485_3.png deleted file mode 100644 index 2f133e8fb98..00000000000 Binary files a/public/images/pokemon/variant/icons/4/485_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/487-altered_2.png b/public/images/pokemon/variant/icons/4/487-altered_2.png deleted file mode 100644 index d9cbea5e323..00000000000 Binary files a/public/images/pokemon/variant/icons/4/487-altered_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/487-altered_3.png b/public/images/pokemon/variant/icons/4/487-altered_3.png deleted file mode 100644 index 59169ab9de8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/487-altered_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/487-origin_2.png b/public/images/pokemon/variant/icons/4/487-origin_2.png deleted file mode 100644 index 61f322ac409..00000000000 Binary files a/public/images/pokemon/variant/icons/4/487-origin_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/487-origin_3.png b/public/images/pokemon/variant/icons/4/487-origin_3.png deleted file mode 100644 index e8fe8f61634..00000000000 Binary files a/public/images/pokemon/variant/icons/4/487-origin_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/488_2.png b/public/images/pokemon/variant/icons/4/488_2.png deleted file mode 100644 index 400a2d2d065..00000000000 Binary files a/public/images/pokemon/variant/icons/4/488_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/488_3.png b/public/images/pokemon/variant/icons/4/488_3.png deleted file mode 100644 index 595ceb54f82..00000000000 Binary files a/public/images/pokemon/variant/icons/4/488_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/489_1.png b/public/images/pokemon/variant/icons/4/489_1.png deleted file mode 100644 index 9cb6e03888a..00000000000 Binary files a/public/images/pokemon/variant/icons/4/489_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/489_2.png b/public/images/pokemon/variant/icons/4/489_2.png deleted file mode 100644 index b4e32fe5259..00000000000 Binary files a/public/images/pokemon/variant/icons/4/489_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/489_3.png b/public/images/pokemon/variant/icons/4/489_3.png deleted file mode 100644 index 428156638bf..00000000000 Binary files a/public/images/pokemon/variant/icons/4/489_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/490_1.png b/public/images/pokemon/variant/icons/4/490_1.png deleted file mode 100644 index 1fda8d15b43..00000000000 Binary files a/public/images/pokemon/variant/icons/4/490_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/490_2.png b/public/images/pokemon/variant/icons/4/490_2.png deleted file mode 100644 index b9014e88e18..00000000000 Binary files a/public/images/pokemon/variant/icons/4/490_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/490_3.png b/public/images/pokemon/variant/icons/4/490_3.png deleted file mode 100644 index 87a055c99e0..00000000000 Binary files a/public/images/pokemon/variant/icons/4/490_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/491_2.png b/public/images/pokemon/variant/icons/4/491_2.png deleted file mode 100644 index e5e8ed579be..00000000000 Binary files a/public/images/pokemon/variant/icons/4/491_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/491_3.png b/public/images/pokemon/variant/icons/4/491_3.png deleted file mode 100644 index 630f7c57c09..00000000000 Binary files a/public/images/pokemon/variant/icons/4/491_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/492-land_2.png b/public/images/pokemon/variant/icons/4/492-land_2.png deleted file mode 100644 index fdb71a83687..00000000000 Binary files a/public/images/pokemon/variant/icons/4/492-land_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/492-land_3.png b/public/images/pokemon/variant/icons/4/492-land_3.png deleted file mode 100644 index 0262fb96375..00000000000 Binary files a/public/images/pokemon/variant/icons/4/492-land_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/492-sky_2.png b/public/images/pokemon/variant/icons/4/492-sky_2.png deleted file mode 100644 index 6c704ab6089..00000000000 Binary files a/public/images/pokemon/variant/icons/4/492-sky_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/492-sky_3.png b/public/images/pokemon/variant/icons/4/492-sky_3.png deleted file mode 100644 index bd18e72a73d..00000000000 Binary files a/public/images/pokemon/variant/icons/4/492-sky_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/494_2.png b/public/images/pokemon/variant/icons/4/494_2.png deleted file mode 100644 index bf0c810d1f8..00000000000 Binary files a/public/images/pokemon/variant/icons/4/494_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/4/494_3.png b/public/images/pokemon/variant/icons/4/494_3.png deleted file mode 100644 index 49a0c349338..00000000000 Binary files a/public/images/pokemon/variant/icons/4/494_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/495_2.png b/public/images/pokemon/variant/icons/5/495_2.png deleted file mode 100644 index f25803707c5..00000000000 Binary files a/public/images/pokemon/variant/icons/5/495_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/495_3.png b/public/images/pokemon/variant/icons/5/495_3.png deleted file mode 100644 index f8aa4640b94..00000000000 Binary files a/public/images/pokemon/variant/icons/5/495_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/496_2.png b/public/images/pokemon/variant/icons/5/496_2.png deleted file mode 100644 index 7afe5afd0d8..00000000000 Binary files a/public/images/pokemon/variant/icons/5/496_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/496_3.png b/public/images/pokemon/variant/icons/5/496_3.png deleted file mode 100644 index bcda92b7564..00000000000 Binary files a/public/images/pokemon/variant/icons/5/496_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/497_2.png b/public/images/pokemon/variant/icons/5/497_2.png deleted file mode 100644 index ab85a310ff6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/497_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/497_3.png b/public/images/pokemon/variant/icons/5/497_3.png deleted file mode 100644 index d901b5060d3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/497_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/531-mega_2.png b/public/images/pokemon/variant/icons/5/531-mega_2.png deleted file mode 100644 index cd23fd25f62..00000000000 Binary files a/public/images/pokemon/variant/icons/5/531-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/531-mega_3.png b/public/images/pokemon/variant/icons/5/531-mega_3.png deleted file mode 100644 index a787eeae6ae..00000000000 Binary files a/public/images/pokemon/variant/icons/5/531-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/531_2.png b/public/images/pokemon/variant/icons/5/531_2.png deleted file mode 100644 index 3fa450360de..00000000000 Binary files a/public/images/pokemon/variant/icons/5/531_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/531_3.png b/public/images/pokemon/variant/icons/5/531_3.png deleted file mode 100644 index 24c3ad108c6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/531_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/532_2.png b/public/images/pokemon/variant/icons/5/532_2.png deleted file mode 100644 index 81c5ccccd02..00000000000 Binary files a/public/images/pokemon/variant/icons/5/532_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/532_3.png b/public/images/pokemon/variant/icons/5/532_3.png deleted file mode 100644 index 276b7da7bac..00000000000 Binary files a/public/images/pokemon/variant/icons/5/532_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/533_2.png b/public/images/pokemon/variant/icons/5/533_2.png deleted file mode 100644 index 0a0e58b5af5..00000000000 Binary files a/public/images/pokemon/variant/icons/5/533_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/533_3.png b/public/images/pokemon/variant/icons/5/533_3.png deleted file mode 100644 index abfa6b61c91..00000000000 Binary files a/public/images/pokemon/variant/icons/5/533_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/534_2.png b/public/images/pokemon/variant/icons/5/534_2.png deleted file mode 100644 index 19a37ec320e..00000000000 Binary files a/public/images/pokemon/variant/icons/5/534_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/534_3.png b/public/images/pokemon/variant/icons/5/534_3.png deleted file mode 100644 index bb5716edede..00000000000 Binary files a/public/images/pokemon/variant/icons/5/534_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/538_2.png b/public/images/pokemon/variant/icons/5/538_2.png deleted file mode 100644 index cce9492da40..00000000000 Binary files a/public/images/pokemon/variant/icons/5/538_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/538_3.png b/public/images/pokemon/variant/icons/5/538_3.png deleted file mode 100644 index 6167c7fbdcd..00000000000 Binary files a/public/images/pokemon/variant/icons/5/538_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/540_2.png b/public/images/pokemon/variant/icons/5/540_2.png deleted file mode 100644 index 26123ac72c3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/540_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/540_3.png b/public/images/pokemon/variant/icons/5/540_3.png deleted file mode 100644 index 3089a82cb9d..00000000000 Binary files a/public/images/pokemon/variant/icons/5/540_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/541_2.png b/public/images/pokemon/variant/icons/5/541_2.png deleted file mode 100644 index 6e14cea1d65..00000000000 Binary files a/public/images/pokemon/variant/icons/5/541_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/541_3.png b/public/images/pokemon/variant/icons/5/541_3.png deleted file mode 100644 index f691017ebc6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/541_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/542_2.png b/public/images/pokemon/variant/icons/5/542_2.png deleted file mode 100644 index c6fab880eee..00000000000 Binary files a/public/images/pokemon/variant/icons/5/542_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/542_3.png b/public/images/pokemon/variant/icons/5/542_3.png deleted file mode 100644 index ed2c5a0dbef..00000000000 Binary files a/public/images/pokemon/variant/icons/5/542_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/543_2.png b/public/images/pokemon/variant/icons/5/543_2.png deleted file mode 100644 index 2d76a56ac2a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/543_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/543_3.png b/public/images/pokemon/variant/icons/5/543_3.png deleted file mode 100644 index 1317d38d215..00000000000 Binary files a/public/images/pokemon/variant/icons/5/543_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/544_2.png b/public/images/pokemon/variant/icons/5/544_2.png deleted file mode 100644 index 6feebe2493b..00000000000 Binary files a/public/images/pokemon/variant/icons/5/544_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/544_3.png b/public/images/pokemon/variant/icons/5/544_3.png deleted file mode 100644 index 8afd2655ad6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/544_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/545_2.png b/public/images/pokemon/variant/icons/5/545_2.png deleted file mode 100644 index a081772bcf6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/545_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/545_3.png b/public/images/pokemon/variant/icons/5/545_3.png deleted file mode 100644 index 17cbab0624e..00000000000 Binary files a/public/images/pokemon/variant/icons/5/545_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/546_2.png b/public/images/pokemon/variant/icons/5/546_2.png deleted file mode 100644 index e5db5b4f74f..00000000000 Binary files a/public/images/pokemon/variant/icons/5/546_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/546_3.png b/public/images/pokemon/variant/icons/5/546_3.png deleted file mode 100644 index 126bd405d95..00000000000 Binary files a/public/images/pokemon/variant/icons/5/546_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/547_2.png b/public/images/pokemon/variant/icons/5/547_2.png deleted file mode 100644 index 2294b11332a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/547_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/547_3.png b/public/images/pokemon/variant/icons/5/547_3.png deleted file mode 100644 index 1af57cc099a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/547_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/548_1.png b/public/images/pokemon/variant/icons/5/548_1.png deleted file mode 100644 index ee99f5110f2..00000000000 Binary files a/public/images/pokemon/variant/icons/5/548_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/548_2.png b/public/images/pokemon/variant/icons/5/548_2.png deleted file mode 100644 index aafa94dc525..00000000000 Binary files a/public/images/pokemon/variant/icons/5/548_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/548_3.png b/public/images/pokemon/variant/icons/5/548_3.png deleted file mode 100644 index 4b31b7c0bdd..00000000000 Binary files a/public/images/pokemon/variant/icons/5/548_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/549_2.png b/public/images/pokemon/variant/icons/5/549_2.png deleted file mode 100644 index 9dbb35707b5..00000000000 Binary files a/public/images/pokemon/variant/icons/5/549_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/549_3.png b/public/images/pokemon/variant/icons/5/549_3.png deleted file mode 100644 index ef8dba0f5be..00000000000 Binary files a/public/images/pokemon/variant/icons/5/549_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/551_2.png b/public/images/pokemon/variant/icons/5/551_2.png deleted file mode 100644 index ae2b2cd7f8a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/551_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/551_3.png b/public/images/pokemon/variant/icons/5/551_3.png deleted file mode 100644 index a7992294947..00000000000 Binary files a/public/images/pokemon/variant/icons/5/551_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/552_2.png b/public/images/pokemon/variant/icons/5/552_2.png deleted file mode 100644 index 4b088ca0a19..00000000000 Binary files a/public/images/pokemon/variant/icons/5/552_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/552_3.png b/public/images/pokemon/variant/icons/5/552_3.png deleted file mode 100644 index 8c07fda33d6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/552_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/553_2.png b/public/images/pokemon/variant/icons/5/553_2.png deleted file mode 100644 index 15ffd4fbcc3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/553_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/553_3.png b/public/images/pokemon/variant/icons/5/553_3.png deleted file mode 100644 index ed4f333684f..00000000000 Binary files a/public/images/pokemon/variant/icons/5/553_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/559_1.png b/public/images/pokemon/variant/icons/5/559_1.png deleted file mode 100644 index 806899a722d..00000000000 Binary files a/public/images/pokemon/variant/icons/5/559_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/559_2.png b/public/images/pokemon/variant/icons/5/559_2.png deleted file mode 100644 index 3323fc8c12f..00000000000 Binary files a/public/images/pokemon/variant/icons/5/559_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/559_3.png b/public/images/pokemon/variant/icons/5/559_3.png deleted file mode 100644 index fdbb6f60687..00000000000 Binary files a/public/images/pokemon/variant/icons/5/559_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/560_1.png b/public/images/pokemon/variant/icons/5/560_1.png deleted file mode 100644 index 1cdbe72ed94..00000000000 Binary files a/public/images/pokemon/variant/icons/5/560_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/560_2.png b/public/images/pokemon/variant/icons/5/560_2.png deleted file mode 100644 index 8dcf14f9494..00000000000 Binary files a/public/images/pokemon/variant/icons/5/560_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/560_3.png b/public/images/pokemon/variant/icons/5/560_3.png deleted file mode 100644 index 10351746c23..00000000000 Binary files a/public/images/pokemon/variant/icons/5/560_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/562_2.png b/public/images/pokemon/variant/icons/5/562_2.png deleted file mode 100644 index 93b69b1b0d3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/562_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/562_3.png b/public/images/pokemon/variant/icons/5/562_3.png deleted file mode 100644 index 094cf780759..00000000000 Binary files a/public/images/pokemon/variant/icons/5/562_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/563_2.png b/public/images/pokemon/variant/icons/5/563_2.png deleted file mode 100644 index f29fa7cca6c..00000000000 Binary files a/public/images/pokemon/variant/icons/5/563_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/563_3.png b/public/images/pokemon/variant/icons/5/563_3.png deleted file mode 100644 index ae3bf60d3b3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/563_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/570_2.png b/public/images/pokemon/variant/icons/5/570_2.png deleted file mode 100644 index c72fb971f4a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/570_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/570_3.png b/public/images/pokemon/variant/icons/5/570_3.png deleted file mode 100644 index d68ea4261b7..00000000000 Binary files a/public/images/pokemon/variant/icons/5/570_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/571_2.png b/public/images/pokemon/variant/icons/5/571_2.png deleted file mode 100644 index 1e238ee619d..00000000000 Binary files a/public/images/pokemon/variant/icons/5/571_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/571_3.png b/public/images/pokemon/variant/icons/5/571_3.png deleted file mode 100644 index 528bfc4b719..00000000000 Binary files a/public/images/pokemon/variant/icons/5/571_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/572_2.png b/public/images/pokemon/variant/icons/5/572_2.png deleted file mode 100644 index b6230a17cbc..00000000000 Binary files a/public/images/pokemon/variant/icons/5/572_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/572_3.png b/public/images/pokemon/variant/icons/5/572_3.png deleted file mode 100644 index c0848deade2..00000000000 Binary files a/public/images/pokemon/variant/icons/5/572_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/577_1.png b/public/images/pokemon/variant/icons/5/577_1.png deleted file mode 100644 index 16f8a4d6640..00000000000 Binary files a/public/images/pokemon/variant/icons/5/577_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/577_2.png b/public/images/pokemon/variant/icons/5/577_2.png deleted file mode 100644 index ac85ca5f5c3..00000000000 Binary files a/public/images/pokemon/variant/icons/5/577_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/577_3.png b/public/images/pokemon/variant/icons/5/577_3.png deleted file mode 100644 index e2d68729a1b..00000000000 Binary files a/public/images/pokemon/variant/icons/5/577_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/578_1.png b/public/images/pokemon/variant/icons/5/578_1.png deleted file mode 100644 index 71364650cbb..00000000000 Binary files a/public/images/pokemon/variant/icons/5/578_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/578_2.png b/public/images/pokemon/variant/icons/5/578_2.png deleted file mode 100644 index 7b3a54b60ce..00000000000 Binary files a/public/images/pokemon/variant/icons/5/578_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/578_3.png b/public/images/pokemon/variant/icons/5/578_3.png deleted file mode 100644 index 27e53e15336..00000000000 Binary files a/public/images/pokemon/variant/icons/5/578_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/579_1.png b/public/images/pokemon/variant/icons/5/579_1.png deleted file mode 100644 index 18a57ba8742..00000000000 Binary files a/public/images/pokemon/variant/icons/5/579_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/579_2.png b/public/images/pokemon/variant/icons/5/579_2.png deleted file mode 100644 index 7424adf1e60..00000000000 Binary files a/public/images/pokemon/variant/icons/5/579_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/579_3.png b/public/images/pokemon/variant/icons/5/579_3.png deleted file mode 100644 index af642842fac..00000000000 Binary files a/public/images/pokemon/variant/icons/5/579_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/585-autumn_1.png b/public/images/pokemon/variant/icons/5/585-autumn_1.png deleted file mode 100644 index 90b61383f4f..00000000000 Binary files a/public/images/pokemon/variant/icons/5/585-autumn_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/585-spring_1.png b/public/images/pokemon/variant/icons/5/585-spring_1.png deleted file mode 100644 index 0abf9205f97..00000000000 Binary files a/public/images/pokemon/variant/icons/5/585-spring_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/585-summer_1.png b/public/images/pokemon/variant/icons/5/585-summer_1.png deleted file mode 100644 index 23884ba1548..00000000000 Binary files a/public/images/pokemon/variant/icons/5/585-summer_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/585-winter_1.png b/public/images/pokemon/variant/icons/5/585-winter_1.png deleted file mode 100644 index 433405e8449..00000000000 Binary files a/public/images/pokemon/variant/icons/5/585-winter_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/586-autumn_1.png b/public/images/pokemon/variant/icons/5/586-autumn_1.png deleted file mode 100644 index 5b18f2ed37d..00000000000 Binary files a/public/images/pokemon/variant/icons/5/586-autumn_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/586-spring_1.png b/public/images/pokemon/variant/icons/5/586-spring_1.png deleted file mode 100644 index dad8e5491d6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/586-spring_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/586-summer_1.png b/public/images/pokemon/variant/icons/5/586-summer_1.png deleted file mode 100644 index e837a8d7efd..00000000000 Binary files a/public/images/pokemon/variant/icons/5/586-summer_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/586-winter_1.png b/public/images/pokemon/variant/icons/5/586-winter_1.png deleted file mode 100644 index b5518e19b32..00000000000 Binary files a/public/images/pokemon/variant/icons/5/586-winter_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/595_2.png b/public/images/pokemon/variant/icons/5/595_2.png deleted file mode 100644 index 88822ea7d41..00000000000 Binary files a/public/images/pokemon/variant/icons/5/595_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/595_3.png b/public/images/pokemon/variant/icons/5/595_3.png deleted file mode 100644 index 99dc686d2c9..00000000000 Binary files a/public/images/pokemon/variant/icons/5/595_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/596_2.png b/public/images/pokemon/variant/icons/5/596_2.png deleted file mode 100644 index 1e8c77ede8e..00000000000 Binary files a/public/images/pokemon/variant/icons/5/596_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/596_3.png b/public/images/pokemon/variant/icons/5/596_3.png deleted file mode 100644 index a01217c6099..00000000000 Binary files a/public/images/pokemon/variant/icons/5/596_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/607_2.png b/public/images/pokemon/variant/icons/5/607_2.png deleted file mode 100644 index 38725cd18e6..00000000000 Binary files a/public/images/pokemon/variant/icons/5/607_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/607_3.png b/public/images/pokemon/variant/icons/5/607_3.png deleted file mode 100644 index be0d7109aaa..00000000000 Binary files a/public/images/pokemon/variant/icons/5/607_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/608_2.png b/public/images/pokemon/variant/icons/5/608_2.png deleted file mode 100644 index 69aebb4cc86..00000000000 Binary files a/public/images/pokemon/variant/icons/5/608_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/608_3.png b/public/images/pokemon/variant/icons/5/608_3.png deleted file mode 100644 index df55f56a395..00000000000 Binary files a/public/images/pokemon/variant/icons/5/608_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/609_2.png b/public/images/pokemon/variant/icons/5/609_2.png deleted file mode 100644 index 8a8aac30577..00000000000 Binary files a/public/images/pokemon/variant/icons/5/609_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/609_3.png b/public/images/pokemon/variant/icons/5/609_3.png deleted file mode 100644 index 93ed2232830..00000000000 Binary files a/public/images/pokemon/variant/icons/5/609_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/610_2.png b/public/images/pokemon/variant/icons/5/610_2.png deleted file mode 100644 index f9e05990a3b..00000000000 Binary files a/public/images/pokemon/variant/icons/5/610_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/610_3.png b/public/images/pokemon/variant/icons/5/610_3.png deleted file mode 100644 index 8441185abe0..00000000000 Binary files a/public/images/pokemon/variant/icons/5/610_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/611_2.png b/public/images/pokemon/variant/icons/5/611_2.png deleted file mode 100644 index 33f05993d2a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/611_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/611_3.png b/public/images/pokemon/variant/icons/5/611_3.png deleted file mode 100644 index c4d95a35edf..00000000000 Binary files a/public/images/pokemon/variant/icons/5/611_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/612_2.png b/public/images/pokemon/variant/icons/5/612_2.png deleted file mode 100644 index b17eec305d7..00000000000 Binary files a/public/images/pokemon/variant/icons/5/612_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/612_3.png b/public/images/pokemon/variant/icons/5/612_3.png deleted file mode 100644 index dd25ae40a21..00000000000 Binary files a/public/images/pokemon/variant/icons/5/612_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/622_2.png b/public/images/pokemon/variant/icons/5/622_2.png deleted file mode 100644 index 96e5ad16cf5..00000000000 Binary files a/public/images/pokemon/variant/icons/5/622_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/622_3.png b/public/images/pokemon/variant/icons/5/622_3.png deleted file mode 100644 index 6575393112c..00000000000 Binary files a/public/images/pokemon/variant/icons/5/622_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/623_2.png b/public/images/pokemon/variant/icons/5/623_2.png deleted file mode 100644 index c024a510326..00000000000 Binary files a/public/images/pokemon/variant/icons/5/623_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/623_3.png b/public/images/pokemon/variant/icons/5/623_3.png deleted file mode 100644 index 88002cd0017..00000000000 Binary files a/public/images/pokemon/variant/icons/5/623_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/632_2.png b/public/images/pokemon/variant/icons/5/632_2.png deleted file mode 100644 index 8146d54a410..00000000000 Binary files a/public/images/pokemon/variant/icons/5/632_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/632_3.png b/public/images/pokemon/variant/icons/5/632_3.png deleted file mode 100644 index 786ebef54e5..00000000000 Binary files a/public/images/pokemon/variant/icons/5/632_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/633_2.png b/public/images/pokemon/variant/icons/5/633_2.png deleted file mode 100644 index 3c6757ceb02..00000000000 Binary files a/public/images/pokemon/variant/icons/5/633_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/633_3.png b/public/images/pokemon/variant/icons/5/633_3.png deleted file mode 100644 index d14fa5e9da8..00000000000 Binary files a/public/images/pokemon/variant/icons/5/633_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/634_2.png b/public/images/pokemon/variant/icons/5/634_2.png deleted file mode 100644 index 35fa482f3b4..00000000000 Binary files a/public/images/pokemon/variant/icons/5/634_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/634_3.png b/public/images/pokemon/variant/icons/5/634_3.png deleted file mode 100644 index 4f3ed3238e0..00000000000 Binary files a/public/images/pokemon/variant/icons/5/634_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/635_2.png b/public/images/pokemon/variant/icons/5/635_2.png deleted file mode 100644 index c46af2fb65a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/635_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/635_3.png b/public/images/pokemon/variant/icons/5/635_3.png deleted file mode 100644 index 0d64cac9c81..00000000000 Binary files a/public/images/pokemon/variant/icons/5/635_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/636_2.png b/public/images/pokemon/variant/icons/5/636_2.png deleted file mode 100644 index 92d0630247a..00000000000 Binary files a/public/images/pokemon/variant/icons/5/636_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/636_3.png b/public/images/pokemon/variant/icons/5/636_3.png deleted file mode 100644 index a1a32a6e586..00000000000 Binary files a/public/images/pokemon/variant/icons/5/636_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/637_2.png b/public/images/pokemon/variant/icons/5/637_2.png deleted file mode 100644 index 95ad5481f5c..00000000000 Binary files a/public/images/pokemon/variant/icons/5/637_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/637_3.png b/public/images/pokemon/variant/icons/5/637_3.png deleted file mode 100644 index a8c4c932367..00000000000 Binary files a/public/images/pokemon/variant/icons/5/637_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/641-incarnate_1.png b/public/images/pokemon/variant/icons/5/641-incarnate_1.png deleted file mode 100644 index ddd0ca15c0c..00000000000 Binary files a/public/images/pokemon/variant/icons/5/641-incarnate_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/641-therian_1.png b/public/images/pokemon/variant/icons/5/641-therian_1.png deleted file mode 100644 index 8f6f01fd0d7..00000000000 Binary files a/public/images/pokemon/variant/icons/5/641-therian_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/642-incarnate_1.png b/public/images/pokemon/variant/icons/5/642-incarnate_1.png deleted file mode 100644 index 55507be70b9..00000000000 Binary files a/public/images/pokemon/variant/icons/5/642-incarnate_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/642-therian_1.png b/public/images/pokemon/variant/icons/5/642-therian_1.png deleted file mode 100644 index bea360abb95..00000000000 Binary files a/public/images/pokemon/variant/icons/5/642-therian_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/645-incarnate_1.png b/public/images/pokemon/variant/icons/5/645-incarnate_1.png deleted file mode 100644 index 416fa9ca1db..00000000000 Binary files a/public/images/pokemon/variant/icons/5/645-incarnate_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/645-therian_1.png b/public/images/pokemon/variant/icons/5/645-therian_1.png deleted file mode 100644 index c03d4233e29..00000000000 Binary files a/public/images/pokemon/variant/icons/5/645-therian_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/648-aria_2.png b/public/images/pokemon/variant/icons/5/648-aria_2.png deleted file mode 100644 index 4992e1c3006..00000000000 Binary files a/public/images/pokemon/variant/icons/5/648-aria_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/648-aria_3.png b/public/images/pokemon/variant/icons/5/648-aria_3.png deleted file mode 100644 index 55d8e658d63..00000000000 Binary files a/public/images/pokemon/variant/icons/5/648-aria_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/648-pirouette_2.png b/public/images/pokemon/variant/icons/5/648-pirouette_2.png deleted file mode 100644 index 8b1db1a5519..00000000000 Binary files a/public/images/pokemon/variant/icons/5/648-pirouette_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/5/648-pirouette_3.png b/public/images/pokemon/variant/icons/5/648-pirouette_3.png deleted file mode 100644 index 874ccfae7cc..00000000000 Binary files a/public/images/pokemon/variant/icons/5/648-pirouette_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/354-mega_2.png b/public/images/pokemon/variant/icons/6/354-mega_2.png deleted file mode 100644 index 6ead74c4cdb..00000000000 Binary files a/public/images/pokemon/variant/icons/6/354-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/354-mega_3.png b/public/images/pokemon/variant/icons/6/354-mega_3.png deleted file mode 100644 index aea0e119118..00000000000 Binary files a/public/images/pokemon/variant/icons/6/354-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/653_2.png b/public/images/pokemon/variant/icons/6/653_2.png deleted file mode 100644 index 74fc7fe34fa..00000000000 Binary files a/public/images/pokemon/variant/icons/6/653_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/653_3.png b/public/images/pokemon/variant/icons/6/653_3.png deleted file mode 100644 index 0a1b589e244..00000000000 Binary files a/public/images/pokemon/variant/icons/6/653_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/654_2.png b/public/images/pokemon/variant/icons/6/654_2.png deleted file mode 100644 index ca0060cab01..00000000000 Binary files a/public/images/pokemon/variant/icons/6/654_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/654_3.png b/public/images/pokemon/variant/icons/6/654_3.png deleted file mode 100644 index 489faa127ac..00000000000 Binary files a/public/images/pokemon/variant/icons/6/654_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/655_2.png b/public/images/pokemon/variant/icons/6/655_2.png deleted file mode 100644 index 0e99195d0d8..00000000000 Binary files a/public/images/pokemon/variant/icons/6/655_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/655_3.png b/public/images/pokemon/variant/icons/6/655_3.png deleted file mode 100644 index 6e340b68616..00000000000 Binary files a/public/images/pokemon/variant/icons/6/655_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/664_2.png b/public/images/pokemon/variant/icons/6/664_2.png deleted file mode 100644 index 7453776377e..00000000000 Binary files a/public/images/pokemon/variant/icons/6/664_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/664_3.png b/public/images/pokemon/variant/icons/6/664_3.png deleted file mode 100644 index def900f8b7f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/664_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/665_2.png b/public/images/pokemon/variant/icons/6/665_2.png deleted file mode 100644 index 36f66b5edd4..00000000000 Binary files a/public/images/pokemon/variant/icons/6/665_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/665_3.png b/public/images/pokemon/variant/icons/6/665_3.png deleted file mode 100644 index e8a449d6606..00000000000 Binary files a/public/images/pokemon/variant/icons/6/665_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-archipelago_2.png b/public/images/pokemon/variant/icons/6/666-archipelago_2.png deleted file mode 100644 index 31059899487..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-archipelago_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-archipelago_3.png b/public/images/pokemon/variant/icons/6/666-archipelago_3.png deleted file mode 100644 index 6552b345b4e..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-archipelago_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-continental_2.png b/public/images/pokemon/variant/icons/6/666-continental_2.png deleted file mode 100644 index 13a3f762c92..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-continental_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-continental_3.png b/public/images/pokemon/variant/icons/6/666-continental_3.png deleted file mode 100644 index 4975a8f5c15..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-continental_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-elegant_2.png b/public/images/pokemon/variant/icons/6/666-elegant_2.png deleted file mode 100644 index 8b94fed05b3..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-elegant_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-elegant_3.png b/public/images/pokemon/variant/icons/6/666-elegant_3.png deleted file mode 100644 index 55de693caf5..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-elegant_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-fancy_2.png b/public/images/pokemon/variant/icons/6/666-fancy_2.png deleted file mode 100644 index ebaf181b305..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-fancy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-fancy_3.png b/public/images/pokemon/variant/icons/6/666-fancy_3.png deleted file mode 100644 index 9da7e479fb0..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-fancy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-garden_2.png b/public/images/pokemon/variant/icons/6/666-garden_2.png deleted file mode 100644 index 43fe4c217cf..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-garden_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-garden_3.png b/public/images/pokemon/variant/icons/6/666-garden_3.png deleted file mode 100644 index ba41f22906a..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-garden_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-high-plains_2.png b/public/images/pokemon/variant/icons/6/666-high-plains_2.png deleted file mode 100644 index 926dc69c720..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-high-plains_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-high-plains_3.png b/public/images/pokemon/variant/icons/6/666-high-plains_3.png deleted file mode 100644 index 9d4b334bf1d..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-high-plains_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-icy-snow_2.png b/public/images/pokemon/variant/icons/6/666-icy-snow_2.png deleted file mode 100644 index 4afb3068279..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-icy-snow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-icy-snow_3.png b/public/images/pokemon/variant/icons/6/666-icy-snow_3.png deleted file mode 100644 index 20a0297bb09..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-icy-snow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-jungle_2.png b/public/images/pokemon/variant/icons/6/666-jungle_2.png deleted file mode 100644 index 85fbd76eaae..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-jungle_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-jungle_3.png b/public/images/pokemon/variant/icons/6/666-jungle_3.png deleted file mode 100644 index 27f202c3f89..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-jungle_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-marine_2.png b/public/images/pokemon/variant/icons/6/666-marine_2.png deleted file mode 100644 index fecac5f1a56..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-marine_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-marine_3.png b/public/images/pokemon/variant/icons/6/666-marine_3.png deleted file mode 100644 index a6e6c678373..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-marine_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-meadow_2.png b/public/images/pokemon/variant/icons/6/666-meadow_2.png deleted file mode 100644 index d9708f5335b..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-meadow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-meadow_3.png b/public/images/pokemon/variant/icons/6/666-meadow_3.png deleted file mode 100644 index 468668c3706..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-meadow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-modern_2.png b/public/images/pokemon/variant/icons/6/666-modern_2.png deleted file mode 100644 index 85fa6dcdb17..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-modern_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-modern_3.png b/public/images/pokemon/variant/icons/6/666-modern_3.png deleted file mode 100644 index d925d62bf44..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-modern_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-monsoon_2.png b/public/images/pokemon/variant/icons/6/666-monsoon_2.png deleted file mode 100644 index 7ea69bd1c91..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-monsoon_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-monsoon_3.png b/public/images/pokemon/variant/icons/6/666-monsoon_3.png deleted file mode 100644 index 718572db21f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-monsoon_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-ocean_2.png b/public/images/pokemon/variant/icons/6/666-ocean_2.png deleted file mode 100644 index cdb012595a2..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-ocean_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-ocean_3.png b/public/images/pokemon/variant/icons/6/666-ocean_3.png deleted file mode 100644 index eb2e996bfbb..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-ocean_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-poke-ball_2.png b/public/images/pokemon/variant/icons/6/666-poke-ball_2.png deleted file mode 100644 index 2aacc409f13..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-poke-ball_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-poke-ball_3.png b/public/images/pokemon/variant/icons/6/666-poke-ball_3.png deleted file mode 100644 index a41e6253560..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-poke-ball_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-polar_2.png b/public/images/pokemon/variant/icons/6/666-polar_2.png deleted file mode 100644 index 2f69fdf66ab..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-polar_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-polar_3.png b/public/images/pokemon/variant/icons/6/666-polar_3.png deleted file mode 100644 index 6a8bf6098fa..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-polar_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-river_2.png b/public/images/pokemon/variant/icons/6/666-river_2.png deleted file mode 100644 index 66a892a9440..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-river_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-river_3.png b/public/images/pokemon/variant/icons/6/666-river_3.png deleted file mode 100644 index 245d0b0423b..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-river_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-sandstorm_2.png b/public/images/pokemon/variant/icons/6/666-sandstorm_2.png deleted file mode 100644 index 5376a7f4f6f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-sandstorm_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-sandstorm_3.png b/public/images/pokemon/variant/icons/6/666-sandstorm_3.png deleted file mode 100644 index a2249c34fa2..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-sandstorm_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-savanna_2.png b/public/images/pokemon/variant/icons/6/666-savanna_2.png deleted file mode 100644 index a7e9fedf674..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-savanna_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-savanna_3.png b/public/images/pokemon/variant/icons/6/666-savanna_3.png deleted file mode 100644 index 981b8155798..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-savanna_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-sun_2.png b/public/images/pokemon/variant/icons/6/666-sun_2.png deleted file mode 100644 index 67505c4df98..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-sun_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-sun_3.png b/public/images/pokemon/variant/icons/6/666-sun_3.png deleted file mode 100644 index 393a37c8773..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-sun_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-tundra_2.png b/public/images/pokemon/variant/icons/6/666-tundra_2.png deleted file mode 100644 index 489013d6748..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-tundra_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/666-tundra_3.png b/public/images/pokemon/variant/icons/6/666-tundra_3.png deleted file mode 100644 index 4127fd68b79..00000000000 Binary files a/public/images/pokemon/variant/icons/6/666-tundra_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/672_2.png b/public/images/pokemon/variant/icons/6/672_2.png deleted file mode 100644 index 942660daaf8..00000000000 Binary files a/public/images/pokemon/variant/icons/6/672_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/672_3.png b/public/images/pokemon/variant/icons/6/672_3.png deleted file mode 100644 index 0901c7cd5a9..00000000000 Binary files a/public/images/pokemon/variant/icons/6/672_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/673_2.png b/public/images/pokemon/variant/icons/6/673_2.png deleted file mode 100644 index fb5b0f3873f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/673_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/673_3.png b/public/images/pokemon/variant/icons/6/673_3.png deleted file mode 100644 index 192f11f9f39..00000000000 Binary files a/public/images/pokemon/variant/icons/6/673_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/690_2.png b/public/images/pokemon/variant/icons/6/690_2.png deleted file mode 100644 index d26f19ffeae..00000000000 Binary files a/public/images/pokemon/variant/icons/6/690_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/690_3.png b/public/images/pokemon/variant/icons/6/690_3.png deleted file mode 100644 index 44f1dc8b129..00000000000 Binary files a/public/images/pokemon/variant/icons/6/690_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/691_2.png b/public/images/pokemon/variant/icons/6/691_2.png deleted file mode 100644 index 0e941c2ec90..00000000000 Binary files a/public/images/pokemon/variant/icons/6/691_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/691_3.png b/public/images/pokemon/variant/icons/6/691_3.png deleted file mode 100644 index 6c1f254636e..00000000000 Binary files a/public/images/pokemon/variant/icons/6/691_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/696_2.png b/public/images/pokemon/variant/icons/6/696_2.png deleted file mode 100644 index 439efdde52a..00000000000 Binary files a/public/images/pokemon/variant/icons/6/696_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/696_3.png b/public/images/pokemon/variant/icons/6/696_3.png deleted file mode 100644 index e2721bd69ac..00000000000 Binary files a/public/images/pokemon/variant/icons/6/696_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/697_2.png b/public/images/pokemon/variant/icons/6/697_2.png deleted file mode 100644 index eee0fbc8415..00000000000 Binary files a/public/images/pokemon/variant/icons/6/697_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/697_3.png b/public/images/pokemon/variant/icons/6/697_3.png deleted file mode 100644 index 02b61bc05c6..00000000000 Binary files a/public/images/pokemon/variant/icons/6/697_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/700_2.png b/public/images/pokemon/variant/icons/6/700_2.png deleted file mode 100644 index 718027f0552..00000000000 Binary files a/public/images/pokemon/variant/icons/6/700_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/700_3.png b/public/images/pokemon/variant/icons/6/700_3.png deleted file mode 100644 index 7a20bb24146..00000000000 Binary files a/public/images/pokemon/variant/icons/6/700_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/704_2.png b/public/images/pokemon/variant/icons/6/704_2.png deleted file mode 100644 index b5ef3292868..00000000000 Binary files a/public/images/pokemon/variant/icons/6/704_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/704_3.png b/public/images/pokemon/variant/icons/6/704_3.png deleted file mode 100644 index 362180b54a1..00000000000 Binary files a/public/images/pokemon/variant/icons/6/704_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/705_2.png b/public/images/pokemon/variant/icons/6/705_2.png deleted file mode 100644 index de2fd606d6b..00000000000 Binary files a/public/images/pokemon/variant/icons/6/705_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/705_3.png b/public/images/pokemon/variant/icons/6/705_3.png deleted file mode 100644 index f79760bc5b4..00000000000 Binary files a/public/images/pokemon/variant/icons/6/705_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/706_2.png b/public/images/pokemon/variant/icons/6/706_2.png deleted file mode 100644 index 01999cbdd86..00000000000 Binary files a/public/images/pokemon/variant/icons/6/706_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/706_3.png b/public/images/pokemon/variant/icons/6/706_3.png deleted file mode 100644 index 03c46970756..00000000000 Binary files a/public/images/pokemon/variant/icons/6/706_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/708_2.png b/public/images/pokemon/variant/icons/6/708_2.png deleted file mode 100644 index 903a00f6164..00000000000 Binary files a/public/images/pokemon/variant/icons/6/708_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/708_3.png b/public/images/pokemon/variant/icons/6/708_3.png deleted file mode 100644 index 0180fca8779..00000000000 Binary files a/public/images/pokemon/variant/icons/6/708_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/709_2.png b/public/images/pokemon/variant/icons/6/709_2.png deleted file mode 100644 index 72eb02bb04e..00000000000 Binary files a/public/images/pokemon/variant/icons/6/709_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/709_3.png b/public/images/pokemon/variant/icons/6/709_3.png deleted file mode 100644 index c53edfa6c9f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/709_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/710_2.png b/public/images/pokemon/variant/icons/6/710_2.png deleted file mode 100644 index 91d5b29d1ea..00000000000 Binary files a/public/images/pokemon/variant/icons/6/710_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/710_3.png b/public/images/pokemon/variant/icons/6/710_3.png deleted file mode 100644 index 02e4ca50199..00000000000 Binary files a/public/images/pokemon/variant/icons/6/710_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/711_1.png b/public/images/pokemon/variant/icons/6/711_1.png deleted file mode 100644 index b2360c10df2..00000000000 Binary files a/public/images/pokemon/variant/icons/6/711_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/711_2.png b/public/images/pokemon/variant/icons/6/711_2.png deleted file mode 100644 index eb85beda5e8..00000000000 Binary files a/public/images/pokemon/variant/icons/6/711_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/711_3.png b/public/images/pokemon/variant/icons/6/711_3.png deleted file mode 100644 index 6e37d2ebff4..00000000000 Binary files a/public/images/pokemon/variant/icons/6/711_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/712_2.png b/public/images/pokemon/variant/icons/6/712_2.png deleted file mode 100644 index f774a39bb1f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/712_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/712_3.png b/public/images/pokemon/variant/icons/6/712_3.png deleted file mode 100644 index c0c88985997..00000000000 Binary files a/public/images/pokemon/variant/icons/6/712_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/713_2.png b/public/images/pokemon/variant/icons/6/713_2.png deleted file mode 100644 index 0da07280d15..00000000000 Binary files a/public/images/pokemon/variant/icons/6/713_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/713_3.png b/public/images/pokemon/variant/icons/6/713_3.png deleted file mode 100644 index 8e6375a6409..00000000000 Binary files a/public/images/pokemon/variant/icons/6/713_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/716-active_2.png b/public/images/pokemon/variant/icons/6/716-active_2.png deleted file mode 100644 index 320407e81f3..00000000000 Binary files a/public/images/pokemon/variant/icons/6/716-active_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/716-active_3.png b/public/images/pokemon/variant/icons/6/716-active_3.png deleted file mode 100644 index cb575c30f67..00000000000 Binary files a/public/images/pokemon/variant/icons/6/716-active_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/716-neutral_2.png b/public/images/pokemon/variant/icons/6/716-neutral_2.png deleted file mode 100644 index 51e4e640542..00000000000 Binary files a/public/images/pokemon/variant/icons/6/716-neutral_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/716-neutral_3.png b/public/images/pokemon/variant/icons/6/716-neutral_3.png deleted file mode 100644 index 581686f3b06..00000000000 Binary files a/public/images/pokemon/variant/icons/6/716-neutral_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/717_2.png b/public/images/pokemon/variant/icons/6/717_2.png deleted file mode 100644 index e99a4311980..00000000000 Binary files a/public/images/pokemon/variant/icons/6/717_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/717_3.png b/public/images/pokemon/variant/icons/6/717_3.png deleted file mode 100644 index 8ca50df40e4..00000000000 Binary files a/public/images/pokemon/variant/icons/6/717_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720-unbound_1.png b/public/images/pokemon/variant/icons/6/720-unbound_1.png deleted file mode 100644 index e0f5e5f9e32..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720-unbound_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720-unbound_2.png b/public/images/pokemon/variant/icons/6/720-unbound_2.png deleted file mode 100644 index 2ff7b5f8d92..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720-unbound_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720-unbound_3.png b/public/images/pokemon/variant/icons/6/720-unbound_3.png deleted file mode 100644 index 29aa89b77e5..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720-unbound_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720_1.png b/public/images/pokemon/variant/icons/6/720_1.png deleted file mode 100644 index 8a7f03ed222..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720_2.png b/public/images/pokemon/variant/icons/6/720_2.png deleted file mode 100644 index 632ccf7e3ab..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/720_3.png b/public/images/pokemon/variant/icons/6/720_3.png deleted file mode 100644 index 7d0ea61305c..00000000000 Binary files a/public/images/pokemon/variant/icons/6/720_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/742_2.png b/public/images/pokemon/variant/icons/6/742_2.png deleted file mode 100644 index cc2a3642acc..00000000000 Binary files a/public/images/pokemon/variant/icons/6/742_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/742_3.png b/public/images/pokemon/variant/icons/6/742_3.png deleted file mode 100644 index ad0ea071f50..00000000000 Binary files a/public/images/pokemon/variant/icons/6/742_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/743_2.png b/public/images/pokemon/variant/icons/6/743_2.png deleted file mode 100644 index 04455f5cfab..00000000000 Binary files a/public/images/pokemon/variant/icons/6/743_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/743_3.png b/public/images/pokemon/variant/icons/6/743_3.png deleted file mode 100644 index 81e97dd05fb..00000000000 Binary files a/public/images/pokemon/variant/icons/6/743_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/777_2.png b/public/images/pokemon/variant/icons/6/777_2.png deleted file mode 100644 index 8bbec081713..00000000000 Binary files a/public/images/pokemon/variant/icons/6/777_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/777_3.png b/public/images/pokemon/variant/icons/6/777_3.png deleted file mode 100644 index 3b89a79f326..00000000000 Binary files a/public/images/pokemon/variant/icons/6/777_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/779_2.png b/public/images/pokemon/variant/icons/6/779_2.png deleted file mode 100644 index b58c3d5e42f..00000000000 Binary files a/public/images/pokemon/variant/icons/6/779_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/6/779_3.png b/public/images/pokemon/variant/icons/6/779_3.png deleted file mode 100644 index 4d3d4abd0e9..00000000000 Binary files a/public/images/pokemon/variant/icons/6/779_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/2052_2.png b/public/images/pokemon/variant/icons/7/2052_2.png deleted file mode 100644 index b88dece15ac..00000000000 Binary files a/public/images/pokemon/variant/icons/7/2052_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/2052_3.png b/public/images/pokemon/variant/icons/7/2052_3.png deleted file mode 100644 index 55b709aa7ba..00000000000 Binary files a/public/images/pokemon/variant/icons/7/2052_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/2053_2.png b/public/images/pokemon/variant/icons/7/2053_2.png deleted file mode 100644 index 04810e6e6fd..00000000000 Binary files a/public/images/pokemon/variant/icons/7/2053_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/2053_3.png b/public/images/pokemon/variant/icons/7/2053_3.png deleted file mode 100644 index 81566af243a..00000000000 Binary files a/public/images/pokemon/variant/icons/7/2053_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/728_2.png b/public/images/pokemon/variant/icons/7/728_2.png deleted file mode 100644 index 3aa87703a1e..00000000000 Binary files a/public/images/pokemon/variant/icons/7/728_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/728_3.png b/public/images/pokemon/variant/icons/7/728_3.png deleted file mode 100644 index 39cf53f1da2..00000000000 Binary files a/public/images/pokemon/variant/icons/7/728_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/729_2.png b/public/images/pokemon/variant/icons/7/729_2.png deleted file mode 100644 index 68a793b7ac2..00000000000 Binary files a/public/images/pokemon/variant/icons/7/729_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/729_3.png b/public/images/pokemon/variant/icons/7/729_3.png deleted file mode 100644 index 17acbd2783c..00000000000 Binary files a/public/images/pokemon/variant/icons/7/729_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/730_2.png b/public/images/pokemon/variant/icons/7/730_2.png deleted file mode 100644 index 2b8dd843c54..00000000000 Binary files a/public/images/pokemon/variant/icons/7/730_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/730_3.png b/public/images/pokemon/variant/icons/7/730_3.png deleted file mode 100644 index 0703d8cfd27..00000000000 Binary files a/public/images/pokemon/variant/icons/7/730_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/734_2.png b/public/images/pokemon/variant/icons/7/734_2.png deleted file mode 100644 index a10d3542cbf..00000000000 Binary files a/public/images/pokemon/variant/icons/7/734_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/734_3.png b/public/images/pokemon/variant/icons/7/734_3.png deleted file mode 100644 index 3949f140014..00000000000 Binary files a/public/images/pokemon/variant/icons/7/734_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/735_2.png b/public/images/pokemon/variant/icons/7/735_2.png deleted file mode 100644 index a9d0785bb2a..00000000000 Binary files a/public/images/pokemon/variant/icons/7/735_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/735_3.png b/public/images/pokemon/variant/icons/7/735_3.png deleted file mode 100644 index eedc5e4d9d8..00000000000 Binary files a/public/images/pokemon/variant/icons/7/735_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/747_2.png b/public/images/pokemon/variant/icons/7/747_2.png deleted file mode 100644 index 618e2d03694..00000000000 Binary files a/public/images/pokemon/variant/icons/7/747_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/747_3.png b/public/images/pokemon/variant/icons/7/747_3.png deleted file mode 100644 index df4ecf7373a..00000000000 Binary files a/public/images/pokemon/variant/icons/7/747_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/748_2.png b/public/images/pokemon/variant/icons/7/748_2.png deleted file mode 100644 index 7dd1f40bebf..00000000000 Binary files a/public/images/pokemon/variant/icons/7/748_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/748_3.png b/public/images/pokemon/variant/icons/7/748_3.png deleted file mode 100644 index 9432853a337..00000000000 Binary files a/public/images/pokemon/variant/icons/7/748_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/751_2.png b/public/images/pokemon/variant/icons/7/751_2.png deleted file mode 100644 index e67db17c08b..00000000000 Binary files a/public/images/pokemon/variant/icons/7/751_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/751_3.png b/public/images/pokemon/variant/icons/7/751_3.png deleted file mode 100644 index 24c52de4600..00000000000 Binary files a/public/images/pokemon/variant/icons/7/751_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/752_2.png b/public/images/pokemon/variant/icons/7/752_2.png deleted file mode 100644 index 89b3d0ef1bf..00000000000 Binary files a/public/images/pokemon/variant/icons/7/752_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/752_3.png b/public/images/pokemon/variant/icons/7/752_3.png deleted file mode 100644 index 3fe7b91cefd..00000000000 Binary files a/public/images/pokemon/variant/icons/7/752_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/753_2.png b/public/images/pokemon/variant/icons/7/753_2.png deleted file mode 100644 index 9f4eabc99e3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/753_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/753_3.png b/public/images/pokemon/variant/icons/7/753_3.png deleted file mode 100644 index 3b09bf63b27..00000000000 Binary files a/public/images/pokemon/variant/icons/7/753_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/754_2.png b/public/images/pokemon/variant/icons/7/754_2.png deleted file mode 100644 index 492a51cbdfb..00000000000 Binary files a/public/images/pokemon/variant/icons/7/754_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/754_3.png b/public/images/pokemon/variant/icons/7/754_3.png deleted file mode 100644 index 9c0fcb6b233..00000000000 Binary files a/public/images/pokemon/variant/icons/7/754_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/755_2.png b/public/images/pokemon/variant/icons/7/755_2.png deleted file mode 100644 index 0467be6c530..00000000000 Binary files a/public/images/pokemon/variant/icons/7/755_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/755_3.png b/public/images/pokemon/variant/icons/7/755_3.png deleted file mode 100644 index 0226bc43ba8..00000000000 Binary files a/public/images/pokemon/variant/icons/7/755_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/756_2.png b/public/images/pokemon/variant/icons/7/756_2.png deleted file mode 100644 index 15c497acd2d..00000000000 Binary files a/public/images/pokemon/variant/icons/7/756_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/756_3.png b/public/images/pokemon/variant/icons/7/756_3.png deleted file mode 100644 index b93ddee49fa..00000000000 Binary files a/public/images/pokemon/variant/icons/7/756_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/761_2.png b/public/images/pokemon/variant/icons/7/761_2.png deleted file mode 100644 index a8257923663..00000000000 Binary files a/public/images/pokemon/variant/icons/7/761_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/761_3.png b/public/images/pokemon/variant/icons/7/761_3.png deleted file mode 100644 index 46325a4f41e..00000000000 Binary files a/public/images/pokemon/variant/icons/7/761_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/762_2.png b/public/images/pokemon/variant/icons/7/762_2.png deleted file mode 100644 index 98c42901971..00000000000 Binary files a/public/images/pokemon/variant/icons/7/762_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/762_3.png b/public/images/pokemon/variant/icons/7/762_3.png deleted file mode 100644 index d26d5b370f5..00000000000 Binary files a/public/images/pokemon/variant/icons/7/762_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/763_2.png b/public/images/pokemon/variant/icons/7/763_2.png deleted file mode 100644 index 49480fea9af..00000000000 Binary files a/public/images/pokemon/variant/icons/7/763_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/763_3.png b/public/images/pokemon/variant/icons/7/763_3.png deleted file mode 100644 index 5a3ef24fd7b..00000000000 Binary files a/public/images/pokemon/variant/icons/7/763_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/767_2.png b/public/images/pokemon/variant/icons/7/767_2.png deleted file mode 100644 index f15b6e875a1..00000000000 Binary files a/public/images/pokemon/variant/icons/7/767_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/767_3.png b/public/images/pokemon/variant/icons/7/767_3.png deleted file mode 100644 index 561e0e050f8..00000000000 Binary files a/public/images/pokemon/variant/icons/7/767_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/768_2.png b/public/images/pokemon/variant/icons/7/768_2.png deleted file mode 100644 index 93f53413739..00000000000 Binary files a/public/images/pokemon/variant/icons/7/768_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/768_3.png b/public/images/pokemon/variant/icons/7/768_3.png deleted file mode 100644 index 0d60869a64e..00000000000 Binary files a/public/images/pokemon/variant/icons/7/768_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/772_2.png b/public/images/pokemon/variant/icons/7/772_2.png deleted file mode 100644 index cd7722918b5..00000000000 Binary files a/public/images/pokemon/variant/icons/7/772_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/772_3.png b/public/images/pokemon/variant/icons/7/772_3.png deleted file mode 100644 index ca418f311e1..00000000000 Binary files a/public/images/pokemon/variant/icons/7/772_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-bug_2.png b/public/images/pokemon/variant/icons/7/773-bug_2.png deleted file mode 100644 index 76106359210..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-bug_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-bug_3.png b/public/images/pokemon/variant/icons/7/773-bug_3.png deleted file mode 100644 index bbb30378bf3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-bug_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-dark_2.png b/public/images/pokemon/variant/icons/7/773-dark_2.png deleted file mode 100644 index 3f6492e62fc..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-dark_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-dark_3.png b/public/images/pokemon/variant/icons/7/773-dark_3.png deleted file mode 100644 index 35f1ce72a89..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-dark_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-dragon_2.png b/public/images/pokemon/variant/icons/7/773-dragon_2.png deleted file mode 100644 index e6f90fa6458..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-dragon_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-dragon_3.png b/public/images/pokemon/variant/icons/7/773-dragon_3.png deleted file mode 100644 index c80f10c8593..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-dragon_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-electric_2.png b/public/images/pokemon/variant/icons/7/773-electric_2.png deleted file mode 100644 index 50aef6defa2..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-electric_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-electric_3.png b/public/images/pokemon/variant/icons/7/773-electric_3.png deleted file mode 100644 index c8f93b7a507..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-electric_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fairy_2.png b/public/images/pokemon/variant/icons/7/773-fairy_2.png deleted file mode 100644 index a47b0bb5ed5..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fairy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fairy_3.png b/public/images/pokemon/variant/icons/7/773-fairy_3.png deleted file mode 100644 index 651e447aaf8..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fairy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fighting_2.png b/public/images/pokemon/variant/icons/7/773-fighting_2.png deleted file mode 100644 index 672b128eeff..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fighting_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fighting_3.png b/public/images/pokemon/variant/icons/7/773-fighting_3.png deleted file mode 100644 index 92c727142d4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fighting_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fire_2.png b/public/images/pokemon/variant/icons/7/773-fire_2.png deleted file mode 100644 index 047c4fd7eda..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fire_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-fire_3.png b/public/images/pokemon/variant/icons/7/773-fire_3.png deleted file mode 100644 index c97502c6a52..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-fire_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-flying_2.png b/public/images/pokemon/variant/icons/7/773-flying_2.png deleted file mode 100644 index 8d1b5100292..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-flying_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-flying_3.png b/public/images/pokemon/variant/icons/7/773-flying_3.png deleted file mode 100644 index a24943f96ea..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-flying_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ghost_2.png b/public/images/pokemon/variant/icons/7/773-ghost_2.png deleted file mode 100644 index 62cc7642137..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ghost_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ghost_3.png b/public/images/pokemon/variant/icons/7/773-ghost_3.png deleted file mode 100644 index 07a5772860c..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ghost_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-grass_2.png b/public/images/pokemon/variant/icons/7/773-grass_2.png deleted file mode 100644 index 1824adaa366..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-grass_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-grass_3.png b/public/images/pokemon/variant/icons/7/773-grass_3.png deleted file mode 100644 index 6f77e617764..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-grass_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ground_2.png b/public/images/pokemon/variant/icons/7/773-ground_2.png deleted file mode 100644 index f10960073cb..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ground_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ground_3.png b/public/images/pokemon/variant/icons/7/773-ground_3.png deleted file mode 100644 index 92b52203244..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ground_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ice_2.png b/public/images/pokemon/variant/icons/7/773-ice_2.png deleted file mode 100644 index 3649659ce43..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ice_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-ice_3.png b/public/images/pokemon/variant/icons/7/773-ice_3.png deleted file mode 100644 index 5a9957c7b16..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-ice_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-poison_2.png b/public/images/pokemon/variant/icons/7/773-poison_2.png deleted file mode 100644 index e089ee8da59..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-poison_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-poison_3.png b/public/images/pokemon/variant/icons/7/773-poison_3.png deleted file mode 100644 index a8f9e6e13b3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-poison_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-psychic_2.png b/public/images/pokemon/variant/icons/7/773-psychic_2.png deleted file mode 100644 index 5f5aff5a4d1..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-psychic_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-psychic_3.png b/public/images/pokemon/variant/icons/7/773-psychic_3.png deleted file mode 100644 index 09afdfb8b70..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-psychic_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-rock_2.png b/public/images/pokemon/variant/icons/7/773-rock_2.png deleted file mode 100644 index 4ee9faf519b..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-rock_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-rock_3.png b/public/images/pokemon/variant/icons/7/773-rock_3.png deleted file mode 100644 index 74072ed64d1..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-rock_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-steel_2.png b/public/images/pokemon/variant/icons/7/773-steel_2.png deleted file mode 100644 index 8f2ac96eea7..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-steel_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-steel_3.png b/public/images/pokemon/variant/icons/7/773-steel_3.png deleted file mode 100644 index 9df00071eb0..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-steel_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-water_2.png b/public/images/pokemon/variant/icons/7/773-water_2.png deleted file mode 100644 index 5d5d661fdb4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-water_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773-water_3.png b/public/images/pokemon/variant/icons/7/773-water_3.png deleted file mode 100644 index 0c6bc132f11..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773-water_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773_2.png b/public/images/pokemon/variant/icons/7/773_2.png deleted file mode 100644 index 9a9aaf9b7a4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/773_3.png b/public/images/pokemon/variant/icons/7/773_3.png deleted file mode 100644 index 58cc225d68e..00000000000 Binary files a/public/images/pokemon/variant/icons/7/773_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/776_2.png b/public/images/pokemon/variant/icons/7/776_2.png deleted file mode 100644 index e2afe333cf6..00000000000 Binary files a/public/images/pokemon/variant/icons/7/776_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/776_3.png b/public/images/pokemon/variant/icons/7/776_3.png deleted file mode 100644 index f90896e61f8..00000000000 Binary files a/public/images/pokemon/variant/icons/7/776_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/789_1.png b/public/images/pokemon/variant/icons/7/789_1.png deleted file mode 100644 index fe970efa3d4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/789_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/789_2.png b/public/images/pokemon/variant/icons/7/789_2.png deleted file mode 100644 index 40723d16b01..00000000000 Binary files a/public/images/pokemon/variant/icons/7/789_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/789_3.png b/public/images/pokemon/variant/icons/7/789_3.png deleted file mode 100644 index b7010acfb66..00000000000 Binary files a/public/images/pokemon/variant/icons/7/789_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/790_2.png b/public/images/pokemon/variant/icons/7/790_2.png deleted file mode 100644 index c0ba96c45c2..00000000000 Binary files a/public/images/pokemon/variant/icons/7/790_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/790_3.png b/public/images/pokemon/variant/icons/7/790_3.png deleted file mode 100644 index c46edca22e3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/790_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/791_1.png b/public/images/pokemon/variant/icons/7/791_1.png deleted file mode 100644 index dfba58f0364..00000000000 Binary files a/public/images/pokemon/variant/icons/7/791_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/791_2.png b/public/images/pokemon/variant/icons/7/791_2.png deleted file mode 100644 index 98ebb49dad4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/791_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/791_3.png b/public/images/pokemon/variant/icons/7/791_3.png deleted file mode 100644 index 6df5930b0ef..00000000000 Binary files a/public/images/pokemon/variant/icons/7/791_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/792_2.png b/public/images/pokemon/variant/icons/7/792_2.png deleted file mode 100644 index 21c69bac01f..00000000000 Binary files a/public/images/pokemon/variant/icons/7/792_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/792_3.png b/public/images/pokemon/variant/icons/7/792_3.png deleted file mode 100644 index 81e59050764..00000000000 Binary files a/public/images/pokemon/variant/icons/7/792_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/793_2.png b/public/images/pokemon/variant/icons/7/793_2.png deleted file mode 100644 index c4c8977c807..00000000000 Binary files a/public/images/pokemon/variant/icons/7/793_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/793_3.png b/public/images/pokemon/variant/icons/7/793_3.png deleted file mode 100644 index f64877f3e52..00000000000 Binary files a/public/images/pokemon/variant/icons/7/793_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/797_2.png b/public/images/pokemon/variant/icons/7/797_2.png deleted file mode 100644 index beb4b1ae2c3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/797_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/797_3.png b/public/images/pokemon/variant/icons/7/797_3.png deleted file mode 100644 index f1a7c6fa359..00000000000 Binary files a/public/images/pokemon/variant/icons/7/797_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-dawn-wings_2.png b/public/images/pokemon/variant/icons/7/800-dawn-wings_2.png deleted file mode 100644 index b0c4d306f03..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-dawn-wings_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-dawn-wings_3.png b/public/images/pokemon/variant/icons/7/800-dawn-wings_3.png deleted file mode 100644 index bef8e4ee52e..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-dawn-wings_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-dusk-mane_2.png b/public/images/pokemon/variant/icons/7/800-dusk-mane_2.png deleted file mode 100644 index 571cf4736e3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-dusk-mane_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-dusk-mane_3.png b/public/images/pokemon/variant/icons/7/800-dusk-mane_3.png deleted file mode 100644 index 96c309e8b15..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-dusk-mane_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-ultra_2.png b/public/images/pokemon/variant/icons/7/800-ultra_2.png deleted file mode 100644 index 75ee17fa2f3..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-ultra_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800-ultra_3.png b/public/images/pokemon/variant/icons/7/800-ultra_3.png deleted file mode 100644 index d4d35bbfb9d..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800-ultra_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800_2.png b/public/images/pokemon/variant/icons/7/800_2.png deleted file mode 100644 index b107563964f..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/800_3.png b/public/images/pokemon/variant/icons/7/800_3.png deleted file mode 100644 index a726b890756..00000000000 Binary files a/public/images/pokemon/variant/icons/7/800_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/802_1.png b/public/images/pokemon/variant/icons/7/802_1.png deleted file mode 100644 index d9e268dd2e7..00000000000 Binary files a/public/images/pokemon/variant/icons/7/802_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/802_2.png b/public/images/pokemon/variant/icons/7/802_2.png deleted file mode 100644 index 039dbd12e03..00000000000 Binary files a/public/images/pokemon/variant/icons/7/802_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/802_3.png b/public/images/pokemon/variant/icons/7/802_3.png deleted file mode 100644 index e371bd9e6bc..00000000000 Binary files a/public/images/pokemon/variant/icons/7/802_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/808_2.png b/public/images/pokemon/variant/icons/7/808_2.png deleted file mode 100644 index fa2bae22836..00000000000 Binary files a/public/images/pokemon/variant/icons/7/808_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/808_3.png b/public/images/pokemon/variant/icons/7/808_3.png deleted file mode 100644 index 49dec761bf4..00000000000 Binary files a/public/images/pokemon/variant/icons/7/808_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/809-gigantamax_2.png b/public/images/pokemon/variant/icons/7/809-gigantamax_2.png deleted file mode 100644 index 00b22ee0bea..00000000000 Binary files a/public/images/pokemon/variant/icons/7/809-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/809-gigantamax_3.png b/public/images/pokemon/variant/icons/7/809-gigantamax_3.png deleted file mode 100644 index 36897253693..00000000000 Binary files a/public/images/pokemon/variant/icons/7/809-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/809_2.png b/public/images/pokemon/variant/icons/7/809_2.png deleted file mode 100644 index c10f36cc8a2..00000000000 Binary files a/public/images/pokemon/variant/icons/7/809_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/7/809_3.png b/public/images/pokemon/variant/icons/7/809_3.png deleted file mode 100644 index 813379e46c1..00000000000 Binary files a/public/images/pokemon/variant/icons/7/809_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4052_2.png b/public/images/pokemon/variant/icons/8/4052_2.png deleted file mode 100644 index 0d71d69fa06..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4052_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4052_3.png b/public/images/pokemon/variant/icons/8/4052_3.png deleted file mode 100644 index 14038420fc3..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4052_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4080_1.png b/public/images/pokemon/variant/icons/8/4080_1.png deleted file mode 100644 index 73e8650265c..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4080_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4199_1.png b/public/images/pokemon/variant/icons/8/4199_1.png deleted file mode 100644 index a8c05daf088..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4199_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4263_2.png b/public/images/pokemon/variant/icons/8/4263_2.png deleted file mode 100644 index abf0690d946..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4263_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4263_3.png b/public/images/pokemon/variant/icons/8/4263_3.png deleted file mode 100644 index eb41f1d6edf..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4263_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4264_2.png b/public/images/pokemon/variant/icons/8/4264_2.png deleted file mode 100644 index a176b19139b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4264_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/4264_3.png b/public/images/pokemon/variant/icons/8/4264_3.png deleted file mode 100644 index 80ff6ee4314..00000000000 Binary files a/public/images/pokemon/variant/icons/8/4264_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6215_2.png b/public/images/pokemon/variant/icons/8/6215_2.png deleted file mode 100644 index fcc3a2c0bec..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6215_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6215_3.png b/public/images/pokemon/variant/icons/8/6215_3.png deleted file mode 100644 index 5f01d7ac0dd..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6215_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6549_2.png b/public/images/pokemon/variant/icons/8/6549_2.png deleted file mode 100644 index 89846aeb4c3..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6549_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6549_3.png b/public/images/pokemon/variant/icons/8/6549_3.png deleted file mode 100644 index 017b78430d6..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6549_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6570_2.png b/public/images/pokemon/variant/icons/8/6570_2.png deleted file mode 100644 index c1309423a17..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6570_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6570_3.png b/public/images/pokemon/variant/icons/8/6570_3.png deleted file mode 100644 index d01a08b1745..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6570_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6571_2.png b/public/images/pokemon/variant/icons/8/6571_2.png deleted file mode 100644 index 2da0932716b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6571_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6571_3.png b/public/images/pokemon/variant/icons/8/6571_3.png deleted file mode 100644 index e1587335c74..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6571_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6705_2.png b/public/images/pokemon/variant/icons/8/6705_2.png deleted file mode 100644 index 2f4a0b3f939..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6705_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6705_3.png b/public/images/pokemon/variant/icons/8/6705_3.png deleted file mode 100644 index 47798e1e9c6..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6705_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6706_2.png b/public/images/pokemon/variant/icons/8/6706_2.png deleted file mode 100644 index 8f2423ebd7c..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6706_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6706_3.png b/public/images/pokemon/variant/icons/8/6706_3.png deleted file mode 100644 index 7f265f02f4c..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6706_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6713_2.png b/public/images/pokemon/variant/icons/8/6713_2.png deleted file mode 100644 index 1a411ee55e1..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6713_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/6713_3.png b/public/images/pokemon/variant/icons/8/6713_3.png deleted file mode 100644 index 3a90d22cfa2..00000000000 Binary files a/public/images/pokemon/variant/icons/8/6713_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/816_2.png b/public/images/pokemon/variant/icons/8/816_2.png deleted file mode 100644 index 7a432a703a3..00000000000 Binary files a/public/images/pokemon/variant/icons/8/816_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/816_3.png b/public/images/pokemon/variant/icons/8/816_3.png deleted file mode 100644 index 1ac23c4d9dd..00000000000 Binary files a/public/images/pokemon/variant/icons/8/816_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/817_2.png b/public/images/pokemon/variant/icons/8/817_2.png deleted file mode 100644 index 30929acf615..00000000000 Binary files a/public/images/pokemon/variant/icons/8/817_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/817_3.png b/public/images/pokemon/variant/icons/8/817_3.png deleted file mode 100644 index 7b6ef890f55..00000000000 Binary files a/public/images/pokemon/variant/icons/8/817_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/818-gigantamax_2.png b/public/images/pokemon/variant/icons/8/818-gigantamax_2.png deleted file mode 100644 index c7985a13bbd..00000000000 Binary files a/public/images/pokemon/variant/icons/8/818-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/818-gigantamax_3.png b/public/images/pokemon/variant/icons/8/818-gigantamax_3.png deleted file mode 100644 index 19e037d3d7c..00000000000 Binary files a/public/images/pokemon/variant/icons/8/818-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/818_2.png b/public/images/pokemon/variant/icons/8/818_2.png deleted file mode 100644 index a943aeb828f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/818_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/818_3.png b/public/images/pokemon/variant/icons/8/818_3.png deleted file mode 100644 index 17962c63011..00000000000 Binary files a/public/images/pokemon/variant/icons/8/818_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/821_2.png b/public/images/pokemon/variant/icons/8/821_2.png deleted file mode 100644 index 5b449e5feba..00000000000 Binary files a/public/images/pokemon/variant/icons/8/821_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/821_3.png b/public/images/pokemon/variant/icons/8/821_3.png deleted file mode 100644 index eeed384b92f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/821_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/822_2.png b/public/images/pokemon/variant/icons/8/822_2.png deleted file mode 100644 index f632cf31a47..00000000000 Binary files a/public/images/pokemon/variant/icons/8/822_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/822_3.png b/public/images/pokemon/variant/icons/8/822_3.png deleted file mode 100644 index 306efdb7140..00000000000 Binary files a/public/images/pokemon/variant/icons/8/822_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/823-gigantamax_2.png b/public/images/pokemon/variant/icons/8/823-gigantamax_2.png deleted file mode 100644 index 5d0a40e8cae..00000000000 Binary files a/public/images/pokemon/variant/icons/8/823-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/823-gigantamax_3.png b/public/images/pokemon/variant/icons/8/823-gigantamax_3.png deleted file mode 100644 index c249206b3e8..00000000000 Binary files a/public/images/pokemon/variant/icons/8/823-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/823_2.png b/public/images/pokemon/variant/icons/8/823_2.png deleted file mode 100644 index dfd5d3dbf0d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/823_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/823_3.png b/public/images/pokemon/variant/icons/8/823_3.png deleted file mode 100644 index 881c79314a7..00000000000 Binary files a/public/images/pokemon/variant/icons/8/823_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/829_2.png b/public/images/pokemon/variant/icons/8/829_2.png deleted file mode 100644 index 350d90c1269..00000000000 Binary files a/public/images/pokemon/variant/icons/8/829_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/829_3.png b/public/images/pokemon/variant/icons/8/829_3.png deleted file mode 100644 index 5fcba4d0bc9..00000000000 Binary files a/public/images/pokemon/variant/icons/8/829_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/830_2.png b/public/images/pokemon/variant/icons/8/830_2.png deleted file mode 100644 index dad419af7f3..00000000000 Binary files a/public/images/pokemon/variant/icons/8/830_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/830_3.png b/public/images/pokemon/variant/icons/8/830_3.png deleted file mode 100644 index a50fbb04f8f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/830_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/835_2.png b/public/images/pokemon/variant/icons/8/835_2.png deleted file mode 100644 index 73840f23af5..00000000000 Binary files a/public/images/pokemon/variant/icons/8/835_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/835_3.png b/public/images/pokemon/variant/icons/8/835_3.png deleted file mode 100644 index 46eca8da04a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/835_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/836_2.png b/public/images/pokemon/variant/icons/8/836_2.png deleted file mode 100644 index d85c4066966..00000000000 Binary files a/public/images/pokemon/variant/icons/8/836_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/836_3.png b/public/images/pokemon/variant/icons/8/836_3.png deleted file mode 100644 index 2c3dc0e4146..00000000000 Binary files a/public/images/pokemon/variant/icons/8/836_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/851-gigantamax_2.png b/public/images/pokemon/variant/icons/8/851-gigantamax_2.png deleted file mode 100644 index 33e2386319a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/851-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/851-gigantamax_3.png b/public/images/pokemon/variant/icons/8/851-gigantamax_3.png deleted file mode 100644 index a444420e17f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/851-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/856_2.png b/public/images/pokemon/variant/icons/8/856_2.png deleted file mode 100644 index 6474bf08629..00000000000 Binary files a/public/images/pokemon/variant/icons/8/856_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/856_3.png b/public/images/pokemon/variant/icons/8/856_3.png deleted file mode 100644 index c5898aa47e0..00000000000 Binary files a/public/images/pokemon/variant/icons/8/856_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/857_2.png b/public/images/pokemon/variant/icons/8/857_2.png deleted file mode 100644 index b1a4c2f82ba..00000000000 Binary files a/public/images/pokemon/variant/icons/8/857_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/857_3.png b/public/images/pokemon/variant/icons/8/857_3.png deleted file mode 100644 index d04b631f628..00000000000 Binary files a/public/images/pokemon/variant/icons/8/857_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/858-gigantamax_2.png b/public/images/pokemon/variant/icons/8/858-gigantamax_2.png deleted file mode 100644 index 8318e810b9b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/858-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/858-gigantamax_3.png b/public/images/pokemon/variant/icons/8/858-gigantamax_3.png deleted file mode 100644 index 30a463a679a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/858-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/858_2.png b/public/images/pokemon/variant/icons/8/858_2.png deleted file mode 100644 index c129c2df02d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/858_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/858_3.png b/public/images/pokemon/variant/icons/8/858_3.png deleted file mode 100644 index 499312644de..00000000000 Binary files a/public/images/pokemon/variant/icons/8/858_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/859_2.png b/public/images/pokemon/variant/icons/8/859_2.png deleted file mode 100644 index a6914ef1bc6..00000000000 Binary files a/public/images/pokemon/variant/icons/8/859_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/859_3.png b/public/images/pokemon/variant/icons/8/859_3.png deleted file mode 100644 index 0a4247993bb..00000000000 Binary files a/public/images/pokemon/variant/icons/8/859_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/860_2.png b/public/images/pokemon/variant/icons/8/860_2.png deleted file mode 100644 index 8b12fb12e70..00000000000 Binary files a/public/images/pokemon/variant/icons/8/860_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/860_3.png b/public/images/pokemon/variant/icons/8/860_3.png deleted file mode 100644 index 0d66720e63a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/860_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/861-gigantamax_2.png b/public/images/pokemon/variant/icons/8/861-gigantamax_2.png deleted file mode 100644 index ade62fd080f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/861-gigantamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/861-gigantamax_3.png b/public/images/pokemon/variant/icons/8/861-gigantamax_3.png deleted file mode 100644 index 6b2b6403a99..00000000000 Binary files a/public/images/pokemon/variant/icons/8/861-gigantamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/861_2.png b/public/images/pokemon/variant/icons/8/861_2.png deleted file mode 100644 index a27a59d89a8..00000000000 Binary files a/public/images/pokemon/variant/icons/8/861_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/861_3.png b/public/images/pokemon/variant/icons/8/861_3.png deleted file mode 100644 index d60a6b1865a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/861_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/862_2.png b/public/images/pokemon/variant/icons/8/862_2.png deleted file mode 100644 index 87a3d78d462..00000000000 Binary files a/public/images/pokemon/variant/icons/8/862_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/862_3.png b/public/images/pokemon/variant/icons/8/862_3.png deleted file mode 100644 index 81702e80b6e..00000000000 Binary files a/public/images/pokemon/variant/icons/8/862_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/863_2.png b/public/images/pokemon/variant/icons/8/863_2.png deleted file mode 100644 index 8fde01a1bf0..00000000000 Binary files a/public/images/pokemon/variant/icons/8/863_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/863_3.png b/public/images/pokemon/variant/icons/8/863_3.png deleted file mode 100644 index 0f5899de0f7..00000000000 Binary files a/public/images/pokemon/variant/icons/8/863_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/872_1.png b/public/images/pokemon/variant/icons/8/872_1.png deleted file mode 100644 index 585412d2397..00000000000 Binary files a/public/images/pokemon/variant/icons/8/872_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/872_2.png b/public/images/pokemon/variant/icons/8/872_2.png deleted file mode 100644 index 258f8fd225b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/872_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/872_3.png b/public/images/pokemon/variant/icons/8/872_3.png deleted file mode 100644 index 2dc2a3f88da..00000000000 Binary files a/public/images/pokemon/variant/icons/8/872_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/873_1.png b/public/images/pokemon/variant/icons/8/873_1.png deleted file mode 100644 index e3ca501356b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/873_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/873_2.png b/public/images/pokemon/variant/icons/8/873_2.png deleted file mode 100644 index 76a37ec55c8..00000000000 Binary files a/public/images/pokemon/variant/icons/8/873_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/873_3.png b/public/images/pokemon/variant/icons/8/873_3.png deleted file mode 100644 index 8101b0f317e..00000000000 Binary files a/public/images/pokemon/variant/icons/8/873_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/876-female_2.png b/public/images/pokemon/variant/icons/8/876-female_2.png deleted file mode 100644 index 359d810f36d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/876-female_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/876-female_3.png b/public/images/pokemon/variant/icons/8/876-female_3.png deleted file mode 100644 index ce647e6a1a2..00000000000 Binary files a/public/images/pokemon/variant/icons/8/876-female_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/876_2.png b/public/images/pokemon/variant/icons/8/876_2.png deleted file mode 100644 index f672f6cd6d5..00000000000 Binary files a/public/images/pokemon/variant/icons/8/876_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/876_3.png b/public/images/pokemon/variant/icons/8/876_3.png deleted file mode 100644 index 0cf31316a47..00000000000 Binary files a/public/images/pokemon/variant/icons/8/876_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877-hangry_1.png b/public/images/pokemon/variant/icons/8/877-hangry_1.png deleted file mode 100644 index 9ccfcba6dcf..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877-hangry_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877-hangry_2.png b/public/images/pokemon/variant/icons/8/877-hangry_2.png deleted file mode 100644 index 03c6e48a63d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877-hangry_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877-hangry_3.png b/public/images/pokemon/variant/icons/8/877-hangry_3.png deleted file mode 100644 index 5dbf6ca7cdf..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877-hangry_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877_1.png b/public/images/pokemon/variant/icons/8/877_1.png deleted file mode 100644 index c9cd435fac8..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877_2.png b/public/images/pokemon/variant/icons/8/877_2.png deleted file mode 100644 index bfebde92e5e..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/877_3.png b/public/images/pokemon/variant/icons/8/877_3.png deleted file mode 100644 index 8fb654de930..00000000000 Binary files a/public/images/pokemon/variant/icons/8/877_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/885_1.png b/public/images/pokemon/variant/icons/8/885_1.png deleted file mode 100644 index ec0849c4a3a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/885_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/885_2.png b/public/images/pokemon/variant/icons/8/885_2.png deleted file mode 100644 index 5b19fac0813..00000000000 Binary files a/public/images/pokemon/variant/icons/8/885_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/885_3.png b/public/images/pokemon/variant/icons/8/885_3.png deleted file mode 100644 index 3938810e1d9..00000000000 Binary files a/public/images/pokemon/variant/icons/8/885_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/886_1.png b/public/images/pokemon/variant/icons/8/886_1.png deleted file mode 100644 index 0001af872dc..00000000000 Binary files a/public/images/pokemon/variant/icons/8/886_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/886_2.png b/public/images/pokemon/variant/icons/8/886_2.png deleted file mode 100644 index b49491cbafd..00000000000 Binary files a/public/images/pokemon/variant/icons/8/886_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/886_3.png b/public/images/pokemon/variant/icons/8/886_3.png deleted file mode 100644 index 5de076df77c..00000000000 Binary files a/public/images/pokemon/variant/icons/8/886_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/887_1.png b/public/images/pokemon/variant/icons/8/887_1.png deleted file mode 100644 index 6efb0d638d6..00000000000 Binary files a/public/images/pokemon/variant/icons/8/887_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/887_2.png b/public/images/pokemon/variant/icons/8/887_2.png deleted file mode 100644 index 28a337f295b..00000000000 Binary files a/public/images/pokemon/variant/icons/8/887_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/887_3.png b/public/images/pokemon/variant/icons/8/887_3.png deleted file mode 100644 index 12507e42247..00000000000 Binary files a/public/images/pokemon/variant/icons/8/887_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/890-eternamax_2.png b/public/images/pokemon/variant/icons/8/890-eternamax_2.png deleted file mode 100644 index e9168e582cf..00000000000 Binary files a/public/images/pokemon/variant/icons/8/890-eternamax_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/890-eternamax_3.png b/public/images/pokemon/variant/icons/8/890-eternamax_3.png deleted file mode 100644 index 885d081c6e0..00000000000 Binary files a/public/images/pokemon/variant/icons/8/890-eternamax_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/890_2.png b/public/images/pokemon/variant/icons/8/890_2.png deleted file mode 100644 index 2afdc3f6fee..00000000000 Binary files a/public/images/pokemon/variant/icons/8/890_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/890_3.png b/public/images/pokemon/variant/icons/8/890_3.png deleted file mode 100644 index dbf49ec615a..00000000000 Binary files a/public/images/pokemon/variant/icons/8/890_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/896_1.png b/public/images/pokemon/variant/icons/8/896_1.png deleted file mode 100644 index d57d7cad794..00000000000 Binary files a/public/images/pokemon/variant/icons/8/896_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/896_2.png b/public/images/pokemon/variant/icons/8/896_2.png deleted file mode 100644 index 241392e5354..00000000000 Binary files a/public/images/pokemon/variant/icons/8/896_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/896_3.png b/public/images/pokemon/variant/icons/8/896_3.png deleted file mode 100644 index 2664d6ef12f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/896_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/897_1.png b/public/images/pokemon/variant/icons/8/897_1.png deleted file mode 100644 index 12fe6ee7d7f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/897_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/897_2.png b/public/images/pokemon/variant/icons/8/897_2.png deleted file mode 100644 index 77eca7f0d01..00000000000 Binary files a/public/images/pokemon/variant/icons/8/897_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/897_3.png b/public/images/pokemon/variant/icons/8/897_3.png deleted file mode 100644 index 156e8f8ad37..00000000000 Binary files a/public/images/pokemon/variant/icons/8/897_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-ice_1.png b/public/images/pokemon/variant/icons/8/898-ice_1.png deleted file mode 100644 index 34b45a31bcc..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-ice_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-ice_2.png b/public/images/pokemon/variant/icons/8/898-ice_2.png deleted file mode 100644 index acefad4a238..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-ice_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-ice_3.png b/public/images/pokemon/variant/icons/8/898-ice_3.png deleted file mode 100644 index 17f259b74e2..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-ice_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-shadow_1.png b/public/images/pokemon/variant/icons/8/898-shadow_1.png deleted file mode 100644 index 2161141ecfe..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-shadow_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-shadow_2.png b/public/images/pokemon/variant/icons/8/898-shadow_2.png deleted file mode 100644 index 52517018f29..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-shadow_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898-shadow_3.png b/public/images/pokemon/variant/icons/8/898-shadow_3.png deleted file mode 100644 index 627d61a5c29..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898-shadow_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898_1.png b/public/images/pokemon/variant/icons/8/898_1.png deleted file mode 100644 index c2075f823c1..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898_2.png b/public/images/pokemon/variant/icons/8/898_2.png deleted file mode 100644 index 0032d709bca..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/898_3.png b/public/images/pokemon/variant/icons/8/898_3.png deleted file mode 100644 index fbb47bc00bc..00000000000 Binary files a/public/images/pokemon/variant/icons/8/898_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/900_2.png b/public/images/pokemon/variant/icons/8/900_2.png deleted file mode 100644 index 376c1dbe794..00000000000 Binary files a/public/images/pokemon/variant/icons/8/900_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/900_3.png b/public/images/pokemon/variant/icons/8/900_3.png deleted file mode 100644 index 9e2fb2a91af..00000000000 Binary files a/public/images/pokemon/variant/icons/8/900_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/901_1.png b/public/images/pokemon/variant/icons/8/901_1.png deleted file mode 100644 index fadff3dce8d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/901_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/901_2.png b/public/images/pokemon/variant/icons/8/901_2.png deleted file mode 100644 index 0140889bd6d..00000000000 Binary files a/public/images/pokemon/variant/icons/8/901_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/901_3.png b/public/images/pokemon/variant/icons/8/901_3.png deleted file mode 100644 index 7e21a682fa3..00000000000 Binary files a/public/images/pokemon/variant/icons/8/901_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/903_2.png b/public/images/pokemon/variant/icons/8/903_2.png deleted file mode 100644 index fdcabbe644f..00000000000 Binary files a/public/images/pokemon/variant/icons/8/903_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/8/903_3.png b/public/images/pokemon/variant/icons/8/903_3.png deleted file mode 100644 index b96cbbd6154..00000000000 Binary files a/public/images/pokemon/variant/icons/8/903_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1000_1.png b/public/images/pokemon/variant/icons/9/1000_1.png deleted file mode 100644 index 92457719472..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1000_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1000_2.png b/public/images/pokemon/variant/icons/9/1000_2.png deleted file mode 100644 index def858c1d10..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1000_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1000_3.png b/public/images/pokemon/variant/icons/9/1000_3.png deleted file mode 100644 index e9ce3de8d62..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1000_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1001_2.png b/public/images/pokemon/variant/icons/9/1001_2.png deleted file mode 100644 index 65398390881..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1001_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1001_3.png b/public/images/pokemon/variant/icons/9/1001_3.png deleted file mode 100644 index 99d29a19c00..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1001_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1004_2.png b/public/images/pokemon/variant/icons/9/1004_2.png deleted file mode 100644 index 1a2761659a6..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1004_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1004_3.png b/public/images/pokemon/variant/icons/9/1004_3.png deleted file mode 100644 index d42a84ed698..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1004_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1007-apex-build_2.png b/public/images/pokemon/variant/icons/9/1007-apex-build_2.png deleted file mode 100644 index 7b8fd5f6114..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1007-apex-build_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1007-apex-build_3.png b/public/images/pokemon/variant/icons/9/1007-apex-build_3.png deleted file mode 100644 index ead43d9b1f9..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1007-apex-build_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_1.png b/public/images/pokemon/variant/icons/9/1008-ultimate-mode_1.png deleted file mode 100644 index 554984faa64..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_2.png b/public/images/pokemon/variant/icons/9/1008-ultimate-mode_2.png deleted file mode 100644 index b96ce1bd85b..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_3.png b/public/images/pokemon/variant/icons/9/1008-ultimate-mode_3.png deleted file mode 100644 index a3698052aa8..00000000000 Binary files a/public/images/pokemon/variant/icons/9/1008-ultimate-mode_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/8901_1.png b/public/images/pokemon/variant/icons/9/8901_1.png deleted file mode 100644 index fb0c9c395fb..00000000000 Binary files a/public/images/pokemon/variant/icons/9/8901_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/8901_2.png b/public/images/pokemon/variant/icons/9/8901_2.png deleted file mode 100644 index c95721ee59e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/8901_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/8901_3.png b/public/images/pokemon/variant/icons/9/8901_3.png deleted file mode 100644 index 926777a226f..00000000000 Binary files a/public/images/pokemon/variant/icons/9/8901_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/909_2.png b/public/images/pokemon/variant/icons/9/909_2.png deleted file mode 100644 index d5797290e69..00000000000 Binary files a/public/images/pokemon/variant/icons/9/909_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/909_3.png b/public/images/pokemon/variant/icons/9/909_3.png deleted file mode 100644 index d4d7a9593a4..00000000000 Binary files a/public/images/pokemon/variant/icons/9/909_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/910_2.png b/public/images/pokemon/variant/icons/9/910_2.png deleted file mode 100644 index 9a808d0e3b7..00000000000 Binary files a/public/images/pokemon/variant/icons/9/910_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/910_3.png b/public/images/pokemon/variant/icons/9/910_3.png deleted file mode 100644 index 0521f47961f..00000000000 Binary files a/public/images/pokemon/variant/icons/9/910_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/911_2.png b/public/images/pokemon/variant/icons/9/911_2.png deleted file mode 100644 index cebbbb77c95..00000000000 Binary files a/public/images/pokemon/variant/icons/9/911_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/911_3.png b/public/images/pokemon/variant/icons/9/911_3.png deleted file mode 100644 index 3182c11e2e0..00000000000 Binary files a/public/images/pokemon/variant/icons/9/911_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/919_1.png b/public/images/pokemon/variant/icons/9/919_1.png deleted file mode 100644 index d6020b717db..00000000000 Binary files a/public/images/pokemon/variant/icons/9/919_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/919_2.png b/public/images/pokemon/variant/icons/9/919_2.png deleted file mode 100644 index 0e6cc33f0cb..00000000000 Binary files a/public/images/pokemon/variant/icons/9/919_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/919_3.png b/public/images/pokemon/variant/icons/9/919_3.png deleted file mode 100644 index 5480bc5f1f8..00000000000 Binary files a/public/images/pokemon/variant/icons/9/919_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/920_1.png b/public/images/pokemon/variant/icons/9/920_1.png deleted file mode 100644 index 186bebbdc9d..00000000000 Binary files a/public/images/pokemon/variant/icons/9/920_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/920_2.png b/public/images/pokemon/variant/icons/9/920_2.png deleted file mode 100644 index 99b1e663dc0..00000000000 Binary files a/public/images/pokemon/variant/icons/9/920_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/920_3.png b/public/images/pokemon/variant/icons/9/920_3.png deleted file mode 100644 index 25bd3d3c629..00000000000 Binary files a/public/images/pokemon/variant/icons/9/920_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/924_1.png b/public/images/pokemon/variant/icons/9/924_1.png deleted file mode 100644 index fbf980cd5f1..00000000000 Binary files a/public/images/pokemon/variant/icons/9/924_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/924_2.png b/public/images/pokemon/variant/icons/9/924_2.png deleted file mode 100644 index 5432c135b40..00000000000 Binary files a/public/images/pokemon/variant/icons/9/924_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/924_3.png b/public/images/pokemon/variant/icons/9/924_3.png deleted file mode 100644 index fe438313f67..00000000000 Binary files a/public/images/pokemon/variant/icons/9/924_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-four_1.png b/public/images/pokemon/variant/icons/9/925-four_1.png deleted file mode 100644 index 5e5fa3dd186..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-four_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-four_2.png b/public/images/pokemon/variant/icons/9/925-four_2.png deleted file mode 100644 index 9f480930adc..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-four_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-four_3.png b/public/images/pokemon/variant/icons/9/925-four_3.png deleted file mode 100644 index 997bb356a0d..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-four_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-three_1.png b/public/images/pokemon/variant/icons/9/925-three_1.png deleted file mode 100644 index 486f5c0ec3b..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-three_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-three_2.png b/public/images/pokemon/variant/icons/9/925-three_2.png deleted file mode 100644 index 53eaec0f370..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-three_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/925-three_3.png b/public/images/pokemon/variant/icons/9/925-three_3.png deleted file mode 100644 index 1381738cc7b..00000000000 Binary files a/public/images/pokemon/variant/icons/9/925-three_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/935_1.png b/public/images/pokemon/variant/icons/9/935_1.png deleted file mode 100644 index 2b143a45186..00000000000 Binary files a/public/images/pokemon/variant/icons/9/935_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/935_2.png b/public/images/pokemon/variant/icons/9/935_2.png deleted file mode 100644 index 3d6abd8bbba..00000000000 Binary files a/public/images/pokemon/variant/icons/9/935_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/935_3.png b/public/images/pokemon/variant/icons/9/935_3.png deleted file mode 100644 index 4b0994edc52..00000000000 Binary files a/public/images/pokemon/variant/icons/9/935_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/936_1.png b/public/images/pokemon/variant/icons/9/936_1.png deleted file mode 100644 index 6c6cc516351..00000000000 Binary files a/public/images/pokemon/variant/icons/9/936_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/936_2.png b/public/images/pokemon/variant/icons/9/936_2.png deleted file mode 100644 index 7faf7fc2363..00000000000 Binary files a/public/images/pokemon/variant/icons/9/936_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/936_3.png b/public/images/pokemon/variant/icons/9/936_3.png deleted file mode 100644 index 37809ee2fcb..00000000000 Binary files a/public/images/pokemon/variant/icons/9/936_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/937_1.png b/public/images/pokemon/variant/icons/9/937_1.png deleted file mode 100644 index 3539fb65dcd..00000000000 Binary files a/public/images/pokemon/variant/icons/9/937_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/937_2.png b/public/images/pokemon/variant/icons/9/937_2.png deleted file mode 100644 index 8406702bdcb..00000000000 Binary files a/public/images/pokemon/variant/icons/9/937_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/937_3.png b/public/images/pokemon/variant/icons/9/937_3.png deleted file mode 100644 index d8cf7f54f63..00000000000 Binary files a/public/images/pokemon/variant/icons/9/937_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/937_9.png b/public/images/pokemon/variant/icons/9/937_9.png deleted file mode 100644 index b9ad59dca69..00000000000 Binary files a/public/images/pokemon/variant/icons/9/937_9.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/948_2.png b/public/images/pokemon/variant/icons/9/948_2.png deleted file mode 100644 index 410f808a465..00000000000 Binary files a/public/images/pokemon/variant/icons/9/948_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/948_3.png b/public/images/pokemon/variant/icons/9/948_3.png deleted file mode 100644 index 7fc4d7b32e4..00000000000 Binary files a/public/images/pokemon/variant/icons/9/948_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/949_2.png b/public/images/pokemon/variant/icons/9/949_2.png deleted file mode 100644 index ef70b3d7d96..00000000000 Binary files a/public/images/pokemon/variant/icons/9/949_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/949_3.png b/public/images/pokemon/variant/icons/9/949_3.png deleted file mode 100644 index 4d0175d939e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/949_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/951_2.png b/public/images/pokemon/variant/icons/9/951_2.png deleted file mode 100644 index 43ef19de0b5..00000000000 Binary files a/public/images/pokemon/variant/icons/9/951_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/951_3.png b/public/images/pokemon/variant/icons/9/951_3.png deleted file mode 100644 index b9e613a8164..00000000000 Binary files a/public/images/pokemon/variant/icons/9/951_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/952_2.png b/public/images/pokemon/variant/icons/9/952_2.png deleted file mode 100644 index f0118b6d8ce..00000000000 Binary files a/public/images/pokemon/variant/icons/9/952_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/952_3.png b/public/images/pokemon/variant/icons/9/952_3.png deleted file mode 100644 index c73ea8ef08b..00000000000 Binary files a/public/images/pokemon/variant/icons/9/952_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/962_1.png b/public/images/pokemon/variant/icons/9/962_1.png deleted file mode 100644 index 5b78aa0f0a7..00000000000 Binary files a/public/images/pokemon/variant/icons/9/962_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/962_2.png b/public/images/pokemon/variant/icons/9/962_2.png deleted file mode 100644 index 7d018e82197..00000000000 Binary files a/public/images/pokemon/variant/icons/9/962_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/962_3.png b/public/images/pokemon/variant/icons/9/962_3.png deleted file mode 100644 index 4bde28d426e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/962_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/967_2.png b/public/images/pokemon/variant/icons/9/967_2.png deleted file mode 100644 index a8b7935f1dc..00000000000 Binary files a/public/images/pokemon/variant/icons/9/967_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/967_3.png b/public/images/pokemon/variant/icons/9/967_3.png deleted file mode 100644 index b67e193543e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/967_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/968_2.png b/public/images/pokemon/variant/icons/9/968_2.png deleted file mode 100644 index fb3cbb3646c..00000000000 Binary files a/public/images/pokemon/variant/icons/9/968_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/968_3.png b/public/images/pokemon/variant/icons/9/968_3.png deleted file mode 100644 index c22bfc1b1be..00000000000 Binary files a/public/images/pokemon/variant/icons/9/968_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/969_2.png b/public/images/pokemon/variant/icons/9/969_2.png deleted file mode 100644 index 824555cce19..00000000000 Binary files a/public/images/pokemon/variant/icons/9/969_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/969_3.png b/public/images/pokemon/variant/icons/9/969_3.png deleted file mode 100644 index 38c7afd4559..00000000000 Binary files a/public/images/pokemon/variant/icons/9/969_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/970_2.png b/public/images/pokemon/variant/icons/9/970_2.png deleted file mode 100644 index 3a2c45c9f49..00000000000 Binary files a/public/images/pokemon/variant/icons/9/970_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/970_3.png b/public/images/pokemon/variant/icons/9/970_3.png deleted file mode 100644 index 01949deea0e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/970_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/973_1.png b/public/images/pokemon/variant/icons/9/973_1.png deleted file mode 100644 index 3dafafe1f8d..00000000000 Binary files a/public/images/pokemon/variant/icons/9/973_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/973_2.png b/public/images/pokemon/variant/icons/9/973_2.png deleted file mode 100644 index 0fb662c43fb..00000000000 Binary files a/public/images/pokemon/variant/icons/9/973_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/973_3.png b/public/images/pokemon/variant/icons/9/973_3.png deleted file mode 100644 index 3b8e2b58d8c..00000000000 Binary files a/public/images/pokemon/variant/icons/9/973_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/974_2.png b/public/images/pokemon/variant/icons/9/974_2.png deleted file mode 100644 index d2345f81171..00000000000 Binary files a/public/images/pokemon/variant/icons/9/974_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/974_3.png b/public/images/pokemon/variant/icons/9/974_3.png deleted file mode 100644 index b15fd390a95..00000000000 Binary files a/public/images/pokemon/variant/icons/9/974_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/975_2.png b/public/images/pokemon/variant/icons/9/975_2.png deleted file mode 100644 index 8f6f1d5042d..00000000000 Binary files a/public/images/pokemon/variant/icons/9/975_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/975_3.png b/public/images/pokemon/variant/icons/9/975_3.png deleted file mode 100644 index 9946f06cd33..00000000000 Binary files a/public/images/pokemon/variant/icons/9/975_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-curly_2.png b/public/images/pokemon/variant/icons/9/978-curly_2.png deleted file mode 100644 index 14de557d03e..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-curly_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-curly_3.png b/public/images/pokemon/variant/icons/9/978-curly_3.png deleted file mode 100644 index 1a2593c495b..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-curly_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-droopy_2.png b/public/images/pokemon/variant/icons/9/978-droopy_2.png deleted file mode 100644 index 7cf300eaabf..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-droopy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-droopy_3.png b/public/images/pokemon/variant/icons/9/978-droopy_3.png deleted file mode 100644 index 915d4b96252..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-droopy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-stretchy_2.png b/public/images/pokemon/variant/icons/9/978-stretchy_2.png deleted file mode 100644 index 036be57dde2..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-stretchy_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/978-stretchy_3.png b/public/images/pokemon/variant/icons/9/978-stretchy_3.png deleted file mode 100644 index 3d142b24f7a..00000000000 Binary files a/public/images/pokemon/variant/icons/9/978-stretchy_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/979_1.png b/public/images/pokemon/variant/icons/9/979_1.png deleted file mode 100644 index 97f982c4878..00000000000 Binary files a/public/images/pokemon/variant/icons/9/979_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/979_2.png b/public/images/pokemon/variant/icons/9/979_2.png deleted file mode 100644 index f27ce543686..00000000000 Binary files a/public/images/pokemon/variant/icons/9/979_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/979_3.png b/public/images/pokemon/variant/icons/9/979_3.png deleted file mode 100644 index 0088be58344..00000000000 Binary files a/public/images/pokemon/variant/icons/9/979_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/987_1.png b/public/images/pokemon/variant/icons/9/987_1.png deleted file mode 100644 index dccbbb60a04..00000000000 Binary files a/public/images/pokemon/variant/icons/9/987_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/987_2.png b/public/images/pokemon/variant/icons/9/987_2.png deleted file mode 100644 index 9253f797f9d..00000000000 Binary files a/public/images/pokemon/variant/icons/9/987_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/987_3.png b/public/images/pokemon/variant/icons/9/987_3.png deleted file mode 100644 index 27cd59ebab8..00000000000 Binary files a/public/images/pokemon/variant/icons/9/987_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/988_2.png b/public/images/pokemon/variant/icons/9/988_2.png deleted file mode 100644 index fcaf8393026..00000000000 Binary files a/public/images/pokemon/variant/icons/9/988_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/988_3.png b/public/images/pokemon/variant/icons/9/988_3.png deleted file mode 100644 index f2db83a8f50..00000000000 Binary files a/public/images/pokemon/variant/icons/9/988_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/993_2.png b/public/images/pokemon/variant/icons/9/993_2.png deleted file mode 100644 index 07def0a91d0..00000000000 Binary files a/public/images/pokemon/variant/icons/9/993_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/993_3.png b/public/images/pokemon/variant/icons/9/993_3.png deleted file mode 100644 index 37aa1aa8d80..00000000000 Binary files a/public/images/pokemon/variant/icons/9/993_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/994_2.png b/public/images/pokemon/variant/icons/9/994_2.png deleted file mode 100644 index 00f5180e5b2..00000000000 Binary files a/public/images/pokemon/variant/icons/9/994_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/999_1.png b/public/images/pokemon/variant/icons/9/999_1.png deleted file mode 100644 index ea3cdfa0de5..00000000000 Binary files a/public/images/pokemon/variant/icons/9/999_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/999_2.png b/public/images/pokemon/variant/icons/9/999_2.png deleted file mode 100644 index 05a374b7f30..00000000000 Binary files a/public/images/pokemon/variant/icons/9/999_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/icons/9/999_3.png b/public/images/pokemon/variant/icons/9/999_3.png deleted file mode 100644 index 84545a14d52..00000000000 Binary files a/public/images/pokemon/variant/icons/9/999_3.png and /dev/null differ diff --git a/public/images/pokemon_icons_6v.json b/public/images/pokemon_icons_6v.json index ce9ab89be5b..d6c7c38304c 100644 --- a/public/images/pokemon_icons_6v.json +++ b/public/images/pokemon_icons_6v.json @@ -219,48 +219,6 @@ "h": 23 } }, - { - "filename": "354-mega_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 176, - "w": 26, - "h": 30 - } - }, - { - "filename": "354-mega_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 206, - "w": 26, - "h": 30 - } - }, { "filename": "666-archipelago_2", "rotated": false, @@ -1479,27 +1437,6 @@ "h": 24 } }, - { - "filename": "779_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 155, - "w": 21, - "h": 20 - } - }, { "filename": "673_2", "rotated": false, @@ -1521,27 +1458,6 @@ "h": 22 } }, - { - "filename": "779_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 107, - "y": 175, - "w": 21, - "h": 20 - } - }, { "filename": "666-tundra_3", "rotated": false, @@ -1794,48 +1710,6 @@ "h": 22 } }, - { - "filename": "743_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 78, - "y": 358, - "w": 20, - "h": 22 - } - }, - { - "filename": "743_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 78, - "y": 380, - "w": 20, - "h": 22 - } - }, { "filename": "690_3", "rotated": false, @@ -1857,48 +1731,6 @@ "h": 21 } }, - { - "filename": "742_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 78, - "y": 423, - "w": 19, - "h": 20 - } - }, - { - "filename": "742_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 19, - "h": 20 - }, - "frame": { - "x": 78, - "y": 443, - "w": 19, - "h": 20 - } - }, { "filename": "720_1", "rotated": false, @@ -2214,48 +2046,6 @@ "h": 17 } }, - { - "filename": "777_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 396, - "w": 17, - "h": 19 - } - }, - { - "filename": "777_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 111, - "y": 415, - "w": 17, - "h": 19 - } - }, { "filename": "712_2", "rotated": false, diff --git a/public/images/pokemon_icons_6v.png b/public/images/pokemon_icons_6v.png index 481d23953bf..8b0ecd85af5 100644 Binary files a/public/images/pokemon_icons_6v.png and b/public/images/pokemon_icons_6v.png differ diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index bd9f404eb26..0523a232d79 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5260,7 +5260,7 @@ } }, { - "filename": "778", + "filename": "778-disguised", "rotated": false, "trimmed": true, "sourceSize": { @@ -5281,7 +5281,7 @@ } }, { - "filename": "778s", + "filename": "778s-disguised", "rotated": false, "trimmed": true, "sourceSize": { diff --git a/public/images/pokemon_icons_7v.json b/public/images/pokemon_icons_7v.json index 431a8b6dc39..ceb7a0b991f 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1,2477 +1,2687 @@ -{ - "textures": [ - { - "image": "pokemon_icons_7v.png", - "format": "RGBA8888", - "size": { - "w": 126, - "h": 614 - }, - "scale": 1, - "frames": [ - { - "filename": "809_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 28 - } - }, - { - "filename": "809_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 28 - }, - "frame": { - "x": 0, - "y": 28, - "w": 40, - "h": 28 - } - }, - { - "filename": "800-dusk-mane_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 40, - "y": 0, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-dusk-mane_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 34, - "h": 30 - }, - "frame": { - "x": 0, - "y": 56, - "w": 34, - "h": 30 - } - }, - { - "filename": "800-ultra_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 74, - "y": 0, - "w": 35, - "h": 28 - } - }, - { - "filename": "797_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 86, - "w": 32, - "h": 30 - } - }, - { - "filename": "797_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 32, - "h": 30 - }, - "frame": { - "x": 0, - "y": 116, - "w": 32, - "h": 30 - } - }, - { - "filename": "778_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 109, - "y": 0, - "w": 17, - "h": 22 - } - }, - { - "filename": "800-dawn-wings_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 146, - "w": 31, - "h": 30 - } - }, - { - "filename": "800-dawn-wings_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 31, - "h": 30 - }, - "frame": { - "x": 0, - "y": 176, - "w": 31, - "h": 30 - } - }, - { - "filename": "798_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 206, - "w": 31, - "h": 29 - } - }, - { - "filename": "798_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 31, - "h": 29 - }, - "frame": { - "x": 0, - "y": 235, - "w": 31, - "h": 29 - } - }, - { - "filename": "800-ultra_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 35, - "h": 28 - }, - "frame": { - "x": 40, - "y": 30, - "w": 35, - "h": 28 - } - }, - { - "filename": "800_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 264, - "w": 28, - "h": 30 - } - }, - { - "filename": "800_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 294, - "w": 28, - "h": 30 - } - }, - { - "filename": "773-bug_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-bug_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dark_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-dragon_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-electric_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fairy_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 0, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "789_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 0, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "809-gigantamax_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 75, - "y": 28, - "w": 30, - "h": 28 - } - }, - { - "filename": "763_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 28, - "w": 21, - "h": 24 - } - }, - { - "filename": "809-gigantamax_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 30, - "h": 28 - }, - "frame": { - "x": 34, - "y": 58, - "w": 30, - "h": 28 - } - }, - { - "filename": "791_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 86, - "w": 29, - "h": 28 - } - }, - { - "filename": "791_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 114, - "w": 29, - "h": 28 - } - }, - { - "filename": "763_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 52, - "w": 21, - "h": 24 - } - }, - { - "filename": "789_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 23, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "772_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 64, - "y": 58, - "w": 25, - "h": 28 - } - }, - { - "filename": "773-fairy_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 61, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 61, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "761_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 89, - "y": 56, - "w": 16, - "h": 19 - } - }, - { - "filename": "773-fighting_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 87, - "y": 86, - "w": 26, - "h": 30 - } - }, - { - "filename": "730_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 28, - "h": 27 - }, - "frame": { - "x": 89, - "y": 116, - "w": 28, - "h": 27 - } - }, - { - "filename": "755_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 113, - "y": 76, - "w": 13, - "h": 24 - } - }, - { - "filename": "791_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 29, - "h": 28 - }, - "frame": { - "x": 32, - "y": 142, - "w": 29, - "h": 28 - } - }, - { - "filename": "773-fighting_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 170, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 200, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-fire_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 31, - "y": 230, - "w": 26, - "h": 30 - } - }, - { - "filename": "792_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 61, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "792_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 89, - "y": 143, - "w": 28, - "h": 28 - } - }, - { - "filename": "773-flying_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-flying_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 171, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ghost_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 201, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 57, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-grass_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 83, - "y": 231, - "w": 26, - "h": 30 - } - }, - { - "filename": "778_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 109, - "y": 171, - "w": 17, - "h": 22 - } - }, - { - "filename": "728_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 193, - "w": 17, - "h": 20 - } - }, - { - "filename": "728_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 109, - "y": 213, - "w": 17, - "h": 20 - } - }, - { - "filename": "808_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 109, - "y": 233, - "w": 17, - "h": 17 - } - }, - { - "filename": "808_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 109, - "y": 250, - "w": 17, - "h": 17 - } - }, - { - "filename": "773-ground_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 264, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ground_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 28, - "y": 294, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-ice_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 354, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 384, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-poison_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 414, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 444, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-psychic_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 474, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 504, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-rock_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 534, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 26, - "y": 564, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-steel_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 54, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "773-water_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 261, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 106, - "y": 267, - "w": 20, - "h": 24 - } - }, - { - "filename": "773_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 80, - "y": 291, - "w": 26, - "h": 30 - } - }, - { - "filename": "735_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 106, - "y": 291, - "w": 20, - "h": 24 - } - }, - { - "filename": "789_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 46, - "y": 594, - "w": 23, - "h": 20 - } - }, - { - "filename": "754_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 106, - "y": 315, - "w": 20, - "h": 22 - } - }, - { - "filename": "773_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, - "frame": { - "x": 52, - "y": 324, - "w": 26, - "h": 30 - } - }, - { - "filename": "772_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 52, - "y": 354, - "w": 25, - "h": 28 - } - }, - { - "filename": "748_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 382, - "w": 26, - "h": 25 - } - }, - { - "filename": "748_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 52, - "y": 407, - "w": 26, - "h": 25 - } - }, - { - "filename": "776_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 52, - "y": 432, - "w": 23, - "h": 26 - } - }, - { - "filename": "776_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 52, - "y": 458, - "w": 23, - "h": 26 - } - }, - { - "filename": "729_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 484, - "w": 23, - "h": 24 - } - }, - { - "filename": "729_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 52, - "y": 508, - "w": 23, - "h": 24 - } - }, - { - "filename": "756_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 532, - "w": 22, - "h": 24 - } - }, - { - "filename": "756_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 52, - "y": 556, - "w": 22, - "h": 24 - } - }, - { - "filename": "767_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 52, - "y": 580, - "w": 24, - "h": 14 - } - }, - { - "filename": "747_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 69, - "y": 594, - "w": 22, - "h": 20 - } - }, - { - "filename": "768_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 78, - "y": 321, - "w": 24, - "h": 23 - } - }, - { - "filename": "768_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 102, - "y": 337, - "w": 24, - "h": 23 - } - }, - { - "filename": "2053_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 78, - "y": 344, - "w": 24, - "h": 22 - } - }, - { - "filename": "2053_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 102, - "y": 360, - "w": 24, - "h": 22 - } - }, - { - "filename": "734_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 77, - "y": 366, - "w": 25, - "h": 16 - } - }, - { - "filename": "802_1", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 382, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 78, - "y": 406, - "w": 22, - "h": 24 - } - }, - { - "filename": "802_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 100, - "y": 382, - "w": 22, - "h": 24 - } - }, - { - "filename": "793_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 100, - "y": 406, - "w": 21, - "h": 24 - } - }, - { - "filename": "734_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 78, - "y": 430, - "w": 25, - "h": 16 - } - }, - { - "filename": "752_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 103, - "y": 430, - "w": 23, - "h": 18 - } - }, - { - "filename": "793_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 75, - "y": 446, - "w": 21, - "h": 24 - } - }, - { - "filename": "754_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 75, - "y": 470, - "w": 20, - "h": 22 - } - }, - { - "filename": "762_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 75, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "747_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 96, - "y": 448, - "w": 22, - "h": 20 - } - }, - { - "filename": "752_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 75, - "y": 515, - "w": 23, - "h": 18 - } - }, - { - "filename": "2052_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 533, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 74, - "y": 554, - "w": 21, - "h": 21 - } - }, - { - "filename": "790_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 76, - "y": 575, - "w": 21, - "h": 19 - } - }, - { - "filename": "751_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 91, - "y": 594, - "w": 14, - "h": 20 - } - }, - { - "filename": "790_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 105, - "y": 468, - "w": 21, - "h": 19 - } - }, - { - "filename": "762_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 93, - "y": 492, - "w": 18, - "h": 23 - } - }, - { - "filename": "755_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 4, - "w": 13, - "h": 24 - }, - "frame": { - "x": 111, - "y": 487, - "w": 13, - "h": 24 - } - }, - { - "filename": "751_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 98, - "y": 515, - "w": 14, - "h": 20 - } - }, - { - "filename": "753_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 112, - "y": 511, - "w": 14, - "h": 19 - } - }, - { - "filename": "753_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 112, - "y": 530, - "w": 14, - "h": 19 - } - }, - { - "filename": "761_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 95, - "y": 535, - "w": 16, - "h": 19 - } - }, - { - "filename": "767_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 11, - "w": 24, - "h": 14 - }, - "frame": { - "x": 95, - "y": 554, - "w": 24, - "h": 14 - } - }, - { - "filename": "771_2", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 97, - "y": 568, - "w": 18, - "h": 13 - } - }, - { - "filename": "771_3", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 97, - "y": 581, - "w": 18, - "h": 13 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4de745903870d93aebe9c754281ab9a1:4247d298b98d033d5b01c30d46133c87:d5975df27e1e94206a68aa1fd3c2c8d0$" - } -} +{ + "textures": [ + { + "image": "pokemon_icons_7v.png", + "format": "RGBA8888", + "size": { + "w": 126, + "h": 614 + }, + "scale": 1, + "frames": [ + { + "filename": "809_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 28 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 28 + } + }, + { + "filename": "809_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 40, + "h": 28 + }, + "frame": { + "x": 0, + "y": 28, + "w": 40, + "h": 28 + } + }, + { + "filename": "800-dusk-mane_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 34, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 34, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 34, + "h": 30 + }, + "frame": { + "x": 0, + "y": 56, + "w": 34, + "h": 30 + } + }, + { + "filename": "800-ultra_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 35, + "h": 28 + }, + "frame": { + "x": 74, + "y": 0, + "w": 35, + "h": 28 + } + }, + { + "filename": "797_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 32, + "h": 30 + }, + "frame": { + "x": 0, + "y": 86, + "w": 32, + "h": 30 + } + }, + { + "filename": "797_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 32, + "h": 30 + }, + "frame": { + "x": 0, + "y": 116, + "w": 32, + "h": 30 + } + }, + { + "filename": "778-disguised_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 113, + "y": 72, + "w": 17, + "h": 22 + } + }, + { + "filename": "800-dawn-wings_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 31, + "h": 30 + }, + "frame": { + "x": 0, + "y": 146, + "w": 31, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 31, + "h": 30 + }, + "frame": { + "x": 0, + "y": 176, + "w": 31, + "h": 30 + } + }, + { + "filename": "798_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 31, + "h": 29 + }, + "frame": { + "x": 0, + "y": 206, + "w": 31, + "h": 29 + } + }, + { + "filename": "798_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 4, + "y": 1, + "w": 31, + "h": 29 + }, + "frame": { + "x": 0, + "y": 235, + "w": 31, + "h": 29 + } + }, + { + "filename": "800-ultra_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 35, + "h": 28 + }, + "frame": { + "x": 40, + "y": 30, + "w": 35, + "h": 28 + } + }, + { + "filename": "800_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 264, + "w": 28, + "h": 30 + } + }, + { + "filename": "800_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 0, + "y": 294, + "w": 28, + "h": 30 + } + }, + { + "filename": "773-bug_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-bug_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 354, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dark_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 384, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dark_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 414, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dragon_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 444, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-dragon_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 474, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 504, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-electric_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 534, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fairy_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 0, + "y": 564, + "w": 26, + "h": 30 + } + }, + { + "filename": "789_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 0, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "809-gigantamax_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 30, + "h": 28 + }, + "frame": { + "x": 75, + "y": 28, + "w": 30, + "h": 28 + } + }, + { + "filename": "763_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 0, + "w": 21, + "h": 24 + } + }, + { + "filename": "809-gigantamax_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 30, + "h": 28 + }, + "frame": { + "x": 34, + "y": 58, + "w": 30, + "h": 28 + } + }, + { + "filename": "791_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 86, + "w": 29, + "h": 28 + } + }, + { + "filename": "791_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 114, + "w": 29, + "h": 28 + } + }, + { + "filename": "763_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 24, + "w": 21, + "h": 24 + } + }, + { + "filename": "789_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 23, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "772_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 64, + "y": 58, + "w": 25, + "h": 28 + } + }, + { + "filename": "773-fairy_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 61, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "730_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 61, + "y": 116, + "w": 28, + "h": 27 + } + }, + { + "filename": "761_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 98, + "y": 516, + "w": 16, + "h": 19 + } + }, + { + "filename": "773-fighting_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 87, + "y": 86, + "w": 26, + "h": 30 + } + }, + { + "filename": "730_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 28, + "h": 27 + }, + "frame": { + "x": 89, + "y": 116, + "w": 28, + "h": 27 + } + }, + { + "filename": "755_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 4, + "w": 13, + "h": 24 + }, + "frame": { + "x": 117, + "y": 117, + "w": 13, + "h": 24 + } + }, + { + "filename": "791_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 2, + "w": 29, + "h": 28 + }, + "frame": { + "x": 32, + "y": 142, + "w": 29, + "h": 28 + } + }, + { + "filename": "773-fighting_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 170, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fire_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 200, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-fire_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 31, + "y": 230, + "w": 26, + "h": 30 + } + }, + { + "filename": "792_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 61, + "y": 143, + "w": 28, + "h": 28 + } + }, + { + "filename": "792_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 89, + "y": 143, + "w": 28, + "h": 28 + } + }, + { + "filename": "773-flying_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 171, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-flying_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 201, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ghost_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 171, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ghost_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 201, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-grass_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 57, + "y": 231, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-grass_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 83, + "y": 231, + "w": 26, + "h": 30 + } + }, + { + "filename": "778-disguised_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 96, + "y": 445, + "w": 17, + "h": 22 + } + }, + { + "filename": "728_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 113, + "y": 448, + "w": 17, + "h": 20 + } + }, + { + "filename": "728_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 113, + "y": 94, + "w": 17, + "h": 20 + } + }, + { + "filename": "808_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 114, + "y": 468, + "w": 17, + "h": 17 + } + }, + { + "filename": "808_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 113, + "y": 235, + "w": 17, + "h": 17 + } + }, + { + "filename": "773-ground_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 264, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ground_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 28, + "y": 294, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-ice_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 354, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-poison_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 384, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-poison_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 414, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 444, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-psychic_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 474, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 504, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-rock_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 534, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 26, + "y": 564, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-steel_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 54, + "y": 261, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-water_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 54, + "y": 291, + "w": 26, + "h": 30 + } + }, + { + "filename": "773-water_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 80, + "y": 261, + "w": 26, + "h": 30 + } + }, + { + "filename": "735_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 109, + "y": 171, + "w": 20, + "h": 24 + } + }, + { + "filename": "773_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 80, + "y": 291, + "w": 26, + "h": 30 + } + }, + { + "filename": "735_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 109, + "y": 195, + "w": 20, + "h": 24 + } + }, + { + "filename": "789_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 46, + "y": 594, + "w": 23, + "h": 20 + } + }, + { + "filename": "754_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 106, + "y": 318, + "w": 20, + "h": 22 + } + }, + { + "filename": "773_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 26, + "h": 30 + }, + "frame": { + "x": 52, + "y": 324, + "w": 26, + "h": 30 + } + }, + { + "filename": "772_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 52, + "y": 354, + "w": 25, + "h": 28 + } + }, + { + "filename": "748_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 52, + "y": 382, + "w": 26, + "h": 25 + } + }, + { + "filename": "748_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 52, + "y": 407, + "w": 26, + "h": 25 + } + }, + { + "filename": "776_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 52, + "y": 432, + "w": 23, + "h": 26 + } + }, + { + "filename": "776_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 101, + "y": 382, + "w": 23, + "h": 26 + } + }, + { + "filename": "729_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 52, + "y": 484, + "w": 23, + "h": 24 + } + }, + { + "filename": "729_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 52, + "y": 508, + "w": 23, + "h": 24 + } + }, + { + "filename": "756_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 532, + "w": 22, + "h": 24 + } + }, + { + "filename": "756_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 556, + "w": 22, + "h": 24 + } + }, + { + "filename": "767_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 52, + "y": 580, + "w": 24, + "h": 14 + } + }, + { + "filename": "747_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 69, + "y": 594, + "w": 22, + "h": 20 + } + }, + { + "filename": "768_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 78, + "y": 321, + "w": 24, + "h": 23 + } + }, + { + "filename": "768_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 106, + "y": 295, + "w": 24, + "h": 23 + } + }, + { + "filename": "2053_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 78, + "y": 344, + "w": 24, + "h": 22 + } + }, + { + "filename": "2053_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 102, + "y": 360, + "w": 24, + "h": 22 + } + }, + { + "filename": "734_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 77, + "y": 366, + "w": 25, + "h": 16 + } + }, + { + "filename": "802_1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 78, + "y": 382, + "w": 22, + "h": 24 + } + }, + { + "filename": "802_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 78, + "y": 406, + "w": 22, + "h": 24 + } + }, + { + "filename": "802_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 52, + "y": 458, + "w": 22, + "h": 24 + } + }, + { + "filename": "793_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 109, + "y": 48, + "w": 21, + "h": 24 + } + }, + { + "filename": "734_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 78, + "y": 430, + "w": 25, + "h": 16 + } + }, + { + "filename": "752_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 104, + "y": 408, + "w": 23, + "h": 18 + } + }, + { + "filename": "793_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 75, + "y": 446, + "w": 21, + "h": 24 + } + }, + { + "filename": "754_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 74, + "y": 470, + "w": 20, + "h": 22 + } + }, + { + "filename": "762_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 75, + "y": 492, + "w": 18, + "h": 23 + } + }, + { + "filename": "747_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 109, + "y": 426, + "w": 22, + "h": 20 + } + }, + { + "filename": "752_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 75, + "y": 515, + "w": 23, + "h": 18 + } + }, + { + "filename": "2052_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 74, + "y": 533, + "w": 21, + "h": 21 + } + }, + { + "filename": "2052_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 74, + "y": 554, + "w": 21, + "h": 21 + } + }, + { + "filename": "790_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 76, + "y": 575, + "w": 21, + "h": 19 + } + }, + { + "filename": "751_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 102, + "y": 340, + "w": 14, + "h": 20 + } + }, + { + "filename": "790_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 91, + "y": 594, + "w": 21, + "h": 19 + } + }, + { + "filename": "762_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 93, + "y": 492, + "w": 18, + "h": 23 + } + }, + { + "filename": "755_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 4, + "w": 13, + "h": 24 + }, + "frame": { + "x": 117, + "y": 141, + "w": 13, + "h": 24 + } + }, + { + "filename": "751_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 116, + "y": 340, + "w": 14, + "h": 20 + } + }, + { + "filename": "753_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 116, + "y": 537, + "w": 14, + "h": 19 + } + }, + { + "filename": "753_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 116, + "y": 556, + "w": 14, + "h": 19 + } + }, + { + "filename": "761_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 96, + "y": 575, + "w": 16, + "h": 19 + } + }, + { + "filename": "767_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 106, + "y": 265, + "w": 24, + "h": 14 + } + }, + { + "filename": "742_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 112, + "y": 575, + "w": 19, + "h": 20 + } + }, + { + "filename": "742_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 19, + "h": 20 + }, + "frame": { + "x": 112, + "y": 594, + "w": 19, + "h": 20 + } + }, + { + "filename": "743_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 94, + "y": 470, + "w": 20, + "h": 22 + } + }, + { + "filename": "743_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 89, + "y": 56, + "w": 20, + "h": 22 + } + }, + { + "filename": "777_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 114, + "y": 518, + "w": 17, + "h": 19 + } + }, + { + "filename": "777_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 114, + "y": 486, + "w": 17, + "h": 19 + } + }, + { + "filename": "778-busted_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 109, + "y": 219, + "w": 21, + "h": 16 + } + }, + { + "filename": "778-busted_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 106, + "y": 279, + "w": 21, + "h": 16 + } + }, + { + "filename": "779_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 95, + "y": 535, + "w": 21, + "h": 20 + } + }, + { + "filename": "779_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 95, + "y": 555, + "w": 21, + "h": 20 + } + }, + { + "filename": "771_2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 112, + "y": 505, + "w": 18, + "h": 13 + } + }, + { + "filename": "771_3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 109, + "y": 252, + "w": 18, + "h": 13 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4de745903870d93aebe9c754281ab9a1:4247d298b98d033d5b01c30d46133c87:d5975df27e1e94206a68aa1fd3c2c8d0$" + } +} diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 23b318b788a..822f7950f3e 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/types/bug.png b/public/images/types/bug.png deleted file mode 100644 index 72681086ec6..00000000000 Binary files a/public/images/types/bug.png and /dev/null differ diff --git a/public/images/types/dark.png b/public/images/types/dark.png deleted file mode 100644 index 6605a95bb4c..00000000000 Binary files a/public/images/types/dark.png and /dev/null differ diff --git a/public/images/types/dragon.png b/public/images/types/dragon.png deleted file mode 100644 index 3554bc8bd68..00000000000 Binary files a/public/images/types/dragon.png and /dev/null differ diff --git a/public/images/types/electric.png b/public/images/types/electric.png deleted file mode 100644 index ea5008652c5..00000000000 Binary files a/public/images/types/electric.png and /dev/null differ diff --git a/public/images/types/fairy.png b/public/images/types/fairy.png deleted file mode 100644 index f8ca169d3aa..00000000000 Binary files a/public/images/types/fairy.png and /dev/null differ diff --git a/public/images/types/fighting.png b/public/images/types/fighting.png deleted file mode 100644 index 0fd87f3dbd9..00000000000 Binary files a/public/images/types/fighting.png and /dev/null differ diff --git a/public/images/types/fire.png b/public/images/types/fire.png deleted file mode 100644 index 08a550fcaff..00000000000 Binary files a/public/images/types/fire.png and /dev/null differ diff --git a/public/images/types/flying.png b/public/images/types/flying.png deleted file mode 100644 index 3a13e051222..00000000000 Binary files a/public/images/types/flying.png and /dev/null differ diff --git a/public/images/types/ghost.png b/public/images/types/ghost.png deleted file mode 100644 index f32896bed02..00000000000 Binary files a/public/images/types/ghost.png and /dev/null differ diff --git a/public/images/types/grass.png b/public/images/types/grass.png deleted file mode 100644 index 35dfecfc2d2..00000000000 Binary files a/public/images/types/grass.png and /dev/null differ diff --git a/public/images/types/ground.png b/public/images/types/ground.png deleted file mode 100644 index 0df975559b6..00000000000 Binary files a/public/images/types/ground.png and /dev/null differ diff --git a/public/images/types/ice.png b/public/images/types/ice.png deleted file mode 100644 index 57ea33f9b16..00000000000 Binary files a/public/images/types/ice.png and /dev/null differ diff --git a/public/images/types/normal.png b/public/images/types/normal.png deleted file mode 100644 index 92524168f5c..00000000000 Binary files a/public/images/types/normal.png and /dev/null differ diff --git a/public/images/types/poison.png b/public/images/types/poison.png deleted file mode 100644 index c898b4d14a9..00000000000 Binary files a/public/images/types/poison.png and /dev/null differ diff --git a/public/images/types/psychic.png b/public/images/types/psychic.png deleted file mode 100644 index ff55bc54a60..00000000000 Binary files a/public/images/types/psychic.png and /dev/null differ diff --git a/public/images/types/rock.png b/public/images/types/rock.png deleted file mode 100644 index 0a90b780a24..00000000000 Binary files a/public/images/types/rock.png and /dev/null differ diff --git a/public/images/types/steel.png b/public/images/types/steel.png deleted file mode 100644 index 34e2ad73db8..00000000000 Binary files a/public/images/types/steel.png and /dev/null differ diff --git a/public/images/types/stellar.png b/public/images/types/stellar.png deleted file mode 100644 index 6ca5e5bdbc4..00000000000 Binary files a/public/images/types/stellar.png and /dev/null differ diff --git a/public/images/types/unknown.png b/public/images/types/unknown.png deleted file mode 100644 index 607111adefb..00000000000 Binary files a/public/images/types/unknown.png and /dev/null differ diff --git a/public/images/types/water.png b/public/images/types/water.png deleted file mode 100644 index eb618008d00..00000000000 Binary files a/public/images/types/water.png and /dev/null differ diff --git a/public/images/types_zh_TW.json b/public/images/types_pt-BR.json similarity index 99% rename from public/images/types_zh_TW.json rename to public/images/types_pt-BR.json index e3923b00f02..e89bdcba87f 100644 --- a/public/images/types_zh_TW.json +++ b/public/images/types_pt-BR.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_TW.png", + "image": "types_pt-BR.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_pt_BR.png b/public/images/types_pt-BR.png similarity index 100% rename from public/images/types_pt_BR.png rename to public/images/types_pt-BR.png diff --git a/public/images/types_zh_CN.json b/public/images/types_zh-CN.json similarity index 99% rename from public/images/types_zh_CN.json rename to public/images/types_zh-CN.json index 4cd0135a677..e82d3c56468 100644 --- a/public/images/types_zh_CN.json +++ b/public/images/types_zh-CN.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_zh_CN.png", + "image": "types_zh-CN.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh-CN.png b/public/images/types_zh-CN.png new file mode 100644 index 00000000000..a1a41a663fd Binary files /dev/null and b/public/images/types_zh-CN.png differ diff --git a/public/images/types_pt_BR.json b/public/images/types_zh-TW.json similarity index 99% rename from public/images/types_pt_BR.json rename to public/images/types_zh-TW.json index 932d316fd30..18c51ab61f4 100644 --- a/public/images/types_pt_BR.json +++ b/public/images/types_zh-TW.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_pt_BR.png", + "image": "types_zh-TW.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_zh_CN.png b/public/images/types_zh-TW.png similarity index 100% rename from public/images/types_zh_CN.png rename to public/images/types_zh-TW.png diff --git a/public/images/types_zh_TW.png b/public/images/types_zh_TW.png deleted file mode 100644 index 8b644f1041c..00000000000 Binary files a/public/images/types_zh_TW.png and /dev/null differ diff --git a/public/images/ui/command_fight_labels.png b/public/images/ui/command_fight_labels.png deleted file mode 100644 index c9d6d60c47f..00000000000 Binary files a/public/images/ui/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/command_fight_labels.png b/public/images/ui/legacy/command_fight_labels.png deleted file mode 100644 index 257d0e5d93f..00000000000 Binary files a/public/images/ui/legacy/command_fight_labels.png and /dev/null differ diff --git a/public/images/ui/legacy/shiny_icons.json b/public/images/ui/legacy/shiny_icons.json new file mode 100644 index 00000000000..698b5b96e72 --- /dev/null +++ b/public/images/ui/legacy/shiny_icons.json @@ -0,0 +1,78 @@ +{ + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 15, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ] +} diff --git a/public/images/ui/legacy/shiny_icons.png b/public/images/ui/legacy/shiny_icons.png new file mode 100644 index 00000000000..f601d908d32 Binary files /dev/null and b/public/images/ui/legacy/shiny_icons.png differ diff --git a/public/images/ui/legacy/summary_moves_effect_pt_BR.png b/public/images/ui/legacy/summary_moves_effect_pt-BR.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_pt_BR.png rename to public/images/ui/legacy/summary_moves_effect_pt-BR.png diff --git a/public/images/ui/legacy/summary_moves_effect_zh_CN.png b/public/images/ui/legacy/summary_moves_effect_zh-CN.png similarity index 100% rename from public/images/ui/legacy/summary_moves_effect_zh_CN.png rename to public/images/ui/legacy/summary_moves_effect_zh-CN.png diff --git a/public/images/ui/shiny_icons.json b/public/images/ui/shiny_icons.json new file mode 100644 index 00000000000..698b5b96e72 --- /dev/null +++ b/public/images/ui/shiny_icons.json @@ -0,0 +1,78 @@ +{ + "textures": [ + { + "image": "shiny_icons.png", + "format": "RGBA8888", + "size": { + "w": 15, + "h": 14 + }, + "scale": 1, + "frames": [ + { + "filename": "0", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 15, + "y": 0, + "w": 15, + "h": 14 + } + }, + { + "filename": "2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 30, + "y": 0, + "w": 15, + "h": 14 + } + } + ] + } + ] +} diff --git a/public/images/ui/shiny_icons.png b/public/images/ui/shiny_icons.png new file mode 100644 index 00000000000..f601d908d32 Binary files /dev/null and b/public/images/ui/shiny_icons.png differ diff --git a/src/@types/i18next.d.ts b/src/@types/i18next.d.ts new file mode 100644 index 00000000000..f3a63d6f4ec --- /dev/null +++ b/src/@types/i18next.d.ts @@ -0,0 +1,9 @@ +import { enConfig } from "#app/locales/en/config.js"; + +// Module declared to make referencing keys in the localization files type-safe. +declare module "i18next" { + interface CustomTypeOptions { + defaultNS: "menu", // needed here as well for typedoc + resources: typeof enConfig + } + } diff --git a/src/account.ts b/src/account.ts index e5bde56bfe3..4d19513908f 100644 --- a/src/account.ts +++ b/src/account.ts @@ -7,6 +7,7 @@ export interface UserInfo { } export let loggedInUser: UserInfo = null; +// This is a random string that is used to identify the client session - unique per session (tab or window) so that the game will only save on the one that the server is expecting export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 148b05c59f6..1b1d1fde83f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3,6 +3,7 @@ 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 } from "./data/pokemon-species"; +import { Constructor } from "#app/utils"; 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"; @@ -36,7 +37,7 @@ 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 { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; @@ -47,7 +48,7 @@ import { biomeDepths, getBiomeName } from "./data/biomes"; import { SceneBase } from "./scene-base"; import CandyBar from "./ui/candy-bar"; import { Variant, variantData } from "./data/variant"; -import { Localizable } from "./plugins/i18n"; +import { Localizable } from "#app/interfaces/locales"; import * as Overrides from "./overrides"; import {InputsController} from "./inputs-controller"; import {UiInputs} from "./ui-inputs"; @@ -156,6 +157,8 @@ export default class BattleScene extends SceneBase { public fusionPaletteSwaps: boolean = true; public enableTouchControls: boolean = false; public enableVibration: boolean = false; + public showBgmBar: boolean = true; + /** * Determines the selected battle style. * - 0 = 'Switch' @@ -218,6 +221,7 @@ export default class BattleScene extends SceneBase { public arenaFlyout: ArenaFlyout; private fieldOverlay: Phaser.GameObjects.Rectangle; + private shopOverlay: Phaser.GameObjects.Rectangle; public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; @@ -331,7 +335,9 @@ export default class BattleScene extends SceneBase { launchBattle() { this.arenaBg = this.add.sprite(0, 0, "plains_bg"); + this.arenaBg.setName("sprite-arena-bg"); this.arenaBgTransition = this.add.sprite(0, 0, "plains_bg"); + this.arenaBgTransition.setName("sprite-arena-bg-transition"); [ this.arenaBgTransition, this.arenaBg ].forEach(a => { a.setPipeline(this.fieldSpritePipeline); @@ -341,13 +347,13 @@ export default class BattleScene extends SceneBase { }); const field = this.add.container(0, 0); + field.setName("field"); field.setScale(6); - field.setName("container-field"); this.field = field; const fieldUI = this.add.container(0, this.game.canvas.height); - fieldUI.setName("container-field-ui"); + fieldUI.setName("field-ui"); fieldUI.setDepth(1); fieldUI.setScale(6); @@ -371,7 +377,7 @@ export default class BattleScene extends SceneBase { this.add.existing(transition); const uiContainer = this.add.container(0, 0); - uiContainer.setName("container-ui"); + uiContainer.setName("ui"); uiContainer.setDepth(2); uiContainer.setScale(6); @@ -385,16 +391,22 @@ export default class BattleScene extends SceneBase { this.fieldOverlay.setAlpha(0); this.fieldUI.add(this.fieldOverlay); + this.shopOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x070707); + this.shopOverlay.setName("rect-shop-overlay"); + this.shopOverlay.setOrigin(0, 0); + this.shopOverlay.setAlpha(0); + this.fieldUI.add(this.shopOverlay); + this.modifiers = []; this.enemyModifiers = []; this.modifierBar = new ModifierBar(this); - this.modifierBar.setName("container-modifier-bar"); + this.modifierBar.setName("modifier-bar"); this.add.existing(this.modifierBar); uiContainer.add(this.modifierBar); this.enemyModifierBar = new ModifierBar(this, true); - this.enemyModifierBar.setName("container-enemy-modifier-bar"); + this.enemyModifierBar.setName("enemy-modifier-bar"); this.add.existing(this.enemyModifierBar); uiContainer.add(this.enemyModifierBar); @@ -405,28 +417,28 @@ export default class BattleScene extends SceneBase { this.fieldUI.add(this.charSprite); this.pbTray = new PokeballTray(this, true); - this.pbTray.setName("container-pb-tray"); + this.pbTray.setName("pb-tray"); this.pbTray.setup(); this.pbTrayEnemy = new PokeballTray(this, false); - this.pbTrayEnemy.setName("container-enemy-pb-tray"); + this.pbTrayEnemy.setName("enemy-pb-tray"); this.pbTrayEnemy.setup(); this.fieldUI.add(this.pbTray); this.fieldUI.add(this.pbTrayEnemy); this.abilityBar = new AbilityBar(this); - this.abilityBar.setName("container-ability-bar"); + this.abilityBar.setName("ability-bar"); this.abilityBar.setup(); this.fieldUI.add(this.abilityBar); this.partyExpBar = new PartyExpBar(this); - this.partyExpBar.setName("container-party-exp-bar"); + this.partyExpBar.setName("party-exp-bar"); this.partyExpBar.setup(); this.fieldUI.add(this.partyExpBar); this.candyBar = new CandyBar(this); - this.candyBar.setName("container-candy-bar"); + this.candyBar.setName("candy-bar"); this.candyBar.setup(); this.fieldUI.add(this.candyBar); @@ -478,13 +490,13 @@ export default class BattleScene extends SceneBase { const loadPokemonAssets = []; this.arenaPlayer = new ArenaBase(this, true); - this.arenaPlayer.setName("container-arena-player"); + this.arenaPlayer.setName("arena-player"); this.arenaPlayerTransition = new ArenaBase(this, true); - this.arenaPlayerTransition.setName("container-arena-player-transition"); + this.arenaPlayerTransition.setName("arena-player-transition"); this.arenaEnemy = new ArenaBase(this, false); - this.arenaEnemy.setName("container-arena-enemy"); + this.arenaEnemy.setName("arena-enemy"); this.arenaNextEnemy = new ArenaBase(this, false); - this.arenaNextEnemy.setName("container-arena-next-enemy"); + this.arenaNextEnemy.setName("arena-next-enemy"); this.arenaBgTransition.setVisible(false); this.arenaPlayerTransition.setVisible(false); @@ -736,6 +748,14 @@ export default class BattleScene extends SceneBase { : ret; } + /** + * Returns the ModifierBar of this scene, which is declared private and therefore not accessible elsewhere + * @returns {ModifierBar} + */ + getModifierBar(): ModifierBar { + return this.modifierBar; + } + // store info toggles to be accessible by the ui addInfoToggle(infoToggle: InfoToggle): void { this.infoToggles.push(infoToggle); @@ -797,8 +817,10 @@ export default class BattleScene extends SceneBase { addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { const container = this.add.container(x, y); + container.setName(`${pokemon.name}-icon`); const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); + icon.setName(`sprite-${pokemon.name}-icon`); 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)) { @@ -815,6 +837,7 @@ export default class BattleScene extends SceneBase { if (pokemon.isFusion()) { const fusionIcon = this.add.sprite(0, 0, pokemon.getFusionIconAtlasKey(ignoreOverride)); + fusionIcon.setName("sprite-fusion-icon"); fusionIcon.setOrigin(0.5, 0); fusionIcon.setFrame(pokemon.getFusionIconId(true)); @@ -1099,8 +1122,10 @@ export default class BattleScene extends SceneBase { playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { - if (pokemon.hasAbility(Abilities.ICE_FACE)) { - pokemon.formIndex = 0; + // Only trigger form change when Eiscue is in Noice form + // Hardcoded Eiscue for now in case it is fused with another pokemon + if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); } pokemon.resetBattleData(); @@ -1396,6 +1421,30 @@ export default class BattleScene extends SceneBase { }); } + showShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0.8, + ease: "Sine.easeOut", + duration: duration, + onComplete: () => resolve() + }); + }); + } + + hideShopOverlay(duration: integer): Promise { + return new Promise(resolve => { + this.tweens.add({ + targets: this.shopOverlay, + alpha: 0, + duration: duration, + ease: "Cubic.easeIn", + onComplete: () => resolve() + }); + }); + } + showEnemyModifierBar(): void { this.enemyModifierBar.setVisible(true); } @@ -1407,6 +1456,7 @@ export default class BattleScene extends SceneBase { updateBiomeWaveText(): void { const isBoss = !(this.currentBattle.waveIndex % 10); const biomeString: string = getBiomeName(this.arena.biomeType); + this.fieldUI.moveAbove(this.biomeWaveText, this.luckText); this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); @@ -1591,6 +1641,7 @@ export default class BattleScene extends SceneBase { : this.getBgmLoopPoint(bgmName); let loaded = false; const playNewBgm = () => { + this.ui.bgmBar.setBgmToBgmBar(bgmName); if (bgmName === null && this.bgm && !this.bgm.pendingRemove) { this.bgm.play({ volume: this.masterVolume * this.bgmVolume @@ -1824,6 +1875,8 @@ export default class BattleScene extends SceneBase { return 0.175; case "battle_legendary_ruinous": //SV Treasures of Ruin Battle return 6.333; + case "battle_legendary_kor_mir": //SV Depths of Area Zero Battle + return 6.442; case "battle_legendary_loyal_three": //SV Loyal Three Battle return 6.500; case "battle_legendary_ogerpon": //SV Ogerpon Battle @@ -1846,8 +1899,26 @@ export default class BattleScene extends SceneBase { return 13.940; case "end_summit": //PMD RTDX Sky Tower Summit return 30.025; + case "battle_rocket_grunt": //HGSS Team Rocket Battle + return 12.707; + case "battle_aqua_magma_grunt": //ORAS Team Aqua & Magma Battle + return 12.062; + case "battle_galactic_grunt": //BDSP Team Galactic Battle + return 13.043; case "battle_plasma_grunt": //BW Team Plasma Battle return 12.974; + case "battle_flare_grunt": //XY Team Flare Battle + return 4.228; + case "battle_rocket_boss": //USUM Giovanni Battle + return 9.115; + case "battle_aqua_magma_boss": //ORAS Archie & Maxie Battle + return 14.847; + case "battle_galactic_boss": //BDSP Cyrus Battle + return 106.962; + case "battle_plasma_boss": //B2W2 Ghetsis Battle + return 25.624; + case "battle_flare_boss": //XY Lysandre Battle + return 8.085; } return 0; @@ -2340,8 +2411,14 @@ export default class BattleScene extends SceneBase { return false; } - getModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true): PersistentModifier[] { - return (player ? this.modifiers : this.enemyModifiers).filter(m => m instanceof modifierType); + /** + * Get all of the modifiers that match `modifierType` + * @param modifierType The type of modifier to apply; must extend {@linkcode PersistentModifier} + * @param player Whether to search the player (`true`) or the enemy (`false`); Defaults to `true` + * @returns the list of all modifiers that matched `modifierType`. + */ + getModifiers(modifierType: Constructor, player: boolean = true): T[] { + return (player ? this.modifiers : this.enemyModifiers).filter((m): m is T => m instanceof modifierType); } findModifiers(modifierFilter: ModifierPredicate, player: boolean = true): PersistentModifier[] { @@ -2352,7 +2429,7 @@ export default class BattleScene extends SceneBase { 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[] { + applyShuffledModifiers(scene: BattleScene, modifierType: Constructor, 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 => { @@ -2367,7 +2444,7 @@ export default class BattleScene extends SceneBase { return this.applyModifiersInternal(modifiers, player, args); } - applyModifiers(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier[] { + applyModifiers(modifierType: Constructor, 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); } @@ -2384,7 +2461,7 @@ export default class BattleScene extends SceneBase { return appliedModifiers; } - applyModifier(modifierType: { new(...args: any[]): Modifier }, player: boolean = true, ...args: any[]): PersistentModifier { + applyModifier(modifierType: Constructor, 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)) { @@ -2396,7 +2473,7 @@ export default class BattleScene extends SceneBase { return null; } - triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: { new(...args: any[]): SpeciesFormChangeTrigger }, delayed: boolean = false, modal: boolean = false): boolean { + triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: Constructor, 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) { @@ -2420,7 +2497,7 @@ export default class BattleScene extends SceneBase { return false; } - validateAchvs(achvType: { new(...args: any[]): Achv }, ...args: any[]): void { + validateAchvs(achvType: Constructor, ...args: unknown[]): void { const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); for (const achv of filteredAchvs) { this.validateAchv(achv, args); diff --git a/src/battle.ts b/src/battle.ts index 97fd8dd064c..c3a481e9956 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -7,6 +7,7 @@ import { GameMode } from "./game-mode"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import {trainerConfigs} from "#app/data/trainer-config"; +import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleSpec } from "#enums/battle-spec"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; @@ -166,6 +167,10 @@ export default class Battle { const moneyAmount = new Utils.IntegerHolder(scene.currentBattle.moneyScattered); scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + scene.addMoney(moneyAmount.value); scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); @@ -306,6 +311,9 @@ export default class Battle { if (pokemon.species.speciesId === Species.WO_CHIEN || pokemon.species.speciesId === Species.CHIEN_PAO || pokemon.species.speciesId === Species.TING_LU || pokemon.species.speciesId === Species.CHI_YU) { return "battle_legendary_ruinous"; } + if (pokemon.species.speciesId === Species.KORAIDON || pokemon.species.speciesId === Species.MIRAIDON) { + return "battle_legendary_kor_mir"; + } if (pokemon.species.speciesId === Species.OKIDOGI || pokemon.species.speciesId === Species.MUNKIDORI || pokemon.species.speciesId === Species.FEZANDIPITI) { return "battle_legendary_loyal_three"; } @@ -426,8 +434,8 @@ export interface FixedBattleConfigs { /** * Youngster/Lass on 5 * Rival on 8, 55, 95, 145, 195 - * Evil team grunts on 35, 62, 64, 65, 112, 114 (Not currently spawning) - * Evil leader on 115, 165 (Not currently spawning) + * Evil team grunts on 35, 62, 64, 66, 112, 114 + * Evil leader on 115, 165 * E4 on 182, 184, 186, 188 * Champion on 190 */ @@ -438,28 +446,28 @@ export const classicFixedBattles: FixedBattleConfigs = { .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)), - // [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [35]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [55]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_3, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [65]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [62]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [64]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [66]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), [95]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_4, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), - // [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), + [112]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [114]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_GRUNT, TrainerType.MAGMA_GRUNT, TrainerType.AQUA_GRUNT, TrainerType.GALACTIC_GRUNT, TrainerType.PLASMA_GRUNT, TrainerType.FLARE_GRUNT ])), + [115]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_1, TrainerType.MAXIE, TrainerType.ARCHIE, TrainerType.CYRUS, TrainerType.GHETSIS, TrainerType.LYSANDRE ])), [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), - // [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) - // .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), + [165]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(35) + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.ROCKET_BOSS_GIOVANNI_2, TrainerType.MAXIE_2, TrainerType.ARCHIE_2, TrainerType.CYRUS_2, TrainerType.GHETSIS_2, TrainerType.LYSANDRE_2 ])), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) diff --git a/src/data/ability.ts b/src/data/ability.ts old mode 100755 new mode 100644 index f0c6443eca6..eb55f661e66 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,20 +1,22 @@ import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { Type } from "./type"; +import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { BattleStat, getBattleStatName } from "./battle-stat"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; -import { BattlerTag } from "./battler-tags"; +import { BattlerTag, GroundedTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { Stat, getStatName } from "./pokemon-stat"; import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { TerrainType } from "./terrain"; import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; -import i18next, { Localizable } from "#app/plugins/i18n.js"; +import i18next from "i18next"; +import { Localizable } from "#app/interfaces/locales.js"; import { Command } from "../ui/command-ui-handler"; import { BerryModifierType } from "#app/modifier/modifier-type"; import { getPokeballName } from "./pokeball"; @@ -60,7 +62,7 @@ export class Ability implements Localizable { * @param attrType any attribute that extends {@linkcode AbAttr} * @returns Array of attributes that match `attrType`, Empty Array if none match. */ - getAttrs(attrType: new(...args: any[]) => T ): T[] { + getAttrs(attrType: Constructor ): T[] { return this.attrs.filter((a): a is T => a instanceof attrType); } @@ -69,18 +71,18 @@ export class Ability implements Localizable { * @param attrType any attribute that extends {@linkcode AbAttr} * @returns true if the ability has attribute `attrType` */ - hasAttr(attrType: new(...args: any[]) => T): boolean { + hasAttr(attrType: Constructor): boolean { return this.attrs.some((attr) => attr instanceof attrType); } - attr AbAttr>(AttrType: T, ...args: ConstructorParameters): Ability { + attr>(AttrType: T, ...args: ConstructorParameters): Ability { const attr = new AttrType(...args); this.attrs.push(attr); return this; } - conditionalAttr AbAttr>(condition: AbAttrCondition, AttrType: T, ...args: ConstructorParameters): Ability { + conditionalAttr>(condition: AbAttrCondition, AttrType: T, ...args: ConstructorParameters): Ability { const attr = new AttrType(...args); attr.addCondition(condition); this.attrs.push(attr); @@ -299,18 +301,19 @@ export class StabBoostAbAttr extends AbAttr { export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { protected condition: PokemonDefendCondition; - private powerMultiplier: number; + private damageMultiplier: number; - constructor(condition: PokemonDefendCondition, powerMultiplier: number) { + constructor(condition: PokemonDefendCondition, damageMultiplier: number) { super(); this.condition = condition; - this.powerMultiplier = powerMultiplier; + this.damageMultiplier = damageMultiplier; } applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value *= this.powerMultiplier; + (args[0] as Utils.NumberHolder).value = Math.floor((args[0] as Utils.NumberHolder).value * this.damageMultiplier); + return true; } @@ -319,19 +322,19 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { } export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { - constructor(moveType: Type, powerMultiplier: number) { - super((user, target, move) => move.type === moveType, powerMultiplier); + constructor(moveType: Type, damageMultiplier: number) { + super((user, target, move) => move.type === moveType, damageMultiplier); } } -export class PreDefendMovePowerToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr { +export class PreDefendMoveDamageToOneAbAttr extends ReceivedMoveDamageMultiplierAbAttr { constructor(condition: PokemonDefendCondition) { super(condition, 1); } applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (this.condition(pokemon, attacker, move)) { - (args[0] as Utils.NumberHolder).value = 1; + (args[0] as Utils.NumberHolder).value = Math.floor(pokemon.getMaxHp() / 8); return true; } @@ -574,6 +577,24 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { } } +/** + * Reduces the accuracy of status moves used against the Pokémon with this ability to 50%. + * Used by Wonder Skin. + * + * @extends PreDefendAbAttr + */ +export class WonderSkinAbAttr extends PreDefendAbAttr { + applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const moveAccuracy = args[0] as Utils.NumberHolder; + if (move.category === MoveCategory.STATUS && moveAccuracy.value >= 50) { + moveAccuracy.value = 50; + return true; + } + + return false; + } +} + export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr { private stat: BattleStat; private levels: integer; @@ -1026,6 +1047,56 @@ export class PreAttackAbAttr extends AbAttr { } } +/** + * Modifies moves additional effects with multipliers, ie. Sheer Force, Serene Grace. + * @extends AbAttr + * @see {@linkcode apply} + */ +export class MoveEffectChanceMultiplierAbAttr extends AbAttr { + private chanceMultiplier: number; + + constructor(chanceMultiplier?: number) { + super(true); + this.chanceMultiplier = chanceMultiplier; + } + /** + * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. Has to be higher than or equal to 0. + * [1]: {@linkcode Moves } Move used by the ability user. + */ + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + + if ((args[0] as Utils.NumberHolder).value <= 0 || (args[1] as Move).id === Moves.ORDER_UP) { + return false; + } + + (args[0] as Utils.NumberHolder).value *= this.chanceMultiplier; + (args[0] as Utils.NumberHolder).value = Math.min((args[0] as Utils.NumberHolder).value, 100); + return true; + + } +} + +/** + * Sets incoming moves additional effect chance to zero, ignoring all effects from moves. ie. Shield Dust. + * @extends PreDefendAbAttr + * @see {@linkcode applyPreDefend} + */ +export class IgnoreMoveEffectsAbAttr extends PreDefendAbAttr { + /** + * @param args [0]: {@linkcode Utils.NumberHolder} Move additional effect chance. + */ + applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { + + if ((args[0] as Utils.NumberHolder).value <= 0) { + return false; + } + + (args[0] as Utils.NumberHolder).value = 0; + return true; + + } +} + export class VariableMovePowerAbAttr extends PreAttackAbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { //const power = args[0] as Utils.NumberHolder; @@ -1160,6 +1231,84 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { } } +/** + * Class for abilities that convert single-strike moves to two-strike moves (i.e. Parental Bond). + * @param damageMultiplier the damage multiplier for the second strike, relative to the first. + */ +export class AddSecondStrikeAbAttr extends PreAttackAbAttr { + private damageMultiplier: number; + + constructor(damageMultiplier: number) { + super(false); + + this.damageMultiplier = damageMultiplier; + } + + /** + * Determines whether this attribute can apply to a given move. + * @param {Move} move the move to which this attribute may apply + * @param numTargets the number of {@linkcode Pokemon} targeted by this move + * @returns true if the attribute can apply to the move, false otherwise + */ + canApplyPreAttack(move: Move, numTargets: integer): boolean { + /** + * Parental Bond cannot apply to multi-hit moves, charging moves, or + * moves that cause the user to faint. + */ + const exceptAttrs: Constructor[] = [ + MultiHitAttr, + ChargeAttr, + SacrificialAttr, + SacrificialAttrOnHit + ]; + + /** Parental Bond cannot apply to these specific moves */ + const exceptMoves: Moves[] = [ + Moves.FLING, + Moves.UPROAR, + Moves.ROLLOUT, + Moves.ICE_BALL, + Moves.ENDEAVOR + ]; + + /** Also check if this move is an Attack move and if it's only targeting one Pokemon */ + return numTargets === 1 + && !exceptAttrs.some(attr => move.hasAttr(attr)) + && !exceptMoves.some(id => move.id === id) + && move.category !== MoveCategory.STATUS; + } + + /** + * If conditions are met, this doubles the move's hit count (via args[1]) + * or multiplies the damage of secondary strikes (via args[2]) + * @param {Pokemon} pokemon the Pokemon using the move + * @param passive n/a + * @param defender n/a + * @param {Move} move the move used by the ability source + * @param args\[0\] the number of Pokemon this move is targeting + * @param {Utils.IntegerHolder} args\[1\] the number of strikes with this move + * @param {Utils.NumberHolder} args\[2\] the damage multiplier for the current strike + * @returns + */ + applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { + const numTargets = args[0] as integer; + const hitCount = args[1] as Utils.IntegerHolder; + const multiplier = args[2] as Utils.NumberHolder; + + if (this.canApplyPreAttack(move, numTargets)) { + if (!!hitCount?.value) { + hitCount.value *= 2; + } + + if (!!multiplier?.value && pokemon.turnData.hitsLeft % 2 === 1 && pokemon.turnData.hitsLeft !== pokemon.turnData.hitCount) { + multiplier.value *= this.damageMultiplier; + } + return true; + } + return false; + } +} + /** * Class for abilities that boost the damage of moves * For abilities that boost the base power of moves, see VariableMovePowerAbAttr @@ -1264,17 +1413,18 @@ export class VariableMovePowerBoostAbAttr extends VariableMovePowerAbAttr { } } -export class FieldVariableMovePowerAbAttr extends AbAttr { - applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, args: any[]): boolean { - //const power = args[0] as Utils.NumberHolder; - return false; - } -} - -export class FieldMovePowerBoostAbAttr extends FieldVariableMovePowerAbAttr { +/** + * Boosts the power of a Pokémon's move under certain conditions. + * @extends AbAttr + */ +export class FieldMovePowerBoostAbAttr extends AbAttr { private condition: PokemonAttackCondition; private powerMultiplier: number; + /** + * @param condition - A function that determines whether the power boost condition is met. + * @param powerMultiplier - The multiplier to apply to the move's power when the condition is met. + */ constructor(condition: PokemonAttackCondition, powerMultiplier: number) { super(false); this.condition = condition; @@ -1292,12 +1442,34 @@ export class FieldMovePowerBoostAbAttr extends FieldVariableMovePowerAbAttr { } } +/** + * Boosts the power of a specific type of move. + * @extends FieldMovePowerBoostAbAttr + */ export class FieldMoveTypePowerBoostAbAttr extends FieldMovePowerBoostAbAttr { + /** + * @param boostedType - The type of move that will receive the power boost. + * @param powerMultiplier - The multiplier to apply to the move's power, defaults to 1.5 if not provided. + */ constructor(boostedType: Type, powerMultiplier?: number) { super((pokemon, defender, move) => move.type === boostedType, powerMultiplier || 1.5); } } +/** + * Boosts the power of moves in specified categories. + * @extends FieldMovePowerBoostAbAttr + */ +export class AllyMoveCategoryPowerBoostAbAttr extends FieldMovePowerBoostAbAttr { + /** + * @param boostedCategories - The categories of moves that will receive the power boost. + * @param powerMultiplier - The multiplier to apply to the move's power. + */ + constructor(boostedCategories: MoveCategory[], powerMultiplier: number) { + super((pokemon, defender, move) => boostedCategories.includes(move.category), powerMultiplier); + } +} + export class BattleStatMultiplierAbAttr extends AbAttr { private battleStat: BattleStat; private multiplier: number; @@ -1376,7 +1548,8 @@ export class PostAttackApplyStatusEffectAbAttr extends PostAttackAbAttr { } applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { + /**Status inflicted by abilities post attacking are also considered additional effects.*/ + if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; return attacker.trySetStatus(effect, true, pokemon); } @@ -1406,10 +1579,9 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { } applyPostAttack(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { + /**Battler tags inflicted by abilities post attacking are also considered additional effects.*/ + if (!attacker.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && pokemon !== attacker && (!this.contactRequired || move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) && pokemon.randSeedInt(100) < this.chance(attacker, pokemon, move) && !pokemon.status) { const effect = this.effects.length === 1 ? this.effects[0] : this.effects[pokemon.randSeedInt(this.effects.length)]; - - return attacker.addTag(effect); } @@ -1609,11 +1781,44 @@ export class PostIntimidateStatChangeAbAttr extends AbAttr { } } +/** + * Base class for defining all {@linkcode Ability} Attributes post summon + * @see {@linkcode applyPostSummon()} + */ export class PostSummonAbAttr extends AbAttr { + /** + * Applies ability post summon (after switching in) + * @param pokemon {@linkcode Pokemon} with this ability + * @param passive Whether this ability is a passive + * @param args Set of unique arguments needed by this attribute + * @returns true if application of the ability succeeds + */ applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { return false; } } +/** + * Removes specified arena tags when a Pokemon is summoned. + */ +export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr { + private arenaTags: ArenaTagType[]; + + /** + * @param arenaTags {@linkcode ArenaTagType[]} - the arena tags to be removed + */ + constructor(arenaTags: ArenaTagType[]) { + super(true); + + this.arenaTags = arenaTags; + } + + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { + for (const arenaTag of this.arenaTags) { + pokemon.scene.arena.removeTag(arenaTag); + } + return true; + } +} export class PostSummonMessageAbAttr extends PostSummonAbAttr { private messageFunc: (pokemon: Pokemon) => string; @@ -1859,7 +2064,11 @@ export class PostSummonFormChangeAbAttr extends PostSummonAbAttr { } } -export class TraceAbAttr extends PostSummonAbAttr { +/** Attempts to copy a pokemon's ability */ +export class PostSummonCopyAbilityAbAttr extends PostSummonAbAttr { + private target: Pokemon; + private targetAbilityName: string; + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const targets = pokemon.getOpponents(); if (!targets.length) { @@ -1873,17 +2082,57 @@ export class TraceAbAttr extends PostSummonAbAttr { 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) && + // Wonder Guard is normally uncopiable so has the attribute, but Trace specifically can copy it + !(pokemon.hasAbility(Abilities.TRACE) && target.getAbility().id === Abilities.WONDER_GUARD) + ) { return false; } + this.target = target; + this.targetAbilityName = allAbilities[target.getAbility().id].name; pokemon.summonData.ability = target.getAbility().id; - - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` traced ${target.name}'s\n${allAbilities[target.getAbility().id].name}!`)); + setAbilityRevealed(target); + pokemon.updateInfo(); return true; } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:trace", { + pokemonName: getPokemonNameWithAffix(pokemon), + targetName: getPokemonNameWithAffix(this.target), + abilityName: this.targetAbilityName, + }); + } +} + + +/** Attempt to copy the stat changes on an ally pokemon */ +export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr { + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + if (!pokemon.scene.currentBattle.double) { + return false; + } + + const ally = pokemon.getAlly(); + if (!ally || ally.summonData.battleStats.every((change) => change === 0)) { + return false; + } + + pokemon.summonData.battleStats = ally.summonData.battleStats; + pokemon.updateInfo(); + + return true; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:costar", { + pokemonName: getPokemonNameWithAffix(pokemon), + allyName: getPokemonNameWithAffix(pokemon.getAlly()), + }); + } } export class PostSummonTransformAbAttr extends PostSummonAbAttr { @@ -2234,7 +2483,7 @@ export class BlockNonDirectDamageAbAttr extends AbAttr { /** * This attribute will block any status damage that you put in the parameter. */ -export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { +export class BlockStatusDamageAbAttr extends AbAttr { private effects: StatusEffect[]; /** @@ -2254,7 +2503,7 @@ export class BlockStatusDamageAbAttr extends BlockNonDirectDamageAbAttr { * @returns Returns true if status damage is blocked */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (this.effects.includes(pokemon.status.effect)) { + if (this.effects.includes(pokemon.status?.effect)) { cancelled.value = true; return true; } @@ -2337,8 +2586,40 @@ export class SuppressWeatherEffectAbAttr extends PreWeatherEffectAbAttr { } } +/** + * Condition function to applied to abilities related to Sheer Force. + * Checks if last move used against target was affected by a Sheer Force user and: + * Disables: Color Change, Pickpocket, Wimp Out, Emergency Exit, Berserk, Anger Shell + * @returns {AbAttrCondition} If false disables the ability which the condition is applied to. + */ +function getSheerForceHitDisableAbCondition(): AbAttrCondition { + return (pokemon: Pokemon) => { + if (!pokemon.turnData) { + return true; + } + + const lastReceivedAttack = pokemon.turnData.attacksReceived[0]; + if (!lastReceivedAttack) { + return true; + } + + const lastAttacker = pokemon.getOpponents().find(p => p.id === lastReceivedAttack.sourceId); + if (!lastAttacker) { + return true; + } + + /**if the last move chance is greater than or equal to cero, and the last attacker's ability is sheer force*/ + const SheerForceAffected = allMoves[lastReceivedAttack.move].chance >= 0 && lastAttacker.hasAbility(Abilities.SHEER_FORCE); + + return !SheerForceAffected; + }; +} + function getWeatherCondition(...weatherTypes: WeatherType[]): AbAttrCondition { return (pokemon: Pokemon) => { + if (!pokemon.scene?.arena) { + return false; + } if (pokemon.scene.arena.weather?.isEffectSuppressed(pokemon.scene)) { return false; } @@ -2439,6 +2720,7 @@ export class FriskAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { for (const opponent of pokemon.getOpponents()) { pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "'s " + opponent.getAbility().name + "!")); + setAbilityRevealed(opponent); } return true; } @@ -2523,15 +2805,11 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { } applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { - const scene = pokemon.scene; - const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); - pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); - return true; - } - - return false; + const scene = pokemon.scene; + const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; + scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); + pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); + return true; } } @@ -2632,7 +2910,7 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { } if (this.target?.status) { - this.target.scene.queueMessage(getPokemonMessage(this.target, getStatusEffectHealText(this.target.status?.effect))); + this.target.scene.queueMessage(getStatusEffectHealText(this.target.status?.effect, getPokemonNameWithAffix(this.target))); this.target.resetStatus(false); this.target.updateInfo(); return true; @@ -3393,6 +3671,9 @@ export class SuppressFieldAbilitiesAbAttr extends AbAttr { export class AlwaysHitAbAttr extends AbAttr { } +/** Attribute for abilities that allow moves that make contact to ignore protection (i.e. Unseen Fist) */ +export class IgnoreProtectOnContactAbAttr extends AbAttr { } + export class UncopiableAbilityAbAttr extends AbAttr { constructor() { super(false); @@ -3534,13 +3815,21 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt } /** - * Applies immunity to physical moves. + * Takes no damage from the first hit of a physical move. * This is used in Ice Face ability. */ -export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr { +export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAttr { + private multiplier: number; + + constructor(condition: PokemonDefendCondition, multiplier: number) { + super(condition, multiplier); + + this.multiplier = multiplier; + } + /** * Applies the Ice Face pre-defense ability to the Pokémon. - * Removes BattlerTagType.ICE_FACE hit by physical attack and is in Ice Face form. + * Removes BattlerTagType.ICE_FACE when hit by physical attack and is in Ice Face form. * * @param {Pokemon} pokemon - The Pokémon with the Ice Face ability. * @param {boolean} passive - Whether the ability is passive. @@ -3551,16 +3840,13 @@ export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr { * @returns {boolean} - Whether the immunity was applied. */ applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - const isImmune = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); - - if (isImmune) { - const simulated = args.length > 1 && args[1]; - if (!simulated) { - pokemon.removeTag(BattlerTagType.ICE_FACE); - } + if (this.condition(pokemon, attacker, move)) { + (args[0] as Utils.NumberHolder).value = this.multiplier; + pokemon.removeTag(BattlerTagType.ICE_FACE); + return true; } - return isImmune; + return false; } /** @@ -3575,7 +3861,55 @@ export class IceFaceMoveImmunityAbAttr extends MoveImmunityAbAttr { } } -function applyAbAttrsInternal(attrType: { new(...args: any[]): TAttr }, +/** + * If a Pokémon with this Ability selects a damaging move, it has a 30% chance of going first in its priority bracket. If the Ability activates, this is announced at the start of the turn (after move selection). + * + * @extends AbAttr + */ +export class BypassSpeedChanceAbAttr extends AbAttr { + public chance: integer; + + /** + * @param {integer} chance probability of ability being active. + */ + constructor(chance: integer) { + super(true); + this.chance = chance; + } + + /** + * bypass move order in their priority bracket when pokemon choose damaging move + * @param {Pokemon} pokemon {@linkcode Pokemon} the Pokemon applying this ability + * @param {boolean} passive N/A + * @param {Utils.BooleanHolder} cancelled N/A + * @param {any[]} args [0] {@linkcode Utils.BooleanHolder} set to true when the ability activated + * @returns {boolean} - whether the ability was activated. + */ + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const bypassSpeed = args[0] as Utils.BooleanHolder; + + if (!bypassSpeed.value && pokemon.randSeedInt(100) < this.chance) { + const turnCommand = + pokemon.scene.currentBattle.turnCommands[pokemon.getBattlerIndex()]; + const isCommandFight = turnCommand?.command === Command.FIGHT; + const move = allMoves[turnCommand.move?.move]; + const isDamageMove = move?.category === MoveCategory.PHYSICAL || move?.category === MoveCategory.SPECIAL; + + if (isCommandFight && isDamageMove) { + bypassSpeed.value = true; + return true; + } + } + + return false; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { + return i18next.t("abilityTriggers:quickDraw", {pokemonName: getPokemonNameWithAffix(pokemon)}); + } +} + +function applyAbAttrsInternal(attrType: Constructor, pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { return new Promise(resolve => { if (!pokemon.canApplyAbility(passive)) { @@ -3590,7 +3924,7 @@ function applyAbAttrsInternal(attrType: { new(...args: any const attrs = ability.getAttrs(attrType); const clearSpliceQueueAndResolve = () => { - pokemon.scene.clearPhaseQueueSplice(); + pokemon.scene?.clearPhaseQueueSplice(); if (!passive) { return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); } else { @@ -3653,32 +3987,32 @@ function applyAbAttrsInternal(attrType: { new(...args: any }); } -export function applyAbAttrs(attrType: { new(...args: any[]): AbAttr }, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { +export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, cancelled, args), args); } -export function applyPostBattleInitAbAttrs(attrType: { new(...args: any[]): PostBattleInitAbAttr }, +export function applyPostBattleInitAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattleInit(pokemon, passive, args), args); } -export function applyPreDefendAbAttrs(attrType: { new(...args: any[]): PreDefendAbAttr }, +export function applyPreDefendAbAttrs(attrType: Constructor, pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated); } -export function applyPostDefendAbAttrs(attrType: { new(...args: any[]): PostDefendAbAttr }, +export function applyPostDefendAbAttrs(attrType: Constructor, pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, attacker, move, hitResult, args), args); } -export function applyPostMoveUsedAbAttrs(attrType: { new(...args: any[]): PostMoveUsedAbAttr }, +export function applyPostMoveUsedAbAttrs(attrType: Constructor, pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, args), args); } -export function applyBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]): BattleStatMultiplierAbAttr }, +export function applyBattleStatMultiplierAbAttrs(attrType: Constructor, pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, battleStat, statValue, args), args); } @@ -3693,98 +4027,98 @@ export function applyBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]) * @param hasApplied {@linkcode Utils.BooleanHolder} whether or not a FieldMultiplyBattleStatAbAttr has already affected this stat * @param args unused */ -export function applyFieldBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]): FieldMultiplyBattleStatAbAttr }, +export function applyFieldBattleStatMultiplierAbAttrs(attrType: Constructor, pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldBattleStat(pokemon, passive, stat, statValue, checkedPokemon, hasApplied, args), args); } -export function applyPreAttackAbAttrs(attrType: { new(...args: any[]): PreAttackAbAttr }, +export function applyPreAttackAbAttrs(attrType: Constructor, pokemon: Pokemon, defender: Pokemon, move: Move, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreAttack(pokemon, passive, defender, move, args), args); } -export function applyPostAttackAbAttrs(attrType: { new(...args: any[]): PostAttackAbAttr }, +export function applyPostAttackAbAttrs(attrType: Constructor, pokemon: Pokemon, defender: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostAttack(pokemon, passive, defender, move, hitResult, args), args); } -export function applyPostKnockOutAbAttrs(attrType: { new(...args: any[]): PostKnockOutAbAttr }, +export function applyPostKnockOutAbAttrs(attrType: Constructor, pokemon: Pokemon, knockedOut: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, knockedOut, args), args); } -export function applyPostVictoryAbAttrs(attrType: { new(...args: any[]): PostVictoryAbAttr }, +export function applyPostVictoryAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostVictory(pokemon, passive, args), args); } -export function applyPostSummonAbAttrs(attrType: { new(...args: any[]): PostSummonAbAttr }, +export function applyPostSummonAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostSummon(pokemon, passive, args), args); } -export function applyPreSwitchOutAbAttrs(attrType: { new(...args: any[]): PreSwitchOutAbAttr }, +export function applyPreSwitchOutAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true); } -export function applyPreStatChangeAbAttrs(attrType: { new(...args: any[]): PreStatChangeAbAttr }, +export function applyPreStatChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, stat: BattleStat, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatChange(pokemon, passive, stat, cancelled, args), args); } -export function applyPostStatChangeAbAttrs(attrType: { new(...args: any[]): PostStatChangeAbAttr }, +export function applyPostStatChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, stats: BattleStat[], levels: integer, selfTarget: boolean, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostStatChange(pokemon, stats, levels, selfTarget, args), args); } -export function applyPreSetStatusAbAttrs(attrType: { new(...args: any[]): PreSetStatusAbAttr }, +export function applyPreSetStatusAbAttrs(attrType: Constructor, pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); } -export function applyPreApplyBattlerTagAbAttrs(attrType: { new(...args: any[]): PreApplyBattlerTagAbAttr }, +export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, pokemon: Pokemon, tag: BattlerTag, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreApplyBattlerTag(pokemon, passive, tag, cancelled, args), args); } -export function applyPreWeatherEffectAbAttrs(attrType: { new(...args: any[]): PreWeatherEffectAbAttr }, +export function applyPreWeatherEffectAbAttrs(attrType: Constructor, pokemon: Pokemon, weather: Weather, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, false, true); } -export function applyPostTurnAbAttrs(attrType: { new(...args: any[]): PostTurnAbAttr }, +export function applyPostTurnAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTurn(pokemon, passive, args), args); } -export function applyPostWeatherChangeAbAttrs(attrType: { new(...args: any[]): PostWeatherChangeAbAttr }, +export function applyPostWeatherChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, weather: WeatherType, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherChange(pokemon, passive, weather, args), args); } -export function applyPostWeatherLapseAbAttrs(attrType: { new(...args: any[]): PostWeatherLapseAbAttr }, +export function applyPostWeatherLapseAbAttrs(attrType: Constructor, pokemon: Pokemon, weather: Weather, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostWeatherLapse(pokemon, passive, weather, args), args); } -export function applyPostTerrainChangeAbAttrs(attrType: { new(...args: any[]): PostTerrainChangeAbAttr }, +export function applyPostTerrainChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, terrain: TerrainType, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostTerrainChange(pokemon, passive, terrain, args), args); } -export function applyCheckTrappedAbAttrs(attrType: { new(...args: any[]): CheckTrappedAbAttr }, +export function applyCheckTrappedAbAttrs(attrType: Constructor, pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args, true); } -export function applyPostBattleAbAttrs(attrType: { new(...args: any[]): PostBattleAbAttr }, +export function applyPostBattleAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostBattle(pokemon, passive, args), args); } -export function applyPostFaintAbAttrs(attrType: { new(...args: any[]): PostFaintAbAttr }, +export function applyPostFaintAbAttrs(attrType: Constructor, pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, attacker, move, hitResult, args), args); } @@ -3799,6 +4133,17 @@ function queueShowAbility(pokemon: Pokemon, passive: boolean): void { pokemon.scene.clearPhaseQueueSplice(); } +/** + * Sets the ability of a Pokémon as revealed. + * + * @param pokemon - The Pokémon whose ability is being revealed. + */ +function setAbilityRevealed(pokemon: Pokemon): void { + if (pokemon.battleData) { + pokemon.battleData.abilityRevealed = true; + } +} + export const allAbilities = [ new Ability(Abilities.NONE, 3) ]; export function initAbilities() { @@ -3852,7 +4197,8 @@ export function initAbilities() { .attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY) .ignorable(), new Ability(Abilities.COLOR_CHANGE, 3) - .attr(PostDefendTypeChangeAbAttr), + .attr(PostDefendTypeChangeAbAttr) + .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.IMMUNITY, 3) .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) .ignorable(), @@ -3860,8 +4206,8 @@ export function initAbilities() { .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1, (pokemon: Pokemon) => !pokemon.status || pokemon.status.effect !== StatusEffect.FREEZE) .ignorable(), new Ability(Abilities.SHIELD_DUST, 3) - .ignorable() - .unimplemented(), + .attr(IgnoreMoveEffectsAbAttr) + .partial(), new Ability(Abilities.OWN_TEMPO, 3) .attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED) .attr(IntimidateImmunityAbAttr) @@ -3887,7 +4233,7 @@ export function initAbilities() { .attr(UnswappableAbilityAbAttr) .ignorable(), new Ability(Abilities.LEVITATE, 3) - .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(BattlerTagType.IGNORE_FLYING) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY) && !pokemon.getTag(BattlerTagType.GROUNDED)) + .attr(TypeImmunityAbAttr, Type.GROUND, (pokemon: Pokemon) => !pokemon.getTag(GroundedTag) && !pokemon.scene.arena.getTag(ArenaTagType.GRAVITY)) .ignorable(), new Ability(Abilities.EFFECT_SPORE, 3) .attr(EffectSporeAbAttr), @@ -3904,7 +4250,8 @@ export function initAbilities() { .attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPATK, 1) .ignorable(), new Ability(Abilities.SERENE_GRACE, 3) - .unimplemented(), + .attr(MoveEffectChanceMultiplierAbAttr, 2) + .partial(), new Ability(Abilities.SWIFT_SWIM, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2) .condition(getWeatherCondition(WeatherType.RAIN, WeatherType.HEAVY_RAIN)), @@ -3916,7 +4263,7 @@ export function initAbilities() { .attr(DoubleBattleChanceAbAttr) .ignorable(), new Ability(Abilities.TRACE, 3) - .attr(TraceAbAttr) + .attr(PostSummonCopyAbilityAbAttr) .attr(UncopiableAbilityAbAttr), new Ability(Abilities.HUGE_POWER, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2), @@ -4180,9 +4527,12 @@ export function initAbilities() { new Ability(Abilities.BAD_DREAMS, 4) .attr(PostTurnHurtIfSleepingAbAttr), new Ability(Abilities.PICKPOCKET, 5) - .attr(PostDefendStealHeldItemAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT)), + .attr(PostDefendStealHeldItemAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT)) + .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.SHEER_FORCE, 5) - .unimplemented(), + .attr(MovePowerBoostAbAttr, (user, target, move) => move.chance >= 1, 5461/4096) + .attr(MoveEffectChanceMultiplierAbAttr, 0) + .partial(), new Ability(Abilities.CONTRARY, 5) .attr(StatChangeMultiplierAbAttr, -1) .ignorable(), @@ -4247,8 +4597,8 @@ export function initAbilities() { .attr(BlockWeatherDamageAttr, WeatherType.SANDSTORM) .condition(getWeatherCondition(WeatherType.SANDSTORM)), new Ability(Abilities.WONDER_SKIN, 5) - .ignorable() - .unimplemented(), + .attr(WonderSkinAbAttr) + .ignorable(), new Ability(Abilities.ANALYTIC, 5) .attr(MovePowerBoostAbAttr, (user, target, move) => !!target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command !== Command.FIGHT, 1.3), new Ability(Abilities.ILLUSION, 5) @@ -4316,8 +4666,8 @@ export function initAbilities() { .attr(HealFromBerryUseAbAttr, 1/3) .partial(), // Healing not blocked by Heal Block new Ability(Abilities.PROTEAN, 6) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.PROTEAN)), //Gen 9 Implementation new Ability(Abilities.FUR_COAT, 6) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, 0.5) .ignorable(), @@ -4360,7 +4710,7 @@ export function initAbilities() { new Ability(Abilities.AERILATE, 6) .attr(MoveTypeChangeAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL), new Ability(Abilities.PARENTAL_BOND, 6) - .unimplemented(), + .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Dark Aura!")) .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), @@ -4369,7 +4719,8 @@ export function initAbilities() { .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() - .unimplemented(), + .conditionalAttr(target => target.hasAbility(Abilities.DARK_AURA), FieldMoveTypePowerBoostAbAttr, Type.DARK, 9 / 16) + .conditionalAttr(target => target.hasAbility(Abilities.FAIRY_AURA), FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 9 / 16), new Ability(Abilities.PRIMORDIAL_SEA, 6) .attr(PostSummonWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.HEAVY_RAIN) @@ -4391,8 +4742,10 @@ export function initAbilities() { new Ability(Abilities.STAMINA, 7) .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1), new Ability(Abilities.WIMP_OUT, 7) + .condition(getSheerForceHitDisableAbCondition()) .unimplemented(), new Ability(Abilities.EMERGENCY_EXIT, 7) + .condition(getSheerForceHitDisableAbCondition()) .unimplemented(), new Ability(Abilities.WATER_COMPACTION, 7) .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.WATER && move.category !== MoveCategory.STATUS, BattleStat.DEF, 2), @@ -4418,7 +4771,8 @@ export function initAbilities() { new Ability(Abilities.STEELWORKER, 7) .attr(MoveTypePowerBoostAbAttr, Type.STEEL), new Ability(Abilities.BERSERK, 7) - .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [BattleStat.SPATK], 1), + .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [BattleStat.SPATK], 1) + .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.SLUSH_RUSH, 7) .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2) .condition(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW)), @@ -4442,7 +4796,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .bypassFaint(), new Ability(Abilities.DISGUISE, 7) - .attr(PreDefendMovePowerToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) + .attr(PreDefendMoveDamageToOneAbAttr, (target, user, move) => target.formIndex === 0 && target.getAttackTypeEffectiveness(move.type, user) > 0) .attr(PostSummonFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) .attr(PostBattleInitFormChangeAbAttr, () => 0) .attr(PostDefendFormChangeAbAttr, p => p.battleData.hitCount === 0 ? 0 : 1) @@ -4492,7 +4846,7 @@ export function initAbilities() { new Ability(Abilities.DANCER, 7) .attr(PostDancingMoveAbAttr), new Ability(Abilities.BATTERY, 7) - .unimplemented(), + .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL], 1.3), new Ability(Abilities.FLUFFY, 7) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), 0.5) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.type === Type.FIRE, 2) @@ -4556,8 +4910,8 @@ export function initAbilities() { .attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true) .condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)), new Ability(Abilities.LIBERO, 8) - .attr(PokemonTypeChangeAbAttr) - .condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), + .attr(PokemonTypeChangeAbAttr), + //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation new Ability(Abilities.BALL_FETCH, 8) .attr(FetchBallAbAttr) .condition(getOncePerBattleCondition(Abilities.BALL_FETCH)), @@ -4601,14 +4955,14 @@ export function initAbilities() { .conditionalAttr(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW), PostSummonAddBattlerTagAbAttr, BattlerTagType.ICE_FACE, 0) // When weather changes to HAIL or SNOW while pokemon is fielded, add BattlerTagType.ICE_FACE .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.ICE_FACE, 0, WeatherType.HAIL, WeatherType.SNOW) - .attr(IceFaceMoveImmunityAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE)) + .attr(IceFaceBlockPhysicalAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL && !!target.getTag(BattlerTagType.ICE_FACE), 0) .ignorable(), new Ability(Abilities.POWER_SPOT, 8) - .unimplemented(), + .attr(AllyMoveCategoryPowerBoostAbAttr, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3), new Ability(Abilities.MIMICRY, 8) .unimplemented(), new Ability(Abilities.SCREEN_CLEANER, 8) - .unimplemented(), + .attr(PostSummonRemoveArenaTagAbAttr, [ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT]), new Ability(Abilities.STEELY_SPIRIT, 8) .attr(MoveTypePowerBoostAbAttr, Type.STEEL) .partial(), @@ -4639,9 +4993,9 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .condition((pokemon) => !pokemon.isTerastallized()), new Ability(Abilities.QUICK_DRAW, 8) - .unimplemented(), + .attr(BypassSpeedChanceAbAttr, 30), new Ability(Abilities.UNSEEN_FIST, 8) - .unimplemented(), + .attr(IgnoreProtectOnContactAbAttr), new Ability(Abilities.CURIOUS_MEDICINE, 8) .attr(PostSummonClearAllyStatsAbAttr), new Ability(Abilities.TRANSISTOR, 8) @@ -4677,7 +5031,8 @@ export function initAbilities() { .ignorable(), new Ability(Abilities.ANGER_SHELL, 9) .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], 1) - .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.DEF, BattleStat.SPDEF ], -1), + .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.DEF, BattleStat.SPDEF ], -1) + .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.PURIFYING_SALT, 9) .attr(StatusEffectImmunityAbAttr) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5) @@ -4764,7 +5119,7 @@ export function initAbilities() { .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5)) .partial(), new Ability(Abilities.COSTAR, 9) - .unimplemented(), + .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) .attr(PostDefendApplyArenaTrapTagAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, ArenaTagType.TOXIC_SPIKES) .bypassFaint(), diff --git a/src/data/api.ts b/src/data/api-generator.script.ts similarity index 100% rename from src/data/api.ts rename to src/data/api-generator.script.ts diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index b1c1b46487c..28d38daffb4 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -4,7 +4,7 @@ import * as Utils from "../utils"; import { MoveCategory, allMoves, MoveTarget } from "./move"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; -import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase} from "../phases"; +import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; import { BattlerIndex } from "../battle"; import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; @@ -63,6 +63,10 @@ export abstract class ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mist_(move) Mist}. + * Prevents Pokémon on the opposing side from lowering the stats of the Pokémon in the Mist. + */ export class MistTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.MIST, turnCount, Moves.MIST, sourceId, side); @@ -86,37 +90,57 @@ export class MistTag extends ArenaTag { } } +/** + * Reduces the damage of specific move categories in the arena. + * @extends ArenaTag + */ export class WeakenMoveScreenTag extends ArenaTag { - constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide) { + protected weakenedCategories: MoveCategory[]; + + /** + * Creates a new instance of the WeakenMoveScreenTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param weakenedCategories - The categories of moves that are weakened by this tag. + */ + constructor(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, weakenedCategories: MoveCategory[]) { super(tagType, turnCount, sourceMove, sourceId, side); + + this.weakenedCategories = weakenedCategories; } + /** + * Applies the weakening effect to the move. + * + * @param arena - The arena where the move is applied. + * @param args - The arguments for the move application. + * @param args[0] - The category of the move. + * @param args[1] - A boolean indicating whether it is a double battle. + * @param args[2] - An object of type `Utils.NumberHolder` that holds the damage multiplier + * + * @returns True if the move was weakened, otherwise false. + */ apply(arena: Arena, args: any[]): boolean { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } -} - -class ReflectTag extends WeakenMoveScreenTag { - constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.PHYSICAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } + if (this.weakenedCategories.includes((args[0] as MoveCategory))) { + (args[2] as Utils.NumberHolder).value = (args[1] as boolean) ? 2732/4096 : 0.5; return true; } return false; } +} + +/** + * Reduces the damage of physical moves. + * Used by {@linkcode Moves.REFLECT} + */ +class ReflectTag extends WeakenMoveScreenTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.REFLECT, turnCount, Moves.REFLECT, sourceId, side, [MoveCategory.PHYSICAL]); + } onAdd(arena: Arena, quiet: boolean = false): void { if (!quiet) { @@ -125,21 +149,13 @@ class ReflectTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of special moves. + * Used by {@linkcode Moves.LIGHT_SCREEN} + */ class LightScreenTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side); - } - - apply(arena: Arena, args: any[]): boolean { - if ((args[0] as MoveCategory) === MoveCategory.SPECIAL) { - if ((args[1] as boolean)) { - (args[2] as Utils.NumberHolder).value = 2732/4096; - } else { - (args[2] as Utils.NumberHolder).value = 0.5; - } - return true; - } - return false; + super(ArenaTagType.LIGHT_SCREEN, turnCount, Moves.LIGHT_SCREEN, sourceId, side, [MoveCategory.SPECIAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -149,9 +165,13 @@ class LightScreenTag extends WeakenMoveScreenTag { } } +/** + * Reduces the damage of physical and special moves. + * Used by {@linkcode Moves.AURORA_VEIL} + */ class AuroraVeilTag extends WeakenMoveScreenTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { - super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side); + super(ArenaTagType.AURORA_VEIL, turnCount, Moves.AURORA_VEIL, sourceId, side, [MoveCategory.SPECIAL, MoveCategory.PHYSICAL]); } onAdd(arena: Arena, quiet: boolean = false): void { @@ -283,6 +303,10 @@ class CraftyShieldTag extends ConditionalProtectTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wish_(move) Wish}. + * Heals the Pokémon in the user's position the turn after Wish is used. + */ class WishTag extends ArenaTag { private battlerIndex: BattlerIndex; private triggerMessage: string; @@ -308,9 +332,21 @@ class WishTag extends ArenaTag { } } +/** + * Abstract class to implement weakened moves of a specific type. + */ export class WeakenMoveTypeTag extends ArenaTag { private weakenedType: Type; + /** + * Creates a new instance of the WeakenMoveTypeTag class. + * + * @param tagType - The type of the arena tag. + * @param turnCount - The number of turns the tag is active. + * @param type - The type being weakened from this tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + */ constructor(tagType: ArenaTagType, turnCount: integer, type: Type, sourceMove: Moves, sourceId: integer) { super(tagType, turnCount, sourceMove, sourceId); @@ -327,6 +363,10 @@ export class WeakenMoveTypeTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mud_Sport_(move) Mud Sport}. + * Weakens Electric type moves for a set amount of turns, usually 5. + */ class MudSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.MUD_SPORT, turnCount, Type.ELECTRIC, Moves.MUD_SPORT, sourceId); @@ -341,6 +381,10 @@ class MudSportTag extends WeakenMoveTypeTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Water_Sport_(move) Water Sport}. + * Weakens Fire type moves for a set amount of turns, usually 5. + */ class WaterSportTag extends WeakenMoveTypeTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.WATER_SPORT, turnCount, Type.FIRE, Moves.WATER_SPORT, sourceId); @@ -355,10 +399,22 @@ class WaterSportTag extends WeakenMoveTypeTag { } } +/** + * Abstract class to implement arena traps. + */ export class ArenaTrapTag extends ArenaTag { public layers: integer; public maxLayers: integer; + /** + * Creates a new instance of the ArenaTrapTag class. + * + * @param tagType - The type of the arena tag. + * @param sourceMove - The move that created the tag. + * @param sourceId - The ID of the source of the tag. + * @param side - The side (player or enemy) the tag affects. + * @param maxLayers - The maximum amount of layers this tag can have. + */ constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, maxLayers: integer) { super(tagType, 0, sourceMove, sourceId, side); @@ -392,6 +448,11 @@ export class ArenaTrapTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Spikes_(move) Spikes}. + * Applies up to 3 layers of Spikes, dealing 1/8th, 1/6th, or 1/4th of the the Pokémon's HP + * in damage for 1, 2, or 3 layers of Spikes respectively if they are summoned into this trap. + */ class SpikesTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.SPIKES, Moves.SPIKES, sourceId, side, 3); @@ -428,6 +489,12 @@ class SpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Spikes_(move) Toxic Spikes}. + * Applies up to 2 layers of Toxic Spikes, poisoning or badly poisoning any Pokémon who is + * summoned into this trap if 1 or 2 layers of Toxic Spikes respectively are up. Poison-type + * Pokémon summoned into this trap remove it entirely. + */ class ToxicSpikesTag extends ArenaTrapTag { private neutralized: boolean; @@ -481,6 +548,11 @@ class ToxicSpikesTag extends ArenaTrapTag { } } +/** + * Arena Tag class for delayed attacks, such as {@linkcode Moves.FUTURE_SIGHT} or {@linkcode Moves.DOOM_DESIRE}. + * Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used), + * and deals damage after the turn count is reached. + */ class DelayedAttackTag extends ArenaTag { public targetIndex: BattlerIndex; @@ -503,6 +575,11 @@ class DelayedAttackTag extends ArenaTag { onRemove(arena: Arena): void { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Stealth_Rock_(move) Stealth Rock}. + * Applies up to 1 layer of Stealth Rocks, dealing percentage-based damage to any Pokémon + * who is summoned into the trap, based on the Rock type's type effectiveness. + */ class StealthRockTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STEALTH_ROCK, Moves.STEALTH_ROCK, sourceId, side, 1); @@ -574,6 +651,11 @@ class StealthRockTag extends ArenaTrapTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Web_(move) Sticky Web}. + * Applies up to 1 layer of Sticky Web, which lowers the Speed by one stage + * to any Pokémon who is summoned into this trap. + */ class StickyWebTag extends ArenaTrapTag { constructor(sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.STICKY_WEB, Moves.STICKY_WEB, sourceId, side, 1); @@ -606,6 +688,11 @@ class StickyWebTag extends ArenaTrapTag { } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Trick_Room_(move) Trick Room}. + * Reverses the Speed stats for all Pokémon on the field as long as this arena tag is up, + * also reversing the turn order for all Pokémon on the field as well. + */ export class TrickRoomTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer) { super(ArenaTagType.TRICK_ROOM, turnCount, Moves.TRICK_ROOM, sourceId); @@ -626,6 +713,11 @@ export class TrickRoomTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) Gravity}. + * Grounds all Pokémon on the field, including Flying-types and those with + * {@linkcode Abilities.LEVITATE} for the duration of the arena tag, usually 5 turns. + */ export class GravityTag extends ArenaTag { constructor(turnCount: integer) { super(ArenaTagType.GRAVITY, turnCount, Moves.GRAVITY); @@ -633,6 +725,11 @@ export class GravityTag extends ArenaTag { onAdd(arena: Arena): void { arena.scene.queueMessage("Gravity intensified!"); + arena.scene.getField(true).forEach((pokemon) => { + if (pokemon !== null) { + pokemon.removeTag(BattlerTagType.MAGNET_RISEN); + } + }); } onRemove(arena: Arena): void { @@ -640,6 +737,11 @@ export class GravityTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Tailwind_(move) Tailwind}. + * Doubles the Speed of the Pokémon who created this arena tag, as well as all allied Pokémon. + * Applies this arena tag for 4 turns (including the turn the move was used). + */ class TailwindTag extends ArenaTag { constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { super(ArenaTagType.TAILWIND, turnCount, Moves.TAILWIND, sourceId, side); @@ -674,6 +776,24 @@ class TailwindTag extends ArenaTag { } } +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Happy_Hour_(move) Happy Hour}. + * Doubles the prize money from trainers and money moves like {@linkcode Moves.PAY_DAY} and {@linkcode Moves.MAKE_IT_RAIN}. + */ +class HappyHourTag extends ArenaTag { + constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.HAPPY_HOUR, turnCount, Moves.HAPPY_HOUR, sourceId, side); + } + + onAdd(arena: Arena): void { + arena.scene.queueMessage("Everyone is caught up in the happy atmosphere!"); + } + + onRemove(arena: Arena): void { + arena.scene.queueMessage("The atmosphere returned to normal."); + } +} + export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag { switch (tagType) { case ArenaTagType.MIST: @@ -715,5 +835,7 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov return new AuroraVeilTag(turnCount, sourceId, side); case ArenaTagType.TAILWIND: return new TailwindTag(turnCount, sourceId, side); + case ArenaTagType.HAPPY_HOUR: + return new HappyHourTag(turnCount, sourceId, side); } } diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 46e5a7dac8b..7dccd4f8a7c 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -1,3 +1,5 @@ +import i18next from "i18next"; + export enum BattleStat { ATK, DEF, @@ -12,52 +14,56 @@ export enum BattleStat { export function getBattleStatName(stat: BattleStat) { switch (stat) { case BattleStat.ATK: - return "Attack"; + return i18next.t("pokemonInfo:Stat.ATK"); case BattleStat.DEF: - return "Defense"; + return i18next.t("pokemonInfo:Stat.DEF"); case BattleStat.SPATK: - return "Sp. Atk"; + return i18next.t("pokemonInfo:Stat.SPATK"); case BattleStat.SPDEF: - return "Sp. Def"; + return i18next.t("pokemonInfo:Stat.SPDEF"); case BattleStat.SPD: - return "Speed"; + return i18next.t("pokemonInfo:Stat.SPD"); case BattleStat.ACC: - return "Accuracy"; + return i18next.t("pokemonInfo:Stat.ACC"); case BattleStat.EVA: - return "Evasiveness"; + return i18next.t("pokemonInfo:Stat.EVA"); 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"; +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { + const stringKey = (() => { + if (up) { + switch (levels) { + case 1: + return "battle:statRose"; + case 2: + return "battle:statSharplyRose"; + case 3: + case 4: + case 5: + case 6: + return "battle:statRoseDrastically"; + default: + return "battle:statWontGoAnyHigher"; + } + } else { + switch (levels) { + case 1: + return "battle:statFell"; + case 2: + return "battle:statHarshlyFell"; + case 3: + case 4: + case 5: + case 6: + return "battle:statSeverelyFell"; + default: + return "battle:statWontGoAnyLower"; + } } - } 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"; - } - } + })(); + + return i18next.t(stringKey, { pokemonNameWithAffix, stats }); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 977dceb8d30..015b8b44984 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -17,6 +17,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import i18next from "#app/plugins/i18n.js"; export enum BattlerTagLapseType { FAINT, @@ -105,7 +106,7 @@ export class RechargingTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { super.lapse(pokemon, lapseType); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " must\nrecharge!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); pokemon.getMoveQueue().shift(); @@ -134,7 +135,10 @@ export class TrappedTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` was freed\nfrom ${this.getMoveName()}!`)); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsTrappedOnRemove", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName() + })); } getDescriptor(): string { @@ -146,7 +150,7 @@ export class TrappedTag extends BattlerTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, " can no\nlonger escape!"); + return i18next.t("battle:battlerTagsTrappedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -169,7 +173,7 @@ export class FlinchedTag extends BattlerTag { super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " flinched!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -218,26 +222,26 @@ 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(i18next.t("battle:battlerTagsConfusedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " snapped\nout of confusion!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready confused!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsConfusedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } 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(i18next.t("battle:battlerTagsConfusedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); // 1/3 chance of hitting self with a 40 base power move @@ -245,7 +249,7 @@ export class ConfusedTag extends BattlerTag { 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(i18next.t("battle:battlerTagsConfusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); @@ -292,14 +296,17 @@ export class DestinyBondTag extends BattlerTag { return false; } - const targetMessage = getPokemonMessage(pokemon, ""); - if (pokemon.isBossImmune()) { - pokemon.scene.queueMessage(`${targetMessage} is unaffected\nby the effects of Destiny Bond.`); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDestinyBondLapseIsBoss", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return false; } - pokemon.scene.queueMessage(`${getPokemonMessage(source, ` took\n${targetMessage} down with it!`)}`); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsDestinyBondLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(source), + pokemonNameWithAffix2: getPokemonNameWithAffix(pokemon) + }) + ); pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); return false; } @@ -317,24 +324,34 @@ export class InfatuatedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` fell in love\nwith ${pokemon.scene.getPokemonById(this.sourceId).name}!`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsInfatuatedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + }) + ); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready in love!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsInfatuatedOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is in love\nwith ${pokemon.scene.getPokemonById(this.sourceId).name}!`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsInfatuatedLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + }) + ); 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(i18next.t("battle:battlerTagsInfatuatedLapseImmobilize", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); } } @@ -345,7 +362,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(i18next.t("battle:battlerTagsInfatuatedOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } isSourceLinked(): boolean { @@ -380,7 +397,7 @@ export class SeedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was seeded!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSeededOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -400,7 +417,7 @@ export class SeedTag extends BattlerTag { const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); 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 ? i18next.t("battle:battlerTagsSeededLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }) : i18next.t("battle:battlerTagsSeededLapseShed", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), false, true)); } } @@ -422,20 +439,20 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " began\nhaving a Nightmare!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onOverlap(pokemon: Pokemon): void { super.onOverlap(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is\nalready locked in a Nightmare!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsNightmareOnOverlap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } 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(i18next.t("battle:battlerTagsNightmareLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CURSE)); // TODO: Update animation type const cancelled = new Utils.BooleanHolder(false); @@ -527,7 +544,7 @@ export class EncoreTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " got\nan Encore!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); const movePhase = pokemon.scene.findPhase(m => m instanceof MovePhase && m.pokemon === pokemon); if (movePhase) { @@ -543,7 +560,7 @@ export class EncoreTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s Encore\nended!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEncoreOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -553,7 +570,12 @@ export class HelpingHandTag extends BattlerTag { } onAdd(pokemon: Pokemon): void { - pokemon.scene.queueMessage(getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` is ready to\nhelp ${pokemon.name}!`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsHelpingHandOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), + pokemonName: pokemon.name + }) + ); } } @@ -581,15 +603,22 @@ export class IngrainTag extends TrappedTag { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), - getPokemonMessage(pokemon, " absorbed\nnutrients with its roots!"), true)); + pokemon.scene.unshiftPhase( + new PokemonHealPhase( + pokemon.scene, + pokemon.getBattlerIndex(), + Math.floor(pokemon.getMaxHp() / 16), + i18next.t("battle:battlerTagsIngrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), + true + ) + ); } return ret; } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, " planted its roots!"); + return i18next.t("battle:battlerTagsIngrainOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } getDescriptor(): string { @@ -605,15 +634,23 @@ 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(i18next.t("battle:battlerTagsAquaRingOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const ret = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); 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)); + pokemon.scene.unshiftPhase( + new PokemonHealPhase( + pokemon.scene, + pokemon.getBattlerIndex(), + Math.floor(pokemon.getMaxHp() / 16), + i18next.t("battle:battlerTagsAquaRingLapse", { + moveName: this.getMoveName(), + pokemonName: pokemon.name + }), + true)); } return ret; @@ -659,7 +696,7 @@ export class DrowsyTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " grew drowsy!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsDrowsyOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -702,7 +739,12 @@ export abstract class DamagingTrapTag extends TrappedTag { const ret = super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby ${this.getMoveName()}!`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsDamagingTrapLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName() + }) + ); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, this.commonAnim)); const cancelled = new Utils.BooleanHolder(false); @@ -723,7 +765,11 @@ export class BindTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` was squeezed by\n${pokemon.scene.getPokemonById(this.sourceId).name}'s ${this.getMoveName()}!`); + return i18next.t("battle:battlerTagsBindOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name, + moveName: this.getMoveName() + }); } } @@ -733,7 +779,10 @@ export class WrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` was Wrapped\nby ${pokemon.scene.getPokemonById(this.sourceId).name}!`); + return i18next.t("battle:battlerTagsWrapOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + }); } } @@ -743,7 +792,7 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, " was trapped\nin the vortex!"); + return i18next.t("battle:battlerTagsVortexOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -765,7 +814,10 @@ export class ClampTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` Clamped\n${pokemon.name}!`); + return i18next.t("battle:battlerTagsClampOnTrap", { + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), + pokemonName: pokemon.name, + }); } } @@ -775,7 +827,10 @@ export class SandTombTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` became trapped\nby ${this.getMoveName()}!`); + return i18next.t("battle:battlerTagsSandTombOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName() + }); } } @@ -785,7 +840,7 @@ export class MagmaStormTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, " became trapped\nby swirling magma!"); + return i18next.t("battle:battlerTagsMagmaStormOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -795,7 +850,7 @@ export class SnapTrapTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, " got trapped\nby a snap trap!"); + return i18next.t("battle:battlerTagsSnapTrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -805,7 +860,10 @@ export class ThunderCageTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon.scene.getPokemonById(this.sourceId), ` trapped\n${getPokemonNameWithAffix(pokemon)}!`); + return i18next.t("battle:battlerTagsThunderCageOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) + }); } } @@ -815,7 +873,10 @@ export class InfestationTag extends DamagingTrapTag { } getTrapMessage(pokemon: Pokemon): string { - return getPokemonMessage(pokemon, ` has been afflicted \nwith an infestation by ${getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId))}!`); + return i18next.t("battle:battlerTagsInfestationOnTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) + }); } } @@ -828,13 +889,19 @@ export class ProtectedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, "\nprotected itself!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsProtectedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } 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(i18next.t("battle:battlerTagsProtectedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + + // Stop multi-hit moves early + const effectPhase = pokemon.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase) { + effectPhase.stopMultiHit(pokemon); + } return true; } @@ -959,12 +1026,12 @@ export class EnduringTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " braced\nitself!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.CUSTOM) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " endured\nthe hit!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsEnduringLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -979,7 +1046,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(i18next.t("battle:battlerTagsSturdyLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -1000,7 +1067,12 @@ export class PerishSongTag extends BattlerTag { const ret = super.lapse(pokemon, lapseType); if (ret) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, `\'s perish count fell to ${this.turnCount}.`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsPerishSongLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + turnCount: this.turnCount + }) + ); } else { pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, true, true); } @@ -1009,6 +1081,33 @@ export class PerishSongTag extends BattlerTag { } } +/** + * Applies the "Center of Attention" volatile status effect, the effect applied by Follow Me, Rage Powder, and Spotlight. + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Center_of_attention | Center of Attention} + */ +export class CenterOfAttentionTag extends BattlerTag { + public powder: boolean; + + constructor(sourceMove: Moves) { + super(BattlerTagType.CENTER_OF_ATTENTION, BattlerTagLapseType.TURN_END, 1, sourceMove); + + this.powder = (this.sourceMove === Moves.RAGE_POWDER); + } + + /** "Center of Attention" can't be added if an ally is already the Center of Attention. */ + canAdd(pokemon: Pokemon): boolean { + const activeTeam = pokemon.isPlayer() ? pokemon.scene.getPlayerField() : pokemon.scene.getEnemyField(); + + return !activeTeam.find(p => p.getTag(BattlerTagType.CENTER_OF_ATTENTION)); + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became the center\nof attention!")); + } +} + export class AbilityBattlerTag extends BattlerTag { public ability: Abilities; @@ -1044,7 +1143,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(i18next.t("battle:battlerTagsTruantLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } return true; @@ -1059,7 +1158,7 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " can't\nget it going!"), null, false, null, true); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsSlowStartOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null, true); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1073,7 +1172,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(i18next.t("battle:battlerTagsSlowStartOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, false, null); } } @@ -1119,13 +1218,13 @@ export class HighestStatBoostTag extends AbilityBattlerTag { break; } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, `'s ${getStatName(highestStat)}\nwas heightened!`), null, false, null, true); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(`The effects of ${getPokemonMessage(pokemon, `'s\n${allAbilities[this.ability].name} wore off!`)}`); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsHighestStatBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: allAbilities[this.ability].name })); } } @@ -1165,7 +1264,7 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } } -export class HideSpriteTag extends BattlerTag { +export class SemiInvulnerableTag extends BattlerTag { constructor(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -1187,8 +1286,11 @@ export class HideSpriteTag extends BattlerTag { export class TypeImmuneTag extends BattlerTag { public immuneType: Type; - constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number) { - super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove); + + constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number = 1) { + super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove); + + this.immuneType = immuneType; } /** @@ -1205,6 +1307,18 @@ export class MagnetRisenTag extends TypeImmuneTag { constructor(tagType: BattlerTagType, sourceMove: Moves) { super(tagType, sourceMove, Type.GROUND, 5); } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " levitated with electromagnetism!")); + } + + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " stopped levitating!")); + } } export class TypeBoostTag extends BattlerTag { @@ -1244,7 +1358,7 @@ export class CritBoostTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is getting\npumped!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -1254,7 +1368,7 @@ export class CritBoostTag extends BattlerTag { onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " relaxed.")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCritBoostOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1289,7 +1403,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(i18next.t("battle:battlerTagsSaltCuredOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1306,7 +1420,12 @@ export class SaltCuredTag extends BattlerTag { const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); pokemon.damageAndUpdate(Math.max(Math.floor(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8), 1)); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by ${this.getMoveName()}!`)); + pokemon.scene.queueMessage( + i18next.t("battle:battlerTagsSaltCuredLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveName: this.getMoveName() + }) + ); } } @@ -1332,8 +1451,6 @@ export class CursedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " has been cursed!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1348,7 +1465,7 @@ export class CursedTag extends BattlerTag { if (!cancelled.value) { pokemon.damageAndUpdate(Math.max(Math.floor(pokemon.getMaxHp() / 4), 1)); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by the ${this.getMoveName()}!`)); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1356,6 +1473,17 @@ export class CursedTag extends BattlerTag { } } +/** + * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. Encompasses two tag types: + * @item IGNORE_FLYING: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) + * @item ROOSTED: One-turn grounding effects (i.e. from Roost) + */ +export class GroundedTag extends BattlerTag { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { + super(tagType, lapseType, 1, sourceMove); + } +} + /** * Provides the Ice Face ability's effects. */ @@ -1479,6 +1607,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new SturdyTag(sourceMove); case BattlerTagType.PERISH_SONG: return new PerishSongTag(turnCount); + case BattlerTagType.CENTER_OF_ATTENTION: + return new CenterOfAttentionTag(sourceMove); case BattlerTagType.TRUANT: return new TruantTag(); case BattlerTagType.SLOW_START: @@ -1491,7 +1621,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.UNDERGROUND: case BattlerTagType.UNDERWATER: case BattlerTagType.HIDDEN: - return new HideSpriteTag(tagType, turnCount, sourceMove); + return new SemiInvulnerableTag(tagType, turnCount, sourceMove); case BattlerTagType.FIRE_BOOST: return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: @@ -1505,9 +1635,9 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc 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); + return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.ROOSTED: + return new GroundedTag(tagType, BattlerTagLapseType.TURN_END, sourceMove); case BattlerTagType.SALT_CURED: return new SaltCuredTag(sourceId); case BattlerTagType.CURSED: diff --git a/src/data/berry.ts b/src/data/berry.ts index 5b4f55c8e13..2f0f466d8a9 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,11 +1,11 @@ import { PokemonHealPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage } from "../messages"; +import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult } from "../field/pokemon"; import { BattleStat } from "./battle-stat"; import { getStatusEffectHealText } from "./status-effect"; import * as Utils from "../utils"; import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -80,7 +80,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { pokemon.battleData.berriesEaten.push(berryType); } if (pokemon.status) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); } pokemon.resetStatus(true, true); pokemon.updateInfo(); diff --git a/src/data/biomes.ts b/src/data/biomes.ts index 166b1fd40c3..782826d8695 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -1,12 +1,12 @@ import { Type } from "./type"; import * as Utils from "../utils"; -import beautify from "json-beautify"; import {pokemonEvolutions, SpeciesFormEvolution} from "./pokemon-evolutions"; import i18next from "i18next"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { TrainerType } from "#enums/trainer-type"; +// import beautify from "json-beautify"; export function getBiomeName(biome: Biome | -1) { if (biome === -1) { @@ -2934,7 +2934,7 @@ export function initBiomes() { [ 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.FAIRY_CAVE, BiomePoolTier.COMMON ] ] ], [ Species.SUDOWOODO, Type.ROCK, -1, [ @@ -3630,7 +3630,7 @@ export function initBiomes() { [ Species.FLYGON, Type.GROUND, Type.DRAGON, [ [ Biome.DESERT, BiomePoolTier.RARE, [ TimeOfDay.DAWN, TimeOfDay.DAY ] ], [ Biome.WASTELAND, BiomePoolTier.COMMON ], - [ Biome.WASTELAND, BiomePoolTier.BOSS ], + [ Biome.WASTELAND, BiomePoolTier.BOSS ] ] ], [ Species.CACNEA, Type.GRASS, -1, [ @@ -3694,14 +3694,14 @@ export function initBiomes() { [ Species.BALTOY, Type.GROUND, Type.PSYCHIC, [ [ Biome.RUINS, BiomePoolTier.COMMON ], [ Biome.SPACE, BiomePoolTier.UNCOMMON ], - [ Biome.TEMPLE, 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.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], [ Species.LILEEP, Type.ROCK, Type.GRASS, [ @@ -4199,14 +4199,14 @@ export function initBiomes() { [ Species.SKORUPI, Type.POISON, Type.BUG, [ [ Biome.SWAMP, BiomePoolTier.UNCOMMON ], [ Biome.DESERT, BiomePoolTier.COMMON ], - [ Biome.TEMPLE, BiomePoolTier.UNCOMMON ], + [ 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.TEMPLE, BiomePoolTier.UNCOMMON ] ] ], [ Species.CROAGUNK, Type.POISON, Type.FIGHTING, [ @@ -4793,7 +4793,7 @@ export function initBiomes() { ] ], [ 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, [ @@ -4898,7 +4898,7 @@ export function initBiomes() { ] ], [ Species.JOLTIK, Type.BUG, Type.ELECTRIC, [ - [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ], + [ Biome.JUNGLE, BiomePoolTier.UNCOMMON ] ] ], [ Species.GALVANTULA, Type.BUG, Type.ELECTRIC, [ @@ -7808,57 +7808,56 @@ export function initBiomes() { // used in a commented code - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function outputPools() { - const pokemonOutput = {}; - const trainerOutput = {}; + // function outputPools() { + // const pokemonOutput = {}; + // const trainerOutput = {}; - for (const b of Object.keys(biomePokemonPools)) { - const biome = Biome[b]; - pokemonOutput[biome] = {}; - trainerOutput[biome] = {}; + // for (const b of Object.keys(biomePokemonPools)) { + // const biome = Biome[b]; + // pokemonOutput[biome] = {}; + // trainerOutput[biome] = {}; - for (const t of Object.keys(biomePokemonPools[b])) { - const tier = BiomePoolTier[t]; + // for (const t of Object.keys(biomePokemonPools[b])) { + // const tier = BiomePoolTier[t]; - pokemonOutput[biome][tier] = {}; + // pokemonOutput[biome][tier] = {}; - for (const tod of Object.keys(biomePokemonPools[b][t])) { - const timeOfDay = TimeOfDay[tod]; + // for (const tod of Object.keys(biomePokemonPools[b][t])) { + // const timeOfDay = TimeOfDay[tod]; - pokemonOutput[biome][tier][timeOfDay] = []; + // pokemonOutput[biome][tier][timeOfDay] = []; - for (const f of biomePokemonPools[b][t][tod]) { - if (typeof f === "number") { - pokemonOutput[biome][tier][timeOfDay].push(Species[f]); - } else { - const tree = {}; + // for (const f of biomePokemonPools[b][t][tod]) { + // if (typeof f === "number") { + // pokemonOutput[biome][tier][timeOfDay].push(Species[f]); + // } else { + // const tree = {}; - for (const l of Object.keys(f)) { - tree[l] = f[l].map(s => Species[s]); - } + // for (const l of Object.keys(f)) { + // tree[l] = f[l].map(s => Species[s]); + // } - pokemonOutput[biome][tier][timeOfDay].push(tree); - } - } + // pokemonOutput[biome][tier][timeOfDay].push(tree); + // } + // } - } - } + // } + // } - for (const t of Object.keys(biomeTrainerPools[b])) { - const tier = BiomePoolTier[t]; + // for (const t of Object.keys(biomeTrainerPools[b])) { + // const tier = BiomePoolTier[t]; - trainerOutput[biome][tier] = []; + // trainerOutput[biome][tier] = []; - for (const f of biomeTrainerPools[b][t]) { - trainerOutput[biome][tier].push(TrainerType[f]); - } - } - } + // 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) { if (pokemon.speciesId >= Species.XERNEAS) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 8b41e8c8d9d..75b200b24ee 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,15 +1,18 @@ import * as Utils from "../utils"; -import i18next from "#app/plugins/i18n.js"; -import { GameData } from "#app/system/game-data.js"; -import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; +import i18next from "i18next"; +import { DexAttrProps, GameData } from "#app/system/game-data.js"; +import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; import Pokemon from "#app/field/pokemon.js"; import { BattleType, FixedBattleConfig } from "#app/battle.js"; import Trainer, { TrainerVariant } from "#app/field/trainer.js"; import { GameMode } from "#app/game-mode.js"; import { Type } from "./type"; +import { pokemonEvolutions } from "./pokemon-evolutions"; +import { pokemonFormChanges } from "./pokemon-forms"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { TypeColor, TypeShadow } from "#app/enums/color.js"; /** * An enum for all the challenge types. The parameter entries on these describe the @@ -158,7 +161,7 @@ export abstract class Challenge { if (overrideValue === undefined) { overrideValue = this.value; } - return i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`); + return `${i18next.t("challenges:usePokemon")}${i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`)}`; } /** @@ -277,8 +280,22 @@ export class SingleGenerationChallenge extends Challenge { case ChallengeType.STARTER_CHOICE: const species = args[0] as PokemonSpecies; const isValidStarter = args[1] as Utils.BooleanHolder; + const amountOfPokemon = args[3] as number; const starterGeneration = species.speciesId === Species.VICTINI ? 5 : species.generation; - if (starterGeneration !== this.value) { + const generations = [starterGeneration]; + if (amountOfPokemon > 0) { + const speciesToCheck = [species.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + generations.push(getPokemonSpecies(e.speciesId).generation); + }); + } + } + } + if (!generations.includes(this.value)) { isValidStarter.value = false; return true; } @@ -331,6 +348,37 @@ export class SingleGenerationChallenge extends Challenge { return this.value > 0 ? 1 : 0; } + /** + * Returns the textual representation of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised name for the current value. + */ + getValue(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + if (this.value === 0) { + return i18next.t("settings:off"); + } + return i18next.t(`starterSelectUiHandler:gen${this.value}`); + } + + /** + * Returns the description of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised description for the current value. + */ + getDescription(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + if (this.value === 0) { + return i18next.t("challenges:singleGeneration.desc_default"); + } + return i18next.t("challenges:singleGeneration.desc", { gen: i18next.t(`challenges:singleGeneration.gen_${this.value}`) }); + } + + static loadChallenge(source: SingleGenerationChallenge | any): SingleGenerationChallenge { const newChallenge = new SingleGenerationChallenge(); newChallenge.value = source.value; @@ -372,7 +420,32 @@ export class SingleTypeChallenge extends Challenge { case ChallengeType.STARTER_CHOICE: const species = args[0] as PokemonSpecies; const isValidStarter = args[1] as Utils.BooleanHolder; - if (!species.isOfType(this.value - 1)) { + const dexAttr = args[2] as DexAttrProps; + const amountOfPokemon = args[3] as number; + const speciesForm = getPokemonSpeciesForm(species.speciesId, dexAttr.formIndex); + const types = [speciesForm.type1, speciesForm.type2]; + if (amountOfPokemon > 0) { + const speciesToCheck = [species.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + }); + } + if (pokemonFormChanges.hasOwnProperty(checking)) { + pokemonFormChanges[checking].forEach(f1 => { + getPokemonSpecies(checking).forms.forEach(f2 => { + if (f1.formKey === f2.formKey) { + types.push(f2.type1, f2.type2); + } + }); + }); + } + } + } + if (!types.includes(this.value - 1)) { isValidStarter.value = false; return true; } @@ -397,6 +470,34 @@ export class SingleTypeChallenge extends Challenge { return this.value > 0 ? 1 : 0; } + /** + * Returns the textual representation of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised name for the current value. + */ + getValue(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + return Type[this.value - 1].toLowerCase(); + } + + /** + * Returns the description of a challenge's current value. + * @param {value} overrideValue The value to check for. If undefined, gets the current value. + * @returns {string} The localised description for the current value. + */ + getDescription(overrideValue?: integer): string { + if (overrideValue === undefined) { + overrideValue = this.value; + } + const type = i18next.t(`pokemonInfo:Type.${Type[this.value - 1]}`); + const typeColor = `[color=${TypeColor[Type[this.value-1]]}][shadow=${TypeShadow[Type[this.value-1]]}]${type}[/shadow][/color]`; + const defaultDesc = i18next.t("challenges:singleType.desc_default"); + const typeDesc = i18next.t("challenges:singleType.desc", {type: typeColor}); + return this.value === 0 ? defaultDesc : typeDesc; + } + static loadChallenge(source: SingleTypeChallenge | any): SingleTypeChallenge { const newChallenge = new SingleTypeChallenge(); newChallenge.value = source.value; @@ -535,7 +636,7 @@ export class LowerStarterPointsChallenge extends Challenge { /** * Apply all challenges of a given challenge type. - * @param {BattleScene} scene The current scene + * @param {GameMode} gameMode The current game mode * @param {ChallengeType} challengeType What challenge type to apply * @param {any[]} args Any args for that challenge type * @returns {boolean} True if any challenge was successfully applied. diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index ae6aa72b52c..ec3358b1a77 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -2290,6 +2290,28 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { "dialogue:raihan_elite.defeat.2" ] }, + [TrainerType.ALDER]: { + encounter: [ + "dialogue:alder.encounter.1" + ], + victory: [ + "dialogue:alder.victory.1" + ], + defeat: [ + "dialogue:alder.defeat.1" + ] + }, + [TrainerType.KIERAN]: { + encounter: [ + "dialogue:kieran.encounter.1" + ], + victory: [ + "dialogue:kieran.victory.1" + ], + defeat: [ + "dialogue:kieran.defeat.1" + ] + }, [TrainerType.RIVAL]: [ { encounter: [ diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts index 6204b9e1df7..64e75113dbc 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -8,117 +8,117 @@ export const speciesEggMoves = { [Species.BULBASAUR]: [ Moves.GIGA_DRAIN, Moves.SLUDGE_BOMB, Moves.EARTH_POWER, Moves.SAPPY_SEED ], [Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ], [Species.SQUIRTLE]: [ Moves.ICE_BEAM, Moves.DARK_PULSE, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], - [Species.CATERPIE]: [ Moves.EARTH_POWER, Moves.SILK_TRAP, Moves.STICKY_WEB, Moves.BLEAKWIND_STORM ], - [Species.WEEDLE]: [ Moves.DRILL_RUN, Moves.SWORDS_DANCE, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ], + [Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ], + [Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.SWORDS_DANCE, Moves.ATTACK_ORDER, Moves.NOXIOUS_TORQUE ], [Species.PIDGEY]: [ Moves.HEAT_WAVE, Moves.FOCUS_BLAST, Moves.U_TURN, Moves.WILDBOLT_STORM ], [Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ], [Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ], [Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], - [Species.SANDSHREW]: [ Moves.DIRE_CLAW, Moves.CEASELESS_EDGE, Moves.SHORE_UP, Moves.PRECIPICE_BLADES ], + [Species.SANDSHREW]: [ Moves.HIGH_HORSEPOWER, Moves.CEASELESS_EDGE, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], [Species.NIDORAN_F]: [ Moves.NO_RETREAT, Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.MALIGNANT_CHAIN ], [Species.NIDORAN_M]: [ Moves.NOXIOUS_TORQUE, Moves.KINGS_SHIELD, Moves.NO_RETREAT, Moves.PRECIPICE_BLADES ], [Species.VULPIX]: [ Moves.MOONBLAST, Moves.ICE_BEAM, Moves.MORNING_SUN, Moves.TAIL_GLOW ], [Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.WICKED_BLOW ], - [Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ], - [Species.PARAS]: [ Moves.FIRST_IMPRESSION, Moves.SAPPY_SEED, Moves.CRABHAMMER, Moves.DIRE_CLAW ], + [Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.BOUNCY_BUBBLE, Moves.SPORE ], + [Species.PARAS]: [ Moves.LEECH_LIFE, Moves.HORN_LEECH, Moves.CRABHAMMER, Moves.SAPPY_SEED ], [Species.VENONAT]: [ Moves.SLUDGE_BOMB, Moves.MOONLIGHT, Moves.EARTH_POWER, Moves.MYSTICAL_POWER ], - [Species.DIGLETT]: [ Moves.REVERSAL, Moves.SWORDS_DANCE, Moves.ICE_SPINNER, Moves.HEADLONG_RUSH ], - [Species.MEOWTH]: [ Moves.COVET, Moves.HAPPY_HOUR, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], - [Species.PSYDUCK]: [ Moves.MYSTICAL_POWER, Moves.AQUA_STEP, Moves.AURA_SPHERE, Moves.MIND_BLOWN ], - [Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.RAGING_FURY, Moves.METEOR_MASH, Moves.NO_RETREAT ], + [Species.DIGLETT]: [ Moves.REVERSAL, Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.HEADLONG_RUSH ], + [Species.MEOWTH]: [ Moves.COVET, Moves.SWORDS_DANCE, Moves.DOUBLE_KICK, Moves.TAIL_SLAP ], + [Species.PSYDUCK]: [ Moves.SPLISHY_SPLASH, Moves.AQUA_STEP, Moves.AURA_SPHERE, Moves.MYSTICAL_POWER ], + [Species.MANKEY]: [ Moves.DRAIN_PUNCH, Moves.PLAY_ROUGH, Moves.METEOR_MASH, Moves.NO_RETREAT ], [Species.GROWLITHE]: [ Moves.ZING_ZAP, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ], - [Species.POLIWAG]: [ Moves.BOUNCY_BUBBLE, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ], + [Species.POLIWAG]: [ Moves.SLACK_OFF, Moves.WILDBOLT_STORM, Moves.DRAIN_PUNCH, Moves.SURGING_STRIKES ], [Species.ABRA]: [ Moves.MOONBLAST, Moves.FLAMETHROWER, Moves.THUNDERBOLT, Moves.PSYSTRIKE ], - [Species.MACHOP]: [ Moves.MACH_PUNCH, Moves.METEOR_MASH, Moves.ICE_HAMMER, Moves.FISSURE ], + [Species.MACHOP]: [ Moves.COMBAT_TORQUE, Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.FISSURE ], [Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], - [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.HAZE, Moves.MALIGNANT_CHAIN ], + [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.BOUNCY_BUBBLE, Moves.MALIGNANT_CHAIN ], [Species.GEODUDE]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.SHORE_UP, Moves.HEAD_SMASH ], [Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ], [Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ], [Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.BODY_PRESS, Moves.ICE_BEAM, Moves.THUNDERCLAP ], [Species.FARFETCHD]: [ Moves.BATON_PASS, Moves.SACRED_SWORD, Moves.ROOST, Moves.VICTORY_DANCE ], [Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], - [Species.SEEL]: [ Moves.FREEZE_DRY, Moves.CHILLY_RECEPTION, Moves.SLACK_OFF, Moves.BOUNCY_BUBBLE ], - [Species.GRIMER]: [ Moves.SHADOW_SNEAK, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ], + [Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], + [Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ], [Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ], - [Species.GASTLY]: [ Moves.ICE_BEAM, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN ], - [Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAD_SMASH, Moves.SPIN_OUT ], - [Species.DROWZEE]: [ Moves.DREAM_EATER, Moves.RECOVER, Moves.NIGHTMARE, Moves.SPORE ], + [Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ], + [Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAVY_SLAM, Moves.DIAMOND_STORM ], + [Species.DROWZEE]: [ Moves.DREAM_EATER, Moves.RECOVER, Moves.LUMINA_CRASH, Moves.DARK_VOID ], [Species.KRABBY]: [ Moves.ICICLE_CRASH, Moves.LIQUIDATION, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ], - [Species.VOLTORB]: [ Moves.BUZZY_BUZZ, Moves.OVERHEAT, Moves.ICE_BEAM, Moves.TAIL_GLOW ], + [Species.VOLTORB]: [ Moves.RISING_VOLTAGE, Moves.OVERHEAT, Moves.ICE_BEAM, Moves.NASTY_PLOT ], [Species.EXEGGCUTE]: [ Moves.MYSTICAL_POWER, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.FICKLE_BEAM ], - [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.PAIN_SPLIT, Moves.VOLT_TACKLE ], + [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ], [Species.LICKITUNG]: [ Moves.BODY_SLAM, Moves.FIRE_LASH, Moves.GRAV_APPLE, Moves.MILK_DRINK ], - [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ], - [Species.RHYHORN]: [ Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.FLARE_BLITZ, Moves.HEAD_SMASH ], + [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.MOONBLAST, Moves.MALIGNANT_CHAIN ], + [Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ], [Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.INFESTATION, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], - [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.BREAKING_SWIPE, Moves.RETURN, Moves.SEISMIC_TOSS ], + [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ], [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.DRAGON_ENERGY ], [Species.GOLDEEN]: [ Moves.DRILL_RUN, Moves.FLIP_TURN, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ], [Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ], - [Species.SCYTHER]: [ Moves.GEAR_GRIND, Moves.BUG_BITE, Moves.STORM_THROW, Moves.MIGHTY_CLEAVE ], + [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.BUG_BITE, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ], [Species.PINSIR]: [ Moves.EARTHQUAKE, Moves.LEECH_LIFE, Moves.CLOSE_COMBAT, Moves.EXTREME_SPEED ], - [Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.FLARE_BLITZ, Moves.WAVE_CRASH, Moves.HEAD_CHARGE ], - [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.DRAGON_ASCENT ], - [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.CHILLY_RECEPTION, Moves.BOOMBURST ], + [Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.BLAZING_TORQUE, Moves.LIQUIDATION, Moves.COMBAT_TORQUE ], + [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.POWER_TRIP, Moves.DRAGON_ASCENT ], + [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SHELL_SMASH, Moves.STEAM_ERUPTION ], [Species.DITTO]: [ Moves.MIMIC, Moves.COPYCAT, Moves.ME_FIRST, Moves.METRONOME ], - [Species.EEVEE]: [ Moves.WISH, Moves.REVELATION_DANCE, Moves.TRI_ATTACK, Moves.NO_RETREAT ], - [Species.PORYGON]: [ Moves.BUZZY_BUZZ, Moves.AURA_SPHERE, Moves.TOPSY_TURVY, Moves.TECHNO_BLAST ], + [Species.EEVEE]: [ Moves.WISH, Moves.REVELATION_DANCE, Moves.ZIPPY_ZAP, Moves.NO_RETREAT ], + [Species.PORYGON]: [ Moves.THUNDERCLAP, Moves.AURA_SPHERE, Moves.FLAMETHROWER, Moves.TECHNO_BLAST ], [Species.OMANYTE]: [ Moves.FREEZE_DRY, Moves.EARTH_POWER, Moves.POWER_GEM, Moves.STEAM_ERUPTION ], - [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.DRILL_RUN, Moves.AQUA_CUTTER, Moves.MIGHTY_CLEAVE ], + [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.RAZOR_SHELL, Moves.MIGHTY_CLEAVE ], [Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.HEAD_SMASH, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ], [Species.ARTICUNO]: [ Moves.AURA_SPHERE, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ], [Species.ZAPDOS]: [ Moves.WEATHER_BALL, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], - [Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.BURNING_BULWARK, Moves.TORCH_SONG ], - [Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.METEOR_MASH, Moves.FIRE_LASH, Moves.FLOATY_FALL ], + [Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ], + [Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.MULTI_ATTACK ], [Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.PLASMA_FISTS, Moves.PHOTON_GEYSER ], - [Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.QUIVER_DANCE, Moves.VICTORY_DANCE, Moves.REVIVAL_BLESSING ], - [Species.CHIKORITA]: [ Moves.ROCK_SLIDE, Moves.PLAY_ROUGH, Moves.DRAGON_DANCE, Moves.SAPPY_SEED ], + [Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE, Moves.SHELL_SMASH ], + [Species.CHIKORITA]: [ Moves.SPORE, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SAPPY_SEED ], [Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.SCORCHING_SANDS, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ], - [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.ICICLE_CRASH, Moves.FISHIOUS_REND ], + [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.FISHIOUS_REND ], [Species.SENTRET]: [ Moves.TIDY_UP, Moves.THIEF, Moves.NUZZLE, Moves.EXTREME_SPEED ], [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.BOOMBURST, Moves.OBLIVION_WING ], [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ], [Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ], [Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.VOLT_SWITCH, Moves.TAIL_GLOW ], - [Species.PICHU]: [ Moves.THUNDERCLAP, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.THUNDER_CAGE ], + [Species.PICHU]: [ Moves.RISING_VOLTAGE, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.THUNDERCLAP ], [Species.CLEFFA]: [ Moves.TAKE_HEART, Moves.POWER_GEM, Moves.WISH, Moves.LIGHT_OF_RUIN ], - [Species.IGGLYBUFF]: [ Moves.MOONBLAST, Moves.APPLE_ACID, Moves.WISH, Moves.BOOMBURST ], + [Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ], [Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.MOONBLAST, Moves.FIERY_DANCE ], [Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.CALM_MIND, Moves.LUMINA_CRASH ], - [Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.DRAGON_ENERGY, Moves.TAIL_GLOW ], - [Species.HOPPIP]: [ Moves.AIR_SLASH, Moves.STRENGTH_SAP, Moves.QUIVER_DANCE, Moves.SEED_FLARE ], + [Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.CORE_ENFORCER, Moves.TAIL_GLOW ], + [Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SPORE, Moves.SAPPY_SEED ], [Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ], [Species.SUNKERN]: [ Moves.SPORE, Moves.SAPPY_SEED, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ], - [Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.AEROBLAST ], + [Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM ], [Species.WOOPER]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.CURSE, Moves.SURGING_STRIKES ], [Species.MURKROW]: [ Moves.TRIPLE_ARROWS, Moves.FLOATY_FALL, Moves.TIDY_UP, Moves.WICKED_BLOW ], [Species.MISDREAVUS]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.UNOWN]: [ Moves.NATURE_POWER, Moves.COSMIC_POWER, Moves.ANCIENT_POWER, Moves.MYSTICAL_POWER ], [Species.GIRAFARIG]: [ Moves.MYSTICAL_POWER, Moves.NIGHT_DAZE, Moves.RECOVER, Moves.BOOMBURST ], [Species.PINECO]: [ Moves.METAL_BURST, Moves.LUNGE, Moves.BODY_PRESS, Moves.SHORE_UP ], - [Species.DUNSPARCE]: [ Moves.BODY_SLAM, Moves.WICKED_TORQUE, Moves.BLAZING_TORQUE, Moves.EXTREME_SPEED ], - [Species.GLIGAR]: [ Moves.STONE_AXE, Moves.EARTHQUAKE, Moves.ROOST, Moves.FLOATY_FALL ], - [Species.SNUBBULL]: [ Moves.PARTING_SHOT, Moves.EARTHQUAKE, Moves.STUFF_CHEEKS, Moves.MAGICAL_TORQUE ], + [Species.DUNSPARCE]: [ Moves.BODY_SLAM, Moves.MAGICAL_TORQUE, Moves.BLAZING_TORQUE, Moves.EXTREME_SPEED ], + [Species.GLIGAR]: [ Moves.FLOATY_FALL, Moves.THOUSAND_WAVES, Moves.ROOST, Moves.MIGHTY_CLEAVE ], + [Species.SNUBBULL]: [ Moves.FACADE, Moves.EARTHQUAKE, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], [Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.KNOCK_OFF, Moves.FISHIOUS_REND ], - [Species.SHUCKLE]: [ Moves.COSMIC_POWER, Moves.SHORE_UP, Moves.BODY_PRESS, Moves.SALT_CURE ], - [Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.TIDY_UP ], + [Species.SHUCKLE]: [ Moves.STUFF_CHEEKS, Moves.HEAL_ORDER, Moves.BODY_PRESS, Moves.SALT_CURE ], + [Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.DRAGON_DANCE ], [Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.SUCKER_PUNCH, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ], [Species.TEDDIURSA]: [ Moves.DIRE_CLAW, Moves.FACADE, Moves.BULK_UP, Moves.SLACK_OFF ], - [Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.MAGMA_STORM, Moves.HYDRO_STEAM ], + [Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ], [Species.SWINUB]: [ Moves.ICE_SPINNER, Moves.HEADLONG_RUSH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ], [Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ], [Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.SNIPE_SHOT, Moves.SEARING_SHOT, Moves.ELECTRO_SHOT ], [Species.DELIBIRD]: [ Moves.DRILL_RUN, Moves.FLOATY_FALL, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ], [Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ], - [Species.HOUNDOUR]: [ Moves.SEARING_SHOT, Moves.FIERY_WRATH, Moves.PARTING_SHOT, Moves.HYDRO_STEAM ], - [Species.PHANPY]: [ Moves.SHORE_UP, Moves.HEAD_SMASH, Moves.MOUNTAIN_GALE, Moves.VOLT_TACKLE ], - [Species.STANTLER]: [ Moves.HORN_LEECH, Moves.HIGH_JUMP_KICK, Moves.BULK_UP, Moves.HEAD_CHARGE ], - [Species.SMEARGLE]: [ Moves.BATON_PASS, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.SPORE ], + [Species.HOUNDOUR]: [ Moves.HEAT_WAVE, Moves.FIERY_WRATH, Moves.SOLAR_BEAM, Moves.HYDRO_STEAM ], + [Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.ICICLE_CRASH, Moves.COLLISION_COURSE ], + [Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.HYPER_VOICE, Moves.BULK_UP, Moves.PHOTON_GEYSER ], + [Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ], [Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.WICKED_TORQUE, Moves.METEOR_MASH, Moves.COLLISION_COURSE ], - [Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZY_FROST, Moves.TAKE_HEART ], - [Species.ELEKID]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.ICE_HAMMER, Moves.PLASMA_FISTS ], - [Species.MAGBY]: [ Moves.STORED_POWER, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ], + [Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZY_FROST, Moves.QUIVER_DANCE ], + [Species.ELEKID]: [ Moves.BLAZING_TORQUE, Moves.TIDY_UP, Moves.MOUNTAIN_GALE, Moves.ZIPPY_ZAP ], + [Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ], [Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.YAWN, Moves.SIZZLY_SLIDE ], [Species.RAIKOU]: [ Moves.THUNDERCLAP, Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE ], [Species.ENTEI]: [ Moves.BURNING_BULWARK, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.MIGHTY_CLEAVE ], @@ -127,24 +127,24 @@ export const speciesEggMoves = { [Species.LUGIA]: [ Moves.TAKE_HEART, Moves.STORED_POWER, Moves.SCALD, Moves.OBLIVION_WING ], [Species.HO_OH]: [ Moves.SWORDS_DANCE, Moves.EARTHQUAKE, Moves.BRAVE_BIRD, Moves.REVIVAL_BLESSING ], [Species.CELEBI]: [ Moves.MYSTICAL_POWER, Moves.STORED_POWER, Moves.COSMIC_POWER, Moves.SEED_FLARE ], - [Species.TREECKO]: [ Moves.DRAGON_PULSE, Moves.DRAGON_ENERGY, Moves.SECRET_SWORD, Moves.SEED_FLARE ], + [Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.DRAGON_ENERGY, Moves.SECRET_SWORD, Moves.SEED_FLARE ], [Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.V_CREATE ], [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.ICICLE_CRASH, Moves.BULK_UP, Moves.SURGING_STRIKES ], - [Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.PSYCHIC_FANGS, Moves.POISON_FANG, Moves.NO_RETREAT ], - [Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.ENDURE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ], - [Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STICKY_WEB, Moves.MALIGNANT_CHAIN ], + [Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ], + [Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ], + [Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STORED_POWER, Moves.MALIGNANT_CHAIN ], [Species.LOTAD]: [ Moves.REVELATION_DANCE, Moves.APPLE_ACID, Moves.ICE_BEAM, Moves.QUIVER_DANCE ], - [Species.SEEDOT]: [ Moves.SWORDS_DANCE, Moves.GRASSY_GLIDE, Moves.KOWTOW_CLEAVE, Moves.IVY_CUDGEL ], - [Species.TAILLOW]: [ Moves.SWORDS_DANCE, Moves.FACADE, Moves.DRILL_RUN, Moves.EXTREME_SPEED ], - [Species.WINGULL]: [ Moves.THUNDER, Moves.FLIP_TURN, Moves.DEFOG, Moves.STEAM_ERUPTION ], - [Species.RALTS]: [ Moves.BOOMBURST, Moves.BITTER_BLADE, Moves.QUIVER_DANCE, Moves.VICTORY_DANCE ], + [Species.SEEDOT]: [ Moves.SWORDS_DANCE, Moves.SACRED_SWORD, Moves.KOWTOW_CLEAVE, Moves.BITTER_BLADE ], + [Species.TAILLOW]: [ Moves.BOOMBURST, Moves.FACADE, Moves.HEADLONG_RUSH, Moves.NO_RETREAT ], + [Species.WINGULL]: [ Moves.THUNDER, Moves.FLIP_TURN, Moves.CALM_MIND, Moves.STEAM_ERUPTION ], + [Species.RALTS]: [ Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.NO_RETREAT, Moves.BOOMBURST ], [Species.SURSKIT]: [ Moves.POLLEN_PUFF, Moves.FIERY_DANCE, Moves.BOUNCY_BUBBLE, Moves.AEROBLAST ], [Species.SHROOMISH]: [ Moves.ACCELEROCK, Moves.TRAILBLAZE, Moves.STORM_THROW, Moves.SAPPY_SEED ], - [Species.SLAKOTH]: [ Moves.FACADE, Moves.JUMP_KICK, Moves.KNOCK_OFF, Moves.SKILL_SWAP ], + [Species.SLAKOTH]: [ Moves.FACADE, Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.SKILL_SWAP ], [Species.NINCADA]: [ Moves.ATTACK_ORDER, Moves.STICKY_WEB, Moves.SPIRIT_SHACKLE, Moves.SHELL_SMASH ], [Species.WHISMUR]: [ Moves.ALLURING_VOICE, Moves.TRICK_ROOM, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], [Species.MAKUHITA]: [ Moves.STORM_THROW, Moves.SLACK_OFF, Moves.HEAT_CRASH, Moves.DOUBLE_IRON_BASH ], - [Species.AZURILL]: [ Moves.JET_PUNCH, Moves.SPIRIT_BREAK, Moves.SWORDS_DANCE, Moves.SURGING_STRIKES ], + [Species.AZURILL]: [ Moves.JET_PUNCH, Moves.MAGICAL_TORQUE, Moves.SWORDS_DANCE, Moves.SURGING_STRIKES ], [Species.NOSEPASS]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.CALM_MIND, Moves.TACHYON_CUTTER ], [Species.SKITTY]: [ Moves.THUNDEROUS_KICK, Moves.ENTRAINMENT, Moves.TIDY_UP, Moves.V_CREATE ], [Species.SABLEYE]: [ Moves.RECOVER, Moves.TOPSY_TURVY, Moves.CURSE, Moves.SALT_CURE ], @@ -153,46 +153,46 @@ export const speciesEggMoves = { [Species.MEDITITE]: [ Moves.THUNDEROUS_KICK, Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.PHOTON_GEYSER ], [Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ], [Species.PLUSLE]: [ Moves.FLAMETHROWER, Moves.GLITZY_GLOW, Moves.SPLISHY_SPLASH, Moves.TAIL_GLOW ], - [Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SIZZLY_SLIDE, Moves.TAIL_GLOW ], - [Species.VOLBEAT]: [ Moves.PARTING_SHOT, Moves.LUNGE, Moves.POWDER, Moves.VICTORY_DANCE ], - [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.POLLEN_PUFF, Moves.POWDER, Moves.QUIVER_DANCE ], + [Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SPARKLY_SWIRL, Moves.TAIL_GLOW ], + [Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.LUNGE, Moves.DECORATE, Moves.VICTORY_DANCE ], + [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ], [Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.GROWTH, Moves.MALIGNANT_CHAIN ], - [Species.CARVANHA]: [ Moves.DRILL_RUN, Moves.ICE_SPINNER, Moves.WAVE_CRASH, Moves.SWORDS_DANCE ], - [Species.WAILMER]: [ Moves.CURSE, Moves.LIQUIDATION, Moves.FLOATY_FALL, Moves.RECOVER ], + [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], + [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.COMEUPPANCE ], [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.MORNING_SUN, Moves.BLUE_FLARE ], [Species.TORKOAL]: [ Moves.MORNING_SUN, Moves.BURNING_BULWARK, Moves.BODY_PRESS, Moves.HYDRO_STEAM ], - [Species.SPOINK]: [ Moves.AURA_SPHERE, Moves.MILK_DRINK, Moves.COSMIC_POWER, Moves.EXPANDING_FORCE ], + [Species.SPOINK]: [ Moves.AURA_SPHERE, Moves.MILK_DRINK, Moves.EXPANDING_FORCE, Moves.TAIL_GLOW ], [Species.SPINDA]: [ Moves.SUPERPOWER, Moves.SLACK_OFF, Moves.FLEUR_CANNON, Moves.V_CREATE ], [Species.TRAPINCH]: [ Moves.FIRE_LASH, Moves.DRAGON_DARTS, Moves.THOUSAND_ARROWS, Moves.DRAGON_ENERGY ], [Species.CACNEA]: [ Moves.EARTH_POWER, Moves.CEASELESS_EDGE, Moves.NIGHT_DAZE, Moves.IVY_CUDGEL ], [Species.SWABLU]: [ Moves.ROOST, Moves.NASTY_PLOT, Moves.FLOATY_FALL, Moves.BOOMBURST ], [Species.ZANGOOSE]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.EXTREME_SPEED, Moves.TIDY_UP ], - [Species.SEVIPER]: [ Moves.DIRE_CLAW, Moves.NASTY_PLOT, Moves.SUCKER_PUNCH, Moves.SHED_TAIL ], - [Species.LUNATONE]: [ Moves.POWER_GEM, Moves.NIGHT_DAZE, Moves.STORED_POWER, Moves.LUMINA_CRASH ], - [Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.POWER_TRIP, Moves.SACRED_FIRE ], - [Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.SUPERCELL_SLAM, Moves.ICE_SPINNER, Moves.WAVE_CRASH ], - [Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.WAVE_CRASH, Moves.SHELL_SMASH ], + [Species.SEVIPER]: [ Moves.ICE_BEAM, Moves.BITTER_BLADE, Moves.SUCKER_PUNCH, Moves.NO_RETREAT ], + [Species.LUNATONE]: [ Moves.POWER_GEM, Moves.NIGHT_DAZE, Moves.SHELL_SMASH, Moves.LUMINA_CRASH ], + [Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH, Moves.SACRED_FIRE ], + [Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.ZING_ZAP, Moves.ICE_SPINNER, Moves.SURGING_STRIKES ], + [Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.SUCKER_PUNCH, Moves.SHELL_SMASH ], [Species.BALTOY]: [ Moves.RECOVER, Moves.STORED_POWER, Moves.BODY_PRESS, Moves.MYSTICAL_POWER ], - [Species.LILEEP]: [ Moves.POWER_GEM, Moves.SCALD, Moves.STONE_AXE, Moves.SAPPY_SEED ], - [Species.ANORITH]: [ Moves.LIQUIDATION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ], + [Species.LILEEP]: [ Moves.POWER_GEM, Moves.SCALD, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ], + [Species.ANORITH]: [ Moves.FIRST_IMPRESSION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ], [Species.FEEBAS]: [ Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.MOONBLAST, Moves.STEAM_ERUPTION ], [Species.CASTFORM]: [ Moves.BOOMBURST, Moves.HYDRO_STEAM, Moves.ERUPTION, Moves.QUIVER_DANCE ], [Species.KECLEON]: [ Moves.DRAIN_PUNCH, Moves.DRAGON_DANCE, Moves.EXTREME_SPEED, Moves.MULTI_ATTACK ], [Species.SHUPPET]: [ Moves.STORM_THROW, Moves.TIDY_UP, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ], [Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.STRENGTH_SAP, Moves.RAGE_FIST ], [Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ], - [Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.DIRE_CLAW, Moves.BITTER_BLADE ], + [Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.PSYBLADE, Moves.BITTER_BLADE ], [Species.WYNAUT]: [ Moves.RECOVER, Moves.SHED_TAIL, Moves.TAUNT, Moves.COMEUPPANCE ], [Species.SNORUNT]: [ Moves.AURORA_VEIL, Moves.HYPER_VOICE, Moves.EARTH_POWER, Moves.NO_RETREAT ], [Species.SPHEAL]: [ Moves.FLIP_TURN, Moves.FREEZE_DRY, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [Species.CLAMPERL]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], [Species.RELICANTH]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.FISHIOUS_REND ], - [Species.LUVDISC]: [ Moves.BATON_PASS, Moves.THIEF, Moves.BOUNCY_BUBBLE, Moves.TAKE_HEART ], + [Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], [Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ], - [Species.BELDUM]: [ Moves.PSYCHIC_FANGS, Moves.RECOVER, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ], + [Species.BELDUM]: [ Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ], [Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.RECOVER, Moves.SALT_CURE ], - [Species.REGICE]: [ Moves.EARTH_POWER, Moves.COSMIC_POWER, Moves.RECOVER, Moves.FREEZE_DRY ], - [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.HEAT_CRASH, Moves.RECOVER, Moves.GIGATON_HAMMER ], + [Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ], + [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.THOUSAND_WAVES, Moves.RECOVER, Moves.GIGATON_HAMMER ], [Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ], [Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY, Moves.QUIVER_DANCE ], [Species.KYOGRE]: [ Moves.BOUNCY_BUBBLE, Moves.HURRICANE, Moves.THUNDER, Moves.TAIL_GLOW ], @@ -201,41 +201,41 @@ export const speciesEggMoves = { [Species.JIRACHI]: [ Moves.IRON_HEAD, Moves.FLOATY_FALL, Moves.ROCK_SLIDE, Moves.SHIFT_GEAR ], [Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ], [Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ], - [Species.CHIMCHAR]: [ Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.ICE_PUNCH, Moves.SACRED_FIRE ], + [Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], [Species.PIPLUP]: [ Moves.KINGS_SHIELD, Moves.TACHYON_CUTTER, Moves.ROOST, Moves.STEAM_ERUPTION ], - [Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.EXTREME_SPEED, Moves.FLARE_BLITZ, Moves.HEAD_CHARGE ], - [Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.STOCKPILE, Moves.POWER_TRIP, Moves.AQUA_STEP ], - [Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.ROOST, Moves.ROCK_BLAST, Moves.VICTORY_DANCE ], + [Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.HEAD_CHARGE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ], + [Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ], + [Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.VICTORY_DANCE, Moves.STONE_AXE, Moves.POPULATION_BOMB ], [Species.SHINX]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.FACADE, Moves.BOLT_STRIKE ], [Species.BUDEW]: [ Moves.FIERY_DANCE, Moves.SLUDGE_WAVE, Moves.SPORE, Moves.QUIVER_DANCE ], [Species.CRANIDOS]: [ Moves.DRAGON_DANCE, Moves.ACCELEROCK, Moves.HEADLONG_RUSH, Moves.VOLT_TACKLE ], - [Species.SHIELDON]: [ Moves.PAIN_SPLIT, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ], + [Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ], [Species.BURMY]: [ Moves.BODY_PRESS, Moves.DEFEND_ORDER, Moves.HEAL_ORDER, Moves.SAPPY_SEED ], - [Species.COMBEE]: [ Moves.SPORE, Moves.HEAT_WAVE, Moves.KINGS_SHIELD, Moves.QUIVER_DANCE ], + [Species.COMBEE]: [ Moves.SPORE, Moves.FLOATY_FALL, Moves.KINGS_SHIELD, Moves.VICTORY_DANCE ], [Species.PACHIRISU]: [ Moves.BADDY_BAD, Moves.SIZZLY_SLIDE, Moves.U_TURN, Moves.ZIPPY_ZAP ], [Species.BUIZEL]: [ Moves.JET_PUNCH, Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.SURGING_STRIKES ], [Species.CHERUBI]: [ Moves.SPORE, Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], [Species.SHELLOS]: [ Moves.BOUNCY_BUBBLE, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], - [Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.HEAT_WAVE, Moves.CALM_MIND, Moves.OBLIVION_WING ], + [Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.MULTI_ATTACK ], [Species.GLAMEOW]: [ Moves.U_TURN, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.EXTREME_SPEED ], - [Species.CHINGLING]: [ Moves.BUZZY_BUZZ, Moves.COSMIC_POWER, Moves.TORCH_SONG, Moves.LUMINA_CRASH ], + [Species.CHINGLING]: [ Moves.BUZZY_BUZZ, Moves.EERIE_SPELL, Moves.TORCH_SONG, Moves.BOOMBURST ], [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ], - [Species.BRONZOR]: [ Moves.RECOVER, Moves.COSMIC_POWER, Moves.GLARE, Moves.TACHYON_CUTTER ], + [Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ], [Species.BONSLY]: [ Moves.STONE_AXE, Moves.LEAF_BLADE, Moves.STRENGTH_SAP, Moves.HEAD_SMASH ], - [Species.MIME_JR]: [ Moves.CALM_MIND, Moves.MOONBLAST, Moves.WILL_O_WISP, Moves.LUMINA_CRASH ], + [Species.MIME_JR]: [ Moves.CALM_MIND, Moves.MOONBLAST, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], [Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], [Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ], - [Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ], - [Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.THOUSAND_WAVES, Moves.SHORE_UP, Moves.BITTER_BLADE ], + [Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ], + [Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.SHORE_UP, Moves.THOUSAND_ARROWS ], [Species.MUNCHLAX]: [ Moves.CURSE, Moves.BODY_PRESS, Moves.KNOCK_OFF, Moves.SLACK_OFF ], [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.BULLET_PUNCH, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ], [Species.HIPPOPOTAS]: [ Moves.BODY_PRESS, Moves.STONE_AXE, Moves.IRON_DEFENSE, Moves.SALT_CURE ], [Species.SKORUPI]: [ Moves.CEASELESS_EDGE, Moves.DIRE_CLAW, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_PUNCH, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], - [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.MIGHTY_CLEAVE, Moves.FLOWER_TRICK ], + [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], - [Species.MANTYKE]: [ Moves.BOUNCY_BUBBLE, Moves.STEALTH_ROCK, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ], + [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.HAZE, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], [Species.SNOVER]: [ Moves.HIGH_HORSEPOWER, Moves.STRENGTH_SAP, Moves.AURORA_VEIL, Moves.IVY_CUDGEL ], [Species.ROTOM]: [ Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.ELECTRO_DRIFT ], [Species.UXIE]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.RECOVER, Moves.SPARKLY_SWIRL ], @@ -243,24 +243,24 @@ export const speciesEggMoves = { [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ], [Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ], [Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.WATER_SPOUT, Moves.DRAGON_ENERGY ], - [Species.HEATRAN]: [ Moves.TORCH_SONG, Moves.RECOVER, Moves.FLASH_CANNON, Moves.MATCHA_GOTCHA ], + [Species.HEATRAN]: [ Moves.TORCH_SONG, Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.MATCHA_GOTCHA ], [Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ], [Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ], [Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], [Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], [Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], [Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.SEARING_SHOT, Moves.SPORE ], - [Species.SHAYMIN]: [ Moves.SPRINGTIDE_STORM, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM, Moves.MATCHA_GOTCHA ], + [Species.SHAYMIN]: [ Moves.MATCHA_GOTCHA, Moves.FIERY_DANCE, Moves.AEROBLAST, Moves.QUIVER_DANCE ], [Species.ARCEUS]: [ Moves.QUIVER_DANCE, Moves.COLLISION_COURSE, Moves.VICTORY_DANCE, Moves.SPECTRAL_THIEF ], [Species.VICTINI]: [ Moves.RECOVER, Moves.BOLT_STRIKE, Moves.PHOTON_GEYSER, Moves.VICTORY_DANCE ], - [Species.SNIVY]: [ Moves.BURNING_JEALOUSY, Moves.SAPPY_SEED, Moves.SUPERPOWER, Moves.FLEUR_CANNON ], - [Species.TEPIG]: [ Moves.AXE_KICK, Moves.VOLT_TACKLE, Moves.DRAIN_PUNCH, Moves.VICTORY_DANCE ], - [Species.OSHAWOTT]: [ Moves.ICE_SPINNER, Moves.SHELL_SIDE_ARM, Moves.SACRED_SWORD, Moves.SHELL_SMASH ], - [Species.PATRAT]: [ Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.GLARE, Moves.TIDY_UP ], + [Species.SNIVY]: [ Moves.FLAMETHROWER, Moves.CLANGING_SCALES, Moves.MAKE_IT_RAIN, Moves.FLEUR_CANNON ], + [Species.TEPIG]: [ Moves.WAVE_CRASH, Moves.VOLT_TACKLE, Moves.DRAIN_PUNCH, Moves.VICTORY_DANCE ], + [Species.OSHAWOTT]: [ Moves.TRIPLE_AXEL, Moves.SHELL_SIDE_ARM, Moves.SACRED_SWORD, Moves.SHELL_SMASH ], + [Species.PATRAT]: [ Moves.FAKE_OUT, Moves.GLARE, Moves.DYNAMIC_PUNCH, Moves.EXTREME_SPEED ], [Species.LILLIPUP]: [ Moves.CLOSE_COMBAT, Moves.THIEF, Moves.HIGH_HORSEPOWER, Moves.LAST_RESPECTS ], [Species.PURRLOIN]: [ Moves.ENCORE, Moves.ASSIST, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], - [Species.PANSAGE]: [ Moves.SWORDS_DANCE, Moves.TEMPER_FLARE, Moves.EARTHQUAKE, Moves.IVY_CUDGEL ], - [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.SCALD, Moves.SCORCHING_SANDS, Moves.TORCH_SONG ], + [Species.PANSAGE]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.EARTHQUAKE, Moves.IVY_CUDGEL ], + [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.SCORCHING_SANDS, Moves.TORCH_SONG ], [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.MYSTICAL_POWER ], [Species.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], @@ -274,29 +274,29 @@ export const speciesEggMoves = { [Species.THROH]: [ Moves.DRAIN_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.NO_RETREAT ], [Species.SAWK]: [ Moves.DRAIN_PUNCH, Moves.MACH_PUNCH, Moves.ENDEAVOR, Moves.VICTORY_DANCE ], [Species.SEWADDLE]: [ Moves.STONE_AXE, Moves.PSYCHO_CUT, Moves.TIDY_UP, Moves.BITTER_BLADE ], - [Species.VENIPEDE]: [ Moves.SWORDS_DANCE, Moves.BATON_PASS, Moves.NOXIOUS_TORQUE, Moves.BLAZING_TORQUE ], + [Species.VENIPEDE]: [ Moves.SWORDS_DANCE, Moves.LEECH_LIFE, Moves.NOXIOUS_TORQUE, Moves.POWER_TRIP ], [Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ], [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.AQUA_STEP, Moves.FIERY_DANCE ], - [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.TRIPLE_DIVE, Moves.DRAGON_DANCE ], - [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.PARTING_SHOT, Moves.FIRE_LASH, Moves.PRECIPICE_BLADES ], - [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.THUNDER_PUNCH, Moves.BLAZING_TORQUE, Moves.V_CREATE ], + [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ], + [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.WICKED_BLOW ], + [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZING_ZAP, Moves.EARTHQUAKE, Moves.V_CREATE ], [Species.MARACTUS]: [ Moves.SCORCHING_SANDS, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ], [Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ], - [Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.TRIPLE_AXEL, Moves.DRAGON_DANCE, Moves.COLLISION_COURSE ], + [Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.DRAGON_DANCE, Moves.COLLISION_COURSE ], [Species.SIGILYPH]: [ Moves.STORED_POWER, Moves.TAKE_HEART, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ], - [Species.YAMASK]: [ Moves.RECOVER, Moves.INFERNAL_PARADE, Moves.AURA_SPHERE, Moves.TOPSY_TURVY ], + [Species.YAMASK]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.TIRTOUGA]: [ Moves.ICE_SPINNER, Moves.LIQUIDATION, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], - [Species.ARCHEN]: [ Moves.ROOST, Moves.MIGHTY_CLEAVE, Moves.FLOATY_FALL, Moves.SKILL_SWAP ], + [Species.ARCHEN]: [ Moves.ROOST, Moves.EARTHQUAKE, Moves.FLOATY_FALL, Moves.MIGHTY_CLEAVE ], [Species.TRUBBISH]: [ Moves.TIDY_UP, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ], [Species.ZORUA]: [ Moves.FLAMETHROWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.FIERY_WRATH ], [Species.MINCCINO]: [ Moves.ICICLE_SPEAR, Moves.TIDY_UP, Moves.KNOCK_OFF, Moves.POPULATION_BOMB ], - [Species.GOTHITA]: [ Moves.MILK_DRINK, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PSYSTRIKE ], - [Species.SOLOSIS]: [ Moves.COSMIC_POWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PSYSTRIKE ], - [Species.DUCKLETT]: [ Moves.QUIVER_DANCE, Moves.EARTH_POWER, Moves.FREEZE_DRY, Moves.OBLIVION_WING ], - [Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.DECORATE, Moves.MILK_DRINK ], + [Species.GOTHITA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.LUMINA_CRASH ], + [Species.SOLOSIS]: [ Moves.EXPANDING_FORCE, Moves.TRICK_ROOM, Moves.AURA_SPHERE, Moves.LIGHT_OF_RUIN ], + [Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.EARTH_POWER, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ], + [Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ], [Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ], [Species.EMOLGA]: [ Moves.ROOST, Moves.HEAT_WAVE, Moves.TAILWIND, Moves.ZING_ZAP ], - [Species.KARRABLAST]: [ Moves.TRICK_ROOM, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE ], + [Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.HEAL_ORDER, Moves.HIGH_HORSEPOWER, Moves.DOUBLE_IRON_BASH ], [Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ], [Species.FRILLISH]: [ Moves.STRENGTH_SAP, Moves.INFERNAL_PARADE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.TOXIC, Moves.GLITZY_GLOW ], @@ -306,11 +306,11 @@ export const speciesEggMoves = { [Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.PLASMA_FISTS ], [Species.ELGYEM]: [ Moves.MYSTICAL_POWER, Moves.TRICK_ROOM, Moves.STORED_POWER, Moves.ASTRAL_BARRAGE ], [Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ], - [Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.FIRE_LASH, Moves.GLAIVE_RUSH ], + [Species.AXEW]: [ Moves.GLAIVE_RUSH, Moves.DIRE_CLAW, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.CUBCHOO]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], - [Species.CRYOGONAL]: [ Moves.SURF, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.AURORA_VEIL ], - [Species.SHELMET]: [ Moves.SHED_TAIL, Moves.NASTY_PLOT, Moves.BATON_PASS, Moves.HEAT_WAVE ], - [Species.STUNFISK]: [ Moves.SHORE_UP, Moves.BANEFUL_BUNKER, Moves.THUNDER_CAGE, Moves.THUNDERCLAP ], + [Species.CRYOGONAL]: [ Moves.SURF, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.FREEZY_FROST ], + [Species.SHELMET]: [ Moves.POWER_GEM, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], + [Species.STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.EARTHQUAKE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], [Species.MIENFOO]: [ Moves.GUNK_SHOT, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.MOUNTAIN_GALE ], [Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.ROOST, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ], [Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ], @@ -318,7 +318,7 @@ export const speciesEggMoves = { [Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ], [Species.RUFFLET]: [ Moves.FLOATY_FALL, Moves.MOONBLAST, Moves.HEAT_WAVE, Moves.BOLT_BEAK ], [Species.VULLABY]: [ Moves.TOXIC, Moves.BODY_PRESS, Moves.ROOST, Moves.TOPSY_TURVY ], - [Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.FLASH_CANNON, Moves.V_CREATE ], + [Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ], [Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ], [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_WAVE, Moves.FICKLE_BEAM ], [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MATCHA_GOTCHA, Moves.EARTH_POWER, Moves.TORCH_SONG ], @@ -332,86 +332,86 @@ export const speciesEggMoves = { [Species.LANDORUS]: [ Moves.STONE_AXE, Moves.THOUSAND_ARROWS, Moves.ROOST, Moves.FLOATY_FALL ], [Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.DRAGON_ENERGY, Moves.NO_RETREAT, Moves.GLACIAL_LANCE ], [Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], - [Species.MELOETTA]: [ Moves.TORCH_SONG, Moves.QUIVER_DANCE, Moves.THUNDEROUS_KICK, Moves.BOOMBURST ], - [Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.SHIFT_GEAR, Moves.TAIL_GLOW ], + [Species.MELOETTA]: [ Moves.TORCH_SONG, Moves.QUIVER_DANCE, Moves.TRIPLE_ARROWS, Moves.BOOMBURST ], + [Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.TACHYON_CUTTER, Moves.TAIL_GLOW ], [Species.CHESPIN]: [ Moves.DRAIN_PUNCH, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], [Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ], - [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.EARTH_POWER, Moves.TRIPLE_AXEL, Moves.SURGING_STRIKES ], + [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.WATER_SPOUT ], [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ], - [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.U_TURN, Moves.SUPERCELL_SLAM, Moves.TIDY_UP ], + [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.U_TURN, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], [Species.SCATTERBUG]: [ Moves.MOONBLAST, Moves.POLLEN_PUFF, Moves.TAILWIND, Moves.HEAT_WAVE ], [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.YAWN, Moves.TORCH_SONG ], - [Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.FLORAL_HEALING, Moves.TAKE_HEART ], + [Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.JUNGLE_HEALING, Moves.QUIVER_DANCE ], [Species.SKIDDO]: [ Moves.HIGH_HORSEPOWER, Moves.GRASSY_GLIDE, Moves.STONE_AXE, Moves.SAPPY_SEED ], [Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.FAKE_OUT, Moves.BULLET_PUNCH, Moves.WICKED_BLOW ], - [Species.FURFROU]: [ Moves.TIDY_UP, Moves.CRUNCH, Moves.COVET, Moves.MULTI_ATTACK ], - [Species.ESPURR]: [ Moves.GLARE, Moves.MOONBLAST, Moves.FLAMETHROWER, Moves.PSYSTRIKE ], + [Species.FURFROU]: [ Moves.TIDY_UP, Moves.SLACK_OFF, Moves.COVET, Moves.MULTI_ATTACK ], + [Species.ESPURR]: [ Moves.GLARE, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PSYSTRIKE ], [Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.POLTERGEIST, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], [Species.SPRITZEE]: [ Moves.TRICK_ROOM, Moves.FOUL_PLAY, Moves.WISH, Moves.REVIVAL_BLESSING ], - [Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.SUCKER_PUNCH, Moves.SPIRIT_BREAK, Moves.SIZZLY_SLIDE ], - [Species.INKAY]: [ Moves.POWER_TRIP, Moves.STORED_POWER, Moves.RECOVER, Moves.PSYCHO_BOOST ], + [Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.SUCKER_PUNCH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ], + [Species.INKAY]: [ Moves.POWER_TRIP, Moves.SPIN_OUT, Moves.RECOVER, Moves.PSYCHO_BOOST ], [Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.ACCELEROCK, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ], [Species.SKRELP]: [ Moves.RECOVER, Moves.CORE_ENFORCER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ], [Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.WATER_SHURIKEN, Moves.ORIGIN_PULSE ], - [Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.BOOMBURST, Moves.EARTH_POWER, Moves.TAIL_GLOW ], + [Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ], [Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.AXE_KICK ], [Species.AMAURA]: [ Moves.RECOVER, Moves.AURORA_VEIL, Moves.POWER_GEM, Moves.GEOMANCY ], - [Species.HAWLUCHA]: [ Moves.DARKEST_LARIAT, Moves.HIGH_HORSEPOWER, Moves.SUPERCELL_SLAM, Moves.BRAVE_BIRD ], - [Species.DEDENNE]: [ Moves.SIZZLY_SLIDE, Moves.STUFF_CHEEKS, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ], + [Species.HAWLUCHA]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FLOATY_FALL, Moves.WICKED_BLOW ], + [Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ], [Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ], [Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ], - [Species.KLEFKI]: [ Moves.COURT_CHANGE, Moves.ENCORE, Moves.TAUNT, Moves.TOPSY_TURVY ], + [Species.KLEFKI]: [ Moves.HEAL_BLOCK, Moves.ENCORE, Moves.TOPSY_TURVY, Moves.INSTRUCT ], [Species.PHANTUMP]: [ Moves.SPIRIT_SHACKLE, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ], [Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ], [Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ], [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], - [Species.XERNEAS]: [ Moves.LIGHT_OF_RUIN, Moves.LUMINA_CRASH, Moves.STRENGTH_SAP, Moves.REVIVAL_BLESSING ], + [Species.XERNEAS]: [ Moves.SEARING_SHOT, Moves.LUMINA_CRASH, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], [Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.VICTORY_DANCE, Moves.DOUBLE_IRON_BASH ], [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.GEOMANCY ], - [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.TIDY_UP, Moves.WICKED_BLOW ], - [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.SEARING_SHOT ], - [Species.ROWLET]: [ Moves.SNIPE_SHOT, Moves.POLTERGEIST, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], + [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], + [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ], + [Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.POLTERGEIST, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], [Species.LITTEN]: [ Moves.FAKE_OUT, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ], [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.BOUNCY_BUBBLE, Moves.ALLURING_VOICE, Moves.TORCH_SONG ], - [Species.PIKIPEK]: [ Moves.FLOATY_FALL, Moves.BONE_RUSH, Moves.BURNING_BULWARK, Moves.TIDY_UP ], - [Species.YUNGOOS]: [ Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.TIDY_UP, Moves.HEAD_CHARGE ], + [Species.PIKIPEK]: [ Moves.DUAL_WINGBEAT, Moves.BONE_RUSH, Moves.BURNING_BULWARK, Moves.POPULATION_BOMB ], + [Species.YUNGOOS]: [ Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.TIDY_UP, Moves.MULTI_ATTACK ], [Species.GRUBBIN]: [ Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.THUNDERCLAP, Moves.QUIVER_DANCE ], - [Species.CRABRAWLER]: [ Moves.CURSE, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ], + [Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ], [Species.ORICORIO]: [ Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.THUNDERCLAP, Moves.OBLIVION_WING ], [Species.CUTIEFLY]: [ Moves.STICKY_WEB, Moves.MOONBLAST, Moves.HEAT_WAVE, Moves.SPORE ], - [Species.ROCKRUFF]: [ Moves.DRILL_RUN, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ], - [Species.WISHIWASHI]: [ Moves.LIQUIDATION, Moves.ICE_SPINNER, Moves.DRAGON_DANCE, Moves.HEAL_ORDER ], - [Species.MAREANIE]: [ Moves.SPIKES, Moves.SIZZLY_SLIDE, Moves.MORTAL_SPIN, Moves.LEECH_SEED ], + [Species.ROCKRUFF]: [ Moves.HIGH_HORSEPOWER, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ], + [Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.ICE_SPINNER, Moves.DRAGON_DANCE, Moves.JET_PUNCH ], + [Species.MAREANIE]: [ Moves.CEASELESS_EDGE, Moves.SIZZLY_SLIDE, Moves.BODY_PRESS, Moves.LEECH_SEED ], [Species.MUDBRAY]: [ Moves.BODY_PRESS, Moves.YAWN, Moves.SHORE_UP, Moves.THOUSAND_WAVES ], - [Species.DEWPIDER]: [ Moves.AQUA_JET, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.AQUA_STEP ], + [Species.DEWPIDER]: [ Moves.JET_PUNCH, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.AQUA_STEP ], [Species.FOMANTIS]: [ Moves.SUPERPOWER, Moves.HEADLONG_RUSH, Moves.ICE_HAMMER, Moves.BITTER_BLADE ], - [Species.MORELULL]: [ Moves.CALM_MIND, Moves.SAPPY_SEED, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ], - [Species.SALANDIT]: [ Moves.FAKE_OUT, Moves.FIERY_DANCE, Moves.SCALD, Moves.MALIGNANT_CHAIN ], + [Species.MORELULL]: [ Moves.CALM_MIND, Moves.SAPPY_SEED, Moves.DRAINING_KISS, Moves.MATCHA_GOTCHA ], + [Species.SALANDIT]: [ Moves.FAKE_OUT, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER, Moves.ERUPTION ], [Species.STUFFUL]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.ICE_HAMMER, Moves.RAGE_FIST ], [Species.BOUNSWEET]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK, Moves.SAPPY_SEED ], - [Species.COMFEY]: [ Moves.BUZZY_BUZZ, Moves.POLLEN_PUFF, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], - [Species.ORANGURU]: [ Moves.FOUL_PLAY, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUNAR_BLESSING ], + [Species.COMFEY]: [ Moves.REVIVAL_BLESSING, Moves.POLLEN_PUFF, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], + [Species.ORANGURU]: [ Moves.JUNGLE_HEALING, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUMINA_CRASH ], [Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.SWORDS_DANCE, Moves.PYRO_BALL ], - [Species.WIMPOD]: [ Moves.ICE_SPINNER, Moves.OBSTRUCT, Moves.KNOCK_OFF, Moves.SURGING_STRIKES ], + [Species.WIMPOD]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.JET_PUNCH, Moves.SURGING_STRIKES ], [Species.SANDYGAST]: [ Moves.SCORCHING_SANDS, Moves.SPLISHY_SPLASH, Moves.CURSE, Moves.SALT_CURE ], [Species.PYUKUMUKU]: [ Moves.COMEUPPANCE, Moves.BANEFUL_BUNKER, Moves.TOXIC_SPIKES, Moves.SALT_CURE ], [Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.NO_RETREAT ], [Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ], - [Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.CLOSE_COMBAT ], - [Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.ARMOR_CANNON, Moves.EARTH_POWER, Moves.CLANGING_SCALES ], + [Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.COLLISION_COURSE ], + [Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.MORNING_SUN, Moves.BODY_PRESS, Moves.CORE_ENFORCER ], [Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.BOLT_STRIKE ], - [Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.SIZZLY_SLIDE, Moves.SPECTRAL_THIEF ], + [Species.MIMIKYU]: [ Moves.MAGICAL_TORQUE, Moves.TIDY_UP, Moves.SIZZLY_SLIDE, Moves.SPECTRAL_THIEF ], [Species.BRUXISH]: [ Moves.ICE_FANG, Moves.FIRE_FANG, Moves.FLIP_TURN, Moves.FILLET_AWAY ], - [Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.FLAMETHROWER, Moves.CLANGING_SCALES, Moves.CLANGOROUS_SOUL ], - [Species.DHELMISE]: [ Moves.POLTERGEIST, Moves.STRENGTH_SAP, Moves.LEAF_BLADE, Moves.DOUBLE_IRON_BASH ], - [Species.JANGMO_O]: [ Moves.ICE_BEAM, Moves.DRAIN_PUNCH, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], - [Species.TAPU_KOKO]: [ Moves.PLAY_ROUGH, Moves.MOUNTAIN_GALE, Moves.RISING_VOLTAGE, Moves.BOLT_BEAK ], + [Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.FLAMETHROWER, Moves.CORE_ENFORCER, Moves.CLANGOROUS_SOUL ], + [Species.DHELMISE]: [ Moves.POLTERGEIST, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ], + [Species.JANGMO_O]: [ Moves.OVERDRIVE, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], + [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.RISING_VOLTAGE, Moves.PLASMA_FISTS ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], - [Species.TAPU_BULU]: [ Moves.GRASSY_GLIDE, Moves.CLOSE_COMBAT, Moves.PLAY_ROUGH, Moves.VICTORY_DANCE ], + [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], [Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], [Species.COSMOG]: [ Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.SACRED_FIRE, Moves.PHOTON_GEYSER ], - [Species.NIHILEGO]: [ Moves.RECOVER, Moves.QUIVER_DANCE, Moves.ENERGY_BALL, Moves.MALIGNANT_CHAIN ], + [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.QUIVER_DANCE, Moves.ENERGY_BALL, Moves.MALIGNANT_CHAIN ], [Species.BUZZWOLE]: [ Moves.LEECH_LIFE, Moves.BULLET_PUNCH, Moves.DARKEST_LARIAT, Moves.COLLISION_COURSE ], [Species.PHEROMOSA]: [ Moves.AURA_SPHERE, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.COLLISION_COURSE ], [Species.XURKITREE]: [ Moves.OVERHEAT, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ], @@ -423,30 +423,30 @@ export const speciesEggMoves = { [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ], [Species.POIPOLE]: [ Moves.SLUDGE_BOMB, Moves.BUG_BUZZ, Moves.SEARING_SHOT, Moves.DRAGON_ENERGY ], [Species.STAKATAKA]: [ Moves.HEAVY_SLAM, Moves.SHORE_UP, Moves.CURSE, Moves.SALT_CURE ], - [Species.BLACEPHALON]: [ Moves.NASTY_PLOT, Moves.SEARING_SHOT, Moves.GIGA_DRAIN, Moves.ASTRAL_BARRAGE ], + [Species.BLACEPHALON]: [ Moves.NASTY_PLOT, Moves.AURA_SPHERE, Moves.CHLOROBLAST, Moves.ASTRAL_BARRAGE ], [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ], [Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ], [Species.GROOKEY]: [ Moves.HIGH_HORSEPOWER, Moves.CLANGOROUS_SOUL, Moves.GRASSY_GLIDE, Moves.SAPPY_SEED ], [Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.HIGH_JUMP_KICK, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE ], - [Species.SOBBLE]: [ Moves.ESPER_WING, Moves.FROST_BREATH, Moves.SEARING_SHOT, Moves.STEAM_ERUPTION ], - [Species.SKWOVET]: [ Moves.KNOCK_OFF, Moves.GRAV_APPLE, Moves.BODY_PRESS, Moves.SLACK_OFF ], + [Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.SEARING_SHOT, Moves.STEAM_ERUPTION ], + [Species.SKWOVET]: [ Moves.KNOCK_OFF, Moves.SLACK_OFF, Moves.BODY_PRESS, Moves.POPULATION_BOMB ], [Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.IRON_HEAD, Moves.KINGS_SHIELD ], [Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.EXPANDING_FORCE, Moves.SPORE, Moves.TAIL_GLOW ], [Species.NICKIT]: [ Moves.BADDY_BAD, Moves.BURNING_JEALOUSY, Moves.SPARKLY_SWIRL, Moves.FIERY_WRATH ], [Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.PARTING_SHOT, Moves.SEED_FLARE ], - [Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.HEAD_CHARGE, Moves.BODY_PRESS, Moves.MILK_DRINK ], - [Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.WAVE_CRASH ], - [Species.YAMPER]: [ Moves.ICE_FANG, Moves.TIDY_UP, Moves.THUNDERCLAP, Moves.ZING_ZAP ], - [Species.ROLYCOLY]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.WORK_UP, Moves.DIAMOND_STORM ], + [Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], + [Species.CHEWTLE]: [ Moves.FIRE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], + [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.ZIPPY_ZAP ], + [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], [Species.APPLIN]: [ Moves.DRAGON_CHEER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.STONE_EDGE, Moves.PRECIPICE_BLADES ], [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], - [Species.ARROKUDA]: [ Moves.THUNDER_FANG, Moves.KNOCK_OFF, Moves.ICE_FANG, Moves.FILLET_AWAY ], - [Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BANEFUL_BUNKER, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], + [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ], + [Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BUG_BUZZ, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], [Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], - [Species.CLOBBOPUS]: [ Moves.DRAIN_PUNCH, Moves.NO_RETREAT, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], + [Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], [Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ], - [Species.HATENNA]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.SEARING_SHOT ], + [Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.SEARING_SHOT ], [Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ], [Species.MILCERY]: [ Moves.MOONBLAST, Moves.SYRUP_BOMB, Moves.EARTH_POWER, Moves.SEARING_SHOT ], [Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ], @@ -455,16 +455,17 @@ export const speciesEggMoves = { [Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ], [Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.SHELL_SMASH, Moves.GLACIAL_LANCE ], [Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ], - [Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.SWORDS_DANCE ], + [Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], [Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ], [Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.FIRE_LASH, Moves.DRAGON_DANCE ], [Species.ARCTOZOLT]: [ Moves.TRIPLE_AXEL, Moves.LIQUIDATION, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ], [Species.ARCTOVISH]: [ Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.DURALUDON]: [ Moves.ICE_BEAM, Moves.BODY_PRESS, Moves.RECOVER, Moves.CORE_ENFORCER ], - [Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.SPIRIT_BREAK, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ], - [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.BITTER_BLADE, Moves.LEAF_BLADE, Moves.VICTORY_DANCE ], + [Species.DREEPY]: [ Moves.DRAGON_ENERGY, Moves.POWER_UP_PUNCH, Moves.BLAZING_TORQUE, Moves.SPECTRAL_THIEF ], + [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], [Species.ZAMAZENTA]: [ Moves.PSYSHIELD_BASH, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.VICTORY_DANCE ], + [Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.DRAGON_ENERGY, Moves.MALIGNANT_CHAIN, Moves.TAIL_GLOW ], [Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ], [Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.PARTING_SHOT, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ], [Species.REGIELEKI]: [ Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.ELECTRO_DRIFT ], @@ -478,7 +479,7 @@ export const speciesEggMoves = { [Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.TROP_KICK, Moves.THUNDEROUS_KICK ], [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.BLAZING_TORQUE, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ], [Species.TAROUNTULA]: [ Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.THIEF, Moves.SPORE ], - [Species.NYMBLE]: [ Moves.CEASELESS_EDGE, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ], + [Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ], [Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.ICE_PUNCH, Moves.MACH_PUNCH, Moves.PLASMA_FISTS ], [Species.TANDEMAUS]: [ Moves.BATON_PASS, Moves.THIEF, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], [Species.FIDOUGH]: [ Moves.WISH, Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.TIDY_UP ], @@ -487,25 +488,25 @@ export const speciesEggMoves = { [Species.NACLI]: [ Moves.BODY_PRESS, Moves.TOXIC, Moves.CURSE, Moves.DIAMOND_STORM ], [Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.SPECTRAL_THIEF ], [Species.TADBULB]: [ Moves.PARABOLIC_CHARGE, Moves.SCALD, Moves.EARTH_POWER, Moves.ELECTRO_SHOT ], - [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.TAILWIND, Moves.HEAT_WAVE, Moves.AEROBLAST ], - [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.KNOCK_OFF, Moves.PLAY_ROUGH, Moves.COLLISION_COURSE ], + [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.TAILWIND, Moves.HEAT_WAVE, Moves.ELECTRO_SHOT ], + [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], [Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ], - [Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.CEASELESS_EDGE, Moves.LAST_RESPECTS ], + [Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ], [Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], [Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ], [Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ], - [Species.RELLOR]: [ Moves.TOXIC_SPIKES, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], + [Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], [Species.FLITTLE]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.ROOST, Moves.FIERY_DANCE ], - [Species.TINKATINK]: [ Moves.MAGICAL_TORQUE, Moves.SHIFT_GEAR, Moves.ICE_HAMMER, Moves.PYRO_BALL ], + [Species.TINKATINK]: [ Moves.MAGICAL_TORQUE, Moves.PYRO_BALL, Moves.ICE_HAMMER, Moves.SHIFT_GEAR ], [Species.WIGLETT]: [ Moves.SHELL_SMASH, Moves.ICICLE_CRASH, Moves.SEED_BOMB, Moves.SURGING_STRIKES ], - [Species.BOMBIRDIER]: [ Moves.U_TURN, Moves.TIDY_UP, Moves.SUCKER_PUNCH, Moves.MIGHTY_CLEAVE ], + [Species.BOMBIRDIER]: [ Moves.FLOATY_FALL, Moves.SWORDS_DANCE, Moves.SUCKER_PUNCH, Moves.MIGHTY_CLEAVE ], [Species.FINIZEN]: [ Moves.TRIPLE_AXEL, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.SURGING_STRIKES ], [Species.VAROOM]: [ Moves.COMBAT_TORQUE, Moves.U_TURN, Moves.BLAZING_TORQUE, Moves.NOXIOUS_TORQUE ], - [Species.CYCLIZAR]: [ Moves.BATON_PASS, Moves.BLAZING_TORQUE, Moves.HEAD_CHARGE, Moves.CLANGOROUS_SOUL ], + [Species.CYCLIZAR]: [ Moves.BATON_PASS, Moves.BLAZING_TORQUE, Moves.KNOCK_OFF, Moves.CLANGOROUS_SOUL ], [Species.ORTHWORM]: [ Moves.SIZZLY_SLIDE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ], [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], - [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.U_TURN, Moves.VICTORY_DANCE ], + [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], [Species.CETODDLE]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ], [Species.VELUZA]: [ Moves.CEASELESS_EDGE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.PSYBLADE ], [Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.ICE_SPINNER, Moves.TOXIC, Moves.SALT_CURE ], @@ -515,39 +516,39 @@ export const speciesEggMoves = { [Species.BRUTE_BONNET]: [ Moves.DARKEST_LARIAT, Moves.STRENGTH_SAP, Moves.EARTHQUAKE, Moves.SAPPY_SEED ], [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.FLAMETHROWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], [Species.SLITHER_WING]: [ Moves.KNOCK_OFF, Moves.VICTORY_DANCE, Moves.FIRE_LASH, Moves.THUNDEROUS_KICK ], - [Species.SANDY_SHOCKS]: [ Moves.SHORE_UP, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], + [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], [Species.IRON_TREADS]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SHORE_UP, Moves.DOUBLE_IRON_BASH ], [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.WATER_SPOUT ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], - [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ], + [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.QUIVER_DANCE, Moves.MALIGNANT_CHAIN ], [Species.IRON_THORNS]: [ Moves.DIAMOND_STORM, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.PLASMA_FISTS ], [Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.GLACIAL_LANCE ], - [Species.GIMMIGHOUL]: [ Moves.COSMIC_POWER, Moves.STORED_POWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], + [Species.GIMMIGHOUL]: [ Moves.ARMOR_CANNON, Moves.STORED_POWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], [Species.WO_CHIEN]: [ Moves.SPORE, Moves.FIERY_WRATH, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ], [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.BITTER_BLADE, Moves.GLACIAL_LANCE ], [Species.TING_LU]: [ Moves.SHORE_UP, Moves.WICKED_BLOW, Moves.SAPPY_SEED, Moves.THOUSAND_ARROWS ], [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.TORCH_SONG, Moves.ERUPTION ], [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], - [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.VICTORY_DANCE, Moves.QUIVER_DANCE, Moves.MAGICAL_TORQUE ], + [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], [Species.KORAIDON]: [ Moves.BITTER_BLADE, Moves.MORNING_SUN, Moves.GLAIVE_RUSH, Moves.CLANGOROUS_SOUL ], [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.RISING_VOLTAGE, Moves.DRAGON_ENERGY ], [Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.DRAGON_ENERGY ], [Species.IRON_LEAVES]: [ Moves.SPORE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE ], - [Species.POLTCHAGEIST]: [ Moves.SHELL_SMASH, Moves.INFERNAL_PARADE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], + [Species.POLTCHAGEIST]: [ Moves.SHELL_SMASH, Moves.BOUNCY_BUBBLE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], [Species.OKIDOGI]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.DIRE_CLAW, Moves.VICTORY_DANCE ], [Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ], [Species.FEZANDIPITI]: [ Moves.BARB_BARRAGE, Moves.VICTORY_DANCE, Moves.TRIPLE_AXEL, Moves.MAGICAL_TORQUE ], [Species.OGERPON]: [ Moves.FLOWER_TRICK, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.GIGATON_HAMMER ], [Species.GOUGING_FIRE]: [ Moves.SUPERCELL_SLAM, Moves.BULK_UP, Moves.SACRED_FIRE, Moves.GLAIVE_RUSH ], - [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.RECOVER, Moves.ELECTRO_DRIFT ], + [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ], [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PHOTON_GEYSER, Moves.ELECTRO_DRIFT ], [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], [Species.PECHARUNT]: [ Moves.TOXIC_SPIKES, Moves.BODY_PRESS, Moves.HEX, Moves.BANEFUL_BUNKER ], [Species.ALOLA_RATTATA]: [ Moves.STORM_THROW, Moves.PLAY_ROUGH, Moves.TIDY_UP, Moves.POPULATION_BOMB ], [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.AQUA_CUTTER, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], - [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.AURORA_VEIL, Moves.FLAMETHROWER, Moves.FREEZY_FROST ], + [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.FLAMETHROWER, Moves.FREEZY_FROST ], [Species.ALOLA_DIGLETT]: [ Moves.THOUSAND_WAVES, Moves.SWORDS_DANCE, Moves.TRIPLE_DIVE, Moves.MOUNTAIN_GALE ], [Species.ALOLA_MEOWTH]: [ Moves.BADDY_BAD, Moves.BUZZY_BUZZ, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], [Species.ALOLA_GEODUDE]: [ Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.STONE_AXE, Moves.EXTREME_SPEED ], @@ -560,15 +561,15 @@ export const speciesEggMoves = { [Species.GALAR_ARTICUNO]: [ Moves.AURA_SPHERE, Moves.OBLIVION_WING, Moves.ICE_BEAM, Moves.PSYSTRIKE ], [Species.GALAR_ZAPDOS]: [ Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], [Species.GALAR_MOLTRES]: [ Moves.ROOST, Moves.SLUDGE_BOMB, Moves.FLAMETHROWER, Moves.OBLIVION_WING ], - [Species.GALAR_CORSOLA]: [ Moves.TRICK_ROOM, Moves.MOONBLAST, Moves.COSMIC_POWER, Moves.ASTRAL_BARRAGE ], - [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.DIRE_CLAW, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], + [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.MOONBLAST, Moves.COSMIC_POWER, Moves.ASTRAL_BARRAGE ], + [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.FACADE, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], [Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ENDURE, Moves.DRAIN_PUNCH, Moves.V_CREATE ], [Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ], - [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.TRICK_ROOM, Moves.SHORE_UP, Moves.SALT_CURE ], - [Species.HISUI_GROWLITHE]: [ Moves.WOOD_HAMMER, Moves.HEAD_SMASH, Moves.VOLT_TACKLE, Moves.MORNING_SUN ], - [Species.HISUI_VOLTORB]: [ Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.PARABOLIC_CHARGE, Moves.SEED_FLARE ], + [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.EARTHQUAKE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], + [Species.HISUI_GROWLITHE]: [ Moves.WOOD_HAMMER, Moves.HEAD_SMASH, Moves.MORNING_SUN, Moves.DRAGON_DANCE ], + [Species.HISUI_VOLTORB]: [ Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.RISING_VOLTAGE, Moves.SEED_FLARE ], [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.STRENGTH_SAP, Moves.FISHIOUS_REND ], - [Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.VICTORY_DANCE ], + [Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ], [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], [Species.PALDEA_WOOPER]: [ Moves.RECOVER, Moves.STONE_AXE, Moves.BANEFUL_BUNKER, Moves.SAPPY_SEED ], diff --git a/src/data/egg.ts b/src/data/egg.ts index 1c3c0e78798..bb952d71fb0 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -1,97 +1,526 @@ import BattleScene from "../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; -import i18next from "../plugins/i18n"; +import { VariantTier } from "../enums/variant-tiers"; +import * as Utils from "../utils"; +import * as Overrides from "../overrides"; +import { pokemonPrevolutions } from "./pokemon-evolutions"; +import { PlayerPokemon } from "#app/field/pokemon"; +import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; import { Species } from "#enums/species"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export const EGG_SEED = 1073741824; -export enum GachaType { - MOVE, - LEGENDARY, - SHINY +// Rates for specific random properties in 1/x +const DEFAULT_SHINY_RATE = 128; +const GACHA_SHINY_UP_SHINY_RATE = 64; +const SAME_SPECIES_EGG_SHINY_RATE = 32; +const SAME_SPECIES_EGG_HA_RATE = 16; +const MANAPHY_EGG_MANAPHY_RATE = 8; + +// 1/x for legendary eggs, 1/x*2 for epic eggs, 1/x*4 for rare eggs, and 1/x*8 for common eggs +const DEFAULT_RARE_EGGMOVE_RATE = 6; +const SAME_SPECIES_EGG_RARE_EGGMOVE_RATE = 3; +const GACHA_MOVE_UP_RARE_EGGMOVE_RATE = 3; + +/** Egg options to override egg properties */ +export interface IEggOptions { + /** Id. Used to check if egg type will be manaphy (id % 204 === 0) */ + id?: number; + /** Timestamp when this egg got created */ + timestamp?: number; + /** Defines if the egg got pulled from a gacha or not. If true, egg pity and pull statistics will be applyed. + * Egg will be automaticly added to the game data. + * NEEDS scene eggOption to work. + */ + pulled?: boolean; + /** Defines where the egg comes from. Applies specific modifiers. + * Will also define the text displayed in the egg list. + */ + sourceType?: EggSourceType; + /** Needs to be defined if eggOption pulled is defined or if no species or isShiny is degined since this will be needed to generate them. */ + scene?: BattleScene; + /** Sets the tier of the egg. Only species of this tier can be hatched from this egg. + * Tier will be overriden if species eggOption is set. + */ + tier?: EggTier; + /** Sets how many waves it will take till this egg hatches. */ + hatchWaves?: number; + /** Sets the exact species that will hatch from this egg. + * Needs scene eggOption if not provided. + */ + species?: Species; + /** Defines if the hatched pokemon will be a shiny. */ + isShiny?: boolean; + /** Defines the variant of the pokemon that will hatch from this egg. If no variantTier is given the normal variant rates will apply. */ + variantTier?: VariantTier; + /** Defines which egg move will be unlocked. 3 = rare egg move. */ + eggMoveIndex?: number; + /** Defines if the egg will hatch with the hidden ability of this species. + * If no hidden ability exist, a random one will get choosen. + */ + overrideHiddenAbility?: boolean } export class Egg { - public id: integer; - public tier: EggTier; - public gachaType: GachaType; - public hatchWaves: integer; - public timestamp: integer; - constructor(id: integer, gachaType: GachaType, hatchWaves: integer, timestamp: integer) { - this.id = id; - this.tier = Math.floor(id / EGG_SEED); - this.gachaType = gachaType; - this.hatchWaves = hatchWaves; - this.timestamp = timestamp; + //// + // #region Privat properties + //// + + private _id: number; + private _tier: EggTier; + private _sourceType: EggSourceType | undefined; + private _hatchWaves: number; + private _timestamp: number; + + private _species: Species; + private _isShiny: boolean; + private _variantTier: VariantTier; + private _eggMoveIndex: number; + + private _overrideHiddenAbility: boolean; + + //// + // #endregion + //// + + //// + // #region Public facing properties + //// + get id(): number { + return this._id; } - isManaphyEgg(): boolean { - return this.tier === EggTier.COMMON && !(this.id % 204); + get tier(): EggTier { + return this._tier; } - getKey(): string { + get sourceType(): EggSourceType | undefined { + return this._sourceType; + } + + get hatchWaves(): number { + return this._hatchWaves; + } + + set hatchWaves(value: number) { + this._hatchWaves = value; + } + + get timestamp(): number { + return this._timestamp; + } + + get species(): Species { + return this._species; + } + + get isShiny(): boolean { + return this._isShiny; + } + + get variantTier(): VariantTier { + return this._variantTier; + } + + get eggMoveIndex(): number { + return this._eggMoveIndex; + } + + get overrideHiddenAbility(): boolean { + return this._overrideHiddenAbility; + } + + //// + // #endregion + //// + + constructor(eggOptions?: IEggOptions) { + //if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.") + + this._sourceType = eggOptions.sourceType ?? undefined; + // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced + this._tier = eggOptions.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier()); + // If egg was pulled, check if egg pity needs to override the egg tier + if (eggOptions.pulled) { + // Needs this._tier and this._sourceType to work + this.checkForPityTierOverrides(eggOptions.scene); + } + + this._id = eggOptions.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier); + + this._sourceType = eggOptions.sourceType ?? undefined; + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + this._timestamp = eggOptions.timestamp ?? new Date().getTime(); + + // First roll shiny and variant so we can filter if species with an variant exist + this._isShiny = eggOptions.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny()); + this._variantTier = eggOptions.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant()); + this._species = eggOptions.species ?? this.rollSpecies(eggOptions.scene); + + this._overrideHiddenAbility = eggOptions.overrideHiddenAbility ?? false; + + // Override egg tier and hatchwaves if species was given + if (eggOptions.species) { + this._tier = this.getEggTierFromSpeciesStarterValue(); + this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); + // If species has no variant, set variantTier to common. This needs to + // be done because species with no variants get filtered at rollSpecies but since the + // species is set the check never happens + if (!getPokemonSpecies(this.species).hasVariants()) { + this._variantTier = VariantTier.COMMON; + } + } + // Needs this._tier so it needs to be generated afer the tier override if bought from same species + this._eggMoveIndex = eggOptions.eggMoveIndex ?? this.rollEggMoveIndex(); + if (eggOptions.pulled) { + this.increasePullStatistic(eggOptions.scene); + this.addEggToGameData(eggOptions.scene); + } + } + + //// + // #region Public methodes + //// + + public isManaphyEgg(): boolean { + return (this._species === Species.PHIONE || this._species === Species.MANAPHY) || + this._tier === EggTier.COMMON && !(this._id % 204) && !this._species; + } + + public getKey(): string { if (this.isManaphyEgg()) { return "manaphy"; } - return this.tier.toString(); + return this._tier.toString(); } + + // Generates a PlayerPokemon from an egg + public generatePlayerPokemon(scene: BattleScene): PlayerPokemon { + // Legacy egg wants to hatch. Generate missing properties + if (!this._species) { + this._isShiny = this.rollShiny(); + this._species = this.rollSpecies(scene); + } + + const pokemonSpecies = getPokemonSpecies(this._species); + + // Sets the hidden ability if a hidden ability exists and the override is set + // or if the same species egg hits the chance + let abilityIndex = undefined; + if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility + || (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE)))) { + abilityIndex = pokemonSpecies.ability2 ? 2 : 1; + } + + // This function has way to many optional parameters + const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false); + ret.shiny = this._isShiny; + ret.variant = this._variantTier; + + const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); + + for (let s = 0; s < ret.ivs.length; s++) { + ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); + } + + return ret; + } + + // Doesn't need to be called if the egg got pulled by a gacha machiene + public addEggToGameData(scene: BattleScene): void { + scene.gameData.eggs.push(this); + } + + public getEggDescriptor(): string { + if (this.isManaphyEgg()) { + return "Manaphy"; + } + switch (this.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"); + } + } + + public getEggHatchWavesMessage(): string { + if (this.hatchWaves <= 5) { + return i18next.t("egg:hatchWavesMessageSoon"); + } + if (this.hatchWaves <= 15) { + return i18next.t("egg:hatchWavesMessageClose"); + } + if (this.hatchWaves <= 50) { + return i18next.t("egg:hatchWavesMessageNotClose"); + } + return i18next.t("egg:hatchWavesMessageLongTime"); + } + + public getEggTypeDescriptor(scene: BattleScene): string { + switch (this.sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + return i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName()}); + case EggSourceType.GACHA_LEGENDARY: + return `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; + case EggSourceType.GACHA_SHINY: + return i18next.t("egg:gachaTypeShiny"); + case EggSourceType.GACHA_MOVE: + return i18next.t("egg:gachaTypeMove"); + } + } + + //// + // #endregion + //// + + //// + // #region Private methodes + //// + + private rollEggMoveIndex() { + let baseChance = DEFAULT_RARE_EGGMOVE_RATE; + switch (this._sourceType) { + case EggSourceType.SAME_SPECIES_EGG: + baseChance = SAME_SPECIES_EGG_RARE_EGGMOVE_RATE; + break; + case EggSourceType.GACHA_MOVE: + baseChance = GACHA_MOVE_UP_RARE_EGGMOVE_RATE; + break; + default: + break; + } + + return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3; + } + + private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { + if (this._species === Species.PHIONE || this._species === Species.MANAPHY) { + return 50; + } + + switch (eggTier ?? this._tier) { + case EggTier.COMMON: + return 10; + case EggTier.GREAT: + return 25; + case EggTier.ULTRA: + return 50; + } + return 100; + } + + private rollEggTier(): EggTier { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + const tierValue = Utils.randInt(256); + return tierValue >= 52 + tierValueOffset ? EggTier.COMMON : tierValue >= 8 + tierValueOffset ? EggTier.GREAT : tierValue >= 1 + tierValueOffset ? EggTier.ULTRA : EggTier.MASTER; + } + + private rollSpecies(scene: BattleScene): Species { + if (!scene) { + return undefined; + } + /** + * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione + * Legendary eggs pulled from the legendary gacha have a 50% of being converted into + * the species that was the legendary focus at the time + */ + if (this.isManaphyEgg()) { + const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE); + return rand ? Species.PHIONE : Species.MANAPHY; + } else if (this.tier === EggTier.MASTER + && this._sourceType === EggSourceType.GACHA_LEGENDARY) { + if (!Utils.randSeedInt(2)) { + return getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp); + } + } + + let minStarterValue: integer; + let maxStarterValue: integer; + + switch (this.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; + } + + const ignoredSpecies = [Species.PHIONE, Species.MANAPHY, Species.ETERNATUS]; + + let 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); + + // If this is the 10th egg without unlocking something new, attempt to force it. + if (scene.gameData.unlockPity[this.tier] >= 9) { + const lockedPool = speciesPool.filter(s => !scene.gameData.dexData[s].caughtAttr && !scene.gameData.eggs.some(e => e.species === s)); + if (lockedPool.length) { // Skip this if everything is unlocked + speciesPool = lockedPool; + } + } + + // If egg variant is set to RARE or EPIC, filter species pool to only include ones with variants. + if (this.variantTier && (this.variantTier === VariantTier.RARE || this.variantTier === VariantTier.EPIC)) { + speciesPool = speciesPool.filter(s => getPokemonSpecies(s).hasVariants()); + } + + /** + * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty + * 1 cost mons get 2x + * 2 cost mons get 1.5x + * 4, 6, 8 cost mons get 1.75x + * 3, 5, 7, 9 cost mons get 1x + * Alolan, Galarian, and Paldean mons get 0.5x + * Hisui mons get 0.125x + * + * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once + * and being the same each time + */ + let totalWeight = 0; + const speciesWeights = []; + 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()) { + weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); + } + speciesWeights.push(totalWeight + weight); + totalWeight += weight; + } + + let species: Species; + + const rand = Utils.randSeedInt(totalWeight); + for (let s = 0; s < speciesWeights.length; s++) { + if (rand < speciesWeights[s]) { + species = speciesPool[s]; + break; + } + } + + if (!!scene.gameData.dexData[species].caughtAttr || scene.gameData.eggs.some(e => e.species === species)) { + scene.gameData.unlockPity[this.tier] = Math.min(scene.gameData.unlockPity[this.tier] + 1, 10); + } else { + scene.gameData.unlockPity[this.tier] = 0; + } + + return species; + } + + /** + * Rolls whether the egg is shiny or not. + * @returns True if the egg is shiny + **/ + private rollShiny(): boolean { + let shinyChance = DEFAULT_SHINY_RATE; + switch (this._sourceType) { + case EggSourceType.GACHA_SHINY: + shinyChance = GACHA_SHINY_UP_SHINY_RATE; + break; + case EggSourceType.SAME_SPECIES_EGG: + shinyChance = SAME_SPECIES_EGG_SHINY_RATE; + break; + default: + break; + } + + return !Utils.randSeedInt(shinyChance); + } + + // Uses the same logic as pokemon.generateVariant(). I would like to only have this logic in one + // place but I don't want to touch the pokemon class. + private rollVariant(): VariantTier { + if (!this.isShiny) { + return VariantTier.COMMON; + } + + const rand = Utils.randSeedInt(10); + if (rand >= 4) { + return VariantTier.COMMON; // 6/10 + } else if (rand >= 1) { + return VariantTier.RARE; // 3/10 + } else { + return VariantTier.EPIC; // 1/10 + } + } + + private checkForPityTierOverrides(scene: BattleScene): void { + const tierValueOffset = this._sourceType === EggSourceType.GACHA_LEGENDARY ? 1 : 0; + scene.gameData.eggPity[EggTier.GREAT] += 1; + scene.gameData.eggPity[EggTier.ULTRA] += 1; + scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; + // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. + if (scene.gameData.eggPity[EggTier.MASTER] >= 412 && this._tier === EggTier.COMMON) { + this._tier = EggTier.MASTER; + } else if (scene.gameData.eggPity[EggTier.ULTRA] >= 59 && this._tier === EggTier.COMMON) { + this._tier = EggTier.ULTRA; + } else if (scene.gameData.eggPity[EggTier.GREAT] >= 9 && this._tier === EggTier.COMMON) { + this._tier = EggTier.GREAT; + } + scene.gameData.eggPity[this._tier] = 0; + } + + private increasePullStatistic(scene: BattleScene): void { + scene.gameData.gameStats.eggsPulled++; + if (this.isManaphyEgg()) { + scene.gameData.gameStats.manaphyEggsPulled++; + this._hatchWaves = this.getEggTierDefaultHatchWaves(EggTier.ULTRA); + return; + } + switch (this.tier) { + case EggTier.GREAT: + scene.gameData.gameStats.rareEggsPulled++; + break; + case EggTier.ULTRA: + scene.gameData.gameStats.epicEggsPulled++; + break; + case EggTier.MASTER: + scene.gameData.gameStats.legendaryEggsPulled++; + break; + } + } + + private getEggTierFromSpeciesStarterValue(): EggTier { + const speciesStartValue = speciesStarters[this.species]; + if (speciesStartValue >= 1 && speciesStartValue <= 3) { + return EggTier.COMMON; + } + if (speciesStartValue >= 4 && speciesStartValue <= 5) { + return EggTier.GREAT; + } + if (speciesStartValue >= 6 && speciesStartValue <= 7) { + return EggTier.ULTRA; + } + if (speciesStartValue >= 8) { + return EggTier.MASTER; + } + } + + //// + // #endregion + //// } -export function getEggTierDefaultHatchWaves(tier: EggTier): integer { - switch (tier) { - 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"; - } - 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"); - } -} - -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"); -} - -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"); - } -} - -export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: integer): Species { +export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { const legendarySpecies = Object.entries(speciesStarters) .filter(s => s[1] >= 8 && s[1] <= 9) .map(s => parseInt(s[0])) diff --git a/src/data/move.ts b/src/data/move.ts index b7bfd9343f2..9964665c12a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,15 +1,16 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag } from "./battler-tags"; -import { getPokemonMessage } from "../messages"; +import { EncoreTag, SemiInvulnerableTag } from "./battler-tags"; +import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; import { Type } from "./type"; +import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr } from "./ability"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr } from "./ability"; import { allAbilities } from "./ability"; import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; import { BattlerIndex } from "../battle"; @@ -18,7 +19,8 @@ import { TerrainType } from "./terrain"; import { SpeciesFormChangeActiveTrigger } from "./pokemon-forms"; import { ModifierPoolType } from "#app/modifier/modifier-type"; import { Command } from "../ui/command-ui-handler"; -import i18next, { Localizable } from "../plugins/i18n"; +import i18next from "i18next"; +import { Localizable } from "#app/interfaces/locales"; import { getBerryEffectFunc } from "./berry"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; @@ -155,7 +157,7 @@ export default class Move implements Localizable { * @param attrType any attribute that extends {@linkcode MoveAttr} * @returns Array of attributes that match `attrType`, Empty Array if none match. */ - getAttrs(attrType: new(...args: any[]) => T): T[] { + getAttrs(attrType: Constructor): T[] { return this.attrs.filter((a): a is T => a instanceof attrType); } @@ -164,7 +166,7 @@ export default class Move implements Localizable { * @param attrType any attribute that extends {@linkcode MoveAttr} * @returns true if the move has attribute `attrType` */ - hasAttr(attrType: new(...args: any[]) => T): boolean { + hasAttr(attrType: Constructor): boolean { return this.attrs.some((attr) => attr instanceof attrType); } @@ -184,7 +186,7 @@ export default class Move implements Localizable { * @param args the args needed to instantiate a the given class * @returns the called object {@linkcode Move} */ - attr MoveAttr>(AttrType: T, ...args: ConstructorParameters): this { + attr>(AttrType: T, ...args: ConstructorParameters): this { const attr = new AttrType(...args); this.attrs.push(attr); let attrCondition = attr.getCondition(); @@ -277,18 +279,29 @@ export default class Move implements Localizable { } /** - * Checks if the move is immune to certain types - * currently only look at case of Grass types and powder moves - * @param type {@linkcode Type} enum + * Checks if the move is immune to certain types. + * Currently looks at cases of Grass types with powder moves and Dark types with moves affected by Prankster. + * @param {Pokemon} user the source of this move + * @param {Pokemon} target the target of this move + * @param {Type} type the type of the move's target * @returns boolean */ - isTypeImmune(type: Type): boolean { + isTypeImmune(user: Pokemon, target: Pokemon, type: Type): boolean { + if (this.moveTarget === MoveTarget.USER) { + return false; + } + switch (type) { case Type.GRASS: if (this.hasFlag(MoveFlags.POWDER_MOVE)) { return true; } break; + case Type.DARK: + if (user.hasAbility(Abilities.PRANKSTER) && this.category === MoveCategory.STATUS && (user.isPlayer() !== target.isPlayer())) { + return true; + } + break; } return false; } @@ -559,6 +572,11 @@ export default class Move implements Localizable { return true; } } + case MoveFlags.IGNORE_PROTECT: + if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) && + this.checkFlag(MoveFlags.MAKES_CONTACT, user, target)) { + return true; + } } return !!(this.flags & flag); @@ -788,16 +806,22 @@ export enum MoveEffectTrigger { */ export class MoveEffectAttr extends MoveAttr { /** Defines when this effect should trigger in the move's effect order - * @see {@linkcode MoveEffectPhase.start} + * @see {@linkcode phases.MoveEffectPhase.start} */ public trigger: MoveEffectTrigger; /** Should this effect only apply on the first hit? */ public firstHitOnly: boolean; + /** Should this effect only apply on the last hit? */ + public lastHitOnly: boolean; + /** Should this effect only apply on the first target hit? */ + public firstTargetOnly: boolean; - constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false) { + constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false, lastHitOnly: boolean = false, firstTargetOnly: boolean = false) { super(selfTarget); this.trigger = trigger !== undefined ? trigger : MoveEffectTrigger.POST_APPLY; this.firstHitOnly = firstHitOnly; + this.lastHitOnly = lastHitOnly; + this.firstTargetOnly = firstTargetOnly; } /** @@ -811,13 +835,30 @@ export class MoveEffectAttr extends MoveAttr { */ canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { return !! (this.selfTarget ? user.hp && !user.getTag(BattlerTagType.FRENZY) : target.hp) - && (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || move.hasFlag(MoveFlags.IGNORE_PROTECT)); + && (this.selfTarget || !target.getTag(BattlerTagType.PROTECTED) || + move.checkFlag(MoveFlags.IGNORE_PROTECT, user, target)); } /** Applies move effects so long as they are able based on {@linkcode canApply} */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { return this.canApply(user, target, move, args); } + + /** + * Gets the used move's additional effect chance. + * If user's ability has MoveEffectChanceMultiplierAbAttr or IgnoreMoveEffectsAbAttr modifies the base chance. + * @param user {@linkcode Pokemon} using this move + * @param target {@linkcode Pokemon} target of this move + * @param move {@linkcode Move} being used + * @param selfEffect {@linkcode Boolean} if move targets user. + * @returns Move chance value. + */ + getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean): integer { + const moveChance = new Utils.NumberHolder(move.chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect); + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr,target,user,null,null, moveChance); + return moveChance.value; + } } export class PreMoveMessageAttr extends MoveAttr { @@ -1029,7 +1070,7 @@ export class RecoilAttr extends MoveEffectAttr { private unblockable: boolean; constructor(useHp: boolean = false, damageRatio: number = 0.25, unblockable: boolean = false) { - super(true); + super(true, MoveEffectTrigger.POST_APPLY, false, true); this.useHp = useHp; this.damageRatio = damageRatio; @@ -1050,8 +1091,8 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.currDamageDealt : user.getMaxHp()) * this.damageRatio), - user.turnData.currDamageDealt ? 1 : 0); + const recoilDamage = Math.max(Math.floor((!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio), + user.turnData.damageDealt ? 1 : 0); if (!recoilDamage) { return false; } @@ -1662,7 +1703,8 @@ export class StatusEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const statusCheck = move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance; + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const statusCheck = moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance; if (statusCheck) { const pokemon = this.selfTarget ? user : target; if (pokemon.status) { @@ -1672,7 +1714,7 @@ export class StatusEffectAttr extends MoveEffectAttr { return false; } } - if ((!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) + if ((!pokemon.status || (pokemon.status.effect === this.effect && moveChance < 0)) && pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) { applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null,this.effect); return true; @@ -1682,7 +1724,8 @@ export class StatusEffectAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; } } @@ -1701,7 +1744,8 @@ export class MultiStatusEffectAttr extends StatusEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; } } @@ -1719,7 +1763,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { if (!target.status || (target.status.effect === statusToApply && move.chance < 0)) { const statusAfflictResult = target.trySetStatus(statusToApply, true, user); if (statusAfflictResult) { - user.scene.queueMessage(getPokemonMessage(user, getStatusEffectHealText(user.status.effect))); + user.scene.queueMessage(getStatusEffectHealText(user.status.effect, getPokemonNameWithAffix(user))); user.resetStatus(); user.updateInfo(); } @@ -1733,7 +1777,11 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; } } - +/** + * The following needs to be implemented for Thief + * "If the user faints due to the target's Ability (Rough Skin or Iron Barbs) or held Rocky Helmet, it cannot remove the target's held item." + * "If Knock Off causes a Pokémon with the Sticky Hold Ability to faint, it can now remove that Pokémon's held item." + */ export class StealHeldItemChanceAttr extends MoveEffectAttr { private chance: number; @@ -1783,37 +1831,65 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { } } +/** + * Removes a random held item (or berry) from target. + * Used for Incinerate and Knock Off. + * Not Implemented Cases: (Same applies for Thief) + * "If the user faints due to the target's Ability (Rough Skin or Iron Barbs) or held Rocky Helmet, it cannot remove the target's held item." + * "If Knock Off causes a Pokémon with the Sticky Hold Ability to faint, it can now remove that Pokémon's held item." + */ export class RemoveHeldItemAttr extends MoveEffectAttr { - private chance: number; - constructor(chance: number) { + /** Optional restriction for item pool to berries only i.e. Differentiating Incinerate and Knock Off */ + private berriesOnly: boolean; + + constructor(berriesOnly: boolean) { super(false, MoveEffectTrigger.HIT); - this.chance = chance; + this.berriesOnly = berriesOnly; } - 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) { - 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; - const highestItemTier = heldItems.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier, highestTier), 0); - const tierHeldItems = heldItems.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); - const stolenItem = tierHeldItems[user.randSeedInt(tierHeldItems.length)]; - user.scene.tryTransferHeldItemModifier(stolenItem, user, false).then(success => { - if (success) { - user.scene.queueMessage(getPokemonMessage(user, ` knocked off\n${target.name}'s ${stolenItem.type.name}!`)); - } - resolve(success); - }); - return; - } + /** + * + * @param user {@linkcode Pokemon} that used the move + * @param target Target {@linkcode Pokemon} that the moves applies to + * @param move {@linkcode Move} that is used + * @param args N/A + * @returns {boolean} True if an item was removed + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - resolve(false); - }); + if (!this.berriesOnly && target.isPlayer()) { // "Wild Pokemon cannot knock off Player Pokemon's held items" (See Bulbapedia) + return false; + } + + const cancelled = new Utils.BooleanHolder(false); + applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // Check for abilities that block item theft + + if (cancelled.value === true) { + return false; + } + + // Considers entire transferrable item pool by default (Knock Off). Otherwise berries only if specified (Incinerate). + let heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); + if (this.berriesOnly) { + heldItems = heldItems.filter(m => m instanceof BerryModifier && m.pokemonId === target.id, target.isPlayer()); + } + + if (heldItems.length) { + const removedItem = heldItems[user.randSeedInt(heldItems.length)]; + + // Decrease item amount and update icon + !--removedItem.stackCount; + target.scene.updateModifiers(target.isPlayer()); + + if (this.berriesOnly) { + user.scene.queueMessage(getPokemonMessage(user, ` incinerated\n${target.name}'s ${removedItem.type.name}!`)); + } else { + user.scene.queueMessage(getPokemonMessage(user, ` knocked off\n${target.name}'s ${removedItem.type.name}!`)); + } + } + + return true; } getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { @@ -1833,7 +1909,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } /** - * Attribute that causes targets of the move to eat a berry. If chosenBerry is not overridden, a random berry will be picked from the target's inventory. + * Attribute that causes targets of the move to eat a berry. Used for Teatime, Stuff Cheeks */ export class EatBerryAttr extends MoveEffectAttr { protected chosenBerry: BerryModifier; @@ -1842,42 +1918,29 @@ export class EatBerryAttr extends MoveEffectAttr { 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 - * @param move {@linkcode Move} The move being used - * @param args Unused - * @returns {boolean} true if the function succeeds - */ + * 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 + * @param move {@linkcode Move} The move being used + * @param args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; } - 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) { - return false; - } - this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const heldBerries = this.getTargetHeldBerries(target); + if (heldBerries.length <= 0) { + return false; } - - getBerryEffectFunc(this.chosenBerry.berryType)(target); // target eats the berry - + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; const preserve = new Utils.BooleanHolder(false); - target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); - - if (!preserve.value) { // remove the eaten berry if not preserved - if (!--this.chosenBerry.stackCount) { - target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); - } - target.scene.updateModifiers(target.isPlayer()); + target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); // check for berry pouch preservation + if (!preserve.value) { + this.reduceBerryModifier(target); } - - this.chosenBerry = undefined; - - applyAbAttrs(HealFromBerryUseAbAttr, target, new Utils.BooleanHolder(false)); - + this.eatBerry(target); return true; } @@ -1886,7 +1949,21 @@ export class EatBerryAttr extends MoveEffectAttr { && (m as BerryModifier).pokemonId === target.id, target.isPlayer()) as BerryModifier[]; } + reduceBerryModifier(target: Pokemon) { + if (this.chosenBerry.stackCount === 1) { + target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); + } else { + this.chosenBerry.stackCount--; + } + target.scene.updateModifiers(target.isPlayer()); + } + + eatBerry(consumer: Pokemon) { + getBerryEffectFunc(this.chosenBerry.berryType)(consumer); // consumer eats the berry + applyAbAttrs(HealFromBerryUseAbAttr, consumer, new Utils.BooleanHolder(false)); + } } + /** * Attribute used for moves that steal a random berry from the target. The user then eats the stolen berry. * Used for Pluck & Bug Bite. @@ -1896,36 +1973,30 @@ export class StealEatBerryAttr extends EatBerryAttr { 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 - * @param {Move} move Move being used - * @param {any[]} args Unused - * @returns {boolean} true if the function succeeds - */ + * 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 + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // check for abilities that block item theft 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 - 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}!`)); - return super.apply(user, user, move, args); + if (heldBerries.length <= 0) { + return false; } - - return false; + // if the target has berries, pick a random berry and steal it + this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; + const message = i18next.t("battle:stealEatBerry", {pokemonName: user.name, targetName: target.name, berryName: this.chosenBerry.type.name}); + user.scene.queueMessage(message); + this.reduceBerryModifier(target); + this.eatBerry(user); + return true; } } @@ -1943,7 +2014,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { * @param ...effects - List of status effects to cure */ constructor(selfTarget: boolean, ...effects: StatusEffect[]) { - super(selfTarget); + super(selfTarget, MoveEffectTrigger.POST_APPLY, false, true); this.effects = effects; } @@ -1961,7 +2032,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { const pokemon = this.selfTarget ? user : target; if (pokemon.status && this.effects.includes(pokemon.status.effect)) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); pokemon.resetStatus(); pokemon.updateInfo(); @@ -2257,8 +2328,8 @@ export class StatChangeAttr extends MoveEffectAttr { private condition: MoveConditionFunc; private showMessage: boolean; - constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT) { - super(selfTarget, moveEffectTrigger, firstHitOnly); + constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false) { + super(selfTarget, moveEffectTrigger, firstHitOnly, false, firstTargetOnly); this.stats = typeof(stats) === "number" ? [ stats as BattleStat ] : stats as BattleStat[]; @@ -2272,7 +2343,8 @@ export class StatChangeAttr extends MoveEffectAttr { return false; } - if (move.chance < 0 || move.chance === 100 || user.randSeedInt(100) < move.chance) { + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { const levels = this.getLevels(user); user.scene.unshiftPhase(new StatChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, levels, this.showMessage)); return true; @@ -2699,7 +2771,7 @@ export class DoublePowerChanceAttr extends VariablePowerAttr { export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultiplierAttr { constructor(limit: integer, resetOnFail: boolean, resetOnLimit?: boolean, ...comboMoves: Moves[]) { super((user: Pokemon, target: Pokemon, move: Move): number => { - const moveHistory = user.getMoveHistory().reverse().slice(1); + const moveHistory = user.getLastXMoves(limit + 1).slice(1); let count = 0; let turnMove: TurnMove; @@ -2996,10 +3068,8 @@ export class FriendshipPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const power = args[0] as Utils.NumberHolder; - if (user instanceof PlayerPokemon) { - const friendshipPower = Math.floor(Math.min(user.friendship, 255) / 2.5); - power.value = Math.max(!this.invert ? friendshipPower : 102 - friendshipPower, 1); - } + const friendshipPower = Math.floor(Math.min(user instanceof PlayerPokemon ? user.friendship : user.species.baseFriendship, 255) / 2.5); + power.value = Math.max(!this.invert ? friendshipPower : 102 - friendshipPower, 1); return true; } @@ -3070,8 +3140,13 @@ export class PunishmentPowerAttr extends VariablePowerAttr { export class PresentPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * If this move is multi-hit, and this attribute is applied to any hit + * other than the first, this move cannot result in a heal. + */ + const firstHit = (user.turnData.hitCount === user.turnData.hitsLeft); - const powerSeed = Utils.randSeedInt(100); + const powerSeed = Utils.randSeedInt(firstHit ? 100 : 80); if (powerSeed <= 40) { (args[0] as Utils.NumberHolder).value = 40; } else if (40 < powerSeed && powerSeed <= 70) { @@ -3079,6 +3154,8 @@ export class PresentPowerAttr extends VariablePowerAttr { } else if (70 < powerSeed && powerSeed <= 80) { (args[0] as Utils.NumberHolder).value = 120; } else if (80 < powerSeed && powerSeed <= 100) { + // If this move is multi-hit, disable all other hits + user.stopMultiHit(); target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), Math.max(Math.floor(target.getMaxHp() / 4), 1), getPokemonMessage(target, " regained\nhealth!"), true)); } @@ -3087,17 +3164,6 @@ export class PresentPowerAttr extends VariablePowerAttr { } } -export class KnockOffPowerAttr extends VariablePowerAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (target.getHeldItems().length > 0) { - (args[0] as Utils.NumberHolder).value *= 1.5; - return true; - } - - return false; - } -} - 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) { @@ -3604,10 +3670,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) || target.hasAbility(Abilities.LEVITATE)) { multiplier.value = 1; } - target.addTag(BattlerTagType.IGNORE_FLYING, 20, move.id, user.id); //TODO: Grounded effect should not have turn limit return true; } @@ -3805,7 +3870,7 @@ export class DisableMoveAttr extends MoveEffectAttr { export class FrenzyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, MoveEffectTrigger.HIT, false, true); } canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { @@ -3848,8 +3913,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr { public turnCountMax: integer; private failOnOverlap: boolean; - constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer) { - super(selfTarget); + constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false) { + super(selfTarget, MoveEffectTrigger.POST_APPLY, false, lastHitOnly); this.tagType = tagType; this.turnCountMin = turnCountMin; @@ -3862,18 +3927,14 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return false; } - const chance = this.getTagChance(user, target, move); - if (chance < 0 || chance === 100 || user.randSeedInt(100) < chance) { + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id); } return false; } - getTagChance(user: Pokemon, target: Pokemon, move: Move): integer { - return move.chance; - } - getCondition(): MoveConditionFunc { return this.failOnOverlap ? (user, target, move) => !(this.selfTarget ? user : target).getTag(this.tagType) @@ -3910,6 +3971,8 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return -3; case BattlerTagType.ENCORE: return -2; + case BattlerTagType.MINIMIZED: + return 0; case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: @@ -3923,11 +3986,11 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - let chance = this.getTagChance(user, target, move); - if (chance < 0) { - chance = 100; + let moveChance = this.getMoveChance(user,target,move,this.selfTarget); + if (moveChance < 0) { + moveChance = 100; } - return Math.floor(this.getTagTargetBenefitScore(user, target, move) * (chance / 100)); + return Math.floor(this.getTagTargetBenefitScore(user, target, move) * (moveChance / 100)); } } @@ -3936,12 +3999,18 @@ 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(i18next.t("battle:attackFailed")); return false; } const curseRecoilDamage = Math.max(1, Math.floor(user.getMaxHp() / 2)); user.damageAndUpdate(curseRecoilDamage, HitResult.OTHER, false, true, true); - user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand laid a curse on the ${target.name}!`)); + user.scene.queueMessage( + i18next.t("battle:battlerTagsCursedOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(user), + pokemonName: target.name + }) + ); + target.addTag(BattlerTagType.CURSED, 0, move.id, user.id); return true; } else { @@ -4010,7 +4079,7 @@ export class ConfuseAttr extends AddBattlerTagAttr { export class RechargeAttr extends AddBattlerTagAttr { constructor() { - super(BattlerTagType.RECHARGING, true); + super(BattlerTagType.RECHARGING, true, false, 1, 1, true); } } @@ -4192,15 +4261,42 @@ 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)) { + const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; + if (!tag) { return true; } - const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; return tag.layers < tag.maxLayers; }; } } +/** + * Attribute used for Stone Axe and Ceaseless Edge. + * Applies the given ArenaTrapTag when move is used. + * @extends AddArenaTagAttr + * @see {@linkcode apply} + */ +export class AddArenaTrapTagHitAttr extends AddArenaTagAttr { + /** + * @param user {@linkcode Pokemon} using this move + * @param target {@linkcode Pokemon} target of this move + * @param move {@linkcode Move} being used + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + const tag = user.scene.arena.getTagOnSide(this.tagType, side) as ArenaTrapTag; + if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance)) { + user.scene.arena.addTag(this.tagType, 0, move.id, user.id, side); + if (!tag) { + return true; + } + return tag.layers < tag.maxLayers; + } + return false; + } +} + export class RemoveArenaTrapAttr extends MoveEffectAttr { private targetBothSides: boolean; @@ -4360,7 +4456,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } resolve(true); } else { - user.scene.queueMessage("But it failed!"); + user.scene.queueMessage(i18next.t("battle:attackFailed")); resolve(false); } }); @@ -4380,7 +4476,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { private batonPass: boolean; constructor(user?: boolean, batonPass?: boolean) { - super(false, MoveEffectTrigger.POST_APPLY, true); + super(false, MoveEffectTrigger.POST_APPLY, false, true); this.user = !!user; this.batonPass = !!batonPass; } @@ -4495,7 +4591,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { private messageCallback: ((user: Pokemon) => void) | undefined; constructor(removedType: Type, messageCallback?: (user: Pokemon) => void) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true, MoveEffectTrigger.POST_TARGET); this.removedType = removedType; this.messageCallback = messageCallback; @@ -4526,7 +4622,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { export class CopyTypeAttr extends MoveEffectAttr { constructor() { - super(true); + super(false); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -4892,14 +4988,36 @@ export class CopyMoveAttr extends OverrideMoveEffectAttr { } } +/** + * Attribute used for moves that reduce PP of the target's last used move. + * Used for Spite. + */ export class ReducePpMoveAttr extends MoveEffectAttr { + protected reduction: number; + constructor(reduction: number) { + super(); + this.reduction = reduction; + } + + /** + * Reduces the PP of the target's last-used move by an amount based on this attribute instance's {@linkcode reduction}. + * + * @param user {@linkcode Pokemon} that used the attack + * @param target {@linkcode Pokemon} targeted by the attack + * @param move {@linkcode Move} being used + * @param args N/A + * @returns {boolean} true + */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { // Null checks can be skipped due to condition function const lastMove = target.getLastXMoves().find(() => true); const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); const lastPpUsed = movesetMove.ppUsed; - movesetMove.ppUsed = Math.min(movesetMove.ppUsed + 4, movesetMove.getMovePp()); - user.scene.queueMessage(`It reduced the PP of ${getPokemonMessage(target, `'s\n${movesetMove.getName()} by ${movesetMove.ppUsed - lastPpUsed}!`)}`); + movesetMove.ppUsed = Math.min(movesetMove.ppUsed + this.reduction, movesetMove.getMovePp()); + + const message = i18next.t("battle:ppReduced", {targetName: target.name, moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); + + user.scene.queueMessage(message); return true; } @@ -4934,6 +5052,42 @@ export class ReducePpMoveAttr extends MoveEffectAttr { } } +/** + * Attribute used for moves that damage target, and then reduce PP of the target's last used move. + * Used for Eerie Spell. + */ +export class AttackReducePpMoveAttr extends ReducePpMoveAttr { + constructor(reduction: number) { + super(reduction); + } + + /** + * Checks if the target has used a move prior to the attack. PP-reduction is applied through the super class if so. + * + * @param user {@linkcode Pokemon} that used the attack + * @param target {@linkcode Pokemon} targeted by the attack + * @param move {@linkcode Move} being used + * @param args N/A + * @returns {boolean} true + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const lastMove = target.getLastXMoves().find(() => true); + if (lastMove) { + const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move); + if (Boolean(movesetMove?.getPpRatio())) { + super.apply(user, target, move, args); + } + } + + return true; + } + + // Override condition function to always perform damage. Instead, perform pp-reduction condition check in apply function above + getCondition(): MoveConditionFunc { + return (user, target, move) => true; + } +} + // TODO: Review this const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { const targetMoves = target.getMoveHistory().filter(m => !m.virtual); @@ -5145,7 +5299,16 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr { } } +/** + * Attribute used for moves that suppress abilities like {@linkcode Moves.GASTRO_ACID}. + * A suppressed ability cannot be activated. + * + * @extends MoveEffectAttr + * @see {@linkcode apply} + * @see {@linkcode getCondition} + */ export class SuppressAbilitiesAttr extends MoveEffectAttr { + /** Sets ability suppression for the target pokemon and displays a message. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { return false; @@ -5158,8 +5321,9 @@ export class SuppressAbilitiesAttr extends MoveEffectAttr { return true; } + /** Causes the effect to fail when the target's ability is unsupressable or already suppressed. */ getCondition(): MoveConditionFunc { - return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr); + return (user, target, move) => !target.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !target.summonData.abilitySuppressed; } } @@ -5174,7 +5338,7 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { * abillity cannot be suppressed. This is a secondary effect and has no bearing on the success or failure of the move. * * @returns True if the move occurred, otherwise false. Note that true will be returned even if the target has not - * yet moved or if the target's abiilty is un-suppressable. + * yet moved or if the suppression failed to apply. */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { if (!super.apply(user, target, move, args)) { @@ -5235,7 +5399,7 @@ export class DiscourageFrequentUseAttr extends MoveAttr { export class MoneyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, MoveEffectTrigger.HIT, true); } apply(user: Pokemon, target: Pokemon, move: Move): boolean { @@ -5285,6 +5449,32 @@ export class LastResortAttr extends MoveAttr { } } + +/** + * The move only works if the target has a transferable held item + * @extends MoveAttr + * @see {@linkcode getCondition} + */ +export class AttackedByItemAttr extends MoveAttr { + /** + * @returns the {@linkcode MoveConditionFunc} for this {@linkcode Move} + */ + getCondition(): MoveConditionFunc { + return (user: Pokemon, target: Pokemon, move: Move) => { + const heldItems = target.getHeldItems().filter(i => i.getTransferrable(true)); + if (heldItems.length === 0) { + return false; + } + + const itemName = heldItems[0]?.type?.name ?? "item"; + const attackedByItemString = ` is about to be attacked by its ${itemName}!`; + target.scene.queueMessage(getPokemonMessage(target, attackedByItemString)); + + return true; + }; + } +} + export class VariableTargetAttr extends MoveAttr { private targetChangeFunc: (user: Pokemon, target: Pokemon, move: Move) => number; @@ -5337,7 +5527,7 @@ function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon, targe }); } -export function applyMoveAttrs(attrType: { new(...args: any[]): MoveAttr }, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise { +export function applyMoveAttrs(attrType: Constructor, user: Pokemon, target: Pokemon, move: Move, ...args: any[]): Promise { return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } @@ -5503,7 +5693,7 @@ export function initMoves() { .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) + new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.BIND), new AttackMove(Moves.SLAM, Type.NORMAL, MoveCategory.PHYSICAL, 80, 75, 20, -1, 0, 1), new AttackMove(Moves.VINE_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 45, 100, 25, -1, 0, 1), @@ -5536,7 +5726,7 @@ export function initMoves() { .attr(MinimizeAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), - new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, 100, 0, 1) + new AttackMove(Moves.WRAP, Type.NORMAL, MoveCategory.PHYSICAL, 15, 90, 20, -1, 0, 1) .attr(TrapAttr, BattlerTagType.WRAP), new AttackMove(Moves.TAKE_DOWN, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, -1, 0, 1) .attr(RecoilAttr) @@ -5561,7 +5751,7 @@ export function initMoves() { new AttackMove(Moves.PIN_MISSILE, Type.BUG, MoveCategory.PHYSICAL, 25, 95, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false), - new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, 100, 0, 1) + new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1) .attr(StatChangeAttr, BattleStat.DEF, -1) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) @@ -5670,7 +5860,7 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) .attr(FixedDamageAttr, 40), - new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, 100, 0, 1) + new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.FIRE_SPIN), new AttackMove(Moves.THUNDER_SHOCK, Type.ELECTRIC, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), @@ -5786,11 +5976,11 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.BURN), new AttackMove(Moves.WATERFALL, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 1) .attr(FlinchAttr), - new AttackMove(Moves.CLAMP, Type.WATER, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 1) + new AttackMove(Moves.CLAMP, Type.WATER, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 1) .attr(TrapAttr, BattlerTagType.CLAMP), new AttackMove(Moves.SWIFT, Type.NORMAL, MoveCategory.SPECIAL, 60, -1, 20, -1, 0, 1) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, 100, 0, 1) + new AttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, "lowered\nits head!", null, true) .attr(StatChangeAttr, BattleStat.DEF, 1, true) .ignoresVirtual(), @@ -5939,7 +6129,7 @@ export function initMoves() { new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2) - .attr(ReducePpMoveAttr), + .attr(ReducePpMoveAttr, 4), new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -6139,7 +6329,7 @@ export function initMoves() { .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) + new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) .attr(TrapAttr, BattlerTagType.WHIRLPOOL) .attr(HitsTagAttr, BattlerTagType.UNDERWATER, true), new AttackMove(Moves.BEAT_UP, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 2) @@ -6191,7 +6381,7 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (user, target, move) => target.status?.effect === StatusEffect.PARALYSIS ? 2 : 1) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS), new SelfStatusMove(Moves.FOLLOW_ME, Type.NORMAL, -1, 20, -1, 2, 3) - .unimplemented(), + .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), new StatusMove(Moves.NATURE_POWER, Type.NORMAL, -1, 20, -1, 0, 3) .attr(NaturePowerAttr) .ignoresVirtual(), @@ -6215,7 +6405,7 @@ export function initMoves() { .ignoresVirtual(), new SelfStatusMove(Moves.INGRAIN, Type.GRASS, -1, 20, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.INGRAIN, true, true), - new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 3) + new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], -1, true), new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3) .unimplemented(), @@ -6229,8 +6419,8 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) .condition((user, target, move) => !target.status), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) - .attr(KnockOffPowerAttr) - .partial(), + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.getTransferrable(false)).length > 0 ? 1.5 : 1) + .attr(RemoveHeldItemAttr, false), new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) .attr(MatchHpAttr) .condition(failOnBossCondition), @@ -6317,7 +6507,7 @@ export function initMoves() { .slicingMove() .windMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.OVERHEAT, Type.FIRE, MoveCategory.SPECIAL, 130, 90, 5, 100, 0, 3) + new AttackMove(Moves.OVERHEAT, Type.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3) .attr(StatChangeAttr, BattleStat.SPATK, -2, true) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE), new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3) @@ -6350,7 +6540,7 @@ export function initMoves() { new AttackMove(Moves.SKY_UPPERCUT, Type.FIGHTING, MoveCategory.PHYSICAL, 85, 90, 15, -1, 0, 3) .attr(HitsTagAttr, BattlerTagType.FLYING) .punchingMove(), - new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, 100, 0, 3) + new AttackMove(Moves.SAND_TOMB, Type.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) .attr(TrapAttr, BattlerTagType.SAND_TOMB) .makesContact(false), new AttackMove(Moves.SHEER_COLD, Type.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) @@ -6420,11 +6610,11 @@ export function initMoves() { .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!"), - new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, 100, 0, 3) + new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4) .attr(HealAttr, 0.5) - .attr(AddBattlerTagAttr, BattlerTagType.GROUNDED, true, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false) .triageMove(), new StatusMove(Moves.GRAVITY, Type.PSYCHIC, -1, 5, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.GRAVITY, 5) @@ -6434,7 +6624,7 @@ export function initMoves() { new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), - new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 4) + new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4) .attr(StatChangeAttr, BattleStat.SPD, -1, true) .punchingMove(), new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) @@ -6468,7 +6658,7 @@ export function initMoves() { .target(MoveTarget.ATTACKER), new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4) .attr(ForceSwitchOutAttr, true, false), - new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 4) + new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 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), @@ -6512,9 +6702,9 @@ export function initMoves() { new SelfStatusMove(Moves.COPYCAT, Type.NORMAL, -1, 20, -1, 0, 4) .attr(CopyMoveAttr) .ignoresVirtual(), - new StatusMove(Moves.POWER_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) + new StatusMove(Moves.POWER_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) .unimplemented(), - new StatusMove(Moves.GUARD_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) + new StatusMove(Moves.GUARD_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4) .unimplemented(), new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .makesContact(true) @@ -6534,10 +6724,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.MAGNET_RISEN, true, true) - .condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) && - !user.getTag(BattlerTagType.IGNORE_FLYING) && !user.getTag(BattlerTagType.INGRAIN) && - !user.getTag(BattlerTagType.MAGNET_RISEN)) - .unimplemented(), + .condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) && [BattlerTagType.MAGNET_RISEN, BattlerTagType.IGNORE_FLYING, BattlerTagType.INGRAIN].every((tag) => !user.getTag(tag))), new AttackMove(Moves.FLARE_BLITZ, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 15, 10, 0, 4) .attr(RecoilAttr, false, 0.33) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) @@ -6645,7 +6832,7 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES), - new AttackMove(Moves.DRACO_METEOR, Type.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, 100, 0, 4) + new AttackMove(Moves.DRACO_METEOR, Type.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new AttackMove(Moves.DISCHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) @@ -6653,7 +6840,7 @@ export function initMoves() { new AttackMove(Moves.LAVA_PLUME, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.LEAF_STORM, Type.GRASS, MoveCategory.SPECIAL, 130, 90, 5, 100, 0, 4) + new AttackMove(Moves.LEAF_STORM, Type.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new AttackMove(Moves.POWER_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4), new AttackMove(Moves.ROCK_WRECKER, Type.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4) @@ -6723,7 +6910,7 @@ export function initMoves() { .unimplemented(), new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr), - new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, 100, 0, 4) + new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) .attr(TrapAttr, BattlerTagType.MAGMA_STORM), new StatusMove(Moves.DARK_VOID, Type.DARK, 50, 10, -1, 0, 4) .attr(StatusEffectAttr, StatusEffect.SLEEP) @@ -6759,7 +6946,7 @@ export function initMoves() { .partial(), new SelfStatusMove(Moves.RAGE_POWDER, Type.BUG, -1, 20, -1, 2, 5) .powderMove() - .unimplemented(), + .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, true), new StatusMove(Moves.TELEKINESIS, Type.PSYCHIC, -1, 15, -1, 0, 5) .condition(failOnGravityCondition) .unimplemented(), @@ -6768,9 +6955,9 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES) .unimplemented(), new AttackMove(Moves.SMACK_DOWN, Type.ROCK, MoveCategory.PHYSICAL, 50, 100, 15, 100, 0, 5) - .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 5) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) - .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING]) + .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .attr(HitsTagAttr, BattlerTagType.FLYING, false) .makesContact(false), new AttackMove(Moves.STORM_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) @@ -6859,7 +7046,7 @@ export function initMoves() { .attr(ForceSwitchOutAttr), new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .target(MoveTarget.ALL_NEAR_ENEMIES) - .partial(), + .attr(RemoveHeldItemAttr, true), new StatusMove(Moves.QUASH, Type.DARK, 100, 15, -1, 0, 5) .unimplemented(), new AttackMove(Moves.ACROBATICS, Type.FLYING, MoveCategory.PHYSICAL, 55, 100, 15, -1, 0, 5) @@ -6983,7 +7170,7 @@ export function initMoves() { new AttackMove(Moves.ICICLE_CRASH, Type.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5) .attr(FlinchAttr) .makesContact(false), - new AttackMove(Moves.V_CREATE, Type.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, 100, 0, 5) + new AttackMove(Moves.V_CREATE, Type.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF, BattleStat.SPD ], -1, true), new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) @@ -7002,7 +7189,7 @@ export function initMoves() { .condition(new FirstMoveCondition()), new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) .condition((user, target, move) => user.battleData.berriesEaten.length > 0), - new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6) + new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) .condition((user,target,move) => { // If any fielded pokémon is grass-type and grounded. @@ -7021,7 +7208,7 @@ export function initMoves() { new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) .attr(AddTypeAttr, Type.GHOST) .partial(), - new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, 100, 0, 6) + new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1) .soundBased(), new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6) @@ -7044,7 +7231,7 @@ export function initMoves() { new AttackMove(Moves.DISARMING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), - new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, 100, 0, 6) + new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY) .attr(ForceSwitchOutAttr, true, false) .soundBased(), @@ -7057,9 +7244,9 @@ export function initMoves() { new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6) .target(MoveTarget.USER_SIDE) .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true), - new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, 100, 0, 6) + new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .unimplemented(), + .attr(StatChangeAttr, BattleStat.DEF, 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)), new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.GRASSY) .target(MoveTarget.BOTH_SIDES), @@ -7082,9 +7269,9 @@ export function initMoves() { .unimplemented(), new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6) .attr(ProtectAttr, BattlerTagType.KINGS_SHIELD), - new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, 100, 0, 6) + new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatChangeAttr, BattleStat.ATK, -1), - new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, 100, 0, 6) + new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatChangeAttr, BattleStat.SPATK, -1) .soundBased(), new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) @@ -7110,7 +7297,7 @@ export function initMoves() { .target(MoveTarget.NEAR_ALLY), new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) .attr(StatChangeAttr, BattleStat.SPATK, -2), - new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, 100, 0, 6) + new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC) .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) @@ -7125,8 +7312,8 @@ export function initMoves() { .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))), new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation - .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.HAPPY_HOUR, null, true) + .target(MoveTarget.USER_SIDE), new StatusMove(Moves.ELECTRIC_TERRAIN, Type.ELECTRIC, -1, 10, -1, 0, 6) .attr(TerrainChangeAttr, TerrainType.ELECTRIC) .target(MoveTarget.BOTH_SIDES), @@ -7141,7 +7328,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) .attr(SurviveDamageAttr), - new AttackMove(Moves.INFESTATION, Type.BUG, MoveCategory.SPECIAL, 20, 100, 20, 100, 0, 6) + new AttackMove(Moves.INFESTATION, Type.BUG, MoveCategory.SPECIAL, 20, 100, 20, -1, 0, 6) .makesContact() .attr(TrapAttr, BattlerTagType.INFESTATION), new AttackMove(Moves.POWER_UP_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6) @@ -7150,15 +7337,16 @@ export function initMoves() { new AttackMove(Moves.OBLIVION_WING, Type.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .triageMove(), - new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 6) + new AttackMove(Moves.THOUSAND_ARROWS, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) + .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) - .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING]) + .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.THOUSAND_WAVES, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.LANDS_WRATH, Type.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) @@ -7173,9 +7361,9 @@ export function initMoves() { new AttackMove(Moves.PRECIPICE_BLADES, Type.GROUND, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 6) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.DRAGON_ASCENT, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 6) + new AttackMove(Moves.DRAGON_ASCENT, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true), - new AttackMove(Moves.HYPERSPACE_FURY, Type.DARK, MoveCategory.PHYSICAL, 100, -1, 5, 100, 0, 6) + new AttackMove(Moves.HYPERSPACE_FURY, Type.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6) .attr(StatChangeAttr, BattleStat.DEF, -1, true) .makesContact(false) .ignoresProtect(), @@ -7299,23 +7487,23 @@ export function initMoves() { .condition(new FirstMoveCondition()), new SelfStatusMove(Moves.BANEFUL_BUNKER, Type.POISON, -1, 10, -1, 4, 7) .attr(ProtectAttr, BattlerTagType.BANEFUL_BUNKER), - new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 7) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) + new AttackMove(Moves.SPIRIT_SHACKLE, Type.GHOST, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 7) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false), new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .attr(IgnoreOpponentStatChangesAttr), - new AttackMove(Moves.SPARKLING_ARIA, Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, -1, 0, 7) + new AttackMove(Moves.SPARKLING_ARIA, Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7) .attr(HealStatusEffectAttr, false, StatusEffect.BURN) .soundBased() .target(MoveTarget.ALL_NEAR_OTHERS), - new AttackMove(Moves.ICE_HAMMER, Type.ICE, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) + new AttackMove(Moves.ICE_HAMMER, Type.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7) .attr(StatChangeAttr, BattleStat.SPD, -1, true) .punchingMove(), new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) .attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY) .triageMove(), new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), - new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, 100, 0, 7) + new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7) .attr(HitHealAttr, null, Stat.ATK) .attr(StatChangeAttr, BattleStat.ATK, -1) .condition((user, target, move) => target.summonData.battleStats[BattleStat.ATK] > -6) @@ -7327,8 +7515,8 @@ export function initMoves() { new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) .makesContact(false), new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7) - .unimplemented(), - new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, 100, 0, 7) + .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false), + new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7) .attr(StatusEffectAttr, StatusEffect.POISON) .attr(StatChangeAttr, BattleStat.SPD, -1), new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) @@ -7343,8 +7531,8 @@ export function initMoves() { .attr(StatusCategoryOnAllyAttr) .attr(HealOnAllyAttr, 0.5, true, false) .ballBombMove(), - new AttackMove(Moves.ANCHOR_SHOT, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, -1, 0, 7) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1), + new AttackMove(Moves.ANCHOR_SHOT, Type.STEEL, MoveCategory.PHYSICAL, 80, 100, 20, 100, 0, 7) + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true), new StatusMove(Moves.PSYCHIC_TERRAIN, Type.PSYCHIC, -1, 10, -1, 0, 7) .attr(TerrainChangeAttr, TerrainType.PSYCHIC) .target(MoveTarget.BOTH_SIDES), @@ -7368,9 +7556,9 @@ export function initMoves() { new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7) .condition( - (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(user.status?.effect)) + (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect)) .attr(HealAttr, 0.5) - .attr(HealStatusEffectAttr, true, ...getNonVolatileStatusEffects()) + .attr(HealStatusEffectAttr, false, ...getNonVolatileStatusEffects()) .triageMove(), new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() @@ -7387,7 +7575,7 @@ export function initMoves() { .ballBombMove() .makesContact(false) .partial(), - new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, 100, 0, 7) + new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) .attr(StatChangeAttr, BattleStat.DEF, -1, true) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -7421,17 +7609,17 @@ export function initMoves() { new AttackMove(Moves.PULVERIZING_PANCAKE, Type.NORMAL, MoveCategory.PHYSICAL, 210, -1, 1, -1, 0, 7) .partial() .ignoresVirtual(), - new SelfStatusMove(Moves.EXTREME_EVOBOOST, Type.NORMAL, -1, 1, 100, 0, 7) + new SelfStatusMove(Moves.EXTREME_EVOBOOST, Type.NORMAL, -1, 1, -1, 0, 7) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true) .ignoresVirtual(), - new AttackMove(Moves.GENESIS_SUPERNOVA, Type.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, -1, 0, 7) + new AttackMove(Moves.GENESIS_SUPERNOVA, Type.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) .attr(TerrainChangeAttr, TerrainType.PSYCHIC) .ignoresVirtual(), /* End Unused */ new AttackMove(Moves.SHELL_TRAP, Type.FIRE, MoveCategory.SPECIAL, 150, 100, 5, -1, -3, 7) .target(MoveTarget.ALL_NEAR_ENEMIES) .partial(), - new AttackMove(Moves.FLEUR_CANNON, Type.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, 100, 0, 7) + new AttackMove(Moves.FLEUR_CANNON, Type.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7) .attr(StatChangeAttr, BattleStat.SPATK, -2, true), new AttackMove(Moves.PSYCHIC_FANGS, Type.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7) .bitingMove() @@ -7454,7 +7642,7 @@ export function initMoves() { new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities() .partial(), - new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, 100, 0, 7) + new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1), new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) .attr(FlinchAttr), @@ -7525,6 +7713,7 @@ export function initMoves() { new AttackMove(Moves.BADDY_BAD, Type.DARK, MoveCategory.SPECIAL, 80, 95, 15, -1, 0, 7) .attr(AddArenaTagAttr, ArenaTagType.REFLECT, 5, false, true), new AttackMove(Moves.SAPPY_SEED, Type.GRASS, MoveCategory.PHYSICAL, 100, 90, 10, 100, 0, 7) + .makesContact(false) .attr(AddBattlerTagAttr, BattlerTagType.SEEDED), new AttackMove(Moves.FREEZY_FROST, Type.ICE, MoveCategory.SPECIAL, 100, 90, 10, -1, 0, 7) .attr(ResetStatsAttr), @@ -7552,7 +7741,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, true, false, 1) .bitingMove(), - new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, 100, 0, 8) // TODO: Stuff Cheeks should not be selectable when the user does not have a berry, see wiki + new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, -1, 0, 8) // TODO: Stuff Cheeks should not be selectable when the user does not have a berry, see wiki .attr(EatBerryAttr) .attr(StatChangeAttr, BattleStat.DEF, 2, true) .condition((user) => { @@ -7560,10 +7749,10 @@ export function initMoves() { return userBerries.length > 0; }) .partial(), - new SelfStatusMove(Moves.NO_RETREAT, Type.FIGHTING, -1, 5, 100, 0, 8) + new SelfStatusMove(Moves.NO_RETREAT, Type.FIGHTING, -1, 5, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, true, true, 1), - new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, 100, 0, 8) + new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) .attr(StatChangeAttr, BattleStat.SPD, -1) .partial(), new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) @@ -7659,18 +7848,18 @@ export function initMoves() { .unimplemented() .ignoresVirtual(), /* End Unused */ - new SelfStatusMove(Moves.CLANGOROUS_SOUL, Type.DRAGON, 100, 5, 100, 0, 8) + new SelfStatusMove(Moves.CLANGOROUS_SOUL, Type.DRAGON, 100, 5, -1, 0, 8) .attr(CutHpStatBoostAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, 3) .soundBased() .danceMove(), new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(DefAtkAttr), - new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, 100, 0, 8) + new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2), new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.SPD, -1) .makesContact(false), - new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, 100, 0, 8) + new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.SNAP_TRAP), new AttackMove(Moves.PYRO_BALL, Type.FIRE, MoveCategory.PHYSICAL, 120, 90, 5, 10, 0, 8) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) @@ -7722,7 +7911,7 @@ export function initMoves() { new AttackMove(Moves.STEEL_ROLLER, Type.STEEL, MoveCategory.PHYSICAL, 130, 100, 5, -1, 0, 8) .attr(ClearTerrainAttr) .condition((user, target, move) => !!user.scene.arena.terrain), - new AttackMove(Moves.SCALE_SHOT, Type.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, 100, 0, 8) + new AttackMove(Moves.SCALE_SHOT, Type.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) //.attr(StatChangeAttr, BattleStat.SPD, 1, true) // TODO: Have boosts only apply at end of move, not after every hit //.attr(StatChangeAttr, BattleStat.DEF, -1, true) .attr(MultiHitAttr) @@ -7758,12 +7947,12 @@ export function initMoves() { new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .partial(), new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8) - .makesContact(false) - .partial(), + .attr(AttackedByItemAttr) + .makesContact(false), new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8) .target(MoveTarget.ALL_NEAR_OTHERS) .unimplemented(), - new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, 100, 0, 8) + new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1) .target(MoveTarget.NEAR_ALLY), new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8) @@ -7789,7 +7978,7 @@ export function initMoves() { .attr(MultiHitAttr, MultiHitType._3) .attr(CritOnlyAttr) .punchingMove(), - new AttackMove(Moves.THUNDER_CAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, 100, 0, 8) + new AttackMove(Moves.THUNDER_CAGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 90, 15, -1, 0, 8) .attr(TrapAttr, BattlerTagType.THUNDER_CAGE), new AttackMove(Moves.DRAGON_ENERGY, Type.DRAGON, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 8) .attr(HpPowerAttr) @@ -7807,16 +7996,16 @@ export function initMoves() { new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8) - .soundBased() - .partial(), + .attr(AttackReducePpMoveAttr, 3) + .soundBased(), new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8) .attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]), new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.DEF, 1, true), - new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, 100, 0, 8) + new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8) .unimplemented(), new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) - .attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK) + .attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK) .slicingMove(), new AttackMove(Moves.SPRINGTIDE_STORM, Type.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8) .attr(StatChangeAttr, BattleStat.ATK, -1) @@ -7825,6 +8014,7 @@ export function initMoves() { new AttackMove(Moves.MYSTICAL_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.SPATK, 1, true), new AttackMove(Moves.RAGING_FURY, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8) + .makesContact(false) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) .target(MoveTarget.RANDOM_NEAR_ENEMY), @@ -7834,14 +8024,16 @@ export function initMoves() { new AttackMove(Moves.CHLOROBLAST, Type.GRASS, MoveCategory.SPECIAL, 150, 95, 5, -1, 0, 8) .attr(RecoilAttr, true, 0.5), new AttackMove(Moves.MOUNTAIN_GALE, Type.ICE, MoveCategory.PHYSICAL, 100, 85, 10, 30, 0, 8) + .makesContact(false) .attr(FlinchAttr), - new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, 100, 0, 8) + new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true) .danceMove(), - new AttackMove(Moves.HEADLONG_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 8) + new AttackMove(Moves.HEADLONG_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true) .punchingMove(), new AttackMove(Moves.BARB_BARRAGE, Type.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8) + .makesContact(false) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1) .attr(StatusEffectAttr, StatusEffect.POISON), new AttackMove(Moves.ESPER_WING, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8) @@ -7852,6 +8044,7 @@ export function initMoves() { new SelfStatusMove(Moves.SHELTER, Type.STEEL, -1, 10, 100, 0, 8) .attr(StatChangeAttr, BattleStat.DEF, 2, true), new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) + .makesContact(false) .attr(HighCritAttr) .attr(StatChangeAttr, BattleStat.DEF, -1) .attr(FlinchAttr) @@ -7860,7 +8053,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.BURN) .attr(MovePowerMultiplierAttr, (user, target, move) => target.status ? 2 : 1), new AttackMove(Moves.CEASELESS_EDGE, Type.DARK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) - .attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES) + .attr(AddArenaTrapTagHitAttr, ArenaTagType.SPIKES) .slicingMove(), new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8) .attr(ThunderAccuracyAttr) @@ -8001,15 +8194,15 @@ export function initMoves() { .makesContact(false), new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatChangeAttr, BattleStat.SPDEF, -2), - new AttackMove(Moves.ORDER_UP, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 9) + new AttackMove(Moves.ORDER_UP, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) .makesContact(false) .partial(), new AttackMove(Moves.JET_PUNCH, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) .punchingMove(), - new StatusMove(Moves.SPICY_EXTRACT, Type.GRASS, -1, 15, 100, 0, 9) + new StatusMove(Moves.SPICY_EXTRACT, Type.GRASS, -1, 15, -1, 0, 9) .attr(StatChangeAttr, BattleStat.ATK, 2) .attr(StatChangeAttr, BattleStat.DEF, -2), - new AttackMove(Moves.SPIN_OUT, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, 100, 0, 9) + new AttackMove(Moves.SPIN_OUT, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(StatChangeAttr, BattleStat.SPD, -2, true), new AttackMove(Moves.POPULATION_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._10) @@ -8023,7 +8216,7 @@ export function initMoves() { .triageMove() .attr(RevivalBlessingAttr) .target(MoveTarget.USER), - new AttackMove(Moves.SALT_CURE, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, -1, 0, 9) + new AttackMove(Moves.SALT_CURE, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 15, 100, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.SALT_CURED) .makesContact(false), new AttackMove(Moves.TRIPLE_DIVE, Type.WATER, MoveCategory.PHYSICAL, 30, 95, 10, -1, 0, 9) @@ -8065,7 +8258,7 @@ export function initMoves() { .attr(RemoveScreensAttr), new AttackMove(Moves.MAKE_IT_RAIN, Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(MoneyAttr) - .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, true) + .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, false, MoveEffectTrigger.HIT, true) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) @@ -8086,10 +8279,9 @@ export function initMoves() { .attr(WeatherChangeAttr, WeatherType.SNOW) .attr(ForceSwitchOutAttr, true, false) .target(MoveTarget.BOTH_SIDES), - new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, 100, 0, 9) + new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPD ], 1, true, null, true, true) - .attr(RemoveArenaTrapAttr) - .target(MoveTarget.BOTH_SIDES), + .attr(RemoveArenaTrapAttr, true), new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9) .attr(WeatherChangeAttr, WeatherType.SNOW) .target(MoveTarget.BOTH_SIDES), @@ -8097,7 +8289,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPD, -1), new AttackMove(Moves.TRAILBLAZE, Type.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9) .attr(StatChangeAttr, BattleStat.SPD, 1, true), - new AttackMove(Moves.CHILLING_WATER, Type.WATER, MoveCategory.SPECIAL, 50, 100, 20, -1, 0, 9) + new AttackMove(Moves.CHILLING_WATER, Type.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9) .attr(StatChangeAttr, BattleStat.ATK, -1), new AttackMove(Moves.HYPER_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .ignoresProtect(), @@ -8159,8 +8351,7 @@ export function initMoves() { .attr(HealStatusEffectAttr, false, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) .target(MoveTarget.ALL_NEAR_ENEMIES) - .triageMove() - .partial(), + .triageMove(), new AttackMove(Moves.SYRUP_BOMB, Type.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9) .attr(StatChangeAttr, BattleStat.SPD, -1) //Temporary .ballBombMove() @@ -8178,7 +8369,7 @@ export function initMoves() { new AttackMove(Moves.FICKLE_BEAM, Type.DRAGON, MoveCategory.SPECIAL, 80, 100, 5, 30, 0, 9) .attr(PreMoveMessageAttr, doublePowerChanceMessageFunc) .attr(DoublePowerChanceAttr), - new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, 100, 4, 9) + new SelfStatusMove(Moves.BURNING_BULWARK, Type.FIRE, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.BURNING_BULWARK), new AttackMove(Moves.THUNDERCLAP, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 5, -1, 1, 9) .condition((user, target, move) => user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.FIGHT && !target.turnData.acted && allMoves[user.scene.currentBattle.turnCommands[target.getBattlerIndex()].move.move].category !== MoveCategory.STATUS), @@ -8190,7 +8381,7 @@ export function initMoves() { .slicingMove(), new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9) .attr(OpponentHighHpPowerAttr), - new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, 100, 0, 9) + new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9) .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, false, true) .target(MoveTarget.NEAR_ALLY) .partial(), diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index de8d5456f45..5964884d967 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 "i18next"; export enum PokeballType { POKEBALL, @@ -10,6 +10,8 @@ export enum PokeballType { LUXURY_BALL } +export const MAX_PER_TYPE_POKEBALLS: integer = 99; + export function getPokeballAtlasKey(type: PokeballType): string { switch (type) { case PokeballType.POKEBALL: diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index cc05af50f6f..ae1532f0be0 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -3,6 +3,7 @@ import Pokemon from "../field/pokemon"; import { SpeciesFormKey } from "./pokemon-species"; import { StatusEffect } from "./status-effect"; import { MoveCategory, allMoves } from "./move"; +import { Constructor } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -178,7 +179,7 @@ export class SpeciesFormChange { return true; } - findTrigger(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): SpeciesFormChangeTrigger { + findTrigger(triggerType: Constructor): SpeciesFormChangeTrigger { if (!this.trigger.hasTriggerType(triggerType)) { return null; } @@ -208,7 +209,7 @@ export abstract class SpeciesFormChangeTrigger { return true; } - hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { + hasTriggerType(triggerType: Constructor): boolean { return this instanceof triggerType; } } @@ -236,7 +237,7 @@ export class SpeciesFormChangeCompoundTrigger { return true; } - hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { + hasTriggerType(triggerType: Constructor): boolean { return !!this.triggers.find(t => t.hasTriggerType(triggerType)); } } @@ -638,6 +639,10 @@ export const pokemonFormChanges: PokemonFormChanges = { 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.XERNEAS]: [ + new SpeciesFormChange(Species.XERNEAS, "neutral", "active", new SpeciesFormChangeActiveTrigger(true), true), + new SpeciesFormChange(Species.XERNEAS, "active", "neutral", new SpeciesFormChangeActiveTrigger(false), true) + ], [Species.ZYGARDE]: [ new SpeciesFormChange(Species.ZYGARDE, "50-pc", "complete", new SpeciesFormChangeManualTrigger(), true), new SpeciesFormChange(Species.ZYGARDE, "complete", "50-pc", new SpeciesFormChangeManualTrigger(), true), diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 6bb0f8db7c5..962772d6e78 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -13,7 +13,8 @@ import { speciesEggMoves } from "./egg-moves"; 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 i18next from "i18next"; +import { Localizable } from "#app/interfaces/locales"; import { Stat } from "./pokemon-stat"; import { Abilities } from "#enums/abilities"; import { PartyMemberStrength } from "#enums/party-member-strength"; @@ -318,6 +319,7 @@ export abstract class PokemonSpeciesForm { case Species.UNFEZANT: case Species.FRILLISH: case Species.JELLICENT: + case Species.PYROAR: ret += female ? "-f" : ""; break; } @@ -818,6 +820,10 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return super.isObtainable(); } + hasVariants() { + return variantData.hasOwnProperty(this.speciesId); + } + getFormSpriteKey(formIndex?: integer) { if (this.forms.length && formIndex >= this.forms.length) { console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); @@ -1295,9 +1301,9 @@ export function initSpecies() { new PokemonSpecies(Species.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", Type.BUG, Type.FLYING, 0.8, 3.6, Abilities.INTIMIDATE, Abilities.NONE, Abilities.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, null, 0.4, 4.5, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", Type.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.NONE, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", Type.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.NONE, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.NONE, 670, 150, 160, 100, 95, 65, 100, 45, 70, 252, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", Type.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", Type.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 252, GrowthRate.SLOW, 50, false), //Custom Hidden new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", Type.BUG, Type.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", Type.BUG, Type.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", Type.BUG, Type.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), @@ -1719,8 +1725,8 @@ export function initSpecies() { new PokemonSpecies(Species.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", Type.GHOST, null, 1.7, 76.5, Abilities.MUMMY, Abilities.NONE, Abilities.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 0.7, 16.5, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), new PokemonSpecies(Species.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", Type.WATER, Type.ROCK, 1.2, 81, Abilities.SOLID_ROCK, Abilities.STURDY, Abilities.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.NONE, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.NONE, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(Species.ARCHEN, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 0.5, 9.5, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(Species.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", Type.ROCK, Type.FLYING, 1.4, 32, Abilities.DEFEATIST, Abilities.NONE, Abilities.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", Type.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), @@ -2106,8 +2112,8 @@ export function initSpecies() { new PokemonSpecies(Species.COMFEY, 7, false, false, false, "Posy Picker Pokémon", Type.FAIRY, null, 0.1, 0.3, Abilities.FLOWER_VEIL, Abilities.TRIAGE, Abilities.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), new PokemonSpecies(Species.ORANGURU, 7, false, false, false, "Sage Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 76, Abilities.INNER_FOCUS, Abilities.TELEPATHY, Abilities.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", Type.FIGHTING, null, 2, 82.8, Abilities.RECEIVER, Abilities.NONE, Abilities.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", Type.BUG, Type.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.NONE, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", Type.BUG, Type.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.NONE, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", Type.BUG, Type.WATER, 0.5, 12, Abilities.WIMP_OUT, Abilities.NONE, Abilities.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(Species.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", Type.BUG, Type.WATER, 2, 108, Abilities.EMERGENCY_EXIT, Abilities.NONE, Abilities.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden new PokemonSpecies(Species.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", Type.GHOST, Type.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", Type.GHOST, Type.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", Type.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), @@ -2152,7 +2158,7 @@ export function initSpecies() { new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", Type.FIRE, Type.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, "", true), + new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), new PokemonForm("Busted Form", "busted", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), ), new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", Type.WATER, Type.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), @@ -3281,67 +3287,67 @@ export function getStarterValueFriendshipCap(value: integer): integer { export const starterPassiveAbilities = { [Species.BULBASAUR]: Abilities.GRASSY_SURGE, - [Species.CHARMANDER]: Abilities.SHEER_FORCE, + [Species.CHARMANDER]: Abilities.BEAST_BOOST, [Species.SQUIRTLE]: Abilities.STURDY, [Species.CATERPIE]: Abilities.MAGICIAN, - [Species.WEEDLE]: Abilities.TECHNICIAN, + [Species.WEEDLE]: Abilities.TINTED_LENS, [Species.PIDGEY]: Abilities.GALE_WINGS, [Species.RATTATA]: Abilities.STRONG_JAW, [Species.SPEAROW]: Abilities.MOXIE, - [Species.EKANS]: Abilities.ROUGH_SKIN, - [Species.SANDSHREW]: Abilities.IRON_BARBS, - [Species.NIDORAN_F]: Abilities.QUEENLY_MAJESTY, - [Species.NIDORAN_M]: Abilities.SUPREME_OVERLORD, - [Species.VULPIX]: Abilities.CURSED_BODY, - [Species.ZUBAT]: Abilities.WIND_RIDER, - [Species.ODDISH]: Abilities.LINGERING_AROMA, - [Species.PARAS]: Abilities.POISON_HEAL, - [Species.VENONAT]: Abilities.SWARM, + [Species.EKANS]: Abilities.REGENERATOR, + [Species.SANDSHREW]: Abilities.TOUGH_CLAWS, + [Species.NIDORAN_F]: Abilities.FLARE_BOOST, + [Species.NIDORAN_M]: Abilities.GUTS, + [Species.VULPIX]: Abilities.SOLAR_POWER, + [Species.ZUBAT]: Abilities.INTIMIDATE, + [Species.ODDISH]: Abilities.TRIAGE, + [Species.PARAS]: Abilities.TRIAGE, + [Species.VENONAT]: Abilities.SIMPLE, [Species.DIGLETT]: Abilities.STURDY, - [Species.MEOWTH]: Abilities.NORMALIZE, + [Species.MEOWTH]: Abilities.TOUGH_CLAWS, [Species.PSYDUCK]: Abilities.SIMPLE, [Species.MANKEY]: Abilities.IRON_FIST, [Species.GROWLITHE]: Abilities.SPEED_BOOST, - [Species.POLIWAG]: Abilities.WATER_BUBBLE, - [Species.ABRA]: Abilities.OPPORTUNIST, - [Species.MACHOP]: Abilities.IRON_FIST, - [Species.BELLSPROUT]: Abilities.CORROSION, - [Species.TENTACOOL]: Abilities.INNARDS_OUT, - [Species.GEODUDE]: Abilities.ROCKY_PAYLOAD, + [Species.POLIWAG]: Abilities.NO_GUARD, + [Species.ABRA]: Abilities.PSYCHIC_SURGE, + [Species.MACHOP]: Abilities.QUICK_FEET, + [Species.BELLSPROUT]: Abilities.PROTOSYNTHESIS, + [Species.TENTACOOL]: Abilities.TOXIC_CHAIN, + [Species.GEODUDE]: Abilities.DRY_SKIN, [Species.PONYTA]: Abilities.MAGIC_GUARD, [Species.SLOWPOKE]: Abilities.UNAWARE, - [Species.MAGNEMITE]: Abilities.MOTOR_DRIVE, - [Species.FARFETCHD]: Abilities.PURE_POWER, - [Species.DODUO]: Abilities.RECKLESS, - [Species.SEEL]: Abilities.REGENERATOR, - [Species.GRIMER]: Abilities.GOOEY, - [Species.SHELLDER]: Abilities.MOXIE, - [Species.GASTLY]: Abilities.PERISH_BODY, + [Species.MAGNEMITE]: Abilities.LEVITATE, + [Species.FARFETCHD]: Abilities.HUGE_POWER, + [Species.DODUO]: Abilities.PARENTAL_BOND, + [Species.SEEL]: Abilities.WATER_BUBBLE, + [Species.GRIMER]: Abilities.WATER_ABSORB, + [Species.SHELLDER]: Abilities.ICE_SCALES, + [Species.GASTLY]: Abilities.SHADOW_SHIELD, [Species.ONIX]: Abilities.ROCKY_PAYLOAD, [Species.DROWZEE]: Abilities.BAD_DREAMS, - [Species.KRABBY]: Abilities.ANGER_SHELL, - [Species.VOLTORB]: Abilities.GALVANIZE, - [Species.EXEGGCUTE]: Abilities.PARENTAL_BOND, - [Species.CUBONE]: Abilities.MOODY, - [Species.LICKITUNG]: Abilities.EARTH_EATER, - [Species.KOFFING]: Abilities.FLARE_BOOST, + [Species.KRABBY]: Abilities.UNBURDEN, + [Species.VOLTORB]: Abilities.ELECTRIC_SURGE, + [Species.EXEGGCUTE]: Abilities.RIPEN, + [Species.CUBONE]: Abilities.PARENTAL_BOND, + [Species.LICKITUNG]: Abilities.THICK_FAT, + [Species.KOFFING]: Abilities.PARENTAL_BOND, [Species.RHYHORN]: Abilities.FILTER, - [Species.TANGELA]: Abilities.TANGLING_HAIR, - [Species.KANGASKHAN]: Abilities.IRON_FIST, + [Species.TANGELA]: Abilities.SEED_SOWER, + [Species.KANGASKHAN]: Abilities.GUTS, [Species.HORSEA]: Abilities.DRIZZLE, [Species.GOLDEEN]: Abilities.MULTISCALE, [Species.STARYU]: Abilities.REGENERATOR, - [Species.SCYTHER]: Abilities.SPEED_BOOST, - [Species.PINSIR]: Abilities.SAP_SIPPER, - [Species.TAUROS]: Abilities.ROCK_HEAD, + [Species.SCYTHER]: Abilities.TINTED_LENS, + [Species.PINSIR]: Abilities.TINTED_LENS, + [Species.TAUROS]: Abilities.SCRAPPY, [Species.MAGIKARP]: Abilities.MULTISCALE, - [Species.LAPRAS]: Abilities.LIQUID_VOICE, - [Species.DITTO]: Abilities.GOOEY, + [Species.LAPRAS]: Abilities.LIGHTNING_ROD, + [Species.DITTO]: Abilities.ADAPTABILITY, [Species.EEVEE]: Abilities.SIMPLE, - [Species.PORYGON]: Abilities.QUARK_DRIVE, - [Species.OMANYTE]: Abilities.ANGER_SHELL, + [Species.PORYGON]: Abilities.PROTEAN, + [Species.OMANYTE]: Abilities.STURDY, [Species.KABUTO]: Abilities.SHARPNESS, - [Species.AERODACTYL]: Abilities.PROTOSYNTHESIS, + [Species.AERODACTYL]: Abilities.ORICHALCUM_PULSE, [Species.ARTICUNO]: Abilities.SNOW_WARNING, [Species.ZAPDOS]: Abilities.DRIZZLE, [Species.MOLTRES]: Abilities.DROUGHT, @@ -3351,50 +3357,50 @@ export const starterPassiveAbilities = { [Species.CHIKORITA]: Abilities.THICK_FAT, [Species.CYNDAQUIL]: Abilities.DROUGHT, [Species.TOTODILE]: Abilities.TOUGH_CLAWS, - [Species.SENTRET]: Abilities.FLUFFY, - [Species.HOOTHOOT]: Abilities.CURSED_BODY, + [Species.SENTRET]: Abilities.PICKUP, + [Species.HOOTHOOT]: Abilities.AERILATE, [Species.LEDYBA]: Abilities.PRANKSTER, [Species.SPINARAK]: Abilities.PRANKSTER, - [Species.CHINCHOU]: Abilities.REGENERATOR, + [Species.CHINCHOU]: Abilities.WATER_BUBBLE, [Species.PICHU]: Abilities.ELECTRIC_SURGE, - [Species.CLEFFA]: Abilities.MAGIC_BOUNCE, - [Species.IGGLYBUFF]: Abilities.SERENE_GRACE, - [Species.TOGEPI]: Abilities.OPPORTUNIST, + [Species.CLEFFA]: Abilities.ANALYTIC, + [Species.IGGLYBUFF]: Abilities.HUGE_POWER, + [Species.TOGEPI]: Abilities.PIXILATE, [Species.NATU]: Abilities.TINTED_LENS, - [Species.MAREEP]: Abilities.FLUFFY, - [Species.HOPPIP]: Abilities.PRANKSTER, + [Species.MAREEP]: Abilities.ELECTROMORPHOSIS, + [Species.HOPPIP]: Abilities.FLUFFY, [Species.AIPOM]: Abilities.SCRAPPY, [Species.SUNKERN]: Abilities.DROUGHT, - [Species.YANMA]: Abilities.INFILTRATOR, - [Species.WOOPER]: Abilities.SIMPLE, - [Species.MURKROW]: Abilities.DEFIANT, - [Species.MISDREAVUS]: Abilities.DAZZLING, + [Species.YANMA]: Abilities.SHEER_FORCE, + [Species.WOOPER]: Abilities.COMATOSE, + [Species.MURKROW]: Abilities.DARK_AURA, + [Species.MISDREAVUS]: Abilities.BEADS_OF_RUIN, [Species.UNOWN]: Abilities.PICKUP, [Species.GIRAFARIG]: Abilities.PARENTAL_BOND, [Species.PINECO]: Abilities.IRON_BARBS, - [Species.DUNSPARCE]: Abilities.MARVEL_SCALE, - [Species.GLIGAR]: Abilities.MERCILESS, - [Species.SNUBBULL]: Abilities.BALL_FETCH, + [Species.DUNSPARCE]: Abilities.UNAWARE, + [Species.GLIGAR]: Abilities.TOXIC_BOOST, + [Species.SNUBBULL]: Abilities.PIXILATE, [Species.QWILFISH]: Abilities.TOXIC_DEBRIS, - [Species.SHUCKLE]: Abilities.WELL_BAKED_BODY, - [Species.HERACROSS]: Abilities.QUICK_FEET, - [Species.SNEASEL]: Abilities.MOXIE, - [Species.TEDDIURSA]: Abilities.GLUTTONY, - [Species.SLUGMA]: Abilities.DROUGHT, + [Species.SHUCKLE]: Abilities.HARVEST, + [Species.HERACROSS]: Abilities.TECHNICIAN, + [Species.SNEASEL]: Abilities.TOUGH_CLAWS, + [Species.TEDDIURSA]: Abilities.THICK_FAT, + [Species.SLUGMA]: Abilities.DESOLATE_LAND, [Species.SWINUB]: Abilities.SLUSH_RUSH, [Species.CORSOLA]: Abilities.STORM_DRAIN, - [Species.REMORAID]: Abilities.SKILL_LINK, - [Species.DELIBIRD]: Abilities.PRANKSTER, - [Species.SKARMORY]: Abilities.OBLIVIOUS, - [Species.HOUNDOUR]: Abilities.INTIMIDATE, - [Species.PHANPY]: Abilities.ROCK_HEAD, - [Species.STANTLER]: Abilities.MAGIC_GUARD, - [Species.SMEARGLE]: Abilities.QUICK_DRAW, - [Species.TYROGUE]: Abilities.STAMINA, - [Species.SMOOCHUM]: Abilities.DAZZLING, - [Species.ELEKID]: Abilities.IRON_FIST, + [Species.REMORAID]: Abilities.SIMPLE, + [Species.DELIBIRD]: Abilities.HUGE_POWER, + [Species.SKARMORY]: Abilities.LIGHTNING_ROD, + [Species.HOUNDOUR]: Abilities.DROUGHT, + [Species.PHANPY]: Abilities.SPEED_BOOST, + [Species.STANTLER]: Abilities.ANALYTIC, + [Species.SMEARGLE]: Abilities.PRANKSTER, + [Species.TYROGUE]: Abilities.MOXIE, + [Species.SMOOCHUM]: Abilities.PSYCHIC_SURGE, + [Species.ELEKID]: Abilities.SHEER_FORCE, [Species.MAGBY]: Abilities.CONTRARY, - [Species.MILTANK]: Abilities.GLUTTONY, + [Species.MILTANK]: Abilities.STAMINA, [Species.RAIKOU]: Abilities.TRANSISTOR, [Species.ENTEI]: Abilities.MOXIE, [Species.SUICUNE]: Abilities.UNAWARE, @@ -3404,65 +3410,65 @@ export const starterPassiveAbilities = { [Species.CELEBI]: Abilities.GRASSY_SURGE, [Species.TREECKO]: Abilities.TINTED_LENS, [Species.TORCHIC]: Abilities.RECKLESS, - [Species.MUDKIP]: Abilities.REGENERATOR, - [Species.POOCHYENA]: Abilities.STRONG_JAW, - [Species.ZIGZAGOON]: Abilities.PICKPOCKET, - [Species.WURMPLE]: Abilities.TINTED_LENS, + [Species.MUDKIP]: Abilities.DRIZZLE, + [Species.POOCHYENA]: Abilities.TOUGH_CLAWS, + [Species.ZIGZAGOON]: Abilities.RUN_AWAY, + [Species.WURMPLE]: Abilities.SIMPLE, [Species.LOTAD]: Abilities.DRIZZLE, - [Species.SEEDOT]: Abilities.LEAF_GUARD, - [Species.TAILLOW]: Abilities.KEEN_EYE, - [Species.WINGULL]: Abilities.STORM_DRAIN, + [Species.SEEDOT]: Abilities.SHARPNESS, + [Species.TAILLOW]: Abilities.AERILATE, + [Species.WINGULL]: Abilities.SWIFT_SWIM, [Species.RALTS]: Abilities.PSYCHIC_SURGE, - [Species.SURSKIT]: Abilities.WATER_ABSORB, + [Species.SURSKIT]: Abilities.WATER_BUBBLE, [Species.SHROOMISH]: Abilities.GUTS, [Species.SLAKOTH]: Abilities.GUTS, - [Species.NINCADA]: Abilities.OVERCOAT, + [Species.NINCADA]: Abilities.MAGIC_GUARD, [Species.WHISMUR]: Abilities.PUNK_ROCK, [Species.MAKUHITA]: Abilities.STAMINA, [Species.AZURILL]: Abilities.MISTY_SURGE, [Species.NOSEPASS]: Abilities.LEVITATE, [Species.SKITTY]: Abilities.SCRAPPY, [Species.SABLEYE]: Abilities.UNNERVE, - [Species.MAWILE]: Abilities.MOLD_BREAKER, - [Species.ARON]: Abilities.SOLID_ROCK, - [Species.MEDITITE]: Abilities.OWN_TEMPO, + [Species.MAWILE]: Abilities.UNNERVE, + [Species.ARON]: Abilities.EARTH_EATER, + [Species.MEDITITE]: Abilities.MINDS_EYE, [Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE, - [Species.PLUSLE]: Abilities.MINUS, - [Species.MINUN]: Abilities.PLUS, - [Species.VOLBEAT]: Abilities.TINTED_LENS, - [Species.ILLUMISE]: Abilities.SWARM, - [Species.GULPIN]: Abilities.POISON_TOUCH, - [Species.CARVANHA]: Abilities.STAKEOUT, + [Species.PLUSLE]: Abilities.POWER_SPOT, + [Species.MINUN]: Abilities.POWER_SPOT, + [Species.VOLBEAT]: Abilities.HONEY_GATHER, + [Species.ILLUMISE]: Abilities.HONEY_GATHER, + [Species.GULPIN]: Abilities.EARTH_EATER, + [Species.CARVANHA]: Abilities.SHEER_FORCE, [Species.WAILMER]: Abilities.LEVITATE, - [Species.NUMEL]: Abilities.TURBOBLAZE, - [Species.TORKOAL]: Abilities.PROTOSYNTHESIS, + [Species.NUMEL]: Abilities.STAMINA, + [Species.TORKOAL]: Abilities.ANALYTIC, [Species.SPOINK]: Abilities.PSYCHIC_SURGE, [Species.SPINDA]: Abilities.SIMPLE, [Species.TRAPINCH]: Abilities.ADAPTABILITY, [Species.CACNEA]: Abilities.SAND_RUSH, - [Species.SWABLU]: Abilities.WHITE_SMOKE, - [Species.ZANGOOSE]: Abilities.TOUGH_CLAWS, - [Species.SEVIPER]: Abilities.MOLD_BREAKER, - [Species.LUNATONE]: Abilities.FAIRY_AURA, + [Species.SWABLU]: Abilities.ADAPTABILITY, + [Species.ZANGOOSE]: Abilities.POISON_HEAL, + [Species.SEVIPER]: Abilities.INTIMIDATE, + [Species.LUNATONE]: Abilities.SHADOW_SHIELD, [Species.SOLROCK]: Abilities.DROUGHT, - [Species.BARBOACH]: Abilities.BALL_FETCH, + [Species.BARBOACH]: Abilities.SIMPLE, [Species.CORPHISH]: Abilities.TOUGH_CLAWS, - [Species.BALTOY]: Abilities.OWN_TEMPO, - [Species.LILEEP]: Abilities.WATER_ABSORB, + [Species.BALTOY]: Abilities.WELL_BAKED_BODY, + [Species.LILEEP]: Abilities.SEED_SOWER, [Species.ANORITH]: Abilities.WATER_ABSORB, [Species.FEEBAS]: Abilities.MAGIC_GUARD, [Species.CASTFORM]: Abilities.ADAPTABILITY, [Species.KECLEON]: Abilities.ADAPTABILITY, - [Species.SHUPPET]: Abilities.MUMMY, + [Species.SHUPPET]: Abilities.SHADOW_SHIELD, [Species.DUSKULL]: Abilities.UNNERVE, - [Species.TROPIUS]: Abilities.CUD_CHEW, - [Species.ABSOL]: Abilities.DARK_AURA, - [Species.WYNAUT]: Abilities.STAMINA, + [Species.TROPIUS]: Abilities.RIPEN, + [Species.ABSOL]: Abilities.SHARPNESS, + [Species.WYNAUT]: Abilities.STURDY, [Species.SNORUNT]: Abilities.SNOW_WARNING, - [Species.SPHEAL]: Abilities.SLUSH_RUSH, - [Species.CLAMPERL]: Abilities.SIMPLE, + [Species.SPHEAL]: Abilities.UNAWARE, + [Species.CLAMPERL]: Abilities.DRIZZLE, [Species.RELICANTH]: Abilities.SOLID_ROCK, - [Species.LUVDISC]: Abilities.PICKUP, + [Species.LUVDISC]: Abilities.MULTISCALE, [Species.BAGON]: Abilities.ADAPTABILITY, [Species.BELDUM]: Abilities.LEVITATE, [Species.REGIROCK]: Abilities.SAND_STREAM, @@ -3470,131 +3476,131 @@ export const starterPassiveAbilities = { [Species.REGISTEEL]: Abilities.FILTER, [Species.LATIAS]: Abilities.SOUL_HEART, [Species.LATIOS]: Abilities.TINTED_LENS, - [Species.KYOGRE]: Abilities.HYDRATION, - [Species.GROUDON]: Abilities.PROTOSYNTHESIS, + [Species.KYOGRE]: Abilities.RAIN_DISH, + [Species.GROUDON]: Abilities.TURBOBLAZE, [Species.RAYQUAZA]: Abilities.UNNERVE, [Species.JIRACHI]: Abilities.COMATOSE, [Species.DEOXYS]: Abilities.PROTEAN, [Species.TURTWIG]: Abilities.THICK_FAT, - [Species.CHIMCHAR]: Abilities.MOXIE, + [Species.CHIMCHAR]: Abilities.BEAST_BOOST, [Species.PIPLUP]: Abilities.LIGHTNING_ROD, [Species.STARLY]: Abilities.ROCK_HEAD, - [Species.BIDOOF]: Abilities.NEUROFORCE, - [Species.KRICKETOT]: Abilities.SOUNDPROOF, - [Species.SHINX]: Abilities.VOLT_ABSORB, - [Species.BUDEW]: Abilities.CUTE_CHARM, + [Species.BIDOOF]: Abilities.SAP_SIPPER, + [Species.KRICKETOT]: Abilities.SHARPNESS, + [Species.SHINX]: Abilities.SPEED_BOOST, + [Species.BUDEW]: Abilities.GRASSY_SURGE, [Species.CRANIDOS]: Abilities.ROCK_HEAD, - [Species.SHIELDON]: Abilities.SOLID_ROCK, + [Species.SHIELDON]: Abilities.EARTH_EATER, [Species.BURMY]: Abilities.STURDY, - [Species.COMBEE]: Abilities.QUEENLY_MAJESTY, - [Species.PACHIRISU]: Abilities.BALL_FETCH, - [Species.BUIZEL]: Abilities.HYDRATION, + [Species.COMBEE]: Abilities.INTIMIDATE, + [Species.PACHIRISU]: Abilities.HONEY_GATHER, + [Species.BUIZEL]: Abilities.MOXIE, [Species.CHERUBI]: Abilities.DROUGHT, - [Species.SHELLOS]: Abilities.SHELL_ARMOR, - [Species.DRIFLOON]: Abilities.PICKPOCKET, - [Species.BUNEARY]: Abilities.OBLIVIOUS, - [Species.GLAMEOW]: Abilities.PICKUP, - [Species.CHINGLING]: Abilities.VICTORY_STAR, - [Species.STUNKY]: Abilities.MERCILESS, - [Species.BRONZOR]: Abilities.SOUNDPROOF, + [Species.SHELLOS]: Abilities.REGENERATOR, + [Species.DRIFLOON]: Abilities.MAGIC_GUARD, + [Species.BUNEARY]: Abilities.ADAPTABILITY, + [Species.GLAMEOW]: Abilities.INTIMIDATE, + [Species.CHINGLING]: Abilities.PUNK_ROCK, + [Species.STUNKY]: Abilities.NEUTRALIZING_GAS, + [Species.BRONZOR]: Abilities.BULLETPROOF, [Species.BONSLY]: Abilities.SAP_SIPPER, - [Species.MIME_JR]: Abilities.MAGIC_BOUNCE, - [Species.HAPPINY]: Abilities.TRIAGE, + [Species.MIME_JR]: Abilities.OPPORTUNIST, + [Species.HAPPINY]: Abilities.FUR_COAT, [Species.CHATOT]: Abilities.PUNK_ROCK, - [Species.SPIRITOMB]: Abilities.REGENERATOR, + [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, [Species.GIBLE]: Abilities.SAND_STREAM, - [Species.MUNCHLAX]: Abilities.CUD_CHEW, + [Species.MUNCHLAX]: Abilities.RIPEN, [Species.RIOLU]: Abilities.MINDS_EYE, - [Species.HIPPOPOTAS]: Abilities.SAND_VEIL, + [Species.HIPPOPOTAS]: Abilities.UNAWARE, [Species.SKORUPI]: Abilities.SUPER_LUCK, - [Species.CROAGUNK]: Abilities.PICKPOCKET, - [Species.CARNIVINE]: Abilities.EFFECT_SPORE, + [Species.CROAGUNK]: Abilities.MOXIE, + [Species.CARNIVINE]: Abilities.ARENA_TRAP, [Species.FINNEON]: Abilities.DRIZZLE, - [Species.MANTYKE]: Abilities.STORM_DRAIN, - [Species.SNOVER]: Abilities.SNOW_CLOAK, + [Species.MANTYKE]: Abilities.UNAWARE, + [Species.SNOVER]: Abilities.THICK_FAT, [Species.ROTOM]: Abilities.HADRON_ENGINE, [Species.UXIE]: Abilities.UNAWARE, [Species.MESPRIT]: Abilities.MOODY, [Species.AZELF]: Abilities.NEUROFORCE, - [Species.DIALGA]: Abilities.SPEED_BOOST, - [Species.PALKIA]: Abilities.MULTISCALE, - [Species.HEATRAN]: Abilities.FILTER, + [Species.DIALGA]: Abilities.LEVITATE, + [Species.PALKIA]: Abilities.SPEED_BOOST, + [Species.HEATRAN]: Abilities.EARTH_EATER, [Species.REGIGIGAS]: Abilities.MINDS_EYE, [Species.GIRATINA]: Abilities.SHADOW_SHIELD, [Species.CRESSELIA]: Abilities.MAGIC_BOUNCE, [Species.PHIONE]: Abilities.SIMPLE, [Species.MANAPHY]: Abilities.SIMPLE, [Species.DARKRAI]: Abilities.UNNERVE, - [Species.SHAYMIN]: Abilities.FLOWER_VEIL, + [Species.SHAYMIN]: Abilities.WIND_RIDER, [Species.ARCEUS]: Abilities.ADAPTABILITY, - [Species.VICTINI]: Abilities.SUPER_LUCK, + [Species.VICTINI]: Abilities.SHEER_FORCE, [Species.SNIVY]: Abilities.MULTISCALE, [Species.TEPIG]: Abilities.ROCK_HEAD, [Species.OSHAWOTT]: Abilities.INTREPID_SWORD, - [Species.PATRAT]: Abilities.STAKEOUT, - [Species.LILLIPUP]: Abilities.BALL_FETCH, - [Species.PURRLOIN]: Abilities.DEFIANT, - [Species.PANSAGE]: Abilities.SAP_SIPPER, - [Species.PANSEAR]: Abilities.FLASH_FIRE, - [Species.PANPOUR]: Abilities.STORM_DRAIN, + [Species.PATRAT]: Abilities.NO_GUARD, + [Species.LILLIPUP]: Abilities.FUR_COAT, + [Species.PURRLOIN]: Abilities.PICKUP, + [Species.PANSAGE]: Abilities.WELL_BAKED_BODY, + [Species.PANSEAR]: Abilities.WATER_ABSORB, + [Species.PANPOUR]: Abilities.SAP_SIPPER, [Species.MUNNA]: Abilities.NEUTRALIZING_GAS, - [Species.PIDOVE]: Abilities.OPPORTUNIST, - [Species.BLITZLE]: Abilities.FLARE_BOOST, + [Species.PIDOVE]: Abilities.SNIPER, + [Species.BLITZLE]: Abilities.RECKLESS, [Species.ROGGENROLA]: Abilities.SOLID_ROCK, - [Species.WOOBAT]: Abilities.SOUL_HEART, + [Species.WOOBAT]: Abilities.OPPORTUNIST, [Species.DRILBUR]: Abilities.SAND_STREAM, [Species.AUDINO]: Abilities.FRIEND_GUARD, - [Species.TIMBURR]: Abilities.STAMINA, - [Species.TYMPOLE]: Abilities.MOODY, - [Species.THROH]: Abilities.SIMPLE, - [Species.SAWK]: Abilities.DEFIANT, + [Species.TIMBURR]: Abilities.ROCKY_PAYLOAD, + [Species.TYMPOLE]: Abilities.POISON_HEAL, + [Species.THROH]: Abilities.STAMINA, + [Species.SAWK]: Abilities.SCRAPPY, [Species.SEWADDLE]: Abilities.SHARPNESS, - [Species.VENIPEDE]: Abilities.INTIMIDATE, + [Species.VENIPEDE]: Abilities.STAMINA, [Species.COTTONEE]: Abilities.FLUFFY, - [Species.PETILIL]: Abilities.DANCER, - [Species.BASCULIN]: Abilities.OPPORTUNIST, - [Species.SANDILE]: Abilities.STRONG_JAW, - [Species.DARUMAKA]: Abilities.IRON_FIST, - [Species.MARACTUS]: Abilities.IRON_BARBS, - [Species.DWEBBLE]: Abilities.STAMINA, - [Species.SCRAGGY]: Abilities.ROCK_HEAD, + [Species.PETILIL]: Abilities.SIMPLE, + [Species.BASCULIN]: Abilities.SUPREME_OVERLORD, + [Species.SANDILE]: Abilities.TOUGH_CLAWS, + [Species.DARUMAKA]: Abilities.GORILLA_TACTICS, + [Species.MARACTUS]: Abilities.WELL_BAKED_BODY, + [Species.DWEBBLE]: Abilities.ANGER_SHELL, + [Species.SCRAGGY]: Abilities.PROTEAN, [Species.SIGILYPH]: Abilities.MAGICIAN, [Species.YAMASK]: Abilities.PURIFYING_SALT, - [Species.TIRTOUGA]: Abilities.SHELL_ARMOR, - [Species.ARCHEN]: Abilities.ROCKY_PAYLOAD, - [Species.TRUBBISH]: Abilities.GOOEY, + [Species.TIRTOUGA]: Abilities.ANGER_SHELL, + [Species.ARCHEN]: Abilities.MULTISCALE, + [Species.TRUBBISH]: Abilities.TOXIC_DEBRIS, [Species.ZORUA]: Abilities.DARK_AURA, - [Species.MINCCINO]: Abilities.SCRAPPY, - [Species.GOTHITA]: Abilities.PRESSURE, - [Species.SOLOSIS]: Abilities.GOOEY, - [Species.DUCKLETT]: Abilities.GALE_WINGS, - [Species.VANILLITE]: Abilities.REFRIGERATE, - [Species.DEERLING]: Abilities.JUSTIFIED, - [Species.EMOLGA]: Abilities.WIND_POWER, - [Species.KARRABLAST]: Abilities.MIRROR_ARMOR, - [Species.FOONGUS]: Abilities.MYCELIUM_MIGHT, - [Species.FRILLISH]: Abilities.MUMMY, + [Species.MINCCINO]: Abilities.FUR_COAT, + [Species.GOTHITA]: Abilities.UNNERVE, + [Species.SOLOSIS]: Abilities.PSYCHIC_SURGE, + [Species.DUCKLETT]: Abilities.DRIZZLE, + [Species.VANILLITE]: Abilities.SLUSH_RUSH, + [Species.DEERLING]: Abilities.FUR_COAT, + [Species.EMOLGA]: Abilities.TRANSISTOR, + [Species.KARRABLAST]: Abilities.QUICK_DRAW, + [Species.FOONGUS]: Abilities.THICK_FAT, + [Species.FRILLISH]: Abilities.UNAWARE, [Species.ALOMOMOLA]: Abilities.MULTISCALE, - [Species.JOLTIK]: Abilities.VOLT_ABSORB, + [Species.JOLTIK]: Abilities.TRANSISTOR, [Species.FERROSEED]: Abilities.ROUGH_SKIN, [Species.KLINK]: Abilities.STEELWORKER, - [Species.TYNAMO]: Abilities.SWIFT_SWIM, - [Species.ELGYEM]: Abilities.SHADOW_TAG, + [Species.TYNAMO]: Abilities.POISON_HEAL, + [Species.ELGYEM]: Abilities.PRISM_ARMOR, [Species.LITWICK]: Abilities.SOUL_HEART, [Species.AXEW]: Abilities.DRAGONS_MAW, - [Species.CUBCHOO]: Abilities.INTIMIDATE, - [Species.CRYOGONAL]: Abilities.DAZZLING, - [Species.SHELMET]: Abilities.SHED_SKIN, + [Species.CUBCHOO]: Abilities.TOUGH_CLAWS, + [Species.CRYOGONAL]: Abilities.SNOW_WARNING, + [Species.SHELMET]: Abilities.PROTEAN, [Species.STUNFISK]: Abilities.STORM_DRAIN, [Species.MIENFOO]: Abilities.NO_GUARD, [Species.DRUDDIGON]: Abilities.INTIMIDATE, [Species.GOLETT]: Abilities.SHADOW_SHIELD, - [Species.PAWNIARD]: Abilities.SHARPNESS, - [Species.BOUFFALANT]: Abilities.THICK_FAT, - [Species.RUFFLET]: Abilities.RECKLESS, + [Species.PAWNIARD]: Abilities.SWORD_OF_RUIN, + [Species.BOUFFALANT]: Abilities.ROCK_HEAD, + [Species.RUFFLET]: Abilities.GALE_WINGS, [Species.VULLABY]: Abilities.THICK_FAT, [Species.HEATMOR]: Abilities.CONTRARY, - [Species.DURANT]: Abilities.TOUGH_CLAWS, + [Species.DURANT]: Abilities.COMPOUND_EYES, [Species.DEINO]: Abilities.PARENTAL_BOND, [Species.LARVESTA]: Abilities.DROUGHT, [Species.COBALION]: Abilities.INTREPID_SWORD, @@ -3608,37 +3614,37 @@ export const starterPassiveAbilities = { [Species.KYUREM]: Abilities.SNOW_WARNING, [Species.KELDEO]: Abilities.GRIM_NEIGH, [Species.MELOETTA]: Abilities.MINDS_EYE, - [Species.GENESECT]: Abilities.REGENERATOR, + [Species.GENESECT]: Abilities.PROTEAN, [Species.CHESPIN]: Abilities.DAUNTLESS_SHIELD, [Species.FENNEKIN]: Abilities.PSYCHIC_SURGE, - [Species.FROAKIE]: Abilities.ADAPTABILITY, + [Species.FROAKIE]: Abilities.STAKEOUT, [Species.BUNNELBY]: Abilities.GUTS, - [Species.FLETCHLING]: Abilities.RECKLESS, + [Species.FLETCHLING]: Abilities.MAGIC_GUARD, [Species.SCATTERBUG]: Abilities.PRANKSTER, - [Species.LITLEO]: Abilities.INTIMIDATE, + [Species.LITLEO]: Abilities.BEAST_BOOST, [Species.FLABEBE]: Abilities.GRASSY_SURGE, [Species.SKIDDO]: Abilities.GRASSY_SURGE, - [Species.PANCHAM]: Abilities.FLUFFY, - [Species.FURFROU]: Abilities.BALL_FETCH, + [Species.PANCHAM]: Abilities.FUR_COAT, + [Species.FURFROU]: Abilities.FLUFFY, [Species.ESPURR]: Abilities.FUR_COAT, [Species.HONEDGE]: Abilities.SHARPNESS, [Species.SPRITZEE]: Abilities.MISTY_SURGE, [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, - [Species.INKAY]: Abilities.SUPREME_OVERLORD, - [Species.BINACLE]: Abilities.SOLID_ROCK, + [Species.INKAY]: Abilities.UNNERVE, + [Species.BINACLE]: Abilities.SAP_SIPPER, [Species.SKRELP]: Abilities.DRAGONS_MAW, [Species.CLAUNCHER]: Abilities.SWIFT_SWIM, - [Species.HELIOPTILE]: Abilities.NO_GUARD, + [Species.HELIOPTILE]: Abilities.PROTEAN, [Species.TYRUNT]: Abilities.RECKLESS, - [Species.AMAURA]: Abilities.SERENE_GRACE, - [Species.HAWLUCHA]: Abilities.RECKLESS, - [Species.DEDENNE]: Abilities.SIMPLE, + [Species.AMAURA]: Abilities.ICE_SCALES, + [Species.HAWLUCHA]: Abilities.MOXIE, + [Species.DEDENNE]: Abilities.PIXILATE, [Species.CARBINK]: Abilities.SOLID_ROCK, - [Species.GOOMY]: Abilities.DRIZZLE, - [Species.KLEFKI]: Abilities.TRIAGE, - [Species.PHANTUMP]: Abilities.UNNERVE, - [Species.PUMPKABOO]: Abilities.FLASH_FIRE, - [Species.BERGMITE]: Abilities.MIRROR_ARMOR, + [Species.GOOMY]: Abilities.REGENERATOR, + [Species.KLEFKI]: Abilities.LEVITATE, + [Species.PHANTUMP]: Abilities.RIPEN, + [Species.PUMPKABOO]: Abilities.WELL_BAKED_BODY, + [Species.BERGMITE]: Abilities.ICE_SCALES, [Species.NOIBAT]: Abilities.PUNK_ROCK, [Species.XERNEAS]: Abilities.MISTY_SURGE, [Species.YVELTAL]: Abilities.SOUL_HEART, @@ -3646,44 +3652,44 @@ export const starterPassiveAbilities = { [Species.DIANCIE]: Abilities.LEVITATE, [Species.HOOPA]: Abilities.OPPORTUNIST, [Species.VOLCANION]: Abilities.FILTER, - [Species.ROWLET]: Abilities.SNIPER, + [Species.ROWLET]: Abilities.UNBURDEN, [Species.LITTEN]: Abilities.FUR_COAT, [Species.POPPLIO]: Abilities.PUNK_ROCK, - [Species.PIKIPEK]: Abilities.ANGER_POINT, - [Species.YUNGOOS]: Abilities.HUGE_POWER, + [Species.PIKIPEK]: Abilities.TECHNICIAN, + [Species.YUNGOOS]: Abilities.TOUGH_CLAWS, [Species.GRUBBIN]: Abilities.SPEED_BOOST, - [Species.CRABRAWLER]: Abilities.REFRIGERATE, + [Species.CRABRAWLER]: Abilities.WATER_BUBBLE, [Species.ORICORIO]: Abilities.ADAPTABILITY, - [Species.CUTIEFLY]: Abilities.FRIEND_GUARD, + [Species.CUTIEFLY]: Abilities.TINTED_LENS, [Species.ROCKRUFF]: Abilities.ROCKY_PAYLOAD, - [Species.WISHIWASHI]: Abilities.PARENTAL_BOND, + [Species.WISHIWASHI]: Abilities.REGENERATOR, [Species.MAREANIE]: Abilities.TOXIC_DEBRIS, [Species.MUDBRAY]: Abilities.CUD_CHEW, - [Species.DEWPIDER]: Abilities.UNNERVE, + [Species.DEWPIDER]: Abilities.TINTED_LENS, [Species.FOMANTIS]: Abilities.SHARPNESS, - [Species.MORELULL]: Abilities.PERISH_BODY, - [Species.SALANDIT]: Abilities.DAZZLING, - [Species.STUFFUL]: Abilities.HOSPITALITY, - [Species.BOUNSWEET]: Abilities.RIPEN, + [Species.MORELULL]: Abilities.TRIAGE, + [Species.SALANDIT]: Abilities.DRAGONS_MAW, + [Species.STUFFUL]: Abilities.SCRAPPY, + [Species.BOUNSWEET]: Abilities.MOXIE, [Species.COMFEY]: Abilities.FRIEND_GUARD, - [Species.ORANGURU]: Abilities.HOSPITALITY, - [Species.PASSIMIAN]: Abilities.COSTAR, - [Species.WIMPOD]: Abilities.TINTED_LENS, - [Species.SANDYGAST]: Abilities.SAND_STREAM, - [Species.PYUKUMUKU]: Abilities.IRON_BARBS, + [Species.ORANGURU]: Abilities.POWER_SPOT, + [Species.PASSIMIAN]: Abilities.LIBERO, + [Species.WIMPOD]: Abilities.REGENERATOR, + [Species.SANDYGAST]: Abilities.SAND_SPIT, + [Species.PYUKUMUKU]: Abilities.PURIFYING_SALT, [Species.TYPE_NULL]: Abilities.ADAPTABILITY, - [Species.MINIOR]: Abilities.ANGER_SHELL, + [Species.MINIOR]: Abilities.STURDY, [Species.KOMALA]: Abilities.GUTS, - [Species.TURTONATOR]: Abilities.ANGER_SHELL, - [Species.TOGEDEMARU]: Abilities.STATIC, + [Species.TURTONATOR]: Abilities.DAUNTLESS_SHIELD, + [Species.TOGEDEMARU]: Abilities.ROUGH_SKIN, [Species.MIMIKYU]: Abilities.TOUGH_CLAWS, [Species.BRUXISH]: Abilities.MULTISCALE, - [Species.DRAMPA]: Abilities.FLASH_FIRE, - [Species.DHELMISE]: Abilities.INFILTRATOR, + [Species.DRAMPA]: Abilities.THICK_FAT, + [Species.DHELMISE]: Abilities.WATER_BUBBLE, [Species.JANGMO_O]: Abilities.PUNK_ROCK, [Species.TAPU_KOKO]: Abilities.TRANSISTOR, [Species.TAPU_LELE]: Abilities.SHEER_FORCE, - [Species.TAPU_BULU]: Abilities.GRASS_PELT, + [Species.TAPU_BULU]: Abilities.TRIAGE, [Species.TAPU_FINI]: Abilities.FAIRY_AURA, [Species.COSMOG]: Abilities.BEAST_BOOST, [Species.NIHILEGO]: Abilities.LEVITATE, @@ -3702,41 +3708,41 @@ export const starterPassiveAbilities = { [Species.ZERAORA]: Abilities.TOUGH_CLAWS, [Species.MELTAN]: Abilities.STEELY_SPIRIT, [Species.GROOKEY]: Abilities.GRASS_PELT, - [Species.SCORBUNNY]: Abilities.VICTORY_STAR, + [Species.SCORBUNNY]: Abilities.NO_GUARD, [Species.SOBBLE]: Abilities.SUPER_LUCK, - [Species.SKWOVET]: Abilities.HONEY_GATHER, + [Species.SKWOVET]: Abilities.RIPEN, [Species.ROOKIDEE]: Abilities.IRON_BARBS, [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, - [Species.NICKIT]: Abilities.INTIMIDATE, + [Species.NICKIT]: Abilities.MAGICIAN, [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, - [Species.WOOLOO]: Abilities.ROCK_HEAD, + [Species.WOOLOO]: Abilities.SIMPLE, [Species.CHEWTLE]: Abilities.ROCK_HEAD, - [Species.YAMPER]: Abilities.STAKEOUT, - [Species.ROLYCOLY]: Abilities.EARTH_EATER, + [Species.YAMPER]: Abilities.SHEER_FORCE, + [Species.ROLYCOLY]: Abilities.SOLID_ROCK, [Species.APPLIN]: Abilities.DRAGONS_MAW, [Species.SILICOBRA]: Abilities.SAND_RUSH, - [Species.CRAMORANT]: Abilities.STORM_DRAIN, - [Species.ARROKUDA]: Abilities.STRONG_JAW, - [Species.TOXEL]: Abilities.GALVANIZE, - [Species.SIZZLIPEDE]: Abilities.DEFIANT, - [Species.CLOBBOPUS]: Abilities.SWIFT_SWIM, - [Species.SINISTEA]: Abilities.WATER_ABSORB, - [Species.HATENNA]: Abilities.MAGIC_GUARD, - [Species.IMPIDIMP]: Abilities.TANGLING_HAIR, + [Species.CRAMORANT]: Abilities.LIGHTNING_ROD, + [Species.ARROKUDA]: Abilities.INTIMIDATE, + [Species.TOXEL]: Abilities.ELECTRIC_SURGE, + [Species.SIZZLIPEDE]: Abilities.SPEED_BOOST, + [Species.CLOBBOPUS]: Abilities.WATER_BUBBLE, + [Species.SINISTEA]: Abilities.SHADOW_SHIELD, + [Species.HATENNA]: Abilities.FAIRY_AURA, + [Species.IMPIDIMP]: Abilities.FUR_COAT, [Species.MILCERY]: Abilities.MISTY_SURGE, - [Species.FALINKS]: Abilities.MOXIE, - [Species.PINCURCHIN]: Abilities.IRON_BARBS, + [Species.FALINKS]: Abilities.PARENTAL_BOND, + [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, [Species.SNOM]: Abilities.SNOW_WARNING, - [Species.STONJOURNER]: Abilities.SOLID_ROCK, - [Species.EISCUE]: Abilities.SLUSH_RUSH, - [Species.INDEEDEE]: Abilities.MAGIC_BOUNCE, - [Species.MORPEKO]: Abilities.GLUTTONY, - [Species.CUFANT]: Abilities.HEATPROOF, - [Species.DRACOZOLT]: Abilities.SLUSH_RUSH, - [Species.ARCTOZOLT]: Abilities.SAND_RUSH, - [Species.DRACOVISH]: Abilities.HUSTLE, - [Species.ARCTOVISH]: Abilities.STRONG_JAW, - [Species.DURALUDON]: Abilities.DOWNLOAD, + [Species.STONJOURNER]: Abilities.STURDY, + [Species.EISCUE]: Abilities.ICE_SCALES, + [Species.INDEEDEE]: Abilities.FRIEND_GUARD, + [Species.MORPEKO]: Abilities.MOODY, + [Species.CUFANT]: Abilities.EARTH_EATER, + [Species.DRACOZOLT]: Abilities.NO_GUARD, + [Species.ARCTOZOLT]: Abilities.SNOW_WARNING, + [Species.DRACOVISH]: Abilities.SWIFT_SWIM, + [Species.ARCTOVISH]: Abilities.SNOW_WARNING, + [Species.DURALUDON]: Abilities.STEELWORKER, [Species.DREEPY]: Abilities.PARENTAL_BOND, [Species.ZACIAN]: Abilities.UNNERVE, [Species.ZAMAZENTA]: Abilities.STAMINA, @@ -3753,64 +3759,64 @@ export const starterPassiveAbilities = { [Species.FUECOCO]: Abilities.PUNK_ROCK, [Species.QUAXLY]: Abilities.DEFIANT, [Species.LECHONK]: Abilities.SIMPLE, - [Species.TAROUNTULA]: Abilities.PICKUP, - [Species.NYMBLE]: Abilities.TECHNICIAN, - [Species.PAWMI]: Abilities.FLUFFY, - [Species.TANDEMAUS]: Abilities.PARENTAL_BOND, + [Species.TAROUNTULA]: Abilities.HONEY_GATHER, + [Species.NYMBLE]: Abilities.GUTS, + [Species.PAWMI]: Abilities.TRANSISTOR, + [Species.TANDEMAUS]: Abilities.SCRAPPY, [Species.FIDOUGH]: Abilities.WATER_ABSORB, [Species.SMOLIV]: Abilities.RIPEN, - [Species.SQUAWKABILLY]: Abilities.GALE_WINGS, - [Species.NACLI]: Abilities.EARTH_EATER, - [Species.CHARCADET]: Abilities.MIRROR_ARMOR, - [Species.TADBULB]: Abilities.TRANSISTOR, - [Species.WATTREL]: Abilities.GALE_WINGS, + [Species.SQUAWKABILLY]: Abilities.MOXIE, + [Species.NACLI]: Abilities.SOLID_ROCK, + [Species.CHARCADET]: Abilities.PRISM_ARMOR, + [Species.TADBULB]: Abilities.STAMINA, + [Species.WATTREL]: Abilities.SHEER_FORCE, [Species.MASCHIFF]: Abilities.STRONG_JAW, [Species.SHROODLE]: Abilities.CORROSION, - [Species.BRAMBLIN]: Abilities.WANDERING_SPIRIT, + [Species.BRAMBLIN]: Abilities.SHADOW_SHIELD, [Species.TOEDSCOOL]: Abilities.PRANKSTER, [Species.KLAWF]: Abilities.WATER_ABSORB, [Species.CAPSAKID]: Abilities.PARENTAL_BOND, - [Species.RELLOR]: Abilities.MAGIC_GUARD, - [Species.FLITTLE]: Abilities.COMPETITIVE, - [Species.TINKATINK]: Abilities.HUGE_POWER, + [Species.RELLOR]: Abilities.PRANKSTER, + [Species.FLITTLE]: Abilities.MAGIC_BOUNCE, + [Species.TINKATINK]: Abilities.STEELWORKER, [Species.WIGLETT]: Abilities.STURDY, - [Species.BOMBIRDIER]: Abilities.UNAWARE, + [Species.BOMBIRDIER]: Abilities.UNBURDEN, [Species.FINIZEN]: Abilities.IRON_FIST, - [Species.VAROOM]: Abilities.SPEED_BOOST, + [Species.VAROOM]: Abilities.LEVITATE, [Species.CYCLIZAR]: Abilities.PROTEAN, - [Species.ORTHWORM]: Abilities.HEATPROOF, - [Species.GLIMMET]: Abilities.SYMBIOSIS, + [Species.ORTHWORM]: Abilities.REGENERATOR, + [Species.GLIMMET]: Abilities.LEVITATE, [Species.GREAVARD]: Abilities.FUR_COAT, [Species.FLAMIGO]: Abilities.MOXIE, - [Species.CETODDLE]: Abilities.GLUTTONY, - [Species.VELUZA]: Abilities.SIMPLE, - [Species.DONDOZO]: Abilities.GLUTTONY, - [Species.TATSUGIRI]: Abilities.WATER_BUBBLE, + [Species.CETODDLE]: Abilities.ICE_SCALES, + [Species.VELUZA]: Abilities.SUPER_LUCK, + [Species.DONDOZO]: Abilities.PARENTAL_BOND, + [Species.TATSUGIRI]: Abilities.ADAPTABILITY, [Species.GREAT_TUSK]: Abilities.INTIMIDATE, [Species.SCREAM_TAIL]: Abilities.UNAWARE, - [Species.BRUTE_BONNET]: Abilities.BEAST_BOOST, + [Species.BRUTE_BONNET]: Abilities.CHLOROPHYLL, [Species.FLUTTER_MANE]: Abilities.DAZZLING, [Species.SLITHER_WING]: Abilities.SCRAPPY, [Species.SANDY_SHOCKS]: Abilities.EARTH_EATER, [Species.IRON_TREADS]: Abilities.STEELY_SPIRIT, [Species.IRON_BUNDLE]: Abilities.SNOW_WARNING, [Species.IRON_HANDS]: Abilities.IRON_FIST, - [Species.IRON_JUGULIS]: Abilities.AERILATE, + [Species.IRON_JUGULIS]: Abilities.LIGHTNING_ROD, [Species.IRON_MOTH]: Abilities.LEVITATE, [Species.IRON_THORNS]: Abilities.SAND_STREAM, [Species.FRIGIBAX]: Abilities.SNOW_WARNING, - [Species.GIMMIGHOUL]: Abilities.SUPER_LUCK, - [Species.WO_CHIEN]: Abilities.GRASSY_SURGE, + [Species.GIMMIGHOUL]: Abilities.CONTRARY, + [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, [Species.CHIEN_PAO]: Abilities.INTREPID_SWORD, [Species.TING_LU]: Abilities.STAMINA, [Species.CHI_YU]: Abilities.DROUGHT, [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS, - [Species.IRON_VALIANT]: Abilities.DOWNLOAD, - [Species.KORAIDON]: Abilities.PROTOSYNTHESIS, - [Species.MIRAIDON]: Abilities.QUARK_DRIVE, + [Species.IRON_VALIANT]: Abilities.ADAPTABILITY, + [Species.KORAIDON]: Abilities.OPPORTUNIST, + [Species.MIRAIDON]: Abilities.OPPORTUNIST, [Species.WALKING_WAKE]: Abilities.BEAST_BOOST, [Species.IRON_LEAVES]: Abilities.SHARPNESS, - [Species.POLTCHAGEIST]: Abilities.FLAME_BODY, + [Species.POLTCHAGEIST]: Abilities.TRIAGE, [Species.OKIDOGI]: Abilities.FUR_COAT, [Species.MUNKIDORI]: Abilities.NEUROFORCE, [Species.FEZANDIPITI]: Abilities.LEVITATE, @@ -3819,34 +3825,34 @@ export const starterPassiveAbilities = { [Species.RAGING_BOLT]: Abilities.BEAST_BOOST, [Species.IRON_BOULDER]: Abilities.SHARPNESS, [Species.IRON_CROWN]: Abilities.SHARPNESS, - [Species.TERAPAGOS]: Abilities.REGENERATOR, + [Species.TERAPAGOS]: Abilities.SOUL_HEART, [Species.PECHARUNT]: Abilities.TOXIC_CHAIN, - [Species.ALOLA_RATTATA]: Abilities.CHEEK_POUCH, - [Species.ALOLA_SANDSHREW]: Abilities.ICE_BODY, - [Species.ALOLA_VULPIX]: Abilities.ICE_BODY, + [Species.ALOLA_RATTATA]: Abilities.STRONG_JAW, + [Species.ALOLA_SANDSHREW]: Abilities.TOUGH_CLAWS, + [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, [Species.ALOLA_DIGLETT]: Abilities.STURDY, - [Species.ALOLA_MEOWTH]: Abilities.UNNERVE, - [Species.ALOLA_GEODUDE]: Abilities.ELECTROMORPHOSIS, - [Species.ALOLA_GRIMER]: Abilities.MERCILESS, + [Species.ALOLA_MEOWTH]: Abilities.DARK_AURA, + [Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN, + [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, - [Species.GALAR_MEOWTH]: Abilities.SUPER_LUCK, + [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, [Species.GALAR_PONYTA]: Abilities.PIXILATE, - [Species.GALAR_SLOWPOKE]: Abilities.POISON_TOUCH, - [Species.GALAR_FARFETCHD]: Abilities.SUPER_LUCK, + [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, + [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, [Species.GALAR_MOLTRES]: Abilities.DARK_AURA, - [Species.GALAR_CORSOLA]: Abilities.SHADOW_TAG, - [Species.GALAR_ZIGZAGOON]: Abilities.PICKPOCKET, + [Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD, + [Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL, [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, - [Species.GALAR_YAMASK]: Abilities.SOLID_ROCK, - [Species.GALAR_STUNFISK]: Abilities.IRON_BARBS, - [Species.HISUI_GROWLITHE]: Abilities.STRONG_JAW, - [Species.HISUI_VOLTORB]: Abilities.HADRON_ENGINE, + [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, + [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, + [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, + [Species.HISUI_VOLTORB]: Abilities.ELECTRIC_SURGE, [Species.HISUI_QWILFISH]: Abilities.MERCILESS, [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, - [Species.PALDEA_TAUROS]: Abilities.RATTLED, + [Species.PALDEA_TAUROS]: Abilities.ADAPTABILITY, [Species.PALDEA_WOOPER]: Abilities.THICK_FAT, [Species.BLOODMOON_URSALUNA]: Abilities.BERSERK }; diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts index c1faee0e177..a6bf77b1daa 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 "i18next"; export enum Stat { HP = 0, diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index 1732d215ef5..bd64456c993 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -1,4 +1,4 @@ -import i18next from "../plugins/i18n"; +import i18next from "i18next"; export function getBattleCountSplashMessage(): string { return `{COUNT} ${i18next.t("splashMessages:battlesWon")}`; diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 810bd4d9482..5949fb2f130 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,4 +1,5 @@ import * as Utils from "../utils"; +import i18next, { ParseKeys } from "i18next"; export enum StatusEffect { NONE, @@ -31,94 +32,52 @@ export class Status { } } -export function getStatusEffectObtainText(statusEffect: StatusEffect, sourceText?: string): string { - const sourceClause = sourceText ? ` ${statusEffect !== StatusEffect.SLEEP ? "by" : "from"} ${sourceText}` : ""; +function getStatusEffectMessageKey(statusEffect: StatusEffect): string { switch (statusEffect) { case StatusEffect.POISON: - return `\nwas poisoned${sourceClause}!`; + return "statusEffect:poison"; case StatusEffect.TOXIC: - return `\nwas badly poisoned${sourceClause}!`; + return "statusEffect:toxic"; case StatusEffect.PARALYSIS: - return ` was paralyzed${sourceClause}!\nIt may be unable to move!`; + return "statusEffect:paralysis"; case StatusEffect.SLEEP: - return `\nfell asleep${sourceClause}!`; + return "statusEffect:sleep"; case StatusEffect.FREEZE: - return `\nwas frozen solid${sourceClause}!`; + return "statusEffect:freeze"; case StatusEffect.BURN: - return `\nwas burned${sourceClause}!`; + return "statusEffect:burn"; + default: + return "statusEffect:none"; } - - 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!"; +export function getStatusEffectObtainText(statusEffect: StatusEffect, pokemonNameWithAffix: string, sourceText?: string): string { + if (!sourceText) { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtain`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } - - return ""; + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.obtainSource`as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix, sourceText: sourceText }); } -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!"; - } - - return ""; +export function getStatusEffectActivationText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.activation` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } -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!"; - } +export function getStatusEffectOverlapText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.overlap` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); +} - return ""; +export function getStatusEffectHealText(statusEffect: StatusEffect, pokemonNameWithAffix: string): string { + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.heal` as ParseKeys; + return i18next.t(i18nKey, { pokemonNameWithAffix: pokemonNameWithAffix }); } 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"; - } + const i18nKey = `${getStatusEffectMessageKey(statusEffect)}.description` as ParseKeys; + return i18next.t(i18nKey); } export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number { diff --git a/src/data/temp-battle-stat.ts b/src/data/temp-battle-stat.ts index 35653bfd75a..2d461a1d647 100644 --- a/src/data/temp-battle-stat.ts +++ b/src/data/temp-battle-stat.ts @@ -1,4 +1,5 @@ import { BattleStat, getBattleStatName } from "./battle-stat"; +import i18next from "i18next"; export enum TempBattleStat { ATK, @@ -12,7 +13,7 @@ export enum TempBattleStat { export function getTempBattleStatName(tempBattleStat: TempBattleStat) { if (tempBattleStat === TempBattleStat.CRIT) { - return "critical-hit ratio"; + return i18next.t("modifierType:TempBattleStatBoosterStatName.CRIT"); } return getBattleStatName(tempBattleStat as integer as BattleStat); } diff --git a/src/data/tms.ts b/src/data/tms.ts index 605419e4685..4616c177eb6 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -4258,6 +4258,8 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PANPOUR, + Species.DRILBUR, + Species.EXCADRILL, Species.TYMPOLE, Species.PALPITOAD, Species.SEISMITOAD, @@ -11023,12 +11025,222 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -11048,7 +11260,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.CONFUSE_RAY]: [ Species.VULPIX, @@ -27226,6 +27475,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -27245,6 +27710,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.FRUSTRATION]: [ Species.BULBASAUR, @@ -28038,6 +28541,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -28057,6 +28776,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.SAFEGUARD]: [ Species.BULBASAUR, @@ -30147,6 +30904,222 @@ export const tmSpecies: TmSpecies = { Species.STAKATAKA, Species.BLACEPHALON, Species.ZERAORA, + Species.MELTAN, + Species.MELMETAL, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SOBBLE, + Species.DRIZZILE, + Species.INTELEON, + Species.SKWOVET, + Species.GREEDENT, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.DOTTLER, + Species.ORBEETLE, + Species.NICKIT, + Species.THIEVUL, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.YAMPER, + Species.BOLTUND, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FLAPPLE, + Species.APPLETUN, + Species.SILICOBRA, + Species.SANDACONDA, + Species.CRAMORANT, + Species.ARROKUDA, + Species.BARRASKEWDA, + Species.TOXEL, + Species.TOXTRICITY, + Species.SIZZLIPEDE, + Species.CENTISKORCH, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.SINISTEA, + Species.POLTEAGEIST, + Species.HATENNA, + Species.HATTREM, + Species.HATTERENE, + Species.IMPIDIMP, + Species.MORGREM, + Species.GRIMMSNARL, + Species.OBSTAGOON, + Species.PERRSERKER, + Species.CURSOLA, + Species.SIRFETCHD, + Species.MR_RIME, + Species.RUNERIGUS, + Species.MILCERY, + Species.ALCREMIE, + Species.FALINKS, + Species.PINCURCHIN, + Species.SNOM, + Species.FROSMOTH, + Species.STONJOURNER, + Species.EISCUE, + Species.INDEEDEE, + Species.MORPEKO, + Species.CUFANT, + Species.COPPERAJAH, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.DRACOVISH, + Species.ARCTOVISH, + Species.DURALUDON, + Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, + Species.ZACIAN, + Species.ZAMAZENTA, + Species.ETERNATUS, + Species.KUBFU, + Species.URSHIFU, + Species.ZARUDE, + Species.REGIELEKI, + Species.REGIDRAGO, + Species.GLASTRIER, + Species.SPECTRIER, + Species.CALYREX, + Species.WYRDEER, + Species.KLEAVOR, + Species.URSALUNA, + Species.BASCULEGION, + Species.SNEASLER, + Species.OVERQWIL, + Species.ENAMORUS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.LECHONK, + Species.OINKOLOGNE, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.PAWMI, + Species.PAWMO, + Species.PAWMOT, + Species.TANDEMAUS, + Species.MAUSHOLD, + Species.FIDOUGH, + Species.DACHSBUN, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.SQUAWKABILLY, + Species.NACLI, + Species.NACLSTACK, + Species.GARGANACL, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.TADBULB, + Species.BELLIBOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.MASCHIFF, + Species.MABOSSTIFF, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.RELLOR, + Species.RABSCA, + Species.FLITTLE, + Species.ESPATHRA, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.WIGLETT, + Species.WUGTRIO, + Species.BOMBIRDIER, + Species.FINIZEN, + Species.PALAFIN, + Species.VAROOM, + Species.REVAVROOM, + Species.CYCLIZAR, + Species.ORTHWORM, + Species.GLIMMET, + Species.GLIMMORA, + Species.GREAVARD, + Species.HOUNDSTONE, + Species.FLAMIGO, + Species.CETODDLE, + Species.CETITAN, + Species.VELUZA, + Species.DONDOZO, + Species.TATSUGIRI, + Species.ANNIHILAPE, + Species.CLODSIRE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, + Species.KINGAMBIT, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.GIMMIGHOUL, + Species.GHOLDENGO, + Species.WO_CHIEN, + Species.CHIEN_PAO, + Species.TING_LU, + Species.CHI_YU, + Species.ROARING_MOON, + Species.IRON_VALIANT, + Species.KORAIDON, + Species.MIRAIDON, + Species.WALKING_WAKE, + Species.IRON_LEAVES, + Species.DIPPLIN, + Species.POLTCHAGEIST, + Species.SINISTCHA, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.TERAPAGOS, + Species.PECHARUNT, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -30166,6 +31139,44 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_EXEGGUTOR, Species.ALOLA_MAROWAK, Species.ETERNAL_FLOETTE, + Species.GALAR_MEOWTH, + Species.GALAR_PONYTA, + Species.GALAR_RAPIDASH, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_FARFETCHD, + Species.GALAR_WEEZING, + Species.GALAR_MR_MIME, + Species.GALAR_ARTICUNO, + Species.GALAR_ZAPDOS, + Species.GALAR_MOLTRES, + Species.GALAR_SLOWKING, + Species.GALAR_CORSOLA, + Species.GALAR_ZIGZAGOON, + Species.GALAR_LINOONE, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.GALAR_YAMASK, + Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + Species.HISUI_TYPHLOSION, + Species.HISUI_QWILFISH, + Species.HISUI_SNEASEL, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_BRAVIARY, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, + Species.HISUI_AVALUGG, + Species.HISUI_DECIDUEYE, + Species.PALDEA_TAUROS, + Species.PALDEA_WOOPER, + Species.BLOODMOON_URSALUNA, ], [Moves.RAIN_DANCE]: [ Species.SQUIRTLE, @@ -63324,12 +64335,18 @@ export const tmSpecies: TmSpecies = { Species.HYDRAPPLE, ], [Moves.TRAILBLAZE]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, Species.EKANS, Species.ARBOK, Species.PIKACHU, Species.RAICHU, Species.JIGGLYPUFF, Species.WIGGLYTUFF, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, Species.MEOWTH, Species.PERSIAN, Species.PSYDUCK, @@ -63337,8 +64354,10 @@ export const tmSpecies: TmSpecies = { Species.BELLSPROUT, Species.WEEPINBELL, Species.VICTREEBEL, + Species.DODRIO, Species.DROWZEE, Species.HYPNO, + Species.HITMONCHAN, Species.CHANSEY, Species.SCYTHER, Species.TAUROS, @@ -63349,6 +64368,12 @@ export const tmSpecies: TmSpecies = { Species.SNORLAX, Species.MEWTWO, Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, Species.SENTRET, Species.FURRET, Species.SPINARAK, @@ -63358,6 +64383,7 @@ export const tmSpecies: TmSpecies = { Species.MAREEP, Species.FLAAFFY, Species.AMPHAROS, + Species.BELLOSSOM, Species.MARILL, Species.AZUMARILL, Species.SUDOWOODO, @@ -63372,6 +64398,8 @@ export const tmSpecies: TmSpecies = { Species.ESPEON, Species.UMBREON, Species.GIRAFARIG, + Species.SNUBBULL, + Species.GRANBULL, Species.SCIZOR, Species.HERACROSS, Species.SNEASEL, @@ -63385,7 +64413,14 @@ export const tmSpecies: TmSpecies = { Species.PHANPY, Species.DONPHAN, Species.STANTLER, + Species.ELEKID, Species.BLISSEY, + Species.RAIKOU, + Species.ENTEI, + Species.SUICUNE, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, Species.POOCHYENA, Species.MIGHTYENA, Species.LOTAD, @@ -63398,6 +64433,8 @@ export const tmSpecies: TmSpecies = { Species.SLAKING, Species.MEDITITE, Species.MEDICHAM, + Species.PLUSLE, + Species.MINUN, Species.VOLBEAT, Species.ILLUMISE, Species.NUMEL, @@ -63422,6 +64459,10 @@ export const tmSpecies: TmSpecies = { Species.SHINX, Species.LUXIO, Species.LUXRAY, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.SHIELDON, + Species.BASTIODON, Species.PACHIRISU, Species.AMBIPOM, Species.STUNKY, @@ -63433,9 +64474,21 @@ export const tmSpecies: TmSpecies = { Species.SNOVER, Species.ABOMASNOW, Species.WEAVILE, + Species.ELECTIVIRE, Species.LEAFEON, + Species.GLACEON, Species.MAMOSWINE, + Species.FROSLASS, + Species.SHAYMIN, Species.ARCEUS, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.BLITZLE, + Species.ZEBSTRIKA, Species.SEWADDLE, Species.SWADLOON, Species.LEAVANNY, @@ -63444,6 +64497,8 @@ export const tmSpecies: TmSpecies = { Species.SCRAGGY, Species.SCRAFTY, Species.DUCKLETT, + Species.MINCCINO, + Species.CINCCINO, Species.SWANNA, Species.DEERLING, Species.SAWSBUCK, @@ -63475,6 +64530,8 @@ export const tmSpecies: TmSpecies = { Species.FLORGES, Species.SKIDDO, Species.GOGOAT, + Species.MEOWSTIC, + Species.MALAMAR, Species.SYLVEON, Species.HAWLUCHA, Species.DEDENNE, @@ -63490,6 +64547,8 @@ export const tmSpecies: TmSpecies = { Species.RIBOMBEE, Species.ROCKRUFF, Species.LYCANROC, + Species.DEWPIDER, + Species.ARAQUANID, Species.FOMANTIS, Species.LURANTIS, Species.SALANDIT, @@ -63497,6 +64556,7 @@ export const tmSpecies: TmSpecies = { Species.BOUNSWEET, Species.STEENEE, Species.TSAREENA, + Species.COMFEY, Species.ORANGURU, Species.PASSIMIAN, Species.KOMALA, @@ -63508,6 +64568,7 @@ export const tmSpecies: TmSpecies = { Species.RABOOT, Species.CINDERACE, Species.SKWOVET, + Species.GREEDENT, Species.FLAPPLE, Species.APPLETUN, Species.TOXTRICITY, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 2479f1a189f..8a25406fc5a 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -531,13 +531,18 @@ export class TrainerConfig { * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader. * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader. + * @param boolean whether or not this is the rematch fight * @returns {TrainerConfig} - The updated TrainerConfig instance. * **/ - initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { + initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig { if (!getIsInitialized()) { initI18n(); } - this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + if (rematch) { + this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); + } else { + this.setPartyTemplates(trainerPartyTemplates.RIVAL_5); + } signatureSpecies.forEach((speciesPool, s) => { if (!Array.isArray(speciesPool)) { speciesPool = [speciesPool]; @@ -551,11 +556,11 @@ export class TrainerConfig { const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); this.name = i18next.t(`trainerNames:${nameForCall}`); this.setTitle(title); - this.setMoneyMultiplier(2.5); + this.setMoneyMultiplier(2.25); this.setBoss(); this.setStaticParty(); - this.setBattleBgm("battle_unova_gym"); // TODO: change - this.setVictoryBgm("victory_gym"); // TODO: change + this.setBattleBgm("battle_plasma_boss"); + this.setVictoryBgm("victory_team_plasma"); return this; } @@ -814,7 +819,7 @@ interface TrainerConfigs { } /** - * The function to get variable strength grutns + * The function to get variable strength grunts * @param scene the singleton scene being passed in * @returns the correct TrainerPartyTemplate */ @@ -822,22 +827,14 @@ function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate { const waveIndex = scene.currentBattle?.waveIndex; if (waveIndex < 40) { return trainerPartyTemplates.TWO_AVG; - } else if (waveIndex < 80) { - switch (waveIndex) { - case 62: - return trainerPartyTemplates.THREE_AVG; - case 64: - return trainerPartyTemplates.TWO_AVG_ONE_STRONG; - case 65: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - } + } else if (waveIndex < 63) { + return trainerPartyTemplates.THREE_AVG; + } else if (waveIndex < 65) { + return trainerPartyTemplates.TWO_AVG_ONE_STRONG; + } else if (waveIndex < 112) { + return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger } else { - switch (waveIndex) { - case 112: - return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger - case 114: - return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger - } + return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger } } @@ -1183,53 +1180,47 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesPools( [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP] ), - [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING], - [TrainerPoolTier.UNCOMMON]: [Species.GRIMER, Species.CUBONE, Species.ODDISH, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], - [TrainerPoolTier.RARE]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER], - [TrainerPoolTier.SUPER_RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], - [TrainerPoolTier.ULTRA_RARE]: [Species.DRATINI, Species.LARVITAR] + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH], + [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB], + [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE], + [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR] }), - [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY], - [TrainerPoolTier.UNCOMMON]: [Species.PHANPY, Species.SWINUB, Species.GLIGAR, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], - [TrainerPoolTier.RARE]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA], - [TrainerPoolTier.SUPER_RARE]: [Species.TRAPINCH, Species.HEATMOR], - [TrainerPoolTier.ULTRA_RARE]: [Species.TURTONATOR, Species.CHARCADET] + [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH], + [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.SWINUB, Species.GLIGAR], + [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR], + [TrainerPoolTier.SUPER_RARE]: [Species.TURTONATOR, Species.CHARCADET] }), - [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH], - [TrainerPoolTier.UNCOMMON]: [Species.SPHEAL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL ], - [TrainerPoolTier.RARE]: [Species.CLAMPERL, Species.REMORAID, Species.ARROKUDA], - [TrainerPoolTier.SUPER_RARE]: [Species.MANTINE, Species.BASCULEGION], - [TrainerPoolTier.ULTRA_RARE]: [Species.DONDOZO] + [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH ], + [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA], + [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO] }), - [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE], - [TrainerPoolTier.UNCOMMON]: [Species.BRONZOR, Species.DRIFLOON, Species.BURMY], - [TrainerPoolTier.RARE]: [Species.CARNIVINE], - [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], - [TrainerPoolTier.ULTRA_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] + [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY], + [TrainerPoolTier.UNCOMMON]: [ Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL ], + [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL], + [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO] }), - [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.SANDILE, Species.TRUBBISH, Species.GOLETT], - [TrainerPoolTier.RARE]: [Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS, Species.DRILBUR, Species.KLINK, Species.VULLABY], - [TrainerPoolTier.SUPER_RARE]: [Species.PAWNIARD, Species.VULLABY, Species.DRUDDIGON, Species.BOUFFALANT, Species.ZORUA], - [TrainerPoolTier.ULTRA_RARE]: [Species.AXEW, Species.DEINO, Species.DURANT] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH], + [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS], + [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK], + [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT] }), - [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) + [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI], - [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN], - [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL], - [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN], - [TrainerPoolTier.ULTRA_RARE]: [] + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK], + [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG], + [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD], + [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON] }), [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"],true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"],false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"), @@ -1509,7 +1500,7 @@ export const trainerConfigs: TrainerConfigs = { return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), - [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]) + [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss",[]).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PERSIAN , Species.ALOLA_PERSIAN])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.NIDOKING , Species.NIDOQUEEN ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) @@ -1521,14 +1512,14 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []) + [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR , Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.EXCADRILL ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.EXCADRILL ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1541,7 +1532,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) + [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIGHTYENA ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.WEEZING, Species.GALAR_WEEZING ])) @@ -1553,33 +1544,33 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[]) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { + [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SOLROCK, Species.TYPHLOSION ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // DROUGHT + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SHIFTRY, Species.SCOVILLAIN ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL, Species.NINETALES ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // DROUGHT - })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LINOONE ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CROBAT, Species.PELIPPER ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MUK, Species.ALOLA_MUK ])) @@ -1591,36 +1582,36 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[]) + [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss",[], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Swift Swim - })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 0; // Swift Swim - })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.POLITOED, Species.PELIPPER ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Drizzle })) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.BEARTIC, Species.ARMALDO ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.abilityIndex = 2; // Swift Swim })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HUNTAIL, Species.GOREBYSS ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Swift Swim + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.SHARPEDO ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS, Species.BASCULEGION ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.OVERQWIL ])) @@ -1635,25 +1626,29 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[]) + [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss",[], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ELECTRODE, Species.HISUI_ELECTRODE ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SALAMENCE, Species.ROARING_MOON ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HISUI_ZOROARK ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.pokeball = PokeballType.ULTRA_BALL; + p.formIndex = 1; })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.DARKRAI ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.COFAGRIGUS, Species.RUNERIGUS ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BOUFFALANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SEISMITOAD, Species.CARRACOSTA ])) @@ -1664,7 +1659,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })), - [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[]) + [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss",[], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SLITHER_WING, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1673,17 +1668,17 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DURANT ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DARMANITAN, Species.GALAR_DARMANITAN ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYUREM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) @@ -1695,7 +1690,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; })), - [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[]) + [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss",[], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.SCREAM_TAIL, Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -1704,15 +1699,15 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GHOLDENGO, Species.AEGISLASH ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - })) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + })) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; })), }; diff --git a/src/data/variant.ts b/src/data/variant.ts index b16586108fd..48369d112db 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -1,3 +1,5 @@ +import { VariantTier } from "#app/enums/variant-tier.js"; + export type Variant = 0 | 1 | 2; export type VariantSet = [Variant, Variant, Variant]; @@ -16,3 +18,14 @@ export function getVariantTint(variant: Variant): integer { return 0xe81048; } } + +export function getVariantIcon(variant: Variant): integer { + switch (variant) { + case 0: + return VariantTier.STANDARD; + case 1: + return VariantTier.RARE; + case 2: + return VariantTier.EPIC; + } +} diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 3fce35e4f88..44b72fb3d05 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -1,19 +1,16 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; +import i18next from "i18next"; import { Phase } from "./phase"; import BattleScene, { AnySound } from "./battle-scene"; import * as Utils from "./utils"; import { Mode } from "./ui/ui"; -import { EGG_SEED, Egg, GachaType, getLegendaryGachaSpeciesForTimestamp } from "./data/egg"; +import { EGG_SEED, Egg } from "./data/egg"; import EggHatchSceneHandler from "./ui/egg-hatch-scene-handler"; import { PlayerPokemon } from "./field/pokemon"; -import { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import { achvs } from "./system/achv"; -import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import PokemonInfoContainer from "./ui/pokemon-info-container"; import EggCounterContainer from "./ui/egg-counter-container"; import { EggCountChangedEvent } from "./events/egg"; -import { EggTier } from "#enums/egg-type"; -import { Species } from "#enums/species"; /** * Class that represents egg hatching @@ -262,6 +259,9 @@ export class EggHatchPhase extends Phase { if (!this.canSkip || this.skipped) { return false; } + if (this.eggCounterContainer.eggCountText?.data === undefined) { + return false; + } this.skipped = true; if (!this.hatched) { this.doHatch(); @@ -342,7 +342,7 @@ export class EggHatchPhase extends Phase { this.scene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(`${this.pokemon.name} hatched from the egg!`, null, () => { + this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.name }), null, () => { this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(() => { @@ -439,135 +439,10 @@ export class EggHatchPhase extends Phase { */ generatePokemon(): PlayerPokemon { let ret: PlayerPokemon; - let speciesOverride: Species; // SpeciesOverride should probably be a passed in parameter for future species-eggs this.scene.executeWithSeedOffset(() => { - - /** - * Manaphy eggs have a 1/8 chance of being Manaphy and 7/8 chance of being Phione - * Legendary eggs pulled from the legendary gacha have a 50% of being converted into - * the species that was the legendary focus at the time - */ - if (this.egg.isManaphyEgg()) { - const rand = Utils.randSeedInt(8); - - speciesOverride = rand ? Species.PHIONE : Species.MANAPHY; - } else if (this.egg.tier === EggTier.MASTER - && this.egg.gachaType === GachaType.LEGENDARY) { - if (!Utils.randSeedInt(2)) { - speciesOverride = getLegendaryGachaSpeciesForTimestamp(this.scene, this.egg.timestamp); - } - } - - if (speciesOverride) { - const pokemonSpecies = getPokemonSpecies(speciesOverride); - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } else { - let minStarterValue: integer; - 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; - } - - const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; - - let 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); - - // If this is the 10th egg without unlocking something new, attempt to force it. - if (this.scene.gameData.unlockPity[this.egg.tier] >= 9) { - const lockedPool = speciesPool.filter(s => !this.scene.gameData.dexData[s].caughtAttr); - if (lockedPool.length) { // Skip this if everything is unlocked - speciesPool = lockedPool; - } - } - - /** - * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty - * 1 cost mons get 2x - * 2 cost mons get 1.5x - * 4, 6, 8 cost mons get 1.75x - * 3, 5, 7, 9 cost mons get 1x - * Alolan, Galarian, and Paldean mons get 0.5x - * Hisui mons get 0.125x - * - * The total weight is also being calculated EACH time there is an egg hatch instead of being generated once - * and being the same each time - */ - let totalWeight = 0; - const speciesWeights = []; - 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()) { - weight = Math.floor(weight / (species.isRareRegional() ? 8 : 2)); - } - speciesWeights.push(totalWeight + weight); - totalWeight += weight; - } - - let species: Species; - - const rand = Utils.randSeedInt(totalWeight); - for (let s = 0; s < speciesWeights.length; s++) { - if (rand < speciesWeights[s]) { - species = speciesPool[s]; - break; - } - } - - if (!!this.scene.gameData.dexData[species].caughtAttr) { - this.scene.gameData.unlockPity[this.egg.tier] = Math.min(this.scene.gameData.unlockPity[this.egg.tier] + 1, 10); - } else { - this.scene.gameData.unlockPity[this.egg.tier] = 0; - } - - const pokemonSpecies = getPokemonSpecies(species); - - ret = this.scene.addPlayerPokemon(pokemonSpecies, 1, undefined, undefined, undefined, false); - } - - /** - * Non Shiny gacha Pokemon have a 1/128 chance of being shiny - * Shiny gacha Pokemon have a 1/64 chance of being shiny - * IVs are rolled twice and the higher of each stat's IV is taken - * The egg move gacha doubles the rate of rare egg moves but the base rates are - * Common: 1/48 - * Rare: 1/24 - * Epic: 1/12 - * Legendary: 1/6 - */ - ret.trySetShiny(this.egg.gachaType === GachaType.SHINY ? 1024 : 512); - ret.variant = ret.shiny ? ret.generateVariant() : 0; - - const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295)); - - for (let s = 0; s < ret.ivs.length; s++) { - ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); - } - - const baseChance = this.egg.gachaType === GachaType.MOVE ? 3 : 6; - this.eggMoveIndex = Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.egg.tier)) - ? Utils.randSeedInt(3) - : 3; + ret = this.egg.generatePlayerPokemon(this.scene); + this.eggMoveIndex = this.egg.eggMoveIndex; }, this.egg.id, EGG_SEED.toString()); diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 90f45f481ba..722096c42cd 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -20,5 +20,6 @@ export enum ArenaTagType { WIDE_GUARD = "WIDE_GUARD", MAT_BLOCK = "MAT_BLOCK", CRAFTY_SHIELD = "CRAFTY_SHIELD", - TAILWIND = "TAILWIND" + TAILWIND = "TAILWIND", + HAPPY_HOUR = "HAPPY_HOUR" } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 98f01c9c375..5cdabfe78c2 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -54,9 +54,10 @@ export enum BattlerTagType { SALT_CURED = "SALT_CURED", CURSED = "CURSED", CHARGED = "CHARGED", - GROUNDED = "GROUNDED", + ROOSTED = "ROOSTED", MAGNET_RISEN = "MAGNET_RISEN", MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", + CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", ICE_FACE = "ICE_FACE" } diff --git a/src/enums/color.ts b/src/enums/color.ts new file mode 100644 index 00000000000..99c2d14cb63 --- /dev/null +++ b/src/enums/color.ts @@ -0,0 +1,83 @@ +export enum Color { + WHITE = "#ffffff", + OFF_WHITE = "#f8f8f8", + LIGHT_GREY = "#a0a0a0", + GREY = "#484848", + DARK_GREY = "#404040", + PINK = "#f89890", + RED = "#e13d3d", + RED2 = "#e70808", + REDORANGE = "#d64b00", + ORANGE = "#f8b050", + LIGHT_YELLOW = "#e8e8a8", + YELLOW = "#ccbe00", + DARK_YELLOW = "#a68e17", + GREEN = "#78c850", + BLUE = "#40c8f8", + COMMON = "#ffffff", + GREAT = "#3890f8", + ULTRA = "#f8d038", + ROGUE = "#d52929", + MASTER = "#e020c0", + LUXURY = "#e64a18" +} + +export enum TypeColor { + NORMAL = "#ADA594", + FIGHTING = "#A55239", + FLYING = "#9CADF7", + POISON = "#9141CB", + GROUND = "#AE7A3B", + ROCK = "#BDA55A", + BUG = "#ADBD21", + GHOST = "#6363B5", + STEEL = "#81A6BE", + FIRE = "#F75231", + WATER = "#399CFF", + GRASS = "#7BCE52", + ELECTRIC = "#FFC631", + PSYCHIC = "#EF4179", + ICE = "#5ACEE7", + DRAGON = "#7B63E7", + DARK = "#735A4A", + FAIRY = "#EF70EF", +} + +export enum TypeShadow { + NORMAL = "#574F4A", + FIGHTING = "#4E637C", + FLYING = "#4E637C", + POISON = "#352166", + GROUND = "#572D1E", + ROCK = "#5F442D", + BUG = "#5F5010", + GHOST = "#323D5B", + STEEL = "#415C5F", + FIRE = "#7C1818", + WATER = "#1C4E80", + GRASS = "#4F6729", + ELECTRIC = "#804618", + PSYCHIC = "#782155", + ICE = "#2D5C74", + DRAGON = "#313874", + DARK = "#392725", + FAIRY = "#663878", +} + +export enum ShadowColor { + GREY = "#636363", + PURPLE = "#6b5a73", + LIGHT_GREY = "#d0d0c8", + BROWN = "#69402a", + PINK = "#fca2a2", + BRIGHT_RED = "#f83018", + RED = "#984038", + MAROON = "#632929", + GREEN = "#306850", + BLUE = "#006090", + LIGHT_YELLOW = "#ded6b5", + YELLOW = "#ebd773", + DARK_YELLOW = "#a0a060", + ORANGE = "#c07800", + LIGHT_ORANGE = "#ffbd73", +} diff --git a/src/enums/egg-source-types.ts b/src/enums/egg-source-types.ts new file mode 100644 index 00000000000..a670d86704b --- /dev/null +++ b/src/enums/egg-source-types.ts @@ -0,0 +1,7 @@ +export enum EggSourceType { + GACHA_MOVE, + GACHA_LEGENDARY, + GACHA_SHINY, + SAME_SPECIES_EGG, + EVENT +} diff --git a/src/enums/gacha-types.ts b/src/enums/gacha-types.ts new file mode 100644 index 00000000000..c8beff5cad2 --- /dev/null +++ b/src/enums/gacha-types.ts @@ -0,0 +1,5 @@ +export enum GachaType { + MOVE, + LEGENDARY, + SHINY +} diff --git a/src/enums/variant-tier.ts b/src/enums/variant-tier.ts new file mode 100644 index 00000000000..279846d5f60 --- /dev/null +++ b/src/enums/variant-tier.ts @@ -0,0 +1,5 @@ +export enum VariantTier { + STANDARD, + RARE, + EPIC +} diff --git a/src/enums/variant-tiers.ts b/src/enums/variant-tiers.ts new file mode 100644 index 00000000000..20a0e8ec4e4 --- /dev/null +++ b/src/enums/variant-tiers.ts @@ -0,0 +1,5 @@ +export enum VariantTier { + COMMON, + RARE, + EPIC +} diff --git a/src/events/arena.ts b/src/events/arena.ts index 657acaeae7e..67b423f3b75 100644 --- a/src/events/arena.ts +++ b/src/events/arena.ts @@ -71,11 +71,18 @@ export class TagAddedEvent extends ArenaEvent { public arenaTagType: ArenaTagType; /** The {@linkcode ArenaTagSide} the tag is being placed on */ public arenaTagSide: ArenaTagSide; - constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number) { + /** The current number of layers of the arena trap. */ + public arenaTagLayers: number; + /** The maximum amount of layers of the arena trap. */ + public arenaTagMaxLayers: number; + + constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number, arenaTagLayers?: number, arenaTagMaxLayers?: number) { super(ArenaEventType.TAG_ADDED, duration); this.arenaTagType = arenaTagType; this.arenaTagSide = arenaTagSide; + this.arenaTagLayers = arenaTagLayers; + this.arenaTagMaxLayers = arenaTagMaxLayers; } } /** diff --git a/src/field/arena.ts b/src/field/arena.ts index 14280536a5f..2d20abeedd1 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -1,5 +1,6 @@ import BattleScene from "../battle-scene"; import { BiomePoolTier, PokemonPools, BiomeTierTrainerPools, biomePokemonPools, biomeTrainerPools } from "../data/biomes"; +import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species"; import { Weather, WeatherType, getTerrainClearMessage, getTerrainStartMessage, getWeatherClearMessage, getWeatherStartMessage } from "../data/weather"; @@ -7,7 +8,7 @@ import { CommonAnimPhase } from "../phases"; import { CommonAnim } from "../data/battle-anims"; import { Type } from "../data/type"; import Move from "../data/move"; -import { ArenaTag, ArenaTagSide, getArenaTag } from "../data/arena-tag"; +import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "../data/arena-tag"; import { BattlerIndex } from "../battle"; import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; @@ -535,7 +536,7 @@ export class Arena { this.ignoreAbilities = ignoreAbilities; } - applyTagsForSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide, ...args: any[]): void { + applyTagsForSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide, ...args: unknown[]): void { let tags = typeof tagType === "string" ? this.tags.filter(t => t.tagType === tagType) : this.tags.filter(t => t instanceof tagType); @@ -545,7 +546,7 @@ export class Arena { tags.forEach(t => t.apply(this, args)); } - applyTags(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, ...args: any[]): void { + applyTags(tagType: ArenaTagType | Constructor, ...args: unknown[]): void { this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); } @@ -553,6 +554,12 @@ export class Arena { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { existingTag.onOverlap(this); + + if (existingTag instanceof ArenaTrapTag) { + const { tagType, side, turnCount, layers, maxLayers } = existingTag as ArenaTrapTag; + this.eventTarget.dispatchEvent(new TagAddedEvent(tagType, side, turnCount, layers, maxLayers)); + } + return false; } @@ -560,16 +567,18 @@ export class Arena { this.tags.push(newTag); newTag.onAdd(this, quiet); - this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount)); + const { layers = 0, maxLayers = 0 } = newTag instanceof ArenaTrapTag ? newTag : {}; + + this.eventTarget.dispatchEvent(new TagAddedEvent(newTag.tagType, newTag.side, newTag.turnCount, layers, maxLayers)); return true; } - getTag(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }): ArenaTag { + getTag(tagType: ArenaTagType | Constructor): ArenaTag { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } - getTagOnSide(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, side: ArenaTagSide): ArenaTag { + getTagOnSide(tagType: ArenaTagType | Constructor, side: ArenaTagSide): ArenaTag { 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)); @@ -652,7 +661,7 @@ export class Arena { case Biome.LAKE: return 5.350; case Biome.SEABED: - return 2.629; + return 2.600; case Biome.MOUNTAIN: return 4.018; case Biome.BADLANDS: @@ -682,7 +691,7 @@ export class Arena { case Biome.ABYSS: return 5.130; case Biome.SPACE: - return 21.347; + return 20.036; case Biome.CONSTRUCTION_SITE: return 1.222; case Biome.JUNGLE: diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index cebde7c3ae9..4af219a60b9 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -20,6 +20,7 @@ export default class DamageNumberHandler { const battlerIndex = target.getBattlerIndex(); const baseScale = target.getSpriteScale() / 6; const damageNumber = addTextObject(scene, target.x, -(scene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, Utils.formatStat(amount, true), TextStyle.SUMMARY); + damageNumber.setName("text-damage-number"); damageNumber.setOrigin(0.5, 1); damageNumber.setScale(baseScale); diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 9b55133bb50..5312dd18727 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -39,6 +39,7 @@ export default class PokemonSpriteSparkleHandler { 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.setName("sprite-tera-sparkle"); sparkle.play("tera_sparkle"); parent.add(sparkle); s.scene.time.delayedCall(Utils.fixedInt(Math.floor((1000 / 12) * 13)), () => sparkle.destroy()); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index c42e8b1b75c..88d7f6b73a8 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,26 +3,27 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; +import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, 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 { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, 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 { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, FieldVariableMovePowerAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr } from "../data/ability"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AllyMoveCategoryPowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AddSecondStrikeAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -37,7 +38,7 @@ import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMov import { TerrainType } from "../data/terrain"; import { TrainerSlot } from "../data/trainer-config"; import * as Overrides from "../overrides"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { speciesEggMoves } from "../data/egg-moves"; import { ModifierTier } from "../modifier/modifier-tier"; import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; @@ -656,6 +657,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel); } const statValue = new Utils.NumberHolder(this.getStat(stat)); + this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + const fieldApplied = new Utils.BooleanHolder(false); for (const pokemon of this.scene.getField(true)) { applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied); @@ -850,6 +853,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.getLevelMoves(1, true).map(lm => lm[1]).filter(lm => !this.moveset.filter(m => m.moveId === lm).length).filter((move: Moves, i: integer, array: Moves[]) => array.indexOf(move) === i); } + /** + * Gets the types of a pokemon + * @param includeTeraType boolean to include tera-formed type, default false + * @param forDefend boolean if the pokemon is defending from an attack + * @param ignoreOverride boolean if true, ignore ability changing effects + * @returns array of {@linkcode Type} + */ getTypes(includeTeraType = false, forDefend: boolean = false, ignoreOverride?: boolean): Type[] { const types = []; @@ -883,7 +893,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (forDefend && (this.getTag(BattlerTagType.IGNORE_FLYING) || this.scene.arena.getTag(ArenaTagType.GRAVITY) || this.getTag(BattlerTagType.GROUNDED))) { + // this.scene potentially can be undefined for a fainted pokemon in doubles + // use optional chaining to avoid runtime errors + if (forDefend && (this.getTag(GroundedTag) || this.scene?.arena.getTag(ArenaTagType.GRAVITY))) { const flyingIndex = types.indexOf(Type.FLYING); if (flyingIndex > -1) { types.splice(flyingIndex, 1); @@ -1060,11 +1072,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * in effect, and both passive and non-passive. This is one of the two primary ways to check * whether a pokemon has a particular ability. * @param {AbAttr} attrType The ability attribute to check for - * @param {boolean} canApply If false, it doesn't check whether the abiltiy is currently active + * @param {boolean} canApply If false, it doesn't check whether the ability is currently active * @param {boolean} ignoreOverride If true, it ignores ability changing effects * @returns {boolean} Whether an ability with that attribute is present and active */ - hasAbilityWithAttr(attrType: { new(...args: any[]): AbAttr }, canApply: boolean = true, ignoreOverride?: boolean): boolean { + hasAbilityWithAttr(attrType: Constructor, canApply: boolean = true, ignoreOverride?: boolean): boolean { if ((!canApply || this.canApplyAbility()) && this.getAbility(ignoreOverride).hasAttr(attrType)) { return true; } @@ -1081,13 +1093,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return weight.value; } + /** + * Gets the tera-formed type of the pokemon, or UNKNOWN if not present + * @returns the {@linkcode Type} + */ getTeraType(): Type { - const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier - && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; - if (teraModifier) { - return teraModifier.teraType; + // this.scene can be undefined for a fainted mon in doubles + if (this.scene !== undefined) { + const teraModifier = this.scene.findModifier(m => m instanceof TerastallizeModifier + && m.pokemonId === this.id && !!m.getBattlesLeft(), this.isPlayer()) as TerastallizeModifier; + // return teraType + if (teraModifier) { + return teraModifier.teraType; + } } - + // if scene is undefined, or if teraModifier is considered false, then return unknown type return Type.UNKNOWN; } @@ -1096,7 +1116,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isGrounded(): boolean { - return !this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE); + return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN)); } /** @@ -1134,7 +1154,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!cancelled.value && !ignoreAbility) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier, true); } - return (!cancelled.value ? typeMultiplier.value : 0) as TypeDamageMultiplier; + + return (!cancelled.value ? Number(typeMultiplier.value) : 0) as TypeDamageMultiplier; } getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false): TypeDamageMultiplier { @@ -1161,6 +1182,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!ignoreStrongWinds && 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; } + + if (!!this.summonData?.tags.find((tag) => tag instanceof TypeImmuneTag && tag.immuneType === moveType)) { + multiplier = 0; + } + return multiplier; } @@ -1724,12 +1750,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (typeless) { typeMultiplier.value = 1; } - if (types.find(t => move.isTypeImmune(t))) { + if (types.find(t => move.isTypeImmune(source, this, t))) { typeMultiplier.value = 0; } // Apply arena tags for conditional protection - if (!move.hasFlag(MoveFlags.IGNORE_PROTECT) && !move.isAllyTarget()) { + if (!move.checkFlag(MoveFlags.IGNORE_PROTECT, source, this) && !move.isAllyTarget()) { const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; this.scene.arena.applyTagsForSide(ArenaTagType.QUICK_GUARD, defendingSide, cancelled, this, move.priority); this.scene.arena.applyTagsForSide(ArenaTagType.WIDE_GUARD, defendingSide, cancelled, this, move.moveTarget); @@ -1747,14 +1773,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { power.value = 60; } applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, move, power); - this.scene.getField(true).map(p => applyPreAttackAbAttrs(FieldVariableMovePowerAbAttr, this, source, move, power)); - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, power); + if (source.getAlly()?.hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { + applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source, this, move, power); + } + + const fieldAuras = new Set( + this.scene.getField(true) + .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[]) + .flat(), + ); + for (const aura of fieldAuras) { + // The only relevant values are `move` and the `power` holder + aura.applyPreAttack(null, null, null, move, [power]); + } power.value *= typeChangeMovePowerMultiplier.value; if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); + applyMoveAttrs(NeutralDamageAgainstFlyingTypeMultiplierAttr, source, this, move, typeMultiplier); } if (!cancelled.value) { applyPreDefendAbAttrs(MoveImmunityAbAttr, this, source, move, cancelled, typeMultiplier); @@ -1762,6 +1800,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (cancelled.value) { + source.stopMultiHit(this); result = HitResult.NO_EFFECT; } else { const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === move.type) as TypeBoostTag; @@ -1776,7 +1815,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && move.type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { power.value /= 2; } + applyMoveAttrs(VariablePowerAttr, source, this, move, power); + this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); if (!typeless) { this.scene.arena.applyTags(WeakenMoveTypeTag, move.type, power); @@ -1845,8 +1886,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); + const effectPhase = this.scene.getCurrentPhase(); + let numTargets = 1; + if (effectPhase instanceof MoveEffectPhase) { + numTargets = effectPhase.getTargets().length; + } + const twoStrikeMultiplier = new Utils.NumberHolder(1); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); + if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); @@ -1914,10 +1963,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - - if (power.value === 0) { - damage.value = 0; - } + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage); console.log("damage", damage.value, move.name, power.value, sourceAtk, targetDef); @@ -2085,7 +2131,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } - getTag(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag { + getTag(tagType: BattlerTagType | Constructor): BattlerTag { if (!this.summonData) { return null; } @@ -2101,7 +2147,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.tags.find(t => tagFilter(t)); } - getTags(tagType: BattlerTagType | { new(...args: any[]): BattlerTag }): BattlerTag[] { + getTags(tagType: BattlerTagType | Constructor): BattlerTag[] { if (!this.summonData) { return []; } @@ -2214,6 +2260,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.moveQueue; } + /** + * If this Pokemon is using a multi-hit move, cancels all subsequent strikes + * @param {Pokemon} target If specified, this only cancels subsequent strikes against the given target + */ + stopMultiHit(target?: Pokemon): void { + const effectPhase = this.scene.getCurrentPhase(); + if (effectPhase instanceof MoveEffectPhase && effectPhase.getUserPokemon() === this) { + effectPhase.stopMultiHit(target); + } + } + changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); @@ -2488,6 +2545,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } + /** + * If this Pokemon falls asleep or freezes in the middle of a multi-hit attack, + * cancel the attack's subsequent hits. + */ + if (effect === StatusEffect.SLEEP || effect === StatusEffect.FREEZE) { + this.stopMultiHit(); + } + if (asPhase) { this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon)); return true; @@ -3341,14 +3406,17 @@ export class EnemyPokemon extends Pokemon { public aiType: AiType; public bossSegments: integer; public bossSegmentIndex: integer; + /** To indicate of the instance was populated with a dataSource -> e.g. loaded & populated from session data */ + public readonly isPopulatedFromDataSource: boolean; constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, dataSource: PokemonData) { super(scene, 236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, null, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; + this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource if (boss) { - this.setBoss(); + this.setBoss(boss, dataSource?.bossSegments); } if (Overrides.OPP_STATUS_OVERRIDE) { @@ -3396,6 +3464,13 @@ export class EnemyPokemon extends Pokemon { } } + /** + * Sets the pokemons boss status. If true initializes the boss segments either from the arguments + * or through the the Scene.getEncounterBossSegments function + * + * @param boss if the pokemon is a boss + * @param bossSegments amount of boss segments (health-bar segments) + */ setBoss(boss: boolean = true, bossSegments: integer = 0): void { if (boss) { this.bossSegments = bossSegments || this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true); @@ -3485,6 +3560,10 @@ export class EnemyPokemon extends Pokemon { 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 (Number.isNaN(targetScore)) { + console.error(`Move ${move.name} returned score of NaN`); + targetScore = 0; + } if ((move.name.endsWith(" (N)") || !move.applyConditions(this, target, move)) && ![Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id)) { targetScore = -20; } else if (move instanceof AttackMove) { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index a582ab4b096..3e78afeae83 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -432,20 +432,24 @@ export default class Trainer extends Phaser.GameObjects.Container { } 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(); + const nonFaintedLegalPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => p.isAllowedInBattle()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); + const partyMemberScores = nonFaintedLegalPartyMembers.map(p => { + const playerField = this.scene.getPlayerField().filter(p => p.isAllowedInBattle()); let score = 0; - for (const playerPokemon of playerField) { - score += p.getMatchupScore(playerPokemon); - if (playerPokemon.species.legendary) { - score /= 2; + + if (playerField.length > 0) { + for (const playerPokemon of playerField) { + score += p.getMatchupScore(playerPokemon); + if (playerPokemon.species.legendary) { + score /= 2; + } + } + score /= playerField.length; + if (forSwitch && !p.isOnField()) { + this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); } } - score /= playerField.length; - if (forSwitch && !p.isOnField()) { - this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); - } + return [party.indexOf(p), score]; }) as [integer, integer][]; diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index f2cf9933b17..7d4e8349775 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -278,7 +278,7 @@ export class QuietFormChangePhase extends BattlePhase { } end(): void { - if (this.pokemon.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { + if (this.pokemon.scene?.currentBattle.battleSpec === BattleSpec.FINAL_BOSS && this.pokemon instanceof EnemyPokemon) { this.scene.playBgm(); this.pokemon.summonData.battleStats = [ 0, 0, 0, 0, 0, 0, 0 ]; this.scene.unshiftPhase(new PokemonHealPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getMaxHp(), null, false, false, false, true)); diff --git a/src/interfaces/locales.ts b/src/interfaces/locales.ts new file mode 100644 index 00000000000..5f7c52100c1 --- /dev/null +++ b/src/interfaces/locales.ts @@ -0,0 +1,94 @@ +export interface Localizable { + localize(): void; + } + +export interface TranslationEntries { + [key: string]: string | { [key: string]: string } +} +export interface SimpleTranslationEntries { + [key: string]: string + } + +export interface MoveTranslationEntry { + name: string, + effect: string + } + +export interface MoveTranslationEntries { + [key: string]: MoveTranslationEntry + } + +export interface AbilityTranslationEntry { + name: string, + description: string + } + +export interface AbilityTranslationEntries { + [key: string]: AbilityTranslationEntry + } + +export interface ModifierTypeTranslationEntry { + name?: string, + description?: string, + extra?: SimpleTranslationEntries + } + +export interface ModifierTypeTranslationEntries { + ModifierType: { [key: string]: ModifierTypeTranslationEntry }, + SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry }, + AttackTypeBoosterItem: SimpleTranslationEntries, + TempBattleStatBoosterItem: SimpleTranslationEntries, + TempBattleStatBoosterStatName: SimpleTranslationEntries, + BaseStatBoosterItem: SimpleTranslationEntries, + EvolutionItem: SimpleTranslationEntries, + FormChangeItem: SimpleTranslationEntries, + } + +export interface PokemonInfoTranslationEntries { + Stat: SimpleTranslationEntries, + Type: SimpleTranslationEntries, + } + +export interface BerryTranslationEntry { + name: string, + effect: string, + } + +export interface BerryTranslationEntries { + [key: string]: BerryTranslationEntry + } + +export interface StatusEffectTranslationEntries { + [key: string]: StatusEffectTranslationEntry +} + +export interface StatusEffectTranslationEntry { + name: string, + obtain: string, + obtainSource: string, + activation: string, + overlap: string, + heal: string + description: string, +} + +export interface AchievementTranslationEntry { + name?: string, + description?: string, + } + +export interface AchievementTranslationEntries { + [key: string]: AchievementTranslationEntry; + } + +export interface DialogueTranslationEntry { + [key: number]: string; + } + +export interface DialogueTranslationCategory { + [category: string]: DialogueTranslationEntry; + } + +export interface DialogueTranslationEntries { + [trainertype: string]: DialogueTranslationCategory; + } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index fbe1d23f049..0a6648a9c57 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -1,4 +1,4 @@ -import { GachaType } from "./data/egg"; +import { GachaType } from "./enums/gacha-types"; import { trainerConfigs } from "./data/trainer-config"; import { getBiomeHasProps } from "./field/arena"; import CacheBustedLoaderPlugin from "./plugins/cache-busted-loader-plugin"; @@ -24,6 +24,8 @@ import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; export class LoadingScene extends SceneBase { + readonly LOAD_EVENTS = Phaser.Loader.Events; + constructor() { super("loading"); @@ -35,17 +37,12 @@ export class LoadingScene extends SceneBase { Utils.localPing(); this.load["manifest"] = this.game["manifest"]; - if (!isMobile()) { - this.load.video("intro_dark", "images/intro_dark.mp4", true); - } - this.loadImage("loading_bg", "arenas"); this.loadImage("logo", ""); this.loadImage("pride-update", "events"); // 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"); @@ -93,6 +90,7 @@ export class LoadingScene extends SceneBase { this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.loadAtlas("shiny_icons", "ui"); this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); this.loadImage("icon_spliced", "ui"); @@ -323,6 +321,7 @@ export class LoadingScene extends SceneBase { 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_team_plasma", "bw/victory_team_plasma.mp3"); this.loadBgm("victory_gym", "bw/victory_gym.mp3"); this.loadBgm("victory_champion", "bw/victory_champion.mp3"); this.loadBgm("evolution", "bw/evolution.mp3"); @@ -421,58 +420,46 @@ export class LoadingScene extends SceneBase { }); disclaimerDescriptionText.setOrigin(0.5, 0.5); - disclaimerText.setVisible(false); - disclaimerDescriptionText.setVisible(false); - - const intro = this.add.video(0, 0); - intro.setOrigin(0, 0); - intro.setScale(3); - - this.load.on("progress", (value: string) => { - const parsedValue = parseFloat(value); - percentText.setText(`${Math.floor(parsedValue * 100)}%`); - progressBar.clear(); - progressBar.fillStyle(0xffffff, 0.8); - progressBar.fillRect(midWidth - 320, 360, 640 * parsedValue, 64); - }); - - this.load.on("fileprogress", file => { - assetText.setText(i18next.t("menu:loadingAsset", { assetName: file.key })); - }); - - loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText); + loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText, disclaimerText, disclaimerDescriptionText); if (!mobile) { loadingGraphics.map(g => g.setVisible(false)); } - const destroyLoadingAssets = () => { - intro.destroy(); - bg.destroy(); - logo.destroy(); - progressBar.destroy(); - progressBox.destroy(); - percentText.destroy(); - assetText.destroy(); - }; + const intro = this.add.video(0, 0); + intro.on(Phaser.GameObjects.Events.VIDEO_COMPLETE, (video: Phaser.GameObjects.Video) => { + this.tweens.add({ + targets: intro, + duration: 500, + alpha: 0, + ease: "Sine.easeIn", + onComplete: () => video.destroy(), + }); + loadingGraphics.forEach(g => g.setVisible(true)); + }); + intro.setOrigin(0, 0); + intro.setScale(3); - this.load.on("filecomplete", key => { + this.load.once(this.LOAD_EVENTS.START, () => { + // videos do not need to be preloaded + intro.loadURL("images/intro_dark.mp4", true); + if (mobile) { + intro.video.setAttribute("webkit-playsinline", "webkit-playsinline"); + intro.video.setAttribute("playsinline", "playsinline"); + } + intro.play(); + }); + + this.load.on(this.LOAD_EVENTS.PROGRESS , (progress: number) => { + percentText.setText(`${Math.floor(progress * 100)}%`); + progressBar.clear(); + progressBar.fillStyle(0xffffff, 0.8); + progressBar.fillRect(midWidth - 320, 360, 640 * progress, 64); + }); + + this.load.on(this.LOAD_EVENTS.FILE_COMPLETE, (key: string) => { + assetText.setText(i18next.t("menu:loadingAsset", { assetName: 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)); - disclaimerText.setVisible(true); - disclaimerDescriptionText.setVisible(true); - }); - intro.play(); - break; case "loading_bg": bg.setTexture("loading_bg"); if (mobile) { @@ -488,7 +475,7 @@ export class LoadingScene extends SceneBase { } }); - this.load.on("complete", () => destroyLoadingAssets()); + this.load.on(this.LOAD_EVENTS.COMPLETE, () => loadingGraphics.forEach(go => go.destroy())); } get gameHeight() { diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 652c16eb662..4e69db20231 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -1,8 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}}\nvor Rückstoß geschützt!", + "blockRecoilDamage" : "{{pokemonName}} wurde durch {{abilityName}} vor Rückstoß geschützt!", "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", + "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", + "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", + "quickDraw": "Durch Schnellschuss kann {{pokemonName}} schneller handeln als sonst!", } as const; diff --git a/src/locales/de/ability.ts b/src/locales/de/ability.ts index 4567976e0ef..e397b84c7b7 100644 --- a/src/locales/de/ability.ts +++ b/src/locales/de/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { diff --git a/src/locales/de/achv.ts b/src/locales/de/achv.ts index 64721e48af6..6040c3ea916 100644 --- a/src/locales/de/achv.ts +++ b/src/locales/de/achv.ts @@ -1,4 +1,4 @@ -import {AchievementTranslationEntries} from "#app/plugins/i18n.js"; +import {AchievementTranslationEntries} from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { diff --git a/src/locales/de/battle-message-ui-handler.ts b/src/locales/de/battle-message-ui-handler.ts index daedb8550d0..cc1deccbaa2 100644 --- a/src/locales/de/battle-message-ui-handler.ts +++ b/src/locales/de/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Sensationell", diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 07687f8a535..67c2cd9a6b0 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} erscheint.", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "{{trainerName}}\nwurde besiegt!", "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", "pokemonCaught": "{{pokemonName}} wurde gefangen!", + "addedAsAStarter": "{{pokemonName}} wurde als Starterpokémon hinzugefügt!", "partyFull": "Dein Team ist voll.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "Ein K.O.-Treffer!", "attackFailed": "Es ist fehlgeschlagen!", "attackHitsCount": "{{count}}-mal getroffen!", + "rewardGain": "Du erhältst\n{{modifierName}}!", "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!", "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!", "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!", @@ -37,7 +39,7 @@ export const battle: SimpleTranslationEntries = { "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.", "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", "learnMoveAnd": "Und…", - "levelCapUp": "Das Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", + "levelCapUp": "Die Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", "moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!", "moveDisabled": "{{moveName}} ist deaktiviert!", @@ -54,6 +56,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", + "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", + "hpIsFull": "Die KP von {{pokemonName}} sind voll!", "eggHatching": "Oh?", "ivScannerUseQuestion": "IV-Scanner auf {{pokemonName}} benutzen?", "wildPokemonWithAffix": "{{pokemonName}} (wild)", @@ -61,5 +65,72 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!", "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", - "fainted": "{{pokemonNameWithAffix}} wurde besiegt!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", + "statRose": "{{stats}} von {{pokemonNameWithAffix}} steigt!", + "statSharplyRose": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", + "statRoseDrastically": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", + "statWontGoAnyHigher": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", + "statFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", + "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", + "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", + "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", + "ppReduced": "{{moveName}} von {{targetName}} wird um {{reduction}} AP reduziert!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} ist zurückgeschreckt und kann nicht handeln!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} wurde verwirrt!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verwirrt!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verwirrt!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} ist verwirrt!", + "battlerTagsConfusedLapseHurtItself": "Es hat sich vor Verwirrung selbst verletzt!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} ist immun gegen den Effekt von Abgangsbund!", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} nimmt {{pokemonNameWithAffix2}} mit sich!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} hat sich in {{sourcePokemonName}} verliebt!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} ist bereits verliebt.", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} ist in {{sourcePokemonName}} verliebt!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} ist starr vor Liebe!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} ist nicht mehr verliebt!", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} wurde bepflanzt!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}} wurden durch Egelsamen KP geraubt!", + "battlerTagsSeededLapseShed": "Egelsamen von {{pokemonNameWithAffix}} saugt Kloakensoße auf!", + "battlerTagsNightmareOnAdd": "Nachtmahr sucht {{pokemonNameWithAffix}} heim!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} wird bereits von Nachtmahr heimgesucht!", + "battlerTagsNightmareLapse": "Nachtmahr schadet {{pokemonNameWithAffix}}!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} gibt eine Zugabe", + "battlerTagsEncoreOnRemove": "Die Zugabe von {{pokemonNameWithAffix}} ist beendet!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} will {{pokemonName}} helfen!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} nimmt über seine Wurzeln Nährstoffe auf!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} pflanzt seine Wurzeln!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} umgibt sich mit einem Wasserring!", + "battlerTagsAquaRingLapse": "{{moveName}} füllt KP von {{pokemonName}} wieder auf!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} wurde schläfrig gemacht!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} wurde durch {{moveName}} von {{sourcePokemonName}} gequetscht!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} wurde von {{sourcePokemonName}} umwickelt!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} wird in dem Strudel gefangen!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} wurde von {{pokemonName}} geschnappt!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} wurde von {{moveName}} gefangen!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} wurde in wirbelndem Magma eingeschlossen!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} wurde durch Sandgrab gefangen!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} hat {{pokemonNameWithAffix}} gefangen!", + "battlerTagsInfestationOnTrap": "{{sourcePokemonNameWithAffix}} plagt {{pokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}} schützt sich selbst!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}} schützt sich selbst!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} sammelt sich, um die nächste Attacke zu überstehen!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", + "battlerTagsPerishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} faulenzt!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!", + "battlerTagsHighestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!", + "battlerTagsHighestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!" } as const; diff --git a/src/locales/de/berry.ts b/src/locales/de/berry.ts index 093c3f708eb..b041a23d646 100644 --- a/src/locales/de/berry.ts +++ b/src/locales/de/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts new file mode 100644 index 00000000000..71e775c8846 --- /dev/null +++ b/src/locales/de/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musik", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "S2W2 Vs. Kanto Champion", + "battle_johto_champion": "S2W2 Vs. Johto Champion", + "battle_hoenn_champion": "S2W2 Vs. Hoenn Champion", + "battle_sinnoh_champion": "S2W2 Vs. Champion Cynthia", + "battle_champion_alder": "SW Vs. Champion Lauro", + "battle_champion_iris": "S2W2 Vs. Champion Lilia", + "battle_kalos_champion": "XY Vs. Champion Diantha", + "battle_alola_champion": "USUM Vs. Alola Champion", + "battle_galar_champion": "SWSH Vs. Champion Delion", + "battle_champion_geeta": "KAPU Vs. Champion Sagaria", + "battle_champion_nemona": "KAPU Vs. Champion Nemila", + "battle_champion_kieran": "KAPU Vs. Jo", + "battle_hoenn_elite": "ORAS Vs. Hoenn Top Vier", + "battle_unova_elite": "SW Vs. Einall Top Vier", + "battle_kalos_elite": "XY Vs. Kalos Top Vier", + "battle_alola_elite": "SM Vs. Alola Top Vier", + "battle_galar_elite": "SWSH Galar Champ-Cup", + "battle_paldea_elite": "KAPU Vs. Paldea Top Vier", + "battle_bb_elite": "KAPU Vs. Blaubeer-Top-Vier", + "battle_final_encounter": "PMDDX Rayquazas Domäne", + "battle_final": "SW Vs. G-Cis", + "battle_kanto_gym": "S2W2 Vs. Kanto Arenaleiter", + "battle_johto_gym": "S2W2 Vs. Johto Arenaleiter", + "battle_hoenn_gym": "S2W2 Vs. Hoenn Arenaleiter", + "battle_sinnoh_gym": "S2W2 Vs. Sinnoh Arenaleiter", + "battle_unova_gym": "SW Vs. Einall Arenaleiter", + "battle_kalos_gym": "XY Vs. Kalos Arenaleiter", + "battle_galar_gym": "SWSH Vs. Galar Arenaleiter", + "battle_paldea_gym": "KAPU Vs. Paldea Arenaleiter", + "battle_legendary_kanto": "XY Vs. Legendäres Kanto Pokémon", + "battle_legendary_raikou": "HGSS Vs. Raikou", + "battle_legendary_entei": "HGSS Vs. Entei", + "battle_legendary_suicune": "HGSS Vs. Suicune", + "battle_legendary_lugia": "HGSS Vs. Lugia", + "battle_legendary_ho_oh": "HGSS Vs. Ho-oh", + "battle_legendary_regis_g5": "S2W2 Vs. Legendäre Giganten", + "battle_legendary_regis_g6": "ORAS Vs. Legendäre Giganten", + "battle_legendary_gro_kyo": "ORAS Vs. Groudon & Kyogre", + "battle_legendary_rayquaza": "ORAS Vs. Rayquaza", + "battle_legendary_deoxys": "ORAS Vs. Deoxys", + "battle_legendary_lake_trio": "ORAS Vs. Seen-Trio", + "battle_legendary_sinnoh": "ORAS Vs. Legendäres Sinnoh Pokémon", + "battle_legendary_dia_pal": "ORAS Vs. Dialga & Palkia", + "battle_legendary_giratina": "ORAS Vs. Giratina", + "battle_legendary_arceus": "HGSS Vs. Arceus", + "battle_legendary_unova": "SW Vs. Legendäres Einall Pokémon", + "battle_legendary_kyurem": "SW Vs. Kyurem", + "battle_legendary_res_zek": "SW Vs. Reshiram & Zekrom", + "battle_legendary_xern_yvel": "XY Vs. Xerneas & Yveltal", + "battle_legendary_tapu": "SM Vs. Kapu", + "battle_legendary_sol_lun": "SM Vs. Solgaleo & Lunala", + "battle_legendary_ub": "SM Vs. Ultrabestie", + "battle_legendary_dusk_dawn": "USUM Vs. Abendmähne- & Morgenschwingen-Necrozma", + "battle_legendary_ultra_nec": "USUM Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "SWSH Vs. Zacian & Zamazenta", + "battle_legendary_glas_spec": "SWSH Vs. Polaross & Phantoross", + "battle_legendary_calyrex": "SWSH Vs. Coronospa", + "battle_legendary_birds_galar": "SWSH Vs. Legendäre Galar-Vögel", + "battle_legendary_ruinous": "KAPU Vs. Schätze des Unheils", + "battle_legendary_kor_mir": "KAPU Die Tiefen von Zone Null", + "battle_legendary_loyal_three": "KAPU Drei Gefährten", + "battle_legendary_ogerpon": "KAPU Vs. Ogerpon", + "battle_legendary_terapagos": "KAPU Vs. Terapagos", + "battle_legendary_pecharunt": "KAPU Vs. Infamomo", + "battle_rival": "SW Vs. Rivale", + "battle_rival_2": "SW Vs. N", + "battle_rival_3": "SW Vs. N (Finale)", + "battle_trainer": "SW Vs. Trainer", + "battle_wild": "SW Vs. Wilde Pokémon", + "battle_wild_strong": "SW Vs. Starke Wilde Pokémon", + "end_summit": "PMDDX Gipfel des Himmelturms", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", + "badlands": "PMD Erkundungsteam Himmel Kargtal", + "beach": "PMD Erkundungsteam Himmel Feuchtklippe", + "cave": "PMD Erkundungsteam Himmel Himmelsgipfel-Höhle", + "construction_site": "PMD Erkundungsteam Himmel Geröllbruch", + "desert": "PMD Erkundungsteam Himmel Nordwüste", + "dojo": "PMD Erkundungsteam Himmel Knogga-Dojo", + "end": "PMD Retterteam DX Himmelsturm", + "factory": "PMD Erkundungsteam Himmel Verborgene Ruinen", + "fairy_cave": "PMD Erkundungsteam Himmel Sternenhöhle", + "forest": "PMD Erkundungsteam Himmel Düsterwald", + "grass": "PMD Erkundungsteam Himmel Apfelwald", + "graveyard": "PMD Erkundungsteam Himmel Verwirrwald", + "ice_cave": "PMD Erkundungsteam Himmel Rieseneisberg", + "island": "PMD Erkundungsteam Himmel Schroffküste", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD Erkundungsteam Himmel Kristallhöhle", + "meadow": "PMD Erkundungsteam Himmel Himmelsgipfel-Wald", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD Erkundungsteam Himmel Hornberg", + "plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie", + "power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene", + "ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies", + "sea": "PMD Erkundungsteam Himmel Salzwasserhöhle", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", + "space": "Firel - Aether", + "swamp": "PMD Erkundungsteam Himmel Ringmeer", + "tall_grass": "PMD Erkundungsteam Himmel Nebelwald", + "temple": "PMD Erkundungsteam Himmel Ägishöhle", + "town": "PMD Erkundungsteam Himmel Zufälliges Dungeon-Theme 3", + "volcano": "PMD Erkundungsteam Himmel Dunsthöhle", + "wasteland": "PMD Erkundungsteam Himmel Verborgenes Hochland", + + // Encounter + "encounter_ace_trainer": "SW Trainerblicke treffen sich (Ass-Trainer)", + "encounter_backpacker": "SW Trainerblicke treffen sich (Backpacker)", + "encounter_clerk": "SW Trainerblicke treffen sich (Angestellter)", + "encounter_cyclist": "SW Trainerblicke treffen sich (Biker)", + "encounter_lass": "SW Trainerblicke treffen sich (Göre)", + "encounter_parasol_lady": "SW Trainerblicke treffen sich (Schirmdame)", + "encounter_pokefan": "SW Trainerblicke treffen sich (Pokéfan)", + "encounter_psychic": "SW Trainerblicke treffen sich (Seher)", + "encounter_rich": "SW Trainerblicke treffen sich (Gentleman)", + "encounter_rival": "SW Vs. Cheren", + "encounter_roughneck": "SW Trainerblicke treffen sich (Raufbold)", + "encounter_scientist": "SW Trainerblicke treffen sich (Forscher)", + "encounter_twins": "SW Trainerblicke treffen sich (Zwillinge)", + "encounter_youngster": "SW Trainerblicke treffen sich (Knirps)", + + // Other + "heal": "SW Pokémon-Heilung", + "menu": "PMD Erkundungsteam Himmel Willkommen in der Welt der Pokémon!", + "title": "PMD Erkundungsteam Himmel Top-Menü-Thema", +} as const; diff --git a/src/locales/de/biome.ts b/src/locales/de/biome.ts index 6fdbb3c6820..2afb4a4b018 100644 --- a/src/locales/de/biome.ts +++ b/src/locales/de/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "An einem unbekannten Ort", diff --git a/src/locales/de/challenges.ts b/src/locales/de/challenges.ts index 1dbd4505986..176de9879b6 100644 --- a/src/locales/de/challenges.ts +++ b/src/locales/de/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Herausforderungsmodifikatoren", - "confirm_start": "Mit diesen Modifikatoren fortfahren?", - "singleGeneration.name": "Mono-Generation", - "singleGeneration.value.0": "Aus", - "singleGeneration.desc.0": "Du kannst nur Pokémon aus der gewählten Generation verwenden.", - "singleGeneration.value.1": "Generation 1", - "singleGeneration.desc.1": "Du kannst nur Pokémon aus der ersten Generation verwenden.", - "singleGeneration.value.2": "Generation 2", - "singleGeneration.desc.2": "Du kannst nur Pokémon aus der zweiten Generation verwenden.", - "singleGeneration.value.3": "Generation 3", - "singleGeneration.desc.3": "Du kannst nur Pokémon aus der dritten Generation verwenden.", - "singleGeneration.value.4": "Generation 4", - "singleGeneration.desc.4": "Du kannst nur Pokémon aus der vierten Generation verwenden.", - "singleGeneration.value.5": "Generation 5", - "singleGeneration.desc.5": "Du kannst nur Pokémon aus der fünften Generation verwenden.", - "singleGeneration.value.6": "Generation 6", - "singleGeneration.desc.6": "Du kannst nur Pokémon aus der sechsten Generation verwenden.", - "singleGeneration.value.7": "Generation 7", - "singleGeneration.desc.7": "Du kannst nur Pokémon aus der siebten Generation verwenden.", - "singleGeneration.value.8": "Generation 8", - "singleGeneration.desc.8": "Du kannst nur Pokémon aus der achten Generation verwenden.", - "singleGeneration.value.9": "Generation 9", - "singleGeneration.desc.9": "Du kannst nur Pokémon aus der neunten Generation verwenden.", - "singleType.name": "Mono-Typ", - "singleType.value.0": "Aus", - "singleType.desc.0": "Du kannst nur Pokémon des gewählten Typs verwenden.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Du kannst nur Pokémon des Typs Normal verwenden.", - "singleType.value.2": "Kampf", - "singleType.desc.2": "Du kannst nur Pokémon des Typs Kampf verwenden.", - "singleType.value.3": "Flug", - "singleType.desc.3": "Du kannst nur Pokémon des Typs Flug verwenden.", - "singleType.value.4": "Gift", - "singleType.desc.4": "Du kannst nur Pokémon des Typs Gift verwenden.", - "singleType.value.5": "Boden", - "singleType.desc.5": "Du kannst nur Pokémon des Typs Boden verwenden.", - "singleType.value.6": "Gestein", - "singleType.desc.6": "Du kannst nur Pokémon des Typs Gestein verwenden.", - "singleType.value.7": "Käfer", - "singleType.desc.7": "Du kannst nur Pokémon des Typs Käfer verwenden.", - "singleType.value.8": "Geist", - "singleType.desc.8": "Du kannst nur Pokémon des Typs Geist verwenden.", - "singleType.value.9": "Stahl", - "singleType.desc.9": "Du kannst nur Pokémon des Typs Stahl verwenden.", - "singleType.value.10": "Feuer", - "singleType.desc.10": "Du kannst nur Pokémon des Typs Feuer verwenden.", - "singleType.value.11": "Wasser", - "singleType.desc.11": "Du kannst nur Pokémon des Typs Wasser verwenden.", - "singleType.value.12": "Pflanze", - "singleType.desc.12": "Du kannst nur Pokémon des Typs Pflanze verwenden.", - "singleType.value.13": "Elektro", - "singleType.desc.13": "Du kannst nur Pokémon des Typs Elektro verwenden.", - "singleType.value.14": "Psycho", - "singleType.desc.14": "Du kannst nur Pokémon des Typs Psycho verwenden.", - "singleType.value.15": "Eis", - "singleType.desc.15": "Du kannst nur Pokémon des Typs Eis verwenden.", - "singleType.value.16": "Drache", - "singleType.desc.16": "Du kannst nur Pokémon des Typs Drache verwenden.", - "singleType.value.17": "Unlicht", - "singleType.desc.17": "Du kannst nur Pokémon des Typs Unlicht verwenden.", - "singleType.value.18": "Fee", - "singleType.desc.18": "Du kannst nur Pokémon des Typs Fee verwenden." - + "illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!", + "singleGeneration": { + "name": "Mono-Generation", + "desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.", + "desc_default": "Du kannst nur Pokémon gewählten Generation verwenden.", + "gen_1": "ersten", + "gen_2": "zweiten", + "gen_3": "dritten", + "gen_4": "vierten", + "gen_5": "fünften", + "gen_6": "sechsten", + "gen_7": "siebten", + "gen_8": "achten", + "gen_9": "neunten", + }, + "singleType": { + "name": "Mono-Typ", + "desc": "Du kannst nur Pokémon des Typs {{type}} verwenden.", + "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden." + // types in pokemon-info + }, } as const; diff --git a/src/locales/de/command-ui-handler.ts b/src/locales/de/command-ui-handler.ts index fcc70e5d59d..cd7da3fbf26 100644 --- a/src/locales/de/command-ui-handler.ts +++ b/src/locales/de/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Kampf", diff --git a/src/locales/de/common.ts b/src/locales/de/common.ts new file mode 100644 index 00000000000..82966b4ffeb --- /dev/null +++ b/src/locales/de/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Start", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index b02bd5aeee6..77834849d2f 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const deConfig = { ability: ability, @@ -46,9 +50,11 @@ export const deConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const deConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/de/dialogue.ts b/src/locales/de/dialogue.ts index 1bfff5aa000..02c497b3182 100644 --- a/src/locales/de/dialogue.ts +++ b/src/locales/de/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) @@ -2349,7 +2349,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "Du bist in meinen Sturm geraten! Viel Glück beim nächsten Mal!" } }, - + "alder": { + "encounter": { + 1: "Mach dich bereit für einen Kampf gegen den stärksten Trainer in Einall! Mich - Lauro!" + }, + "victory": { + 1: "Gut gemacht! Du hast wirklich ein unvergleichliches Talent." + }, + "defeat": { + 1: `Ein frischer Wind weht durch mein Herz... + $Was für ein außergewöhnliches Gefühl!` + } + }, + "kieran": { + "encounter": { + 1: `Durch harte Arbeit werde ich immer stärker und stärker! + $Ich verliere nicht.` + }, + "victory": { + 1: `Ich kann es nicht glauben... + $Was für ein lustiger und herzzerreißender Kampf!` + }, + "defeat": { + 1: `Wow, was für ein Kampf! + $Es ist Zeit für dich, noch härter zu trainieren.` + } + }, "rival": { "encounter": { 1: `@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen, diff --git a/src/locales/de/egg.ts b/src/locales/de/egg.ts index b55c3a229d0..61a2f627aa4 100644 --- a/src/locales/de/egg.ts +++ b/src/locales/de/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Ei", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Du hast nicht genug Ei-Gutscheine!", "tooManyEggs": "Du hast schon zu viele Eier!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} wird aus dem Ei schlüpfen!", + "hatchFromTheEgg": "Ein {{pokemonName}} ist aus dem Ei geschlüpft!", + "eggMoveUnlock": "Ei-Attacke freigeschaltet: {{moveName}}", + "rareEggMoveUnlock": "Seltene Ei-Attacke freigeschaltet: {{moveName}}", } as const; diff --git a/src/locales/de/fight-ui-handler.ts b/src/locales/de/fight-ui-handler.ts index 4c6ec243a22..255b48b3aa4 100644 --- a/src/locales/de/fight-ui-handler.ts +++ b/src/locales/de/fight-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "AP", diff --git a/src/locales/de/game-mode.ts b/src/locales/de/game-mode.ts index 59058a6ab49..72661bd4682 100644 --- a/src/locales/de/game-mode.ts +++ b/src/locales/de/game-mode.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "Klassik", diff --git a/src/locales/de/game-stats-ui-handler.ts b/src/locales/de/game-stats-ui-handler.ts index 8c582b33eb1..776a28f95c7 100644 --- a/src/locales/de/game-stats-ui-handler.ts +++ b/src/locales/de/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "Statistiken", diff --git a/src/locales/de/growth.ts b/src/locales/de/growth.ts index dbd0e119e5f..275f1645b87 100644 --- a/src/locales/de/growth.ts +++ b/src/locales/de/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Unregelmäßig", diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index de30785b731..0338ba6f399 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Spieleinstellungen", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Daten importieren", "exportData": "Daten exportieren", "cancel": "Abbrechen", - "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?" + "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", + "noEggs": "Du brütest aktuell keine Eier aus!" } as const; diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index d8987fcf77b..bffcdeb1c3e 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "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.", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "Tägliche Rangliste", "weeklyRankings": "Wöchentliche Rangliste", "noRankings": "Keine Rangliste", + "positionIcon": "#", + "usernameScoreboard": "Benutzername", + "score": "Punkte", + "wave": "Welle", "loading": "Lade…", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "Lade Asset: {{assetName}}", "playersOnline": "Spieler Online", "yes":"Ja", "no":"Nein", - "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed." + "disclaimer": "HAFTUNGSAUSSCHLUSS", + "disclaimerDescription": "Dieses Spiel ist ein unfertiges Produkt. Es kann spielbeinträchtigende Fehler (bis hin zum Verlust des Speicherstandes)\n aufweisen, sich ohne Vorankündigung ändern und es gibt keine Garantie dass es weiterentwickelt oder fertiggestellt wird.", + "choosePokemon": "Wähle ein Pokémon.", + "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.", } as const; diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index 175c426143b..8b2950f44c3 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Sanftglocke" }, + "EVIOLITE": { name: "Evolith", description: "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." }, + "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." }, "NUGGET": { name: "Nugget" }, @@ -240,6 +242,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Kugelblitz", description: "Ein Item, das von Pikachu getragen werden kann. Es erhöht den Angriff und den Spezial-Angriff." }, + "THICK_CLUB": { name: "Kampfknochen", description: "Ein Item, das von Tragosso oder Knogga getragen werden kann. Dieser harte Knochen erhöht den Angriff." }, + "METAL_POWDER": { name: "Metallstaub", description: "Ein Item, das von Ditto getragen werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Verteidigung." }, + "QUICK_POWDER": { name: "Flottstaub", description: "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative." } + }, TempBattleStatBoosterItem: { "x_attack": "X-Angriff", "x_defense": "X-Verteidigung", @@ -249,6 +257,20 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "X-Treffer", "dire_hit": "X-Volltreffer", }, + + TempBattleStatBoosterStatName: { + "ATK": "Angriff", + "DEF": "Verteidigung", + "SPATK": "Sp. Ang", + "SPDEF": "Sp. Vert", + "SPD": "Initiative", + "ACC": "Genauigkeit", + "CRIT": "Volltrefferquote", + "EVA": "Fluchtwert", + "DEFAULT": "???", + }, + + AttackTypeBoosterItem: { "silk_scarf": "Seidenschal", "black_belt": "Schwarzgurt", diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts index 8af2e8bb022..430b4f85ec3 100644 --- a/src/locales/de/move.ts +++ b/src/locales/de/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { diff --git a/src/locales/de/nature.ts b/src/locales/de/nature.ts index 3b730dd0455..0156b8515df 100644 --- a/src/locales/de/nature.ts +++ b/src/locales/de/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Robust", diff --git a/src/locales/de/party-ui-handler.ts b/src/locales/de/party-ui-handler.ts index 103c6837889..da83d2370c3 100644 --- a/src/locales/de/party-ui-handler.ts +++ b/src/locales/de/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { "SEND_OUT": "Einwechseln", diff --git a/src/locales/de/pokeball.ts b/src/locales/de/pokeball.ts index 0b850b5c775..395134be844 100644 --- a/src/locales/de/pokeball.ts +++ b/src/locales/de/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Pokéball", diff --git a/src/locales/de/pokemon-info-container.ts b/src/locales/de/pokemon-info-container.ts index 41cca2d7dbb..f408dbcff9c 100644 --- a/src/locales/de/pokemon-info-container.ts +++ b/src/locales/de/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "Attacken", diff --git a/src/locales/de/pokemon-info.ts b/src/locales/de/pokemon-info.ts index 203ad9e6e1e..08a23de2b3a 100644 --- a/src/locales/de/pokemon-info.ts +++ b/src/locales/de/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -14,6 +14,8 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEFshortened": "SpVert", "SPD": "Initiative", "SPDshortened": "Init", + "ACC": "Genauigkeit", + "EVA": "Fluchtwert", }, Type: { diff --git a/src/locales/de/pokemon.ts b/src/locales/de/pokemon.ts index bd2ff964a9b..58a0439f5d5 100644 --- a/src/locales/de/pokemon.ts +++ b/src/locales/de/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bisasam", diff --git a/src/locales/de/save-slot-select-ui-handler.ts b/src/locales/de/save-slot-select-ui-handler.ts index fbbfebae6ee..b6577cd574a 100644 --- a/src/locales/de/save-slot-select-ui-handler.ts +++ b/src/locales/de/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Den ausgewählten Speicherstand überschreiben?", diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts new file mode 100644 index 00000000000..85f8645d69f --- /dev/null +++ b/src/locales/de/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Junge", + "girl": "Mädchen", + "general": "Allgemein", + "display": "Anzeige", + "audio": "Audio", + "gamepad": "Controller", + "keyboard": "Tastatur", + "gameSpeed": "Spielgeschwindigkeit", + "hpBarSpeed": "KP-Balken Geschw.", + "expGainsSpeed": "EP-Balken Geschw.", + "expPartyDisplay": "Team-EP anzeigen", + "skipSeenDialogues": "Gesehenen Dialog überspringen", + "battleStyle": "Kampfstil", + "enableRetries": "Erneut versuchen aktivieren", + "tutorials": "Tutorials", + "touchControls": "Touch Steuerung", + "vibrations": "Vibration", + "normal": "Normal", + "fast": "Schnell", + "faster": "Schneller", + "skip": "Überspringen", + "levelUpNotifications": "Nur Lvl.-Up", + "on": "An", + "off": "Aus", + "switch": "Wechsel", + "set": "Folge", + "auto": "Auto", + "disabled": "Deaktiviert", + "language": "Sprache", + "change": "Ändern", + "uiTheme": "UI Thema", + "default": "Standard", + "legacy": "Legacy", + "windowType": "Fenster Typ", + "moneyFormat": "Währungsformat", + "damageNumbers": "Schadensnummern", + "simple": "Simpel", + "fancy": "Schön", + "abbreviated": "Abgekürzt", + "moveAnimations": "Attacken Animationen", + "showStatsOnLevelUp": "Werte beim Aufleveln anzeigen", + "candyUpgradeNotification": "Bonbon Upgrade Benachrichtigung", + "passivesOnly": "Nur Passive", + "candyUpgradeDisplay": "Bonbon Upgrade Anzeige", + "icon": "Icon", + "animation": "Animation", + "moveInfo": "Attacken-Info", + "showMovesetFlyout": "Zeige Attacken Flyout", + "showArenaFlyout": "Zeige Arena Flyout", + "showTimeOfDayWidget": "Zeige Tageszeit Widget", + "timeOfDayAnimation": "Tageszeit Animation", + "bounce": "Springen", + "timeOfDay_back": "Zurück", + "spriteSet": "Sprite Satz", + "consistent": "Konistent", + "mixedAnimated": "Gemischt animiert", + "fusionPaletteSwaps": "Fusion-Farbpalettenwechsel", + "playerGender": "Spielergeschlecht", + "typeHints": "Typhinweise", + "masterVolume": "Gesamtlautstärke", + "bgmVolume": "Hintergrundmusik", + "seVolume": "Spezialeffekte", + "musicPreference": "Musik Präferenz", + "mixed": "Gemischt", + "gamepadPleasePlug": "Bitte einen Controller anschließen oder eine Taste drücken.", + "delete": "Löschen", + "keyboardPleasePress": "Bitte eine Taste auf der Tastatur drücken.", + "reset": "Reset", + "requireReload": "Neuladen", + "action": "Aktion", + "back": "Zurück", + "pressToBind": "Zum Zuweisen drücken", + "pressButton": "Eine Taste drücken...", + "buttonUp": "Hoch", + "buttonDown": "Runter", + "buttonLeft": "Links", + "buttonRight": "Rechts", + "buttonAction": "Aktion", + "buttonMenu": "Menü", + "buttonSubmit": "Bestätigen", + "buttonCancel": "Abbrechen", + "buttonStats": "Statistiken", + "buttonCycleForm": "Form wechseln", + "buttonCycleShiny": "Schillernd wechseln", + "buttonCycleGender": "Geschlecht wechseln", + "buttonCycleAbility": "Fähigkeit wechseln", + "buttonCycleNature": "Wesen wechseln", + "buttonCycleVariant": "Variante wechseln", + "buttonSpeedUp": "Beschleunigen", + "buttonSlowDown": "Verlangsamen", + "alt": " (Alt)", + "mute": "Stumm", + "controller": "Controller", + "gamepadSupport": "Controllerunterstützung", + "showBgmBar": "Musiknamen anzeigen", +} as const; diff --git a/src/locales/de/splash-messages.ts b/src/locales/de/splash-messages.ts index fda502120e0..f5ab8572b7b 100644 --- a/src/locales/de/splash-messages.ts +++ b/src/locales/de/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "Kämpfe gewonnen!", diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index a448dcedad8..92ead61ebe7 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passiv:", "nature": "Wesen:", "eggMoves": "Ei-Attacken", - "start": "Start", "addToParty": "Zum Team hinzufügen", "toggleIVs": "DVs anzeigen/verbergen", "manageMoves": "Attacken ändern", + "manageNature": "Wesen ändern", "useCandies": "Bonbons verwenden", + "selectNature": "Wähle das neue Wesen.", "selectMoveSwapOut": "Wähle die zu ersetzende Attacke.", "selectMoveSwapWith": "Wähle die gewünschte Attacke.", "unlockPassive": "Passiv-Skill freischalten", "reduceCost": "Preis reduzieren", + "sameSpeciesEgg": "Ein Ei kaufen", "cycleShiny": ": Schillernd", "cycleForm": ": Form", "cycleGender": ": Geschlecht", diff --git a/src/locales/de/status-effect.ts b/src/locales/de/status-effect.ts new file mode 100644 index 00000000000..997d005987e --- /dev/null +++ b/src/locales/de/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + toxic: { + name: "Gift", + description: "Vergiftungen", + obtain: "{{pokemonNameWithAffix}} wurde schwer vergiftet!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} schwer vergiftet!", + activation: "{{pokemonNameWithAffix}} wird durch Gift verletzt!", + overlap: "{{pokemonNameWithAffix}} ist bereits vergiftet!", + heal: "Die Vergiftung von {{pokemonNameWithAffix}} wurde geheilt!" + }, + paralysis: { + name: "Paralyse", + description: "Paralyse", + obtain: "{{pokemonNameWithAffix}} wurde paralysiert!\nEs kann eventuell nicht handeln!", + obtainSource: "{{pokemonNameWithAffix}} wurde durch {{sourceText}} paralysiert,\nEs kann eventuell nicht handeln!", + activation: "{{pokemonNameWithAffix}}ist paralysiert!\nEs kann nicht angreifen!", + overlap: "{{pokemonNameWithAffix}} ist bereits paralysiert!", + heal: "Die Paralyse von {{pokemonNameWithAffix}} wurde aufgehoben!" + }, + sleep: { + name: "Schlaf", + description: "Einschlafen", + obtain: "{{pokemonNameWithAffix}} ist eingeschlafen!", + obtainSource: "{{pokemonNameWithAffix}}ist durch {{sourceText}} eingeschlafen!", + activation: "{{pokemonNameWithAffix}} schläft tief und fest!", + overlap: "{{pokemonNameWithAffix}} schläft bereits!", + heal: "{{pokemonNameWithAffix}} ist aufgewacht!" + }, + freeze: { + name: "Gefroren", + description: "Einfrieren", + obtain: "{{pokemonNameWithAffix}} erstarrt zu Eis!", + obtainSource: "{{pokemonNameWithAffix}} erstarrt durch {{sourceText}} zu Eis!", + activation: "{{pokemonNameWithAffix}} ist eingefroren und kann nicht handeln!", + overlap: "{{pokemonNameWithAffix}} ist bereits eingefroren!", + heal: "{{pokemonNameWithAffix}} wurde aufgetaut!" + }, + burn: { + name: "Verbrennung ", + description: "Verbrennungen", + obtain: "{{pokemonNameWithAffix}} erleidet Verbrennungen!", + obtainSource: "{{pokemonNameWithAffix}} erleidet durch {{sourceText}} Verbrennungen!", + activation: "Die Verbrennungen schaden {{pokemonNameWithAffix}}!", + overlap: "{{pokemonNameWithAffix}} leidet bereits unter Verbrennungen!", + heal: "Die Verbrennungen von {{pokemonNameWithAffix}} wurden geheilt!" + }, +} as const; diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index b473bb94094..1390bf410ae 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -93,12 +93,12 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon-Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Angestellte", - "rich": "Rich", - "rich_female": "Rich", + "rich": "Gentleman", + "rich_female": "Reiche Dame", "rich_boy": "Schnösel", "rich_couple": "Reiches Paar", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", + "rich_kid": "Schnösel", + "rich_kid_female": "Schnöselin", "rich_kids": "Schnösel", "roughneck": "Raufbold", "sailor": "Matrose", diff --git a/src/locales/de/tutorial.ts b/src/locales/de/tutorial.ts index 2f27cb10d61..0b02c6c0922 100644 --- a/src/locales/de/tutorial.ts +++ b/src/locales/de/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `Willkommen bei PokéRogue! Dies ist ein kampforientiertes Pokémon-Fangame mit Roguelite-Elementen. diff --git a/src/locales/de/voucher.ts b/src/locales/de/voucher.ts index 80e22931982..3ca01689875 100644 --- a/src/locales/de/voucher.ts +++ b/src/locales/de/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Gutscheine", diff --git a/src/locales/de/weather.ts b/src/locales/de/weather.ts index ab1dde97639..1132c35c430 100644 --- a/src/locales/de/weather.ts +++ b/src/locales/de/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index a99053785ab..b516bc8dde0 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -1,10 +1,13 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", + "blockRecoilDamage": "{{pokemonName}}'s {{abilityName}}\nprotected it from recoil!", "badDreams": "{{pokemonName}} is tormented!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!", "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/en/ability.ts b/src/locales/en/ability.ts index aff5d95405e..7e81f90afff 100644 --- a/src/locales/en/ability.ts +++ b/src/locales/en/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { diff --git a/src/locales/en/achv.ts b/src/locales/en/achv.ts index 571935aaddf..bff75344ea5 100644 --- a/src/locales/en/achv.ts +++ b/src/locales/en/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { diff --git a/src/locales/en/battle-message-ui-handler.ts b/src/locales/en/battle-message-ui-handler.ts index 6f09770808f..c213c666a26 100644 --- a/src/locales/en/battle-message-ui-handler.ts +++ b/src/locales/en/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Best", @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "Pretty Good", "ivDecent": "Decent", "ivNoGood": "No Good", -} as const; +} as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 52b64b8b614..d41ffc373dc 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} appeared.", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "You defeated\n{{trainerName}}!", "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "pokemonCaught": "{{pokemonName}} was caught!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Go! {{pokemonName}}!", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "It's a one-hit KO!", "attackFailed": "But it failed!", "attackHitsCount": "Hit {{count}} time(s)!", + "rewardGain": "You received\n{{modifierName}}!", "expGain": "{{pokemonName}} gained\n{{exp}} EXP. Points!", "levelUp": "{{pokemonName}} grew to\nLv. {{level}}!", "learnMove": "{{pokemonName}} learned\n{{moveName}}!", @@ -53,6 +55,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "switching", "escapeVerbFlee": "fleeing", "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", @@ -61,5 +65,72 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", "drainMessage": "{{pokemonName}} had its\nenergy drained!", "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "fainted": "{{pokemonNameWithAffix}} fainted!", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", + "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", + "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", + "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" } as const; diff --git a/src/locales/en/berry.ts b/src/locales/en/berry.ts index 1063b84046d..3c4930b1591 100644 --- a/src/locales/en/berry.ts +++ b/src/locales/en/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts new file mode 100644 index 00000000000..ef15c6c6dcb --- /dev/null +++ b/src/locales/en/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/en/biome.ts b/src/locales/en/biome.ts index 5631b91b836..d3f34c021d4 100644 --- a/src/locales/en/biome.ts +++ b/src/locales/en/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "Somewhere you can\'t remember", diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts index 7401104e1a3..a40f05a0843 100644 --- a/src/locales/en/challenges.ts +++ b/src/locales/en/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales.js"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Challenge Modifiers", - "start": "Start", - "illegalEvolution": "{{pokemon}} changed into an ineligble pokemon\nfor this challenge!", - "singleGeneration.name": "Mono Gen", - "singleGeneration.value.0": "Off", - "singleGeneration.desc.0": "You can only use pokemon from the chosen generation.", - "singleGeneration.value.1": "Gen 1", - "singleGeneration.desc.1": "You can only use pokemon from generation one.", - "singleGeneration.value.2": "Gen 2", - "singleGeneration.desc.2": "You can only use pokemon from generation two.", - "singleGeneration.value.3": "Gen 3", - "singleGeneration.desc.3": "You can only use pokemon from generation three.", - "singleGeneration.value.4": "Gen 4", - "singleGeneration.desc.4": "You can only use pokemon from generation four.", - "singleGeneration.value.5": "Gen 5", - "singleGeneration.desc.5": "You can only use pokemon from generation five.", - "singleGeneration.value.6": "Gen 6", - "singleGeneration.desc.6": "You can only use pokemon from generation six.", - "singleGeneration.value.7": "Gen 7", - "singleGeneration.desc.7": "You can only use pokemon from generation seven.", - "singleGeneration.value.8": "Gen 8", - "singleGeneration.desc.8": "You can only use pokemon from generation eight.", - "singleGeneration.value.9": "Gen 9", - "singleGeneration.desc.9": "You can only use pokemon from generation nine.", - "singleType.name": "Mono Type", - "singleType.value.0": "Off", - "singleType.desc.0": "You can only use pokemon of the chosen type.", - "singleType.value.1": "Normal", - "singleType.desc.1": "You can only use pokemon with the Normal type.", - "singleType.value.2": "Fighting", - "singleType.desc.2": "You can only use pokemon with the Fighting type.", - "singleType.value.3": "Flying", - "singleType.desc.3": "You can only use pokemon with the Flying type.", - "singleType.value.4": "Poison", - "singleType.desc.4": "You can only use pokemon with the Poison type.", - "singleType.value.5": "Ground", - "singleType.desc.5": "You can only use pokemon with the Ground type.", - "singleType.value.6": "Rock", - "singleType.desc.6": "You can only use pokemon with the Rock type.", - "singleType.value.7": "Bug", - "singleType.desc.7": "You can only use pokemon with the Bug type.", - "singleType.value.8": "Ghost", - "singleType.desc.8": "You can only use pokemon with the Ghost type.", - "singleType.value.9": "Steel", - "singleType.desc.9": "You can only use pokemon with the Steel type.", - "singleType.value.10": "Fire", - "singleType.desc.10": "You can only use pokemon with the Fire type.", - "singleType.value.11": "Water", - "singleType.desc.11": "You can only use pokemon with the Water type.", - "singleType.value.12": "Grass", - "singleType.desc.12": "You can only use pokemon with the Grass type.", - "singleType.value.13": "Electric", - "singleType.desc.13": "You can only use pokemon with the Electric type.", - "singleType.value.14": "Psychic", - "singleType.desc.14": "You can only use pokemon with the Psychic type.", - "singleType.value.15": "Ice", - "singleType.desc.15": "You can only use pokemon with the Ice type.", - "singleType.value.16": "Dragon", - "singleType.desc.16": "You can only use pokemon with the Dragon type.", - "singleType.value.17": "Dark", - "singleType.desc.17": "You can only use pokemon with the Dark type.", - "singleType.value.18": "Fairy", - "singleType.desc.18": "You can only use pokemon with the Fairy type.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Mono Gen", + "desc": "You can only use Pokémon from Generation {{gen}}.", + "desc_default": "You can only use Pokémon from the chosen generation.", + "gen_1": "one", + "gen_2": "two", + "gen_3": "three", + "gen_4": "four", + "gen_5": "five", + "gen_6": "six", + "gen_7": "seven", + "gen_8": "eight", + "gen_9": "nine", + }, + "singleType": { + "name": "Mono Type", + "desc": "You can only use Pokémon with the {{type}} type.", + "desc_default": "You can only use Pokémon of the chosen type." + //types in pokemon-info + }, } as const; diff --git a/src/locales/en/command-ui-handler.ts b/src/locales/en/command-ui-handler.ts index b5a87b72ffd..c4c65db0aa0 100644 --- a/src/locales/en/command-ui-handler.ts +++ b/src/locales/en/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Fight", diff --git a/src/locales/en/common.ts b/src/locales/en/common.ts new file mode 100644 index 00000000000..82966b4ffeb --- /dev/null +++ b/src/locales/en/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Start", +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 89f809b266d..1d40e61bbad 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -1,9 +1,12 @@ +import { common } from "./common.js"; +import { settings } from "./settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -27,6 +30,7 @@ import { menuUiHandler } from "./menu-ui-handler"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; +import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; import { pokemonInfo } from "./pokemon-info"; @@ -34,11 +38,11 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; export const enConfig = { ability: ability, @@ -46,9 +50,11 @@ export const enConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -69,18 +75,20 @@ export const enConfig = { modifierType: modifierType, move: move, nature: nature, + partyUiHandler: partyUiHandler, pokeball: pokeball, pokemon: pokemon, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, weather: weather, - partyUiHandler: partyUiHandler }; diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index abf95193bc9..dda8891b788 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -1,4 +1,4 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/plugins/i18n"; +import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -447,7 +447,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "My old associates need me... Are you going to get in my way?" }, "victory": { - 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + 1: "How is this possible...? The precious dream of Team Rocket has become little more than an illusion..." }, "defeat": { 1: "Team Rocket will be reborn again, and I will rule the world!" @@ -466,7 +466,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "magma_boss_maxie_2": { "encounter": { - 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + 1: `You are the final obstacle remaining between me and my goals. + $Brace yourself for my ultimate attack! Fuhahaha!` }, "victory": { 1: "This... This is not.. Ngh..." @@ -477,7 +478,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "aqua_boss_archie_1": { "encounter": { - 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + 1: "I'm the leader of Team Aqua, so I'm afraid it's the rope's end for you." }, "victory": { 1: "Let's meet again somewhere. I'll be sure to remember that face." @@ -499,7 +500,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_1": { "encounter": { - 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + 1: `You were compelled to come here by such vacuous sentimentality. + $I will make you regret paying heed to your heart!` }, "victory": { 1: "Interesting. And quite curious." @@ -510,7 +512,8 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "galactic_boss_cyrus_2": { "encounter": { - 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + 1: `So we meet again. It seems our fates have become intertwined. + $But here and now, I will finally break that bond!` }, "victory": { 1: "How? How? HOW?!" @@ -1641,7 +1644,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: `Just a moment, please. The book I'm reading has nearly reached its thrilling climax… $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` + $Let me see if you'll achieve as much glory as the hero of my book!` }, "victory": { 1: "I see… It appears you've put me in checkmate." @@ -2287,6 +2290,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "You got caught in my storm! Better luck next time!" } }, + "alder": { + "encounter": { + 1: "Prepare yourself for a match against the strongest Trainer in Unova!" + }, + "victory": { + 1: "Well done! You certainly are an unmatched talent." + }, + "defeat": { + 1: `A fresh wind blows through my heart... + $What an extraordinary effort!` + } + }, + "kieran": { + "encounter": { + 1: `Through hard work, I become stronger and stronger! + $I don't lose.` + }, + "victory": { + 1: `I don't believe it... + $What a fun and heart-pounding battle!` + }, + "defeat": { + 1: `Wowzers, what a battle! + $Time for you to train even harder.` + } + }, "rival": { "encounter": { 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index b9ed9a71fd1..b6e13d26213 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Egg", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "You don't have enough vouchers!", "tooManyEggs": "You have too many eggs!", "pull": "Pull", - "pulls": "Pulls" + "pulls": "Pulls", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "{{pokemonName}} hatched from the egg!", + "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", + "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", } as const; diff --git a/src/locales/en/fight-ui-handler.ts b/src/locales/en/fight-ui-handler.ts index a73c5c6d3d6..8ceb503c34a 100644 --- a/src/locales/en/fight-ui-handler.ts +++ b/src/locales/en/fight-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", diff --git a/src/locales/en/game-mode.ts b/src/locales/en/game-mode.ts index be342b4c390..903f1a63072 100644 --- a/src/locales/en/game-mode.ts +++ b/src/locales/en/game-mode.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "Classic", diff --git a/src/locales/en/game-stats-ui-handler.ts b/src/locales/en/game-stats-ui-handler.ts index 64e4e2af5e3..06b2211b0dd 100644 --- a/src/locales/en/game-stats-ui-handler.ts +++ b/src/locales/en/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "Stats", diff --git a/src/locales/en/growth.ts b/src/locales/en/growth.ts index ea4dad72240..410355b143b 100644 --- a/src/locales/en/growth.ts +++ b/src/locales/en/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Erratic", diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index 5958981968b..97d6e38a099 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Game Settings", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Import Data", "exportData": "Export Data", "cancel": "Cancel", - "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?" + "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 03b8f22332d..47d19bd56b6 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "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.", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "Daily Rankings", "weeklyRankings": "Weekly Rankings", "noRankings": "No Rankings", + "positionIcon": "#", + "usernameScoreboard": "Username", + "score": "Score", + "wave": "Wave", "loading": "Loading…", "loadingAsset": "Loading asset: {{assetName}}", "playersOnline": "Players Online", "yes":"Yes", "no":"No", "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed." + "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 87d4a0ccf4f..09d9baea6fb 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Soothe Bell" }, + "EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, + "SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, "NUGGET": { name: "Nugget" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Endure Token" }, "ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Light Ball", description: "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." }, + "THICK_CLUB": { name: "Thick Club", description: "This hard bone of unknown origin boosts Cubone or Marowak's Attack stat." }, + "METAL_POWDER": { name: "Metal Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." }, + "QUICK_POWDER": { name: "Quick Powder", description: "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." } + }, TempBattleStatBoosterItem: { "x_attack": "X Attack", "x_defense": "X Defense", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "X Accuracy", "dire_hit": "Dire Hit", }, + + TempBattleStatBoosterStatName: { + "ATK": "Attack", + "DEF": "Defense", + "SPATK": "Sp. Atk", + "SPDEF": "Sp. Def", + "SPD": "Speed", + "ACC": "Accuracy", + "CRIT": "Critical Hit Ratio", + "EVA": "Evasiveness", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "Silk Scarf", "black_belt": "Black Belt", diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts index 50f21186e2d..b9a8836dfec 100644 --- a/src/locales/en/move.ts +++ b/src/locales/en/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { diff --git a/src/locales/en/nature.ts b/src/locales/en/nature.ts index 983252b9802..9ab26f3eb2a 100644 --- a/src/locales/en/nature.ts +++ b/src/locales/en/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Hardy", diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts index 9d3c7baa9ae..b7eac04b4c8 100644 --- a/src/locales/en/party-ui-handler.ts +++ b/src/locales/en/party-ui-handler.ts @@ -1,6 +1,7 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { + "ALL": "All", "SEND_OUT": "Send Out", "SUMMARY": "Summary", "CANCEL": "Cancel", diff --git a/src/locales/en/pokeball.ts b/src/locales/en/pokeball.ts index 6d69911efeb..01017cac46d 100644 --- a/src/locales/en/pokeball.ts +++ b/src/locales/en/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Poké Ball", diff --git a/src/locales/en/pokemon-info-container.ts b/src/locales/en/pokemon-info-container.ts index 6b3ef954f58..0d37b2ead62 100644 --- a/src/locales/en/pokemon-info-container.ts +++ b/src/locales/en/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "Moveset", diff --git a/src/locales/en/pokemon-info.ts b/src/locales/en/pokemon-info.ts index b9a24d7e449..f31fdac69ab 100644 --- a/src/locales/en/pokemon-info.ts +++ b/src/locales/en/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "Sp. Def", "SPDEFshortened": "SpDef", "SPD": "Speed", - "SPDshortened": "Spd" + "SPDshortened": "Spd", + "ACC": "Accuracy", + "EVA": "Evasiveness" }, Type: { diff --git a/src/locales/en/pokemon.ts b/src/locales/en/pokemon.ts index 61c2d809082..297bbcc3975 100644 --- a/src/locales/en/pokemon.ts +++ b/src/locales/en/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bulbasaur", diff --git a/src/locales/en/save-slot-select-ui-handler.ts b/src/locales/en/save-slot-select-ui-handler.ts index 5aaa675fc4d..f4efa3de734 100644 --- a/src/locales/en/save-slot-select-ui-handler.ts +++ b/src/locales/en/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Overwrite the data in the selected slot?", diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts new file mode 100644 index 00000000000..f68a649269f --- /dev/null +++ b/src/locales/en/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Boy", + "girl": "Girl", + "general": "General", + "display": "Display", + "audio": "Audio", + "gamepad": "Gamepad", + "keyboard": "Keyboard", + "gameSpeed": "Game Speed", + "hpBarSpeed": "HP Bar Speed", + "expGainsSpeed": "EXP Gains Speed", + "expPartyDisplay": "Show EXP Party", + "skipSeenDialogues": "Skip Seen Dialogues", + "battleStyle": "Battle Style", + "enableRetries": "Enable Retries", + "tutorials": "Tutorials", + "touchControls": "Touch Controls", + "vibrations": "Vibrations", + "normal": "Normal", + "fast": "Fast", + "faster": "Faster", + "skip": "Skip", + "levelUpNotifications": "Level Up Notifications", + "on": "On", + "off": "Off", + "switch": "Switch", + "set": "Set", + "auto": "Auto", + "disabled": "Disabled", + "language": "Language", + "change": "Change", + "uiTheme": "UI Theme", + "default": "Default", + "legacy": "Legacy", + "windowType": "Window Type", + "moneyFormat": "Money Format", + "damageNumbers": "Damage Numbers", + "simple": "Simple", + "fancy": "Fancy", + "abbreviated": "Abbreviated", + "moveAnimations": "Move Animations", + "showStatsOnLevelUp": "Show Stats on Level Up", + "candyUpgradeNotification": "Candy Upgrade Notification", + "passivesOnly": "Passives Only", + "candyUpgradeDisplay": "Candy Upgrade Display", + "icon": "Icon", + "animation": "Animation", + "moveInfo": "Move Info", + "showMovesetFlyout": "Show Moveset Flyout", + "showArenaFlyout": "Show Arena Flyout", + "showTimeOfDayWidget": "Show Time of Day Widget", + "timeOfDayAnimation": "Time of Day Animation", + "bounce": "Bounce", + "timeOfDay_back": "Back", + "spriteSet": "Sprite Set", + "consistent": "Consistent", + "mixedAnimated": "Mixed Animated", + "fusionPaletteSwaps": "Fusion Palette Swaps", + "playerGender": "Player Gender", + "typeHints": "Type Hints", + "masterVolume": "Master Volume", + "bgmVolume": "BGM Volume", + "seVolume": "SE Volume", + "musicPreference": "Music Preference", + "mixed": "Mixed", + "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", + "delete": "Delete", + "keyboardPleasePress": "Please Press a Key on Your Keyboard", + "reset": "Reset", + "requireReload": "Reload Required", + "action": "Action", + "back": "Back", + "pressToBind": "Press to Bind", + "pressButton": "Press a Button...", + "buttonUp": "Up", + "buttonDown": "Down", + "buttonLeft": "Left", + "buttonRight": "Right", + "buttonAction": "Action", + "buttonMenu": "Menu", + "buttonSubmit": "Submit", + "buttonCancel": "Cancel", + "buttonStats": "Stats", + "buttonCycleForm": "Cycle Form", + "buttonCycleShiny": "Cycle Shiny", + "buttonCycleGender": "Cycle Gender", + "buttonCycleAbility": "Cycle Ability", + "buttonCycleNature": "Cycle Nature", + "buttonCycleVariant": "Cycle Variant", + "buttonSpeedUp": "Speed Up", + "buttonSlowDown": "Slow Down", + "alt": " (Alt)", + "mute": "Mute", + "controller": "Controller", + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", +} as const; diff --git a/src/locales/en/splash-messages.ts b/src/locales/en/splash-messages.ts index d8400111060..17eafc2d6d6 100644 --- a/src/locales/en/splash-messages.ts +++ b/src/locales/en/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "Battles Won!", diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index fd2eb6c40df..ac59785bab7 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passive:", "nature": "Nature:", "eggMoves": "Egg Moves", - "start": "Start", "addToParty": "Add to Party", "toggleIVs": "Toggle IVs", "manageMoves": "Manage Moves", + "manageNature": "Manage Nature", "useCandies": "Use Candies", + "selectNature": "Select nature.", "selectMoveSwapOut": "Select a move to swap out.", "selectMoveSwapWith": "Select a move to swap with", "unlockPassive": "Unlock Passive", "reduceCost": "Reduce Cost", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Form", "cycleGender": ": Gender", diff --git a/src/locales/en/status-effect.ts b/src/locales/en/status-effect.ts new file mode 100644 index 00000000000..162b2ada281 --- /dev/null +++ b/src/locales/en/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}}!\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 39ca5f7512c..b59cfdc4fda 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { diff --git a/src/locales/en/tutorial.ts b/src/locales/en/tutorial.ts index 6361bd7d25f..3c4aa2b46f6 100644 --- a/src/locales/en/tutorial.ts +++ b/src/locales/en/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `Welcome to PokéRogue! This is a battle-focused Pokémon fangame with roguelite elements. diff --git a/src/locales/en/voucher.ts b/src/locales/en/voucher.ts index f2bcb8d723c..57db5fe767f 100644 --- a/src/locales/en/voucher.ts +++ b/src/locales/en/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Vouchers", @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Egg Voucher Gold", "locked": "Locked", "defeatTrainer": "Defeat {{trainerName}}" -} as const; +} as const; diff --git a/src/locales/en/weather.ts b/src/locales/en/weather.ts index 513c2181b00..f50c1ee907e 100644 --- a/src/locales/en/weather.ts +++ b/src/locales/en/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index e6dde7ad79f..5c09c3832c0 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -1,8 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "¡{{abilityName}} de {{pokemonName}}\nlo protegió del daño de retroceso!", "badDreams": "¡{{pokemonName}} está atormentado!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", - "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!" + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/es/ability.ts b/src/locales/es/ability.ts index 56f3afe6b02..d89bc6fa3cc 100644 --- a/src/locales/es/ability.ts +++ b/src/locales/es/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { "stench": { diff --git a/src/locales/es/achv.ts b/src/locales/es/achv.ts index 8d9ebc7d457..47348903b28 100644 --- a/src/locales/es/achv.ts +++ b/src/locales/es/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { diff --git a/src/locales/es/battle-message-ui-handler.ts b/src/locales/es/battle-message-ui-handler.ts index e1668d1b5f6..cfc913f4b50 100644 --- a/src/locales/es/battle-message-ui-handler.ts +++ b/src/locales/es/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Inmejorable", diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index 2b5f725caf2..7f5832d069d 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "¡{{bossName}} te corta el paso!", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", "moneyWon": "¡Has ganado\n₽{{moneyAmount}} por vencer!", "pokemonCaught": "¡{{pokemonName}} atrapado!", + "addedAsAStarter": "{{pokemonName}} ha sido añadido\na tus iniciales!", "partyFull": "Tu equipo esta completo.\n¿Quieres liberar un Pokémon para meter a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "¡Adelante, {{pokemonName}}!", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "¡KO en 1 golpe!", "attackFailed": "¡Pero ha fallado!", "attackHitsCount": "N.º de golpes: {{count}}.", + "rewardGain": "¡Has obtenido\n{{modifierName}}!", "expGain": "{{pokemonName}} ha ganado\n{{exp}} puntos de experiencia.", "levelUp": "¡{{pokemonName}} ha subido al \nNv. {{level}}!", "learnMove": "¡{{pokemonName}} ha aprendido {{moveName}}!", @@ -53,6 +55,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiar", "escapeVerbFlee": "huir", "notDisabled": "¡El movimiento {{moveName}} de {{pokemonName}}\nya no está anulado!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "¿Estás seguro de que no quieres coger un objeto?", "eggHatching": "¿Y esto?", "ivScannerUseQuestion": "¿Quieres usar el Escáner de IVs en {{pokemonName}}?", @@ -61,5 +65,72 @@ export const battle: SimpleTranslationEntries = { "useMove": "¡{{pokemonNameWithAffix}} usó {{moveName}}!", "drainMessage": "¡{{pokemonName}} tuvo su\nenergía absorbida!", "regainHealth": "¡{{pokemonName}} recuperó\nPS!", - "fainted": "¡{{pokemonNameWithAffix}} se debilitó!" + "stealEatBerry": "¡{{pokemonName}} robó la {{berryName}}\nde {{targetName}} y se la comió!", + "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", + "statRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", + "statSharplyRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", + "statRoseDrastically": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", + "statWontGoAnyHigher": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", + "statFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", + "statHarshlyFell": "¡El {{stats}} de {{pokemonNameWithAffix}}} ha bajado mucho!", + "statSeverelyFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", + "statWontGoAnyLower": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", + "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} was freed\nfrom {{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} flinched!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} became\nconfused!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} snapped\nout of confusion!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} is\nalready confused!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} is\nconfused!", + "battlerTagsConfusedLapseHurtItself": "It hurt itself in its\nconfusion!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} is unaffected\nby the effects of Destiny Bond.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} took\n{{pokemonNameWithAffix2}} down with it!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} fell in love\nwith {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} is\nalready in love!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} is in love\nwith {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} is\nimmobilized by love!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} got over\nits infatuation.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} was seeded!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}'s health is\nsapped by Leech Seed!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}'s Leech Seed\nsucked up the liquid ooze!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} began\nhaving a Nightmare!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} is\nalready locked in a Nightmare!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} is locked\nin a Nightmare!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} got\nan Encore!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}'s Encore\nended!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} is ready to\nhelp {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbed\nnutrients with its roots!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} planted its roots!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} surrounded\nitself with a veil of water!", + "battlerTagsAquaRingLapse": "{{moveName}} restored\n{{pokemonName}}'s HP!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} grew drowsy!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} is hurt\nby {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} was squeezed by\n{{sourcePokemonName}}'s {{moveName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} was Wrapped\nby {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} was trapped\nin the vortex!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} Clamped\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} became trapped\nby {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} became trapped\nby swirling magma!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} got trapped\nby a snap trap!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} trapped\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} has been afflicted \nwith an infestation by {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nprotected itself!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nprotected itself!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} braced\nitself!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", + "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" } as const; diff --git a/src/locales/es/berry.ts b/src/locales/es/berry.ts index d2d891ea19c..0bebdf43c13 100644 --- a/src/locales/es/berry.ts +++ b/src/locales/es/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts new file mode 100644 index 00000000000..cda6fba84f4 --- /dev/null +++ b/src/locales/es/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Música", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!", + "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!", + "battle_hoenn_champion": "B2W2 - ¡Vs Campeón de Hoenn!", + "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!", + "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!", + "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!", + "battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!", + "battle_alola_champion": "USUM - ¡Vs Campeón de Alola!", + "battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!", + "battle_champion_geeta": "SV - ¡Vs Campeona Ságita!", + "battle_champion_nemona": "SV - ¡Vs Campeona Mencía!", + "battle_champion_kieran": "SV - ¡Vs Campeón Cass!", + "battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!", + "battle_unova_elite": "BW - ¡Vs Alto Mando!", + "battle_kalos_elite": "XY - ¡Vs Alto Mando!", + "battle_alola_elite": "SM - ¡Vs Alto Mando!", + "battle_galar_elite": "SWSH - Torneo de Finalistas", + "battle_paldea_elite": "SV - ¡Vs Alto Mando!", + "battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!", + "battle_final_encounter": "PMD RTDX - Dominio de Rayquaza", + "battle_final": "BW - ¡Vs Ghechis!", + "battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!", + "battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!", + "battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!", + "battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!", + "battle_unova_gym": "BW - ¡Vs Líder de Teselia!", + "battle_kalos_gym": "XY - ¡Vs Líder de Kalos!", + "battle_galar_gym": "SWSH - ¡Vs Líder de Galar!", + "battle_paldea_gym": "SV - ¡Vs Líder de Paldea!", + "battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!", + "battle_legendary_raikou": "HGSS - ¡Vs Raikou!", + "battle_legendary_entei": "HGSS - ¡Vs Entei!", + "battle_legendary_suicune": "HGSS - ¡Vs Suicune!", + "battle_legendary_lugia": "HGSS - ¡Vs Lugia!", + "battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!", + "battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!", + "battle_legendary_regis_g6": "ORAS - ¡Vs Regis!", + "battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!", + "battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!", + "battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!", + "battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!", + "battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!", + "battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!", + "battle_legendary_giratina": "ORAS - ¡Vs Giratina!", + "battle_legendary_arceus": "HGSS - ¡Vs Arceus!", + "battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!", + "battle_legendary_kyurem": "BW - ¡Vs Kyurem!", + "battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!", + "battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!", + "battle_legendary_tapu": "SM - ¡Vs Tapus!", + "battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!", + "battle_legendary_ub": "SM - ¡Vs Ultraentes!", + "battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!", + "battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!", + "battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!", + "battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!", + "battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!", + "battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!", + "battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV - ¡Vs Compatrones!", + "battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!", + "battle_legendary_terapagos": "SV - ¡Vs Terapagos!", + "battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!", + "battle_rival": "BW - ¡Vs Rival!", + "battle_rival_2": "BW - ¡Vs N!", + "battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!", + "battle_trainer": "BW - ¡Vs Entrenador!", + "battle_wild": "BW - ¡Vs Pokémon Salvaje!", + "battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!", + "end_summit": "PMD RTDX - Techo del Cielo", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS - Cráter Oscuro", + "badlands": "PMD EoS - Valle Desolado", + "beach": "PMD EoS - Risco Calado", + "cave": "PMD EoS - Cueva de la Cumbre del Cielo", + "construction_site": "PMD EoS - Roquedal", + "desert": "PMD EoS - Desierto Norte", + "dojo": "PMD EoS - Dojo Marowak", + "end": "PMD RTDX - Torre del Cielo", + "factory": "PMD EoS - Ruinas Camufladas", + "fairy_cave": "PMD EoS - Cueva Estrella", + "forest": "PMD EoS - Bosque Sombrío", + "grass": "PMD EoS - Manzanar", + "graveyard": "PMD EoS - Bosque Misterio", + "ice_cave": "PMD EoS - Gran Iceberg", + "island": "PMD EoS - Costa Escarpada", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS - Cueva Cristal", + "meadow": "PMD EoS - Bosque de la Cumbre del Cielo", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS - Monte Cuerno", + "plains": "PMD EoS - Pradera de la Cumbre del Cielo", + "power_plant": "PMD EoS - Pradera Destello", + "ruins": "PMD EoS - Sima Hermética", + "sea": "PMD EoS - Cueva Aguamar", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS - Costa de la Cumbre del Cielo", + "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", + "space": "Firel - Aether", + "swamp": "PMD EoS - Mar Circundante", + "tall_grass": "PMD EoS - Bosque Niebla", + "temple": "PMD EoS - Cueva Regia", + "town": "PMD EoS - Tema del territorio aleatorio 3", + "volcano": "PMD EoS - Cueva Vapor", + "wasteland": "PMD EoS - Corazón Tierra Oculta", + + // Encounter + "encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)", + "encounter_backpacker": "BW - Desafío Combate (Mochilero)", + "encounter_clerk": "BW - Desafío Combate (Empresario)", + "encounter_cyclist": "BW - Desafío Combate (Ciclista)", + "encounter_lass": "BW - Desafío Combate (Chica)", + "encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)", + "encounter_pokefan": "BW - Desafío Combate (Pokéfan)", + "encounter_psychic": "BW - Desafío Combate (Médium)", + "encounter_rich": "BW - Desafío Combate (Aristócrata)", + "encounter_rival": "BW - Desafío Combate (Cheren)", + "encounter_roughneck": "BW - Desafío Combate (Calvo)", + "encounter_scientist": "BW - Desafío Combate (Científico)", + "encounter_twins": "BW - Desafío Combate (Gemelas)", + "encounter_youngster": "BW - Desafío Combate (Joven)", + + // Other + "heal": "BW - Cura Pokémon", + "menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!", + "title": "PMD EoS - Tema del menú principal", +} as const; diff --git a/src/locales/es/biome.ts b/src/locales/es/biome.ts index 7e34c5285e5..a0b861b57f5 100644 --- a/src/locales/es/biome.ts +++ b/src/locales/es/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "En algún lugar que no puedes recordar", diff --git a/src/locales/es/challenges.ts b/src/locales/es/challenges.ts index 6c994e5f4b3..711be39b116 100644 --- a/src/locales/es/challenges.ts +++ b/src/locales/es/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Parámetros de Desafíos", - "points": "Malas Ideas", - "confirm_start": "¿Continuar con estos desafíos?", - "singleGeneration.name": "Monogeneración", - "singleGeneration.value.0": "No", - "singleGeneration.desc.0": "Solo puedes usar Pokémon de la generación elegida.", - "singleGeneration.value.1": "Gen 1", - "singleGeneration.desc.1": "Solo puedes usar Pokémon de primera generación.", - "singleGeneration.value.2": "Gen 2", - "singleGeneration.desc.2": "Solo puedes usar Pokémon de segunda generación.", - "singleGeneration.value.3": "Gen 3", - "singleGeneration.desc.3": "Solo puedes usar Pokémon de tercera generación.", - "singleGeneration.value.4": "Gen 4", - "singleGeneration.desc.4": "Solo puedes usar Pokémon de cuarta generación.", - "singleGeneration.value.5": "Gen 5", - "singleGeneration.desc.5": "Solo puedes usar Pokémon de quinta generación.", - "singleGeneration.value.6": "Gen 6", - "singleGeneration.desc.6": "Solo puedes usar Pokémon de sexta generación.", - "singleGeneration.value.7": "Gen 7", - "singleGeneration.desc.7": "Solo puedes usar Pokémon de séptima generación.", - "singleGeneration.value.8": "Gen 8", - "singleGeneration.desc.8": "Solo puedes usar Pokémon de octava generación.", - "singleGeneration.value.9": "Gen 9", - "singleGeneration.desc.9": "Solo puedes usar Pokémon de novena generación.", - "singleType.name": "Monotipo", - "singleType.value.0": "No", - "singleType.desc.0": "Solo puedes usar Pokémon del tipo elegido", - "singleType.value.1": "Normal", - "singleType.desc.1": "Solo puedes usar Pokémon de tipo Normal.", - "singleType.value.2": "Lucha", - "singleType.desc.2": "Solo puedes usar Pokémon de tipo Lucha.", - "singleType.value.3": "Volador", - "singleType.desc.3": "Solo puedes usar Pokémon de tipo Volador.", - "singleType.value.4": "Veneno", - "singleType.desc.4": "Solo puedes usar Pokémon de tipo Veneno.", - "singleType.value.5": "Tierra", - "singleType.desc.5": "Solo puedes usar Pokémon de tipo Tierra.", - "singleType.value.6": "Roca", - "singleType.desc.6": "Solo puedes usar Pokémon de tipo Roca.", - "singleType.value.7": "Bicho", - "singleType.desc.7": "Solo puedes usar Pokémon de tipo Bicho.", - "singleType.value.8": "Fantasma", - "singleType.desc.8": "Solo puedes usar Pokémon de tipo Fantasma.", - "singleType.value.9": "Acero", - "singleType.desc.9": "Solo puedes usar Pokémon de tipo Acero.", - "singleType.value.10": "Fuego", - "singleType.desc.10": "Solo puedes usar Pokémon de tipo Fuego.", - "singleType.value.11": "Agua", - "singleType.desc.11": "Solo puedes usar Pokémon de tipo Agua.", - "singleType.value.12": "Planta", - "singleType.desc.12": "Solo puedes usar Pokémon de tipo Planta.", - "singleType.value.13": "Eléctrico", - "singleType.desc.13": "Solo puedes usar Pokémon de tipo Eléctrico.", - "singleType.value.14": "Psíquico", - "singleType.desc.14": "Solo puedes usar Pokémon de tipo Psíquico.", - "singleType.value.15": "Hielo", - "singleType.desc.15": "Solo puedes usar Pokémon de tipo Hielo.", - "singleType.value.16": "Dragón", - "singleType.desc.16": "Solo puedes usar Pokémon de tipo Dragón.", - "singleType.value.17": "Siniestro", - "singleType.desc.17": "Solo puedes usar Pokémon de tipo Siniestro.", - "singleType.value.18": "Hada", - "singleType.desc.18": "Solo puedes usar Pokémon de tipo Hada.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Monogeneración", + "desc": "Solo puedes usar Pokémon de {{gen}} generación.", + "desc_default": "Solo puedes usar Pokémon de la generación elegida.", + "gen_1": "primera", + "gen_2": "segunda", + "gen_3": "tercera", + "gen_4": "cuarta", + "gen_5": "quinta", + "gen_6": "sexta", + "gen_7": "séptima", + "gen_8": "octava", + "gen_9": "novena", + }, + "singleType": { + "name": "Monotipo", + "desc": "Solo puedes usar Pokémon with the {{type}} type.", + "desc_default": "Solo puedes usar Pokémon del tipo elegido.", + }, } as const; diff --git a/src/locales/es/command-ui-handler.ts b/src/locales/es/command-ui-handler.ts index 89dddb84a06..5ddde2c983a 100644 --- a/src/locales/es/command-ui-handler.ts +++ b/src/locales/es/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Luchar", diff --git a/src/locales/es/common.ts b/src/locales/es/common.ts new file mode 100644 index 00000000000..82966b4ffeb --- /dev/null +++ b/src/locales/es/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Start", +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 8b482de5c78..551c7a2f6dc 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const esConfig = { ability: ability, @@ -46,9 +50,11 @@ export const esConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const esConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/es/dialogue.ts b/src/locales/es/dialogue.ts index b27f5a7570c..c1b23b57fe0 100644 --- a/src/locales/es/dialogue.ts +++ b/src/locales/es/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Creo que soy yo quien está mareado..." }, }, + "rocket_grunt": { + "encounter": { + 1: "¡Ríndete ahora, o prepárate para luchar!" + }, + "victory": { + 1: "¡El Team Rocket despega de nuevo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "¡No esperes piedad si te interpones al Team Magma!" + }, + "victory": { + 1: "¿Eh? ¿He perdido?" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "El Team Aqua no muestra piedad, ¡ni siquiera a los niños!" + }, + "victory": { + 1: "¡Bromeas! ¡No me lo creo!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "¡No desafíes al Equipo Galaxia, te arrepentirás!" + }, + "victory": { + 1: "Me callaste la boca..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "¡El Equipo Plasma no tolerará otros ideales!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "¡La moda es lo más importante para nosotros!" + }, + "victory": { + 1: "Me temo que se me avecina un futuro oscuro..." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "He de decir... estoy impresionado de que hayas llegado tan lejos." + }, + "victory": { + 1: "¿¡QUÉ?! ¡No puede ser!" + }, + "defeat": { + 1: "Recuerda mis palabras: Que no seas capaz de medir\n tu propia fuerza demuestra que todavía eres un niño" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mis antiguos socios me necesitan... ¿te atreves a imponerte en mi camino?" + }, + "victory": { + 1: "¿Cómo es esto posible?\nEl sueño del Team Rocket, ahora tan solo una mera ilusión..." + }, + "defeat": { + 1: "El Team Rocket renacerá... ¡y gobernaré el mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Está bien, tendré que cavar yo mismo tu propia tumba. Siéntete orgulloso." + }, + "victory": { + 1: "Ugh! Eres... muy capaz...\nFue por poco, estuve a esto de ganarte..." + }, + "defeat": { + 1: "¡El Equipo Magma prevalecerá!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Eres el obstáculo final entre mi y mis propósitos.\n¡Aquí va mi mejor golpe! ¡MUAJAJAJA!" + }, + "victory": { + 1: "No... no es posib... nnngh..." + }, + "defeat": { + 1: "Y ahora... transformaré este planeta en una tierra ideal para la humanidad." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Soy el líder del Equipo Aqua, así que me temo que aquí se acaba tu bromita." + }, + "victory": { + 1: "Volvamos a vernos más tarde. Recordaré tu cara." + }, + "defeat": { + 1: "¡Excelente! ¡Nadie se puede oponer a mi equipo!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Llevo esperando mucho que llegara este día.\n¡Contempla el poder de mi equipo!" + }, + "victory": { + 1: "Quién me lo iba a decir..." + }, + "defeat": { + 1: "Devolveré todo en este planeta a su estado original.\nSe avecina un nuevo mundo, ¡más puro!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu fútil sentimentalidad te hizo interferir.\n¡Haré que te arrepientas de escuchar a tu corazón!" + }, + "victory": { + 1: "Interesante. Muy... curioso." + }, + "defeat": { + 1: "Crearé un nuevo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos vemos de nuevo... se ve que nuestros destinos están entrelazados.\nPero, aquí y ahora, ¡sesgaré ese vínculo!" + }, + "victory": { + 1: "¿Cómo? ¿¡Cómo!? ¿¡¡CÓMO!!?" + }, + "defeat": { + 1: "Hasta nunca." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "¡No permitiré que nadie me detenga!" + }, + "victory": { + 1: "¿Cómo puede ser esto? ¡yo creé al Equipo Plasma!\n¡Soy PERFECTO!" + }, + "defeat": { + 1: "Soy el perfecto gobernante para un perfecto nuevo mundo. ¡Muajajajaja!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "¡Adelante! ¡Quiero ver tu cara cuando la desesperación se apoderede de ti!" + }, + "victory": { + 1: "Mis planes... ¡no! ¡El mundo debería pertenecerme!" + }, + "defeat": { + 1: "¡Kyurem, Absorfusión... ahora!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "¿Acaso quieres detenerme? Demuéstramelo." + }, + "victory": { + 1: "Estás aquí para detenerme. Pero tendrás que esperar. " + }, + "defeat": { + 1: "Los Pokémon... su fin ha llegado." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "El futuro que quieres tú, o el futuro que quiero yo.\nVeamos cuál de los dos se merece existir..." + }, + "victory": { + 1: "¡AARGH!" + }, + "defeat": { + 1: "Los idiotas sin ningún tipo de visión continuarán asediando este mundo." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -2107,6 +2287,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "You got caught in my storm! Better luck next time!" } }, + "alder": { + "encounter": { + 1: "Prepárate para una batalla contra el entrenador más fuerte en Unova!" + }, + "victory": { + 1: "Bien hecho! Tienes ciertamente un talento inigualable" + }, + "defeat": { + 1: `Un viento fresco sopla a través en mi corazón + $Qué esfuerzo extraordinario!` + } + }, + "kieran": { + "encounter": { + 1: `A través del trabajo duro, me he vuelto más y más fuerte! + $No pierdo.` + }, + "victory": { + 1: `No puedo creerlo... + $¡Qué batalla tan divertida y trepidante!` + }, + "defeat": { + 1: `Asombroso, que batalla! + $Es hora de que entrenes aún más duro.` + } + }, "rival": { "encounter": { 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… diff --git a/src/locales/es/egg.ts b/src/locales/es/egg.ts index cdce119507a..dea466066f1 100644 --- a/src/locales/es/egg.ts +++ b/src/locales/es/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Huevo", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "¡No tienes suficientes vales!", "tooManyEggs": "¡No tienes suficiente espacio!", "pull": "Tirada", - "pulls": "Tiradas" + "pulls": "Tiradas", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "¡Ha salido un {{pokemonName}} del Huevo!", + "eggMoveUnlock": "Mov. Huevo desbloqueado:\n{{moveName}}", + "rareEggMoveUnlock": "Mov. Huevo Raro desbloqueado:\n{{moveName}}", } as const; diff --git a/src/locales/es/fight-ui-handler.ts b/src/locales/es/fight-ui-handler.ts index 6c6afec1daf..70526ce4692 100644 --- a/src/locales/es/fight-ui-handler.ts +++ b/src/locales/es/fight-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", diff --git a/src/locales/es/game-mode.ts b/src/locales/es/game-mode.ts index dcff983791f..bf399b8fc74 100644 --- a/src/locales/es/game-mode.ts +++ b/src/locales/es/game-mode.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "Clásica", diff --git a/src/locales/es/game-stats-ui-handler.ts b/src/locales/es/game-stats-ui-handler.ts index 64e4e2af5e3..06b2211b0dd 100644 --- a/src/locales/es/game-stats-ui-handler.ts +++ b/src/locales/es/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "Stats", diff --git a/src/locales/es/growth.ts b/src/locales/es/growth.ts index a47a4f408bd..c72ea3d76c6 100644 --- a/src/locales/es/growth.ts +++ b/src/locales/es/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Errático", diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index 76972cef19c..bf71c2b390b 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Ajustes", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importar Datos", "exportData": "Exportar Datos", "cancel": "Cancelar", - "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?" + "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index 4bd6d750d69..8176af456e1 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "Sesión cargada con éxito.", "failedToLoadSession": "No se han 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": "¡Anda!\n¡{{pokemonName}} está evolucionando!", "stoppedEvolving": "¿Eh?\n¡La evolución de {{pokemonName}} se ha detenido!", "pauseEvolutionsQuestion": "¿Quieres detener las evoluciones de {{pokemonName}}?\nSiempre pueden ser reactivadas desde la pantalla de tu equipo.", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "Rankings Diarios", "weeklyRankings": "Rankings Semanales", "noRankings": "Sin Rankings", + "positionIcon": "#", + "usernameScoreboard": "Username", + "score": "Score", + "wave": "Wave", "loading": "Cargando…", "loadingAsset": "Cargando recurso: {{assetName}}", "playersOnline": "Jugadores en Línea", "yes":"Sí", "no":"No", "disclaimer": "AVISO", - "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida de datos de guardado),\ncambiar sin avisar, y puede o no puede ser actualizado hasta ser completado." + "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", + "choosePokemon": "Choose a Pokémon.", + "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta,\nel juego se reconectará automáticamente.", } as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index 3c1925eaa67..e7d6e8889fe 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Camp. Alivio" }, + "EVIOLITE": { name: "Mineral Evolutivo", description: "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." }, + "SOUL_DEW": { name: "Rocío bondad", description: "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." }, "NUGGET": { name: "Pepita" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Ficha Aguante" }, "ENEMY_FUSED_CHANCE": { name: "Ficha Fusión", description: "Agrega un 1% de probabilidad de que un Pokémon salvaje sea una fusión." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Bola Luminosa", description: "Asombrosa esfera que aumenta el Ataque y el Ataque Especial. Debe llevarla Pikachu." }, + "THICK_CLUB": { name: "Hueso Grueso", description: "Extraño tipo de hueso que potencia los ataques físicos. Debe llevarlo Cubone o Marowak." }, + "METAL_POWDER": { name: "Polvo Metálico", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Defensa. Debe llevarlo Ditto." }, + "QUICK_POWDER": { name: "Polvo Veloz", description: "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto." } + }, TempBattleStatBoosterItem: { "x_attack": "Ataque X", "x_defense": "Defensa X", @@ -248,6 +256,18 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "Precisión X", "dire_hit": "Crítico X", }, + + TempBattleStatBoosterStatName: { + "ATK": "Attack", + "DEF": "Defense", + "SPATK": "Sp. Atk", + "SPDEF": "Sp. Def", + "SPD": "Speed", + "ACC": "Accuracy", + "CRIT": "Critical Hit Ratio", + "EVA": "Evasiveness", + "DEFAULT": "???", + }, AttackTypeBoosterItem: { "silk_scarf": "Pañuelo Seda", "black_belt": "Cinturón Negro", diff --git a/src/locales/es/move.ts b/src/locales/es/move.ts index 7bf63008aeb..3693e008574 100644 --- a/src/locales/es/move.ts +++ b/src/locales/es/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { pound: { diff --git a/src/locales/es/nature.ts b/src/locales/es/nature.ts index 212ee403bd7..ddeff5aa0ab 100644 --- a/src/locales/es/nature.ts +++ b/src/locales/es/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Fuerte", diff --git a/src/locales/es/party-ui-handler.ts b/src/locales/es/party-ui-handler.ts index 9d3c7baa9ae..894ea14bb12 100644 --- a/src/locales/es/party-ui-handler.ts +++ b/src/locales/es/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { "SEND_OUT": "Send Out", diff --git a/src/locales/es/pokeball.ts b/src/locales/es/pokeball.ts index a38b6d6a047..c9b62cdd9ea 100644 --- a/src/locales/es/pokeball.ts +++ b/src/locales/es/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Poké Ball", diff --git a/src/locales/es/pokemon-info-container.ts b/src/locales/es/pokemon-info-container.ts index 785f5fce275..ad0f951b984 100644 --- a/src/locales/es/pokemon-info-container.ts +++ b/src/locales/es/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "Movimientos", diff --git a/src/locales/es/pokemon-info.ts b/src/locales/es/pokemon-info.ts index 4861ac1f82f..56fd7130c0a 100644 --- a/src/locales/es/pokemon-info.ts +++ b/src/locales/es/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "Def. Esp.", "SPDEFshortened": "DefEsp", "SPD": "Velocidad", - "SPDshortened": "Veloc." + "SPDshortened": "Veloc.", + "ACC": "Accuracy", + "EVA": "Evasiveness" }, Type: { diff --git a/src/locales/es/pokemon.ts b/src/locales/es/pokemon.ts index b230777e033..93f13aed8b0 100644 --- a/src/locales/es/pokemon.ts +++ b/src/locales/es/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bulbasaur", diff --git a/src/locales/es/save-slot-select-ui-handler.ts b/src/locales/es/save-slot-select-ui-handler.ts index 7939518ceed..645afd453a9 100644 --- a/src/locales/es/save-slot-select-ui-handler.ts +++ b/src/locales/es/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "¿Sobrescribir los datos en la ranura seleccionada?", diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts new file mode 100644 index 00000000000..dfd6f097242 --- /dev/null +++ b/src/locales/es/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Chico", + "girl": "Chica", + "general": "General", + "display": "Display", + "audio": "Audio", + "gamepad": "Gamepad", + "keyboard": "Keyboard", + "gameSpeed": "Game Speed", + "hpBarSpeed": "HP Bar Speed", + "expGainsSpeed": "EXP Gains Speed", + "expPartyDisplay": "Show EXP Party", + "skipSeenDialogues": "Skip Seen Dialogues", + "battleStyle": "Battle Style", + "enableRetries": "Enable Retries", + "tutorials": "Tutorials", + "touchControls": "Touch Controls", + "vibrations": "Vibrations", + "normal": "Normal", + "fast": "Fast", + "faster": "Faster", + "skip": "Skip", + "levelUpNotifications": "Level Up Notifications", + "on": "On", + "off": "Off", + "switch": "Switch", + "set": "Set", + "auto": "Auto", + "disabled": "Disabled", + "language": "Language", + "change": "Change", + "uiTheme": "UI Theme", + "default": "Default", + "legacy": "Legacy", + "windowType": "Window Type", + "moneyFormat": "Money Format", + "damageNumbers": "Damage Numbers", + "simple": "Simple", + "fancy": "Fancy", + "abbreviated": "Abbreviated", + "moveAnimations": "Move Animations", + "showStatsOnLevelUp": "Show Stats on Level Up", + "candyUpgradeNotification": "Candy Upgrade Notification", + "passivesOnly": "Passives Only", + "candyUpgradeDisplay": "Candy Upgrade Display", + "icon": "Icon", + "animation": "Animation", + "moveInfo": "Move Info", + "showMovesetFlyout": "Show Moveset Flyout", + "showArenaFlyout": "Show Arena Flyout", + "showTimeOfDayWidget": "Show Time of Day Widget", + "timeOfDayAnimation": "Time of Day Animation", + "bounce": "Bounce", + "timeOfDay_back": "Back", + "spriteSet": "Sprite Set", + "consistent": "Consistent", + "mixedAnimated": "Mixed Animated", + "fusionPaletteSwaps": "Fusion Palette Swaps", + "playerGender": "Player Gender", + "typeHints": "Type Hints", + "masterVolume": "Master Volume", + "bgmVolume": "BGM Volume", + "seVolume": "SE Volume", + "musicPreference": "Music Preference", + "mixed": "Mixed", + "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", + "delete": "Delete", + "keyboardPleasePress": "Please Press a Key on Your Keyboard", + "reset": "Reset", + "requireReload": "Reload Required", + "action": "Action", + "back": "Back", + "pressToBind": "Press to Bind", + "pressButton": "Press a Button...", + "buttonUp": "Up", + "buttonDown": "Down", + "buttonLeft": "Left", + "buttonRight": "Right", + "buttonAction": "Action", + "buttonMenu": "Menu", + "buttonSubmit": "Submit", + "buttonCancel": "Cancel", + "buttonStats": "Stats", + "buttonCycleForm": "Cycle Form", + "buttonCycleShiny": "Cycle Shiny", + "buttonCycleGender": "Cycle Gender", + "buttonCycleAbility": "Cycle Ability", + "buttonCycleNature": "Cycle Nature", + "buttonCycleVariant": "Cycle Variant", + "buttonSpeedUp": "Speed Up", + "buttonSlowDown": "Slow Down", + "alt": " (Alt)", + "mute": "Mute", + "controller": "Controller", + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", +} as const; diff --git a/src/locales/es/splash-messages.ts b/src/locales/es/splash-messages.ts index 665476da1fb..0d6f050be94 100644 --- a/src/locales/es/splash-messages.ts +++ b/src/locales/es/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "¡Batallas ganadas!", diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 4d025820260..14c22e22097 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Pasiva:", "nature": "Natur:", "eggMoves": "Mov. Huevo", - "start": "Iniciar", "addToParty": "Añadir a Equipo", "toggleIVs": "Mostrar IVs", "manageMoves": "Gestionar Movs.", + "manageNature": "Gestionar Natur", "useCandies": "Usar Caramelos", + "selectNature": "Elige Natur.", "selectMoveSwapOut": "Elige el movimiento que sustituir.", "selectMoveSwapWith": "Elige el movimiento que sustituirá a", "unlockPassive": "Añadir Pasiva", "reduceCost": "Reducir Coste", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": Shiny", "cycleForm": ": Forma", "cycleGender": ": Género", diff --git a/src/locales/es/status-effect.ts b/src/locales/es/status-effect.ts new file mode 100644 index 00000000000..975288fc451 --- /dev/null +++ b/src/locales/es/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Ninguno", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamiento", + description: "envenenamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + toxic: { + name: "Envenenamiento grave", + description: "envenenamiento grave", + obtain: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido gravemente envenenado por {{sourceText}}!", + activation: "¡El veneno resta PS a {{pokemonNameWithAffix}}!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá envenenado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá envenenado!" + }, + paralysis: { + name: "Parálisis", + description: "parálisis", + obtain: "¡{{pokemonNameWithAffix}} sufre parálisis!\nQuizás no se pueda mover.", + obtainSource: "¡{{pokemonNameWithAffix}} sufre parálisis por {{sourceText}}!\nQuizás no se pueda mover.", + activation: "¡{{pokemonNameWithAffix}} está paralizado!\n¡No se puede mover!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá paralizado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá paralizado!" + }, + sleep: { + name: "Dormir", + description: "dormir", + obtain: "¡{{pokemonNameWithAffix}}\nse ha dormido!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha dormido\npor culpa de {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está/ndormido como un tronco.", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá dormido!", + heal: "¡{{pokemonNameWithAffix}} se despertó!" + }, + freeze: { + name: "Congelamiento", + description: "congelamiento", + obtain: "¡{{pokemonNameWithAffix}}\nha sido congelado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nha sido congelado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá congelado!", + heal: "¡{{pokemonNameWithAffix}} se\nha descongelado!" + }, + burn: { + name: "Quemadura", + description: "quemadura", + obtain: "¡{{pokemonNameWithAffix}}\nse ha quemado!", + obtainSource: "¡{{pokemonNameWithAffix}}\nse ha quemado por {{sourceText}}!", + activation: "¡{{pokemonNameWithAffix}} se resiente\nde las quemaduras!", + overlap: "¡{{pokemonNameWithAffix}} ya\nestá quemado!", + heal: "¡{{pokemonNameWithAffix}} ya no\nestá quemado!" + }, +} as const; diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index 6d776f44c9c..d5647f83cf6 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { diff --git a/src/locales/es/tutorial.ts b/src/locales/es/tutorial.ts index 055bc808da3..5a33bcd9dd0 100644 --- a/src/locales/es/tutorial.ts +++ b/src/locales/es/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `¡Bienvenido/a a PokéRogue! Este es un fangame de Pokémon centrado en el combate con elementos roguelite. diff --git a/src/locales/es/voucher.ts b/src/locales/es/voucher.ts index 86debdc25cf..60479160efe 100644 --- a/src/locales/es/voucher.ts +++ b/src/locales/es/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Vales", diff --git a/src/locales/es/weather.ts b/src/locales/es/weather.ts index 1e40544accd..5565779a7bd 100644 --- a/src/locales/es/weather.ts +++ b/src/locales/es/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index f3311118591..f99ff15c26f 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -1,8 +1,13 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}}\nde {{pokemonName}} le protège du contrecoup !", "badDreams": "{{pokemonName}} a le sommeil agité !", + "costar": "{{pokemonName}} copie les changements de stats\nde {{allyName}} !", + "iceFaceAvoidedDamage": "{{pokemonName}} évite les dégâts\navec {{abilityName}} !", + "perishBody": "{{abilityName}} de {{pokemonName}}\nmettra les deux Pokémon K.O. dans trois tours !", + "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", + "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/fr/ability.ts b/src/locales/fr/ability.ts index f984c8843de..a69519e187a 100644 --- a/src/locales/fr/ability.ts +++ b/src/locales/fr/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { diff --git a/src/locales/fr/achv.ts b/src/locales/fr/achv.ts index ddec9086892..4ff9bf20f51 100644 --- a/src/locales/fr/achv.ts +++ b/src/locales/fr/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { @@ -162,7 +162,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Capturer un Pokémon possédant un talent caché", }, "PERFECT_IVS": { - name: "Certificat d’Authenticité", + name: "Certificat d’authenticité", description: "Avoir des IV parfaits sur un Pokémon", }, "CLASSIC_VICTORY": { @@ -171,98 +171,98 @@ export const PGMachv: AchievementTranslationEntries = { }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "Le rival originel", + description: "Terminer un challenge avec uniquement des Pokémon de 1re génération.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "Entre tradition et modernité", + description: "Terminer un challenge avec uniquement des Pokémon de 2e génération.", }, "MONO_GEN_THREE": { - name: "Too much water?", - description: "Complete the generation three only challenge.", + name: "Too much water ?", + description: "Terminer un challenge avec uniquement des Pokémon de 3e génération.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "Réellement la plus difficile ?", + description: "Terminer un challenge avec uniquement des Pokémon de 4e génération.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "Recast complet", + description: "Terminer un challenge avec uniquement des Pokémon de 5e génération.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "Aristocrate", + description: "Terminer un challenge avec uniquement des Pokémon de 6e génération.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "Seulement techniquement", + description: "Terminer un challenge avec uniquement des Pokémon de 7e génération.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "L’heure de gloire", + description: "Terminer un challenge avec uniquement des Pokémon de 8e génération.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "Ça va, c’était EZ", + description: "Terminer un challenge avec uniquement des Pokémon de 9e génération.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "Terminer un challenge en monotype {{type}}.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "Extraordinairement banal", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "Je connais le kung-fu", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "Angry Birds", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "Touche moi je t’empoisonne !", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "Prévisions : Séisme", }, "MONO_ROCK": { - name: "Brock Hard", + name: "Comme un roc", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "Une chenille !", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "SOS Fantômes", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "De type Acier !", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "Allumer le feu", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "Vacances en Bretagne", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "Ne pas toucher !", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "À la masse", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "Grocervo", }, "MONO_ICE": { - name: "Mono ICE", + name: "Froid comme la glace", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "Légendes du club, ou presque", }, "MONO_DARK": { - name: "It's just a phase", + name: "Ça va lui passer", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "Hey ! Listen !", }, } as const; diff --git a/src/locales/fr/battle-message-ui-handler.ts b/src/locales/fr/battle-message-ui-handler.ts index 8dc980d49a4..cb2f745577e 100644 --- a/src/locales/fr/battle-message-ui-handler.ts +++ b/src/locales/fr/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Exceptionnel", diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index 9a4650fadc4..539b7c99094 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "Un {{bossName}} apparait.", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Vous avez battu\n{{trainerName}} !", "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", + "addedAsAStarter": "{{pokemonName}} est ajouté\ncomme starter !", "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}} ! Go !", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "K.O. en un coup !", "attackFailed": "Mais cela échoue !", "attackHitsCount": "Touché {{count}} fois !", + "rewardGain": "Vous recevez\n{{modifierName}} !", "expGain": "{{pokemonName}} gagne\n{{exp}} Points d’Exp !", "levelUp": "{{pokemonName}} monte au\nN. {{level}} !", "learnMove": "{{pokemonName}} apprend\n{{moveName}} !", @@ -53,13 +55,82 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "le changement", "escapeVerbFlee": "la fuite", "notDisabled": "La capacité {{moveName}}\nde {{pokemonName}} n’est plus sous entrave !", + "turnEndHpRestore": "{{pokemonName}} récupère des PV !", + "hpIsFull": "Les PV de {{pokemonName}}\nsont au maximum !", "skipItemQuestion": "Êtes-vous sûr·e de ne pas vouloir prendre d’objet ?", - "eggHatching": "Oh ?", + "eggHatching": "Hein ?", "ivScannerUseQuestion": "Utiliser le Scanner d’IV sur {{pokemonName}} ?", "wildPokemonWithAffix": "{{pokemonName}} sauvage", "foePokemonWithAffix": "{{pokemonName}} ennemi", "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} a récupéré\ndes PV!", - "fainted": "{{pokemonNameWithAffix}} est tombé KO!" + "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", + "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", + "regainHealth": "{{pokemonName}} récupère\ndes PV !", + "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", + "statRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", + "battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} a la trouille !\nIl ne peut plus attaquer !", + "battlerTagsConfusedOnAdd": "Ça rend {{pokemonNameWithAffix}}\nconfus !", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus confus !", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\nest déjà confus !", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\nest confus !", + "battlerTagsConfusedLapseHurtItself": "Il se blesse dans sa confusion.", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} n’est pas affecté\nle Lien du Destin !", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} entraine\n{{pokemonNameWithAffix2}} dans sa chute !", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà amoureux !", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} est amoureux\nde {{sourcePokemonName}} !", + "battlerTagsInfatuatedLapseImmobilize": "L’amour empêche {{pokemonNameWithAffix}}\nd’agir !", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\nn’est plus amoureux !", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} est infecté !", + "battlerTagsSeededLapse": "Vampigraine draine l’énergie\nde {{pokemonNameWithAffix}} !", + "battlerTagsSeededLapseShed": "La Vampigraine de {{pokemonNameWithAffix}}\naspire le suintement !", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} commence à cauchemarder !", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} est\ndéjà prisonnier d’un cauchemar !", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}est\nprisonnier d’un cauchemar !", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} !\nEncore une fois !", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}} n’est\nplus obligé d’utiliser la même capacité !", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} est prêt\nà aider {{pokemonName}} !", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorbe\ndes nutriments avec ses racines !", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\nplante ses racines !", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} s’entoure\nd’un voile d’eau !", + "battlerTagsAquaRingLapse": "{{moveName}} restaure\nles PV de {{pokemonName}} !", + "battlerTagsDrowsyOnAdd": "Ça rend {{pokemonNameWithAffix}} somnolent !", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} est pris dans\nl’étreinte de {{sourcePokemonName}} !", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} est ligoté\npar {{sourcePokemonName}} !", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans le tourbillon !", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} est pris dans le Claquoir\nde {{pokemonName}} !", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} est piégé\npar {{moveName}} !", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} est piégé\ndans un tourbillon de magma !", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} est tombé\ndans un Troquenard !", + "battlerTagsThunderCageOnTrap": "{{pokemonNameWithAffix}} se fait emprisonner\npar {{sourcePokemonNameWithAffix}} !", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} est harcelé\npar {{sourcePokemonNameWithAffix}} !", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nest prêt à se protéger !", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protège !", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} se prépare\nà encaisser les coups !", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", + "battlerTagsPerishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} paresse !", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", + "battlerTagsHighestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", + "battlerTagsHighestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !" } as const; diff --git a/src/locales/fr/berry.ts b/src/locales/fr/berry.ts index dd6b387f4cc..b5048eb02c0 100644 --- a/src/locales/fr/berry.ts +++ b/src/locales/fr/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts new file mode 100644 index 00000000000..025f339ee86 --- /dev/null +++ b/src/locales/fr/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Musique ", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "N2B2 - Vs. Maitre de Kanto", + "battle_johto_champion": "N2B2 - Vs. Maitre de Johto", + "battle_hoenn_champion": "N2B2 - Vs. Maitre de Hoenn", + "battle_sinnoh_champion": "N2B2 - Vs. Maitresse de Sinnoh", + "battle_champion_alder": "NB - Vs. Maitre d’Unys", + "battle_champion_iris": "N2B2 - Vs. Maitresse d’Unys", + "battle_kalos_champion": "XY - Maitresse de Kalos", + "battle_alola_champion": "USUL - Maitre d’Alola", + "battle_galar_champion": "ÉB - Maitre de Galar", + "battle_champion_geeta": "ÉV - Vs. Alisma la Maitresse", + "battle_champion_nemona": "ÉV - Vs. Menzi la Maitresse", + "battle_champion_kieran": "ÉV - Vs. Kassis le Maitre", + "battle_hoenn_elite": "ROSA - Vs. Conseil 4", + "battle_unova_elite": "NB - Vs. Conseil 4", + "battle_kalos_elite": "XY - Vs. Conseil 4", + "battle_alola_elite": "SL - Vs. Conseil 4", + "battle_galar_elite": "ÉB - Vs. Tournoi des Champions", + "battle_paldea_elite": "ÉV - Vs. Conseil 4", + "battle_bb_elite": "ÉV - Vs. Conseil 4 de l’Institut Myrtille", + "battle_final_encounter": "PDM ÉSDX - Vs. Rayquaza", + "battle_final": "NB - Vs. Ghetis", + "battle_kanto_gym": "N2B2 - Vs. Champion·ne d’Arène de Kanto", + "battle_johto_gym": "N2B2 - Vs. Champion·ne d’Arène de Johto", + "battle_hoenn_gym": "N2B2 - Vs. Champion·ne d’Arène de Hoenn", + "battle_sinnoh_gym": "N2B2 - Vs. Champion·ne d’Arène de Sinnoh", + "battle_unova_gym": "NB - Vs. Champion·ne d’Arène d’Unys", + "battle_kalos_gym": "XY - Vs. Champion·ne d’Arène de Kalos", + "battle_galar_gym": "ÉB - Vs. Champion·ne d’Arène de Galar", + "battle_paldea_gym": "ÉV - Vs. Champion·ne d’Arène de Paldea", + "battle_legendary_kanto": "XY - Vs. Légendaire de Kanto", + "battle_legendary_raikou": "HGSS - Vs. Raikou", + "battle_legendary_entei": "HGSS - Vs. Entei", + "battle_legendary_suicune": "HGSS - Vs. Suicune", + "battle_legendary_lugia": "HGSS - Vs. Lugia", + "battle_legendary_ho_oh": "HGSS - Vs. Ho-oh", + "battle_legendary_regis_g5": "N2B2 - Vs. Colosses Légendaires", + "battle_legendary_regis_g6": "ROSA - Vs. Colosses Légendaires", + "battle_legendary_gro_kyo": "ROSA - Vs. Groudon/Kyogre", + "battle_legendary_rayquaza": "ROSA - Vs. Rayquaza", + "battle_legendary_deoxys": "ROSA - Vs. Deoxys", + "battle_legendary_lake_trio": "ROSA - Vs. Gardiens des Lacs", + "battle_legendary_sinnoh": "ROSA - Vs. Légendaire de Sinnoh", + "battle_legendary_dia_pal": "ROSA - Vs. Dialga/Palkia", + "battle_legendary_giratina": "ROSA - Vs. Giratina", + "battle_legendary_arceus": "HGSS - Vs. Arceus", + "battle_legendary_unova": "NB - Vs. Légendaire d’Unys", + "battle_legendary_kyurem": "NB - Vs. Kyurem", + "battle_legendary_res_zek": "NB - Vs. Reshiram/Zekrom", + "battle_legendary_xern_yvel": "XY - Vs. Xerneas/Yveltal", + "battle_legendary_tapu": "SL - Vs. Divinités gardiennes d’Alola", + "battle_legendary_sol_lun": "SL - Vs. Solgaleo/Lunala", + "battle_legendary_ub": "SL - Vs. Ultra-Chimère", + "battle_legendary_dusk_dawn": "USUL - Vs. Necrozma Crinière du Couchant/Ailes de l’Aurore", + "battle_legendary_ultra_nec": "USUL - Vs. Ultra-Necrozma", + "battle_legendary_zac_zam": "ÉB - Vs. Zacian/Zamazenta", + "battle_legendary_glas_spec": "ÉB - Vs. Blizzeval/Spectreval", + "battle_legendary_calyrex": "ÉB - Vs. Sylveroy", + "battle_legendary_birds_galar": "ÉB - Vs. Oiseaux Légendaires de Galar", + "battle_legendary_ruinous": "ÉV - Vs. Trésors du fléau", + "battle_legendary_kor_mir": "ÉV - Profondeurs de la Zone Zéro (Combat)", + "battle_legendary_loyal_three": "ÉV - Vs. Adoramis", + "battle_legendary_ogerpon": "ÉV - Vs. Ogerpon", + "battle_legendary_terapagos": "ÉV - Vs. Terapagos", + "battle_legendary_pecharunt": "ÉV - Vs. Pêchaminus", + "battle_rival": "NB - Vs. Rival", + "battle_rival_2": "NB - Vs. N", + "battle_rival_3": "NB - Combat final Vs. N", + "battle_trainer": "NB - Vs. Dresseur·euse", + "battle_wild": "NB - Vs. Pokémon sauvage", + "battle_wild_strong": "NB - Vs. Pokémon puissant sauvage", + "end_summit": "PDM ÉSDX - Tour Céleste", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "NB - Vs. Team Plasma", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PDM EdS - Cratère Obscur", + "badlands": "PDM EdS - Vallée Stérile", + "beach": "PDM EdS - Falaise Trempée", + "cave": "PDM EdS - Pic Céleste (grotte)", + "construction_site": "PDM EdS - Carrière Rocher", + "desert": "PDM EdS - Désert du Nord", + "dojo": "PDM EdS - Dojo Ossatueur", + "end": "PDM EdS - Tour Céleste", + "factory": "PDM EdS - Ruines Cachées", + "fairy_cave": "PDM EdS - Caverne Étoile", + "forest": "PDM EdS - Forêt Crépuscule", + "grass": "PDM EdS - Bois aux Pommes", + "graveyard": "PDM EdS - Forêt Trompeuse", + "ice_cave": "PDM EdS - Montagne Glacier", + "island": "PDM EdS - Côte Escarpée", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PDM EdS - Caverne Cristal", + "meadow": "PDM EdS - Pic Céleste (forêt)", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PDM EdS - Mt Corne", + "plains": "PDM EdS - Pic Céleste (prairie)", + "power_plant": "PDM EdS - Plaines Élek", + "ruins": "PDM EdS - Ruine Scellée", + "sea": "PDM EdS - Caverne Saline", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PDM EdS - Pic Céleste (côte)", + "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", + "space": "Firel - Aether", + "swamp": "PDM EdS - Mer Fermée", + "tall_grass": "PDM EdS - Forêt Brumeuse", + "temple": "PDM EdS - Grotte Égide", + "town": "PDM EdS - Donjon aléatoire - Thème 3", + "volcano": "PDM EdS - Grotte Étuve", + "wasteland": "PDM EdS - Terres Illusoires", + + // Encounter + "encounter_ace_trainer": "NB - Regards croisés (Topdresseur·euse)", + "encounter_backpacker": "NB - Regards croisés (Randonneur·euse)", + "encounter_clerk": "NB - Regards croisés (Employé·e)", + "encounter_cyclist": "NB - Regards croisés (Cycliste)", + "encounter_lass": "NB - Regards croisés (Fillette)", + "encounter_parasol_lady": "NB - Regards croisés (Sœur Parasol)", + "encounter_pokefan": "NB - Regards croisés (Pokéfan)", + "encounter_psychic": "NB - Regards croisés (Kinésiste)", + "encounter_rich": "NB - Regards croisés (Gentleman)", + "encounter_rival": "NB - Tcheren", + "encounter_roughneck": "NB - Regards croisés (Loubard)", + "encounter_scientist": "NB - Regards croisés (Scientifique)", + "encounter_twins": "NB - Regards croisés (Jumelles)", + "encounter_youngster": "NB - Regards croisés (Gamin)", + + // Other + "heal": "NB - Soin de Pokémon", + "menu": "PDM EdS - Bienvenue dans le monde de Pokémon !", + "title": "PDM EdS - Menu Principal", +} as const; diff --git a/src/locales/fr/biome.ts b/src/locales/fr/biome.ts index 2f3dffb28f6..83029b3a8d4 100644 --- a/src/locales/fr/biome.ts +++ b/src/locales/fr/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "vous avez oublié où", diff --git a/src/locales/fr/challenges.ts b/src/locales/fr/challenges.ts index f655caf4807..d88960dbe3b 100644 --- a/src/locales/fr/challenges.ts +++ b/src/locales/fr/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Paramètres du Challenge", - "points": "Bad Ideas", - "confirm_start": "Continuer avec ces paramètres ?", - "singleGeneration.name": "Mono-génération", - "singleGeneration.value.0": "Désactivé", - "singleGeneration.desc.0": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", - "singleGeneration.value.1": "1G", - "singleGeneration.desc.1": "Vous ne pouvez choisir que des Pokémon de 1re génération.", - "singleGeneration.value.2": "2G", - "singleGeneration.desc.2": "Vous ne pouvez choisir que des Pokémon de 2e génération.", - "singleGeneration.value.3": "3G", - "singleGeneration.desc.3": "Vous ne pouvez choisir que des Pokémon de 3e génération.", - "singleGeneration.value.4": "4G", - "singleGeneration.desc.4": "Vous ne pouvez choisir que des Pokémon de 4e génération.", - "singleGeneration.value.5": "5G", - "singleGeneration.desc.5": "Vous ne pouvez choisir que des Pokémon de 5e génération.", - "singleGeneration.value.6": "6G", - "singleGeneration.desc.6": "Vous ne pouvez choisir que des Pokémon de 6e génération.", - "singleGeneration.value.7": "7G", - "singleGeneration.desc.7": "Vous ne pouvez choisir que des Pokémon de 7e génération.", - "singleGeneration.value.8": "8G", - "singleGeneration.desc.8": "Vous ne pouvez choisir que des Pokémon de 8e génération.", - "singleGeneration.value.9": "9G", - "singleGeneration.desc.9": "Vous ne pouvez choisir que des Pokémon de 9e génération.", - "singleType.name": "Mono-type", - "singleType.value.0": "Désactivé", - "singleType.desc.0": "Vous ne pouvez choisir que des Pokémon du type sélectionné.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Vous ne pouvez choisir que des Pokémon de type Normal.", - "singleType.value.2": "Combat", - "singleType.desc.2": "Vous ne pouvez choisir que des Pokémon de type Combat.", - "singleType.value.3": "Vol", - "singleType.desc.3": "Vous ne pouvez choisir que des Pokémon de type Vol.", - "singleType.value.4": "Poison", - "singleType.desc.4": "Vous ne pouvez choisir que des Pokémon de type Poison.", - "singleType.value.5": "Sol", - "singleType.desc.5": "Vous ne pouvez choisir que des Pokémon de type Sol.", - "singleType.value.6": "Roche", - "singleType.desc.6": "Vous ne pouvez choisir que des Pokémon de type Roche.", - "singleType.value.7": "Insecte", - "singleType.desc.7": "Vous ne pouvez choisir que des Pokémon de type Insecte.", - "singleType.value.8": "Spectre", - "singleType.desc.8": "Vous ne pouvez choisir que des Pokémon de type Spectre.", - "singleType.value.9": "Acier", - "singleType.desc.9": "Vous ne pouvez choisir que des Pokémon de type Acier.", - "singleType.value.10": "Feu", - "singleType.desc.10": "Vous ne pouvez choisir que des Pokémon de type Feu.", - "singleType.value.11": "Eau", - "singleType.desc.11": "Vous ne pouvez choisir que des Pokémon de type Eau.", - "singleType.value.12": "Plante", - "singleType.desc.12": "Vous ne pouvez choisir que des Pokémon de type Plante.", - "singleType.value.13": "Électrik", - "singleType.desc.13": "Vous ne pouvez choisir que des Pokémon de type Électrik.", - "singleType.value.14": "Psy", - "singleType.desc.14": "Vous ne pouvez choisir que des Pokémon de type Psy.", - "singleType.value.15": "Glace", - "singleType.desc.15": "Vous ne pouvez choisir que des Pokémon de type Glace.", - "singleType.value.16": "Dragon", - "singleType.desc.16": "Vous ne pouvez choisir que des Pokémon de type Dragon.", - "singleType.value.17": "Ténèbres", - "singleType.desc.17": "Vous ne pouvez choisir que des Pokémon de type Ténèbres.", - "singleType.value.18": "Fée", - "singleType.desc.18": "Vous ne pouvez choisir que des Pokémon de type Fée.", + "illegalEvolution": "{{pokemon}} s’est transformé en Pokémon\ninéligible pour ce challenge !", + "singleGeneration": { + "name": "Mono-génération", + "desc": "Vous ne pouvez choisir que des Pokémon de {{gen}} génération.", + "desc_default": "Vous ne pouvez choisir que des Pokémon de la génération sélectionnée.", + "gen_1": "1re", + "gen_2": "2e", + "gen_3": "3e", + "gen_4": "4e", + "gen_5": "5e", + "gen_6": "6e", + "gen_7": "7e", + "gen_8": "8e", + "gen_9": "9e", + }, + "singleType": { + "name": "Mono-type", + "desc": "Vous ne pouvez choisir que des Pokémon de type {{type}}.", + "desc_default": "Vous ne pouvez choisir que des Pokémon du type sélectionné." + //type in pokemon-info + }, } as const; diff --git a/src/locales/fr/command-ui-handler.ts b/src/locales/fr/command-ui-handler.ts index 37d910c8844..42180d31276 100644 --- a/src/locales/fr/command-ui-handler.ts +++ b/src/locales/fr/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Attaque", diff --git a/src/locales/fr/common.ts b/src/locales/fr/common.ts new file mode 100644 index 00000000000..e4ccc627f5e --- /dev/null +++ b/src/locales/fr/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Lancer", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index f7b7467c4bc..04af81adf52 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const frConfig = { ability: ability, @@ -46,9 +50,11 @@ export const frConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const frConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/fr/dialogue.ts b/src/locales/fr/dialogue.ts index e0f0737ef82..ab192963cad 100644 --- a/src/locales/fr/dialogue.ts +++ b/src/locales/fr/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour un gamin !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’un gamin." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n'est pas… Gnn…" + }, + "defeat": { + 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton future ou le mien… Voyons lequel mérite plus." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -2107,6 +2287,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "You got caught in my storm! Better luck next time!" } }, + "alder": { + "encounter": { + 1: "Prépare-toi pour un combat contre le meilleur Dresseur d'Unys !", + }, + "victory": { + 1: "Bien joué ! Tu as sans aucun doute un talent inégalé.", + }, + "defeat": { + 1: `Une brise fraîche traverse mon cœur… + $Quel effort extraordinaire !`, + } + }, + "kieran": { + "encounter": { + 1: `Grâce à un travail acharné, je deviens de plus en plus fort ! + $Je ne perdrai pas.`, + }, + "victory": { + 1: `Je n'y crois pas… + $Quel combat amusant et palpitant !` + }, + "defeat": { + 1: `Eh beh, quel combat ! + $Il est temps pour toi de t'entraîner encore plus dur.`, + } + }, "rival": { "encounter": { 1: `@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir… @@ -2161,7 +2367,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: `@c{neutral}Je… J’étais pas encore supposée perdre… - $@c{smile}Bon. Ça veut juste dire que je vois devoir encore plus m’entrainer ! + $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! $@c{smile_wave}Allez, tiens le coup !` @@ -2262,7 +2468,7 @@ export const PGMdialogue: DialogueTranslationEntries = { $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? $@c{serious}…et c’est comme si quelque chose ici me parlait. - $Comme si c’était tout ce que ce monde avait toujours connu. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. @@ -2660,6 +2866,210 @@ export const PGFdialogue: DialogueTranslationEntries = { 1: "I'll tune up for the next race." }, }, + "firebreather": { + "encounter": { + 1: "My flames shall devour you!", + 2: "My soul is on fire. I'll show you how hot it burns!", + 3: "Step right up and take a look!" + }, + "victory": { + 1: "I burned down to ashes...", + 2: "Yow! That's hot!", + 3: "Ow! I scorched the tip of my nose!" + }, + }, + "sailor": { + "encounter": { + 1: "Matey, you're walking the plank if you lose!", + 2: "Come on then! My sailor's pride is at stake!", + 3: "Ahoy there! Are you seasick?" + }, + "victory": { + 1: "Argh! Beaten by a kid!", + 2: "Your spirit sank me!", + 3: "I think it's me that's seasick..." + }, + }, + "rocket_grunt": { + "encounter": { + 1: "Nous sommes de retour !" + }, + "victory": { + 1: "Une fois de plus la Team Rocket s’envole vers d’autres cieux !" + }, + }, + "magma_grunt": { + "encounter": { + 1: "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !" + }, + "victory": { + 1: "Je…?\nJ’ai perdu ?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour une gamine !" + }, + "victory": { + 1: "Comment ça ?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Ne te mets pas en travers de la Team Galaxie !" + }, + "victory": { + 1: "Désactivation…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Pas de quatiers à ceux qui ne suivent pas notre idéal !" + }, + "victory": { + 1: "Plasmaaaaaaaaa !" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Le style et le bon gout, il n’y a que ça qui compte !" + }, + "victory": { + 1: "Mon futur me semble guère radieux." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Bien. Je dois admettre que je suis impressionné de te voir ici !" + }, + "victory": { + 1: "QUOI ? IMPOSSIBLE !" + }, + "defeat": { + 1: "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n'es encore qu’une gamine." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?" + }, + "victory": { + 1: "Comment c'est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…" + }, + "defeat": { + 1: "La Team Rocket renaitra, et je dominerai le monde !" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !" + }, + "victory": { + 1: "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…" + }, + "defeat": { + 1: "La Team Magma vaincra !" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !" + }, + "victory": { + 1: "Ce… Ce n'est pas… Gnn…" + }, + "defeat": { + 1: "L'heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours." + }, + "victory": { + 1: "Retrouvons-nous.\nJe me souviendrai de ton visage." + }, + "defeat": { + 1: "Magnifique !\nPlus rien ne peut nous retenir !" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !" + }, + "victory": { + 1: "Comme si j’y avait cru…" + }, + "defeat": { + 1: "Je rendrai à ce monde sa pureté originelle !" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Tu t’es sentie obligée de venir ici dans un acte vide de sens. Je vais te le faire regretter." + }, + "victory": { + 1: "Intéressant. Et plutôt curieux." + }, + "defeat": { + 1: "Je le créerai, mon nouveau monde…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme." + }, + "victory": { + 1: "Comment. Comment ?\nCOMMENT ?!" + }, + "defeat": { + 1: "Adieu." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !" + }, + "victory": { + 1: "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !" + }, + "defeat": { + 1: "Je suis le parfait monarque d’un monde parfait !\nHahaha !" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !" + }, + "victory": { + 1: "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !" + }, + "defeat": { + 1: "Kyurem ! Fusiorption !!!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Comptes-tu m’arrêter ? Prouve-le." + }, + "victory": { + 1: "T’es venu m’arrêter. Mais je te demande d’attendre." + }, + "defeat": { + 1: "Les Pokémon… Ne devraient plus exister." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "Ton future ou le mien… Voyons lequel mérite plus." + }, + "victory": { + 1: "Ohhhh… !" + }, + "defeat": { + 1: "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -4439,7 +4849,7 @@ export const PGFdialogue: DialogueTranslationEntries = { }, "victory": { 1: `@c{neutral}Je… J’étais pas encore supposée perdre… - $@c{smile}Bon. Ça veut juste dire que je vois devoir encore plus m’entrainer ! + $@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer ! $@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~. $@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là ! $@c{smile_wave}Allez, tiens le coup !` @@ -4539,7 +4949,8 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir. $@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds. $@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ? - $@c{serious}…et c’est comme si quelque chose ici me parlait.\nComme si c’était tout ce que ce monde avait toujours connu. + $@c{serious}…et c’est comme si quelque chose ici me parlait. + $Comme si c’était tout ce que ce monde avait toujours connu. $Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir. $@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ? $@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es la seule à en être capable. @@ -4566,7 +4977,7 @@ export const PGFdialogue: DialogueTranslationEntries = { $@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant… $@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n'aura jamais de fin et t’es le seul à en être capable. $@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité. - $@c{neutral}Si tu ne parviens à pas me battre ici et maintenant, tu n’as aucune chance.` + $@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance.` }, "victory": { 1: `@c{smile_ehalf}Je… Je crois que j'ai rempli ma mission… diff --git a/src/locales/fr/egg.ts b/src/locales/fr/egg.ts index beffb1a98a7..96fbc4dce15 100644 --- a/src/locales/fr/egg.ts +++ b/src/locales/fr/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Œuf", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Vous n’avez pas assez de coupons !", "tooManyEggs": "Vous avez trop d’Œufs !", "pull": "Tirage", - "pulls": "Tirages" + "pulls": "Tirages", + "sameSpeciesEgg": "{{species}} sortira de cet Œuf !", + "hatchFromTheEgg": "{{pokemonName}} sort de l’Œuf !", + "eggMoveUnlock": "Capacité Œuf débloquée :\n{{moveName}}", + "rareEggMoveUnlock": "Capacité Œuf Rare débloquée :\n{{moveName}}", } as const; diff --git a/src/locales/fr/fight-ui-handler.ts b/src/locales/fr/fight-ui-handler.ts index 6be12179d28..8bcf7732626 100644 --- a/src/locales/fr/fight-ui-handler.ts +++ b/src/locales/fr/fight-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "Puissance", "accuracy": "Précision", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": " {{passive}}{{abilityName}}\nde {{pokemonName}}", + "passive": "Passif ", // The space at the end is important } as const; diff --git a/src/locales/fr/game-mode.ts b/src/locales/fr/game-mode.ts index 28858e46bfa..ad4481b4953 100644 --- a/src/locales/fr/game-mode.ts +++ b/src/locales/fr/game-mode.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "Classique", diff --git a/src/locales/fr/game-stats-ui-handler.ts b/src/locales/fr/game-stats-ui-handler.ts index 1f368f1ff43..6d6bcd370d2 100644 --- a/src/locales/fr/game-stats-ui-handler.ts +++ b/src/locales/fr/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "Statistiques", diff --git a/src/locales/fr/growth.ts b/src/locales/fr/growth.ts index a4e9e8ed0ce..f44913b7d60 100644 --- a/src/locales/fr/growth.ts +++ b/src/locales/fr/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Erratique", diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 9494a64ab3f..b8446b1aa68 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Paramètres", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importer données", "exportData": "Exporter données", "cancel": "Retour", - "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?" + "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index f9538e9d26c..0402bd4bfda 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menu: SimpleTranslationEntries = { "cancel": "Annuler", @@ -29,8 +29,6 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "Session chargée avec succès.", "failedToLoadSession": "Vos données de session n’ont pas pu être chargées.\nElles pourraient être corrompues.", "boyOrGirl": "Es-tu un garçon ou une fille ?", - "boy": "Garçon", - "girl": "Fille", "evolving": "Quoi ?\n{{pokemonName}} évolue !", "stoppedEvolving": "Hein ?\n{{pokemonName}} n’évolue plus !", "pauseEvolutionsQuestion": "Mettre en pause les évolutions pour {{pokemonName}} ?\nElles peuvent être réactivées depuis l’écran d’équipe.", @@ -39,11 +37,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "Classement du Jour", "weeklyRankings": "Classement de la Semaine", "noRankings": "Pas de Classement", + "positionIcon": "#", + "usernameScoreboard": "Utilisateur", + "score": "Score", + "wave": "Vague", "loading": "Chargement…", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "Chargement de la ressource : {{assetName}}", "playersOnline": "Joueurs Connectés", "yes":"Oui", "no":"Non", "disclaimer": "AVERTISSEMENT", - "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé." + "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", + "choosePokemon": "Sélectionnez un Pokémon.", + "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.", } as const; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 766629b88d8..0423751e937 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -1,10 +1,10 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{pokeballName}} x{{modifierCount}}", - description: "Recevez {{modifierCount}} {{pokeballName}}s (Inventaire : {{pokeballAmount}}) \nTaux de capture : {{catchRate}}.", + description: "Recevez {{modifierCount}} {{pokeballName}}·s (Inventaire : {{pokeballAmount}})\nTaux de capture : {{catchRate}}.", }, "AddVoucherModifierType": { name: "{{voucherTypeName}} x{{modifierCount}}", @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé", + description: "Restaure {{restorePoints}} PV ou {{restorePercent}}% des PV totaux d’un Pokémon, en fonction duquel des deux est le plus élevé.", extra: { "fully": "Restaure tous les PV d’un Pokémon.", "fullyWithStatus": "Restaure tous les PV d’un Pokémon et soigne tous ses problèmes de statut.", @@ -73,7 +73,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Réanime et restaure tous les PV de tous les Pokémon K.O.", }, "MoneyRewardModifierType": { - description: "Octroie une {{moneyMultiplier}} somme d’argent ({{moneyAmount}}₽).", + description: "Octroie une {{moneyMultiplier}} somme d’argent.\n({{moneyAmount}} ₽)", extra: { "small": "petite", "moderate": "moyenne", @@ -101,7 +101,7 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TmModifierTypeWithInfo": { name: "CT{{moveId}} - {{moveName}}", - description: "Apprend la capacité {{moveName}} à un Pokémon\n(Hold C or Shift for more info).", + description: "Apprend la capacité {{moveName}} à un Pokémon\n(Maintenez C ou Maj pour plus d’infos).", }, "EvolutionItemModifierType": { description: "Permet à certains Pokémon d’évoluer.", @@ -110,7 +110,7 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Permet à certains Pokémon de changer de forme.", }, "FusePokemonModifierType": { - description: "Fusionne deux Pokémon (transfère le Talent, sépare les stats de base et les types, partage le movepool).", + description: "Fusionne deux Pokémon (transfère le talent, sépare les stats de base et les types, partage le movepool).", }, "TerastallizeModifierType": { name: "Téra-Éclat {{teraType}}", @@ -151,7 +151,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SACRED_ASH": { name: "Cendre Sacrée" }, - "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O." }, + "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il tombe K.O. ." }, "ETHER": { name: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Grelot Zen" }, + "EVIOLITE": { name: "Évoluroc", description: "Un étrange concentré d’évolution qui augmente la Défense et la Défense Spéciale d’un Pokémon pouvant évoluer." }, + "SOUL_DEW": { name: "Rosée Âme", description: "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques (cumulatif)." }, "NUGGET": { name: "Pépite" }, @@ -211,10 +213,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "KINGS_ROCK": { name: "Roche Royale", description: "Ajoute 10% de chances qu’une capacité offensive apeure l’adversaire." }, "LEFTOVERS": { name: "Restes", description: "Soigne à chaque tour 1/16 des PV max d’un Pokémon." }, - "SHELL_BELL": { name: "Grelot Coque", description: "Soigne 1/8 des dégâts infligés par un Pokémon." }, + "SHELL_BELL": { name: "Grelot Coque", description: "Soigne son porteur avec 1/8 des dégâts qu’il inflige à un Pokémon." }, "TOXIC_ORB": { name: "Orbe Toxique", description: "Un orbe bizarre qui empoisonne gravement son porteur durant le combat." }, - "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brûle son porteur durant le combat." }, + "FLAME_ORB": { name: "Orbe Flamme", description: "Un orbe bizarre qui brule son porteur durant le combat." }, "BATON": { name: "Bâton", description: "Permet de transmettre les effets en cas de changement de Pokémon. Ignore les pièges." }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Jeton Ténacité" }, "ENEMY_FUSED_CHANCE": { name: "Jeton Fusion", description: "Ajoute 1% de chances qu’un Pokémon sauvage soit une fusion." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Balle Lumière", description: "Objet à faire tenir à Pikachu. Un orbe énigmatique qui augmente son Attaque et son Attaque Spéciale." }, + "THICK_CLUB": { name: "Masse Os", description: "Objet à faire tenir à Osselait ou Ossatueur. Un os dur qui augmente leur Attaque." }, + "METAL_POWDER": { name: "Poudre Métal", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Défense." }, + "QUICK_POWDER": { name: "Poudre Vite", description: "Objet à faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, augmente sa Vitesse." } + }, TempBattleStatBoosterItem: { "x_attack": "Attaque +", "x_defense": "Défense +", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "Précision +", "dire_hit": "Muscle +", }, + + TempBattleStatBoosterStatName: { + "ATK": "Attaque", + "DEF": "Défense", + "SPATK": "Atq. Spé.", + "SPDEF": "Déf. Spé.", + "SPD": "Vitesse", + "ACC": "Précision", + "CRIT": "Taux de critique", + "EVA": "Esquive", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "Mouchoir Soie", "black_belt": "Ceinture Noire", diff --git a/src/locales/fr/move.ts b/src/locales/fr/move.ts index cd67d592919..3fea8995694 100644 --- a/src/locales/fr/move.ts +++ b/src/locales/fr/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { diff --git a/src/locales/fr/nature.ts b/src/locales/fr/nature.ts index 0c838138bfe..6f2e3985d8f 100644 --- a/src/locales/fr/nature.ts +++ b/src/locales/fr/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Hardi", diff --git a/src/locales/fr/party-ui-handler.ts b/src/locales/fr/party-ui-handler.ts index 9d3c7baa9ae..369f7b65bb9 100644 --- a/src/locales/fr/party-ui-handler.ts +++ b/src/locales/fr/party-ui-handler.ts @@ -1,10 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "ALL": "Tout", + "SEND_OUT": "Envoyer", + "SUMMARY": "Résumé", + "CANCEL": "Annuler", + "RELEASE": "Relâcher", + "APPLY": "Appliquer", + "TEACH": "Apprendre" } as const; diff --git a/src/locales/fr/pokeball.ts b/src/locales/fr/pokeball.ts index 0f878eea528..910002e41e1 100644 --- a/src/locales/fr/pokeball.ts +++ b/src/locales/fr/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Poké Ball", diff --git a/src/locales/fr/pokemon-info-container.ts b/src/locales/fr/pokemon-info-container.ts index 102616da287..c61c23b0970 100644 --- a/src/locales/fr/pokemon-info-container.ts +++ b/src/locales/fr/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "Capacités", @@ -7,5 +7,6 @@ export const pokemonInfoContainer: SimpleTranslationEntries = { "nature": "Nature :", "epic": "Épique", "rare": "Rare", - "common": "Commun" + "common": "Commun", + "form": "Forme :" } as const; diff --git a/src/locales/fr/pokemon-info.ts b/src/locales/fr/pokemon-info.ts index 9341e5d77ca..641b372f3d3 100644 --- a/src/locales/fr/pokemon-info.ts +++ b/src/locales/fr/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "Déf. Spé.", "SPDEFshortened": "DéfSp", "SPD": "Vitesse", - "SPDshortened": "Vit" + "SPDshortened": "Vit", + "ACC": "Accuracy", + "EVA": "Evasiveness" }, Type: { diff --git a/src/locales/fr/pokemon.ts b/src/locales/fr/pokemon.ts index d685f91ab4d..d731fd148ad 100644 --- a/src/locales/fr/pokemon.ts +++ b/src/locales/fr/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bulbizarre", diff --git a/src/locales/fr/save-slot-select-ui-handler.ts b/src/locales/fr/save-slot-select-ui-handler.ts index 53b68191b9f..64f6da7017c 100644 --- a/src/locales/fr/save-slot-select-ui-handler.ts +++ b/src/locales/fr/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Effacer les données de l’emplacement sélectionné ?", diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts new file mode 100644 index 00000000000..cd85b0f8cb9 --- /dev/null +++ b/src/locales/fr/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Garçon", + "girl": "Fille", + "general": "Général", + "display": "Affichage", + "audio": "Audio", + "gamepad": "Manette", + "keyboard": "Clavier", + "gameSpeed": "Vitesse du jeu", + "hpBarSpeed": "Vit. barre de PV", + "expGainsSpeed": "Vit. barre d’Exp", + "expPartyDisplay": "Afficher Exp équipe", + "skipSeenDialogues": "Passer dialogues connus", + "battleStyle": "Style de combat", + "enableRetries": "Activer les réessais", + "tutorials": "Tutoriels", + "touchControls": "Contrôles tactiles", + "vibrations": "Vibrations", + "normal": "Normal", + "fast": "Rapide", + "faster": "Plus rapide", + "skip": "Passer", + "levelUpNotifications": "Notif. gain de N.", + "on": "Activé", + "off": "Désactivé", + "switch": "Choix", + "set": "Défini", + "auto": "Auto", + "disabled": "Désactivé", + "language": "Langue", + "change": "Changer", + "uiTheme": "Interface", + "default": "Par défaut", + "legacy": "Ancienne", + "windowType": "Type de fenêtre", + "moneyFormat": "Format de l’argent", + "damageNumbers": "Nombres de dégâts", + "simple": "Simple", + "fancy": "Amélioré", + "abbreviated": "Abrégé", + "moveAnimations": "Animations de combat", + "showStatsOnLevelUp": "Afficher stats à la montée de N.", + "candyUpgradeNotification": "Notif amélioration de bonbon", + "passivesOnly": "Passifs", + "candyUpgradeDisplay": "Amélioration bonbon", + "icon": "Icône", + "animation": "Animation", + "moveInfo": "Infos de capacité", + "showMovesetFlyout": "Afficher le volet de capacités", + "showArenaFlyout": "Afficher le volet d’arène", + "showTimeOfDayWidget": "Widget de l’heure", + "timeOfDayAnimation": "Animation de l’heure", + "bounce": "Sauter", + "timeOfDay_back": "Retour", + "spriteSet": "Ensemble de sprites", + "consistent": "Consistant", + "mixedAnimated": "Mixte", + "fusionPaletteSwaps": "Palettes de fusion", + "playerGender": "Genre de l’avatar", + "typeHints": "Indications de type", + "masterVolume": "Vol. principal", + "bgmVolume": "Vol. musique", + "seVolume": "Vol. effets", + "musicPreference": "Préf. musicale", + "mixed": "Mixte", + "gamepadPleasePlug": "Veuillez brancher une manette ou appuyer sur un bouton.", + "delete": "Supprimer", + "keyboardPleasePress": "Veuillez appuyer sur une touche de votre clavier.", + "reset": "Réinitialiser", + "requireReload": "Redémarrage requis", + "action": "Action", + "back": "Retour", + "pressToBind": "Sélectionnez pour assigner", + "pressButton": "Appuyez sur un bouton…", + "buttonUp": "Haut", + "buttonDown": "Bas", + "buttonLeft": "Gauche", + "buttonRight": "Droite", + "buttonAction": "Action", + "buttonMenu": "Menu", + "buttonSubmit": "Valider", + "buttonCancel": "Annuler", + "buttonStats": "Stats", + "buttonCycleForm": "Modifier Forme", + "buttonCycleShiny": "Modifier Chromatique", + "buttonCycleGender": "Modifier Sexe", + "buttonCycleAbility": "Modifier Capacité", + "buttonCycleNature": "Modifier Nature", + "buttonCycleVariant": "Modifier Variant", + "buttonSpeedUp": "Accélérer", + "buttonSlowDown": "Ralentir", + "alt": " (Alt)", + "mute": "Muet", + "controller": "Controller", + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Montrer titre de la musique", +} as const; diff --git a/src/locales/fr/splash-messages.ts b/src/locales/fr/splash-messages.ts index 534cefaeff6..13de7f28116 100644 --- a/src/locales/fr/splash-messages.ts +++ b/src/locales/fr/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "combats gagnés !", @@ -28,7 +28,7 @@ export const splashMessages: SimpleTranslationEntries = { "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 !", + "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 !", diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index 9f504cab11e..84fb56c9ccc 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "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", + "toggleIVs": "Voir les IV", + "manageMoves": "Modifier les Capacités", + "manageNature": "Modifier la Nature", + "useCandies": "Utiliser des Bonbons", + "selectNature": "Sélectionnez une nature.", "selectMoveSwapOut": "Sélectionnez la capacité à échanger.", "selectMoveSwapWith": "Sélectionnez laquelle échanger avec", "unlockPassive": "Débloquer Passif", "reduceCost": "Diminuer le cout", + "sameSpeciesEgg": "Buy an Egg", "cycleShiny": ": » Chromatiques", "cycleForm": ": » Formes", "cycleGender": ": » Sexes", diff --git a/src/locales/fr/status-effect.ts b/src/locales/fr/status-effect.ts new file mode 100644 index 00000000000..f4f210406c6 --- /dev/null +++ b/src/locales/fr/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Aucun", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Empoisonnement", + description: "empoisonné", + obtain: "{{pokemonNameWithAffix}} est\nempoisonné !", + obtainSource: "{{pokemonNameWithAffix}} est\nempoisonné par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + toxic: { + name: "Empoisonnement grave", + description: "gravement empoisonné", + obtain: "{{pokemonNameWithAffix}} est\ngravement empoisonné !", + obtainSource: "{{pokemonNameWithAffix}} est\ngravement empoisonné par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre du poison !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà empoisonné.", + heal: "{{pokemonNameWithAffix}} n’est\nplus empoisonné !" + }, + paralysis: { + name: "Paralysie", + description: "paralysé", + obtain: "{{pokemonNameWithAffix}} est paralysé !\nIl aura du mal à attaquer !", + obtainSource: "{{pokemonNameWithAffix}} est paralysé\npar {{sourceText}} ! Il aura du mal à attaquer !", + activation: "{{pokemonNameWithAffix}} est paralysé !\nIl n’a pas pu attaquer !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà paralysé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus paralysé !" + }, + sleep: { + name: "Sommeil", + description: "endormi", + obtain: "{{pokemonNameWithAffix}}\ns’est endormi !", + obtainSource: "{{pokemonNameWithAffix}} est\nendormi par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\ndort profondément.", + overlap: "{{pokemonNameWithAffix}}\ndort déjà.", + heal: "{{pokemonNameWithAffix}}\nse réveille !" + }, + freeze: { + name: "Gelé", + description: "gelé", + obtain: "{{pokemonNameWithAffix}} est\ngelé !", + obtainSource: "{{pokemonNameWithAffix}} est\ngelé par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}est gelé !\nIl ne peut plus attaquer !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà gelé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus gelé !" + }, + burn: { + name: "Brulure", + description: "brulé", + obtain: "{{pokemonNameWithAffix}} est\nbrulé !", + obtainSource: "{{pokemonNameWithAffix}} est\nbrulé par {{sourceText}} !", + activation: "{{pokemonNameWithAffix}}\nsouffre de sa brulure !", + overlap: "{{pokemonNameWithAffix}} est\ndéjà brulé.", + heal: "{{pokemonNameWithAffix}} n’est\nplus brulé !" + }, +} as const; diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index a44c03e1b68..fc0639d47b9 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "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 + "rocket_boss": "Leader de la Team Rocket", + "magma_boss": "Leader de la Team Magma", + "aqua_boss": "Leader de la Team Aqua", + "galactic_boss": "Leader de la Team Galaxie", + "plasma_boss": "Leader de la Team Plasma", + "flare_boss": "Leader de la Team Flare", // 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; @@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "Ouvrier", "worker_female": "Ouvrière", "workers": "Ouvriers", - "youngster": "Gamin" + "youngster": "Gamin", + "rocket_grunt": "Sbire de la Team Rocket", + "rocket_grunt_female": "Sbire de la Team Rocket", + "magma_grunt": "Sbire de la Team Magma", + "magma_grunt_female": "Sbire de la Team Magma", + "aqua_grunt": "Sbire de la Team Aqua", + "aqua_grunt_female": "Sbire de la Team Aqua", + "galactic_grunt": "Sbire de la Team Galaxie", + "galactic_grunt_female": "Sbire Team Galaxie", + "plasma_grunt": "Sbire de la Team Plasma", + "plasma_grunt_female": "Sbire de la Team Plasma", + "flare_grunt": "Sbire de la Team Flare", + "flare_grunt_female": "Sbire de la Team Flare", } as const; // Names of special trainers like gym leaders, elite four, and the champion diff --git a/src/locales/fr/tutorial.ts b/src/locales/fr/tutorial.ts index 2f12f7ccaa0..d8940dadd56 100644 --- a/src/locales/fr/tutorial.ts +++ b/src/locales/fr/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `Bienvenue dans PokéRogue, un fangame axé sur les combats Pokémon avec des éléments roguelite ! diff --git a/src/locales/fr/voucher.ts b/src/locales/fr/voucher.ts index ba787ec05a7..7cab3f90878 100644 --- a/src/locales/fr/voucher.ts +++ b/src/locales/fr/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Coupons", @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "Coupon Œuf Or", "locked": "Verrouillé", "defeatTrainer": "Vaincre {{trainerName}}" -} as const; +} as const; diff --git a/src/locales/fr/weather.ts b/src/locales/fr/weather.ts index 5c483d71b44..fa6090a3ad5 100644 --- a/src/locales/fr/weather.ts +++ b/src/locales/fr/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index 527c1e4fead..1f6fcfb1258 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -1,8 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}} di {{pokemonName}}\nl'ha protetto dal contraccolpo!", "badDreams": "{{pokemonName}} è tormentato dagli incubi!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", - "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!" + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts index 9eb9480f771..5e01e02a718 100644 --- a/src/locales/it/ability.ts +++ b/src/locales/it/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { diff --git a/src/locales/it/achv.ts b/src/locales/it/achv.ts index 99d2f0445bf..0ec9ad3f98a 100644 --- a/src/locales/it/achv.ts +++ b/src/locales/it/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { @@ -229,7 +229,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Forte come una roccia!", }, "MONO_BUG": { - name: "Pungi come un Beedrill", + name: "Metodo Guzma", }, "MONO_GHOST": { name: "Sono fantasmi, caro Watson", @@ -262,7 +262,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Solo una fase", }, "MONO_FAIRY": { - name: "Fatina dei denti", + name: "Follettini e follettine", }, } as const; diff --git a/src/locales/it/battle-message-ui-handler.ts b/src/locales/it/battle-message-ui-handler.ts index 33aabb61fb1..d70ab400e39 100644 --- a/src/locales/it/battle-message-ui-handler.ts +++ b/src/locales/it/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Stellare", @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "Normale", "ivDecent": "Sufficiente", "ivNoGood": "Mediocre", -} as const; +} as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index 7ef606e11cc..d9af58893e5 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} è apparso.", "trainerAppeared": "{{trainerName}}\nvuole combattere!", - "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", + "trainerAppearedDouble": "{{trainerName}}\nvogliono combattere!", "trainerSendOut": "{{trainerName}} manda in campo\n{{pokemonName}}!", "singleWildAppeared": "Appare {{pokemonName}} selvatico!", "multiWildAppeared": "Appaiono {{pokemonName1}}\ne {{pokemonName2}} salvatici!", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", "moneyWon": "Hai vinto {{moneyAmount}}₽", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "KO con un colpo!", "attackFailed": "Ma ha fallito!", "attackHitsCount": "Colpito {{count}} volta/e!", + "rewardGain": "You received\n{{modifierName}}!", "expGain": "{{pokemonName}} ha guadagnato\n{{exp}} Punti Esperienza!", "levelUp": "{{pokemonName}} è salito al\nlivello {{level}}!", "learnMove": "{{pokemonName}} impara\n{{moveName}}!", @@ -53,13 +55,82 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiando", "escapeVerbFlee": "fuggendo", "notDisabled": "{{pokemonName}}'s {{moveName}} non è più\ndisabilitata!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", "eggHatching": "Oh!", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "wildPokemonWithAffix": "{{pokemonName}} selvatico", + "foePokemonWithAffix": "{{pokemonName}} avversario", + "useMove": "{{pokemonNameWithAffix}} usa {{moveName}}!", + "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", + "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", + "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", + "statRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", + "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", + "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", + "statFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", + "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", + "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", + "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} tentenna!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} è\nconfuso!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} non\nè più confuso!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} è\ngià confuso!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} è\nconfuso!", + "battlerTagsConfusedLapseHurtItself": "Si colpisce da solo per via della\nconfusione!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} è immune\na Destinobbligato.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} trascina\ncon sé{{pokemonNameWithAffix2}}!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} si è infatuato\ndi {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} è\ngià infatuato!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} è infatuato\ndi {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} è\nimmobilizzato dall'infatuazione!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} non è\npiù infatuato.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} è pieno di semi!", + "battlerTagsSeededLapse": "La salute di {{pokemonNameWithAffix}}\nviene prelevata da Parassiseme!", + "battlerTagsSeededLapseShed": "Parassiseme di {{pokemonNameWithAffix}}\nha risucchiato la melma!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} sta\navendo un Incubo!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} sta\ngià avendo un Incubo!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} è bloccato\nin un Incubo!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ha\nsubito Ripeti!", + "battlerTagsEncoreOnRemove": "L'effetto di Ripeti su {{pokemonNameWithAffix}}\n è terminato!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} è pronto ad\naiutare {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} assorbe\nnutrienti dalle sue radici!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} ha messo le radici!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} si è circondato\ncon un velo d'acqua!", + "battlerTagsAquaRingLapse": "{{moveName}} ha ripristinato\ni PS di {{pokemonName}}!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} sta per addormentarsi!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} subisce danni\nper via di {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} viene schiacciato da\n{{moveName}} di {{sourcePokemonName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} è stato avvinghiato\nda {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel vortice!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} sta intenagliando\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nda {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nnel magma vorticoso!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} è intrappolato\nin una tagliola!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} ha intrappolato\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} ha subito un\ninfestazione da parte di {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nsi è protetto!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nsi è protetto!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} si prepara a\nsubire il colpo!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", + "battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!", + "battlerTagsHighestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!", + "battlerTagsHighestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!" } as const; diff --git a/src/locales/it/berry.ts b/src/locales/it/berry.ts index 4c36e209f64..7be40b43c32 100644 --- a/src/locales/it/berry.ts +++ b/src/locales/it/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts new file mode 100644 index 00000000000..ef15c6c6dcb --- /dev/null +++ b/src/locales/it/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/it/biome.ts b/src/locales/it/biome.ts index 7e6a31422cd..602218fa852 100644 --- a/src/locales/it/biome.ts +++ b/src/locales/it/biome.ts @@ -1,11 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "Da qualche parte che non ricordi", "TOWN": "Città", "PLAINS": "Pianure", - "GRASS": "Campo Erboso", - "TALL_GRASS": "Erba Alta", + "GRASS": "Campo erboso", + "TALL_GRASS": "Erba alta", "METROPOLIS": "Metropoli", "FOREST": "Foresta", "SEA": "Mare", @@ -15,25 +15,25 @@ export const biome: SimpleTranslationEntries = { "SEABED": "Fondale", "MOUNTAIN": "Montagna", "BADLANDS": "Calanchi", - "CAVE": "Grotta", + "CAVE": "Caverna", "DESERT": "Deserto", - "ICE_CAVE": "Grotta Ghiacciata", + "ICE_CAVE": "Caverna ghiacciata", "MEADOW": "Prato", - "POWER_PLANT": "Centrale Elettrica", + "POWER_PLANT": "Centrale elettrica", "VOLCANO": "Vulcano", "GRAVEYARD": "Cimitero", "DOJO": "Dojo", "FACTORY": "Fabbrica", - "RUINS": "Antiche Rovine", + "RUINS": "Antiche rovine", "WASTELAND": "Terra Desolata", "ABYSS": "Abisso", "SPACE": "Spazio", "CONSTRUCTION_SITE": "Cantiere", "JUNGLE": "Giungla", - "FAIRY_CAVE": "Grotta Fatata", + "FAIRY_CAVE": "Caverna fatata", "TEMPLE": "Tempio", "SLUM": "Bassifondi", - "SNOWY_FOREST": "Foresta Innevata", + "SNOWY_FOREST": "Foresta innevata", "ISLAND": "Isola", "LABORATORY": "Laboratorio", "END": "???", diff --git a/src/locales/it/challenges.ts b/src/locales/it/challenges.ts index 149037be740..2643b16d0f7 100644 --- a/src/locales/it/challenges.ts +++ b/src/locales/it/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { - "title": "Challenge Modifiers", - "points": "Bad Ideas", - "confirm_start": "Proceed with these challenges?", - "singleGeneration.name": "Mono Gen", - "singleGeneration.value.0": "Off", - "singleGeneration.desc.0": "You can only use pokemon from the chosen generation.", - "singleGeneration.value.1": "Gen 1", - "singleGeneration.desc.1": "You can only use pokemon from generation one.", - "singleGeneration.value.2": "Gen 2", - "singleGeneration.desc.2": "You can only use pokemon from generation two.", - "singleGeneration.value.3": "Gen 3", - "singleGeneration.desc.3": "You can only use pokemon from generation three.", - "singleGeneration.value.4": "Gen 4", - "singleGeneration.desc.4": "You can only use pokemon from generation four.", - "singleGeneration.value.5": "Gen 5", - "singleGeneration.desc.5": "You can only use pokemon from generation five.", - "singleGeneration.value.6": "Gen 6", - "singleGeneration.desc.6": "You can only use pokemon from generation six.", - "singleGeneration.value.7": "Gen 7", - "singleGeneration.desc.7": "You can only use pokemon from generation seven.", - "singleGeneration.value.8": "Gen 8", - "singleGeneration.desc.8": "You can only use pokemon from generation eight.", - "singleGeneration.value.9": "Gen 9", - "singleGeneration.desc.9": "You can only use pokemon from generation nine.", - "singleType.name": "Mono Type", - "singleType.value.0": "Off", - "singleType.desc.0": "You can only use pokemon of the chosen type.", - "singleType.value.1": "Normal", - "singleType.desc.1": "You can only use pokemon with the Normal type.", - "singleType.value.2": "Fighting", - "singleType.desc.2": "You can only use pokemon with the Fighting type.", - "singleType.value.3": "Flying", - "singleType.desc.3": "You can only use pokemon with the Flying type.", - "singleType.value.4": "Poison", - "singleType.desc.4": "You can only use pokemon with the Poison type.", - "singleType.value.5": "Ground", - "singleType.desc.5": "You can only use pokemon with the Ground type.", - "singleType.value.6": "Rock", - "singleType.desc.6": "You can only use pokemon with the Rock type.", - "singleType.value.7": "Bug", - "singleType.desc.7": "You can only use pokemon with the Bug type.", - "singleType.value.8": "Ghost", - "singleType.desc.8": "You can only use pokemon with the Ghost type.", - "singleType.value.9": "Steel", - "singleType.desc.9": "You can only use pokemon with the Steel type.", - "singleType.value.10": "Fire", - "singleType.desc.10": "You can only use pokemon with the Fire type.", - "singleType.value.11": "Water", - "singleType.desc.11": "You can only use pokemon with the Water type.", - "singleType.value.12": "Grass", - "singleType.desc.12": "You can only use pokemon with the Grass type.", - "singleType.value.13": "Electric", - "singleType.desc.13": "You can only use pokemon with the Electric type.", - "singleType.value.14": "Psychic", - "singleType.desc.14": "You can only use pokemon with the Psychic type.", - "singleType.value.15": "Ice", - "singleType.desc.15": "You can only use pokemon with the Ice type.", - "singleType.value.16": "Dragon", - "singleType.desc.16": "You can only use pokemon with the Dragon type.", - "singleType.value.17": "Dark", - "singleType.desc.17": "You can only use pokemon with the Dark type.", - "singleType.value.18": "Fairy", - "singleType.desc.18": "You can only use pokemon with the Fairy type.", +export const challenges: TranslationEntries = { + "title": "Modificatori delle sfide", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "Mono gen", + "desc": "Puoi usare solo Pokémon di {{gen}} generazione.", + "desc_default": "Puoi usare solo Pokémon della generazione selezionata.", + "gen_1": "1ª", + "gen_2": "2ª", + "gen_3": "3ª", + "gen_4": "4ª", + "gen_5": "5ª", + "gen_6": "6ª", + "gen_7": "7ª", + "gen_8": "8ª", + "gen_9": "9ª", + }, + "singleType": { + "name": "Mono tipo", + "desc": "Puoi usare solo Pokémon di tipo {{type}}.", + "desc_default": "Puoi usare solo Pokémon del tipo selezionato." + }, } as const; diff --git a/src/locales/it/command-ui-handler.ts b/src/locales/it/command-ui-handler.ts index 7c30532d46c..acd0370ba05 100644 --- a/src/locales/it/command-ui-handler.ts +++ b/src/locales/it/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Lotta", diff --git a/src/locales/it/common.ts b/src/locales/it/common.ts new file mode 100644 index 00000000000..f42fa311472 --- /dev/null +++ b/src/locales/it/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Inizia", +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 333c11ae6a8..ac2e37c2df5 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const itConfig = { ability: ability, @@ -46,9 +50,11 @@ export const itConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const itConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/it/dialogue.ts b/src/locales/it/dialogue.ts index 26602079f65..702b550c45a 100644 --- a/src/locales/it/dialogue.ts +++ b/src/locales/it/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "I think it's me that's seasick..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", @@ -2107,6 +2287,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "You got caught in my storm! Better luck next time!" } }, + "alder": { + "encounter": { + 1: "Preparati ad affrontare l’allenatore più in gamba di Unima!" + }, + "victory": { + 1: "Ben fatto! Hai un talento invidiabile." + }, + "defeat": { + 1: `Un freddo vento attraversa il mio cuore... + $Che battaglia!` + } + }, + "kieran": { + "encounter": { + 1: `Attraverso il duro lavoro, divento sempre più forte! + $Non perdo mai.` + }, + "victory": { + 1: `Non posso crederci… + $Che battaglia mozzafiato!` + }, + "defeat": { + 1: `Cavoli, che scontro! + $È ora che tu ti alleni ancora più duramente.` + } + }, "rival": { "encounter": { 1: `@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye… diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index e486122280b..9b60b2f1835 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Uovo", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Non hai abbastanza Biglietti!", "tooManyEggs": "Hai troppe Uova!", "pull": "Tiro", - "pulls": "Tiri" + "pulls": "Tiri", + "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", + "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", + "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", } as const; diff --git a/src/locales/it/fight-ui-handler.ts b/src/locales/it/fight-ui-handler.ts index bd2cb0cfb0b..91f1c3c19f4 100644 --- a/src/locales/it/fight-ui-handler.ts +++ b/src/locales/it/fight-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "Potenza", "accuracy": "Precisione", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": "{{passive}} {{pokemonName}} {{abilityName}}", + "passive": "Passiva di ", // The space at the end is important } as const; diff --git a/src/locales/it/game-mode.ts b/src/locales/it/game-mode.ts index be342b4c390..88bc39e4a76 100644 --- a/src/locales/it/game-mode.ts +++ b/src/locales/it/game-mode.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", + "classic": "Classica", + "endless": "Infinita", + "endlessSpliced": "Infinita (fusioni)", + "dailyRun": "Run giornaliera", + "unknown": "Sconosciuta", + "challenge": "Sfida", } as const; diff --git a/src/locales/it/game-stats-ui-handler.ts b/src/locales/it/game-stats-ui-handler.ts index 64e4e2af5e3..f4b5f80e23b 100644 --- a/src/locales/it/game-stats-ui-handler.ts +++ b/src/locales/it/game-stats-ui-handler.ts @@ -1,44 +1,44 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", + "stats": "Statistiche", + "playTime": "Tempo di gioco", + "totalBattles": "Battaglie totali", "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "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", + "shinyStarters": "Starters shiny", + "speciesSeen": "Specie viste", + "speciesCaught": "Specie catturate", + "ribbonsOwned": "Fiocchi ottenuti", + "classicRuns": "Run in modalità classica", + "classicWins": "Vittorie in modalità classica", + "dailyRunAttempts": "Tentativi di run giornaliere", + "dailyRunWins": "Run giornaliere vinte", + "endlessRuns": "Run in modalità infinita", + "highestWaveEndless": "Orda più alta raggiunta (Infinita)", + "highestMoney": "Patrimonio maggiore posseduto", + "highestDamage": "Danni maggiori inflitti", + "highestHPHealed": "PS maggiori rigenerati", + "pokemonEncountered": "Pokémon incontrati", + "pokemonDefeated": "Pokémon sconfitti", + "pokemonCaught": "Pokémon catturati", + "eggsHatched": "Uova schiuse", + "subLegendsSeen": "Semi-leggendari visti", + "subLegendsCaught": "Semi-leggendari catturati", + "subLegendsHatched": "Semi-leggendari schiusi", + "legendsSeen": "Leggendari visti", + "legendsCaught": "Leggendari catturati", + "legendsHatched": "Leggendari schiusi", + "mythicalsSeen": "Mitici visti", + "mythicalsCaught": "Mitici catturati", + "mythicalsHatched": "Mitici schiusi", + "shiniesSeen": "Shiny visti", + "shiniesCaught": "Shiny catturati", + "shiniesHatched": "Shiny schiusi", + "pokemonFused": "Pokémon fusi", + "trainersDefeated": "Allenatori sconfitti", + "eggsPulled": "Uova ottenute", + "rareEggsPulled": "Uova rare ottenute", + "epicEggsPulled": "Uova epiche ottenute", + "legendaryEggsPulled": "Uova leggendarie ottenute", + "manaphyEggsPulled": "Uova di Manaphy ottenute", } as const; diff --git a/src/locales/it/growth.ts b/src/locales/it/growth.ts index 96edcac4d93..8132137d9fe 100644 --- a/src/locales/it/growth.ts +++ b/src/locales/it/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Irregolare", diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index 336fd997918..7aae9e26f6d 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Impostazioni", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importa Dati", "exportData": "Esporta Dati", "cancel": "Annulla", - "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?" + "losingProgressionWarning": "Perderai tutti i progressi dall'inizio della battaglia. Procedere?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 4e3da7ca992..3336373a6c3 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -8,13 +8,13 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; export const menu: SimpleTranslationEntries = { "cancel": "Annulla", "continue": "Continua", - "newGame": "Nuova Partita", - "loadGame": "Carica Partita", - "settings": "Settings", - "dailyRun": "Corsa Giornaliera (Beta)", + "newGame": "Nuova partita", + "loadGame": "Carica partita", + "settings": "Impostazioni", + "dailyRun": "Run giornaliera (Beta)", "selectGameMode": "Seleziona una modalità di gioco.", "logInOrCreateAccount": "Accedi o crea un nuovo account per iniziare. Non è richiesta un'email!", - "username": "Nome Utente", + "username": "Nome utente", "password": "Password", "login": "Accedi", "register": "Registrati", @@ -27,28 +27,32 @@ export const menu: SimpleTranslationEntries = { "accountNonExistent": "Account inesistente!", "unmatchingPassword": "La password inserita non è corretta!", "passwordNotMatchingConfirmPassword": "La password deve essere uguale alla conferma password!", - "confirmPassword": "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", + "dailyRankings": "Classifica giornaliera", + "weeklyRankings": "Classifica settimanale", + "noRankings": "Nessuna classifica", + "positionIcon": "#", + "usernameScoreboard": "Username", + "score": "Score", + "wave": "Wave", "loading": "Caricamento…", - "loadingAsset": "Loading asset: {{assetName}}", - "playersOnline": "Giocatori Online", - "evolving": "Cosa?\n{{pokemonName}} si evolvendo!", + "loadingAsset": "Caricamento asset: {{assetName}}", + "playersOnline": "Giocatori online", + "evolving": "Cosa?\n{{pokemonName}} si sta evolvendo!", "stoppedEvolving": "{{pokemonName}} ha smesso di evolversi.", - "pauseEvolutionsQuestion": "Vuoi sospendere le evoluzioni per {{pokemonName}}?\nLe evoluzioni possono essere riattivate dalla schermata del party.", + "pauseEvolutionsQuestion": "Vuoi sospendere le evoluzioni per {{pokemonName}}?\nPossono essere riattivate dalla schermata del party.", "evolutionsPaused": "Le evoluzioni sono state sospese per {{pokemonName}}.", "evolutionDone": "Congratulazioni!\n{{pokemonName}} si è evoluto in {{evolvedPokemonName}}!", "yes":"Si", "no":"No", "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed." + "disclaimerDescription": "Questo gioco è un prodotto incompleto; si potrebbero riscontrare errori (inclusa la perdita dei dati di salvataggio),\ncambiamenti impercettibili, e non è detto che venga aggiornato nel tempo o mai completato del tutto.", + "choosePokemon": "Choose a Pokémon.", + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index b16604200f8..2b7147133e1 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Calmanella" }, + "EVIOLITE": { name: "Evolcondensa", description: "Misteriosa materia evolutiva. Aumenta la Difesa e la Difesa Speciale di un Pokémon che può ancora evolversi." }, + "SOUL_DEW": { name: "Cuorugiada", description: "Aumenta del 10% l'influenza della natura di un Pokémon sulle sue statistiche (Aggiuntivo)." }, "NUGGET": { name: "Pepita" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Gettone di Resistenza" }, "ENEMY_FUSED_CHANCE": { name: "Gettone della fusione", description: "Aggiunge l'1% di possibilità che un Pokémon selvatico sia una fusione." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Elettropalla", description: "Strumento da dare a Pikachu. Sfera insolita che aumenta l’Attacco e l’Attacco Speciale." }, + "THICK_CLUB": { name: "Osso spesso", description: "Strumento da dare a Cubone o Marowak. Osso duro che aumenta l’Attacco." }, + "METAL_POWDER": { name: "Metalpolvere", description: "Strumento da dare a Ditto. Strana polvere finissima e al tempo stesso dura che migliora la Difesa." }, + "QUICK_POWDER": { name: "Velopolvere", description: "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità." } + }, TempBattleStatBoosterItem: { "x_attack": "Attacco X", "x_defense": "Difesa X", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "Precisione X", "dire_hit": "Supercolpo", }, + + TempBattleStatBoosterStatName: { + "ATK": "Attack", + "DEF": "Defense", + "SPATK": "Sp. Atk", + "SPDEF": "Sp. Def", + "SPD": "Speed", + "ACC": "Accuracy", + "CRIT": "Critical Hit Ratio", + "EVA": "Evasiveness", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "Sciarpa seta", "black_belt": "Cinturanera", diff --git a/src/locales/it/move.ts b/src/locales/it/move.ts index 677fcda093a..a7ebd605f18 100644 --- a/src/locales/it/move.ts +++ b/src/locales/it/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { pound: { diff --git a/src/locales/it/nature.ts b/src/locales/it/nature.ts index 401567901ad..3c6e8b4d29f 100644 --- a/src/locales/it/nature.ts +++ b/src/locales/it/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Ardita", diff --git a/src/locales/it/party-ui-handler.ts b/src/locales/it/party-ui-handler.ts index 9d3c7baa9ae..c174df03d1f 100644 --- a/src/locales/it/party-ui-handler.ts +++ b/src/locales/it/party-ui-handler.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "SEND_OUT": "Manda in campo", + "SUMMARY": "Sommario", + "CANCEL": "Annulla", + "RELEASE": "Rilascia", + "APPLY": "Applica", + "TEACH": "Insegna" } as const; diff --git a/src/locales/it/pokeball.ts b/src/locales/it/pokeball.ts index a07e4c2ca7d..df556415670 100644 --- a/src/locales/it/pokeball.ts +++ b/src/locales/it/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Poké Ball", @@ -6,5 +6,5 @@ export const pokeball: SimpleTranslationEntries = { "ultraBall": "Ultra Ball", "rogueBall": "Rogue Ball", "masterBall": "Master Ball", - "luxuryBall": "Chich Ball", + "luxuryBall": "Chic Ball", } as const; diff --git a/src/locales/it/pokemon-info-container.ts b/src/locales/it/pokemon-info-container.ts index 068c9ebb431..2d80763abc3 100644 --- a/src/locales/it/pokemon-info-container.ts +++ b/src/locales/it/pokemon-info-container.ts @@ -1,11 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Moveset", - "gender": "Gender:", - "ability": "Ability:", - "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common" + "moveset": "Set di mosse", + "gender": "Genere:", + "ability": "Abilità:", + "nature": "Natura:", + "epic": "Epico", + "rare": "Raro", + "common": "Comune" } as const; diff --git a/src/locales/it/pokemon-info.ts b/src/locales/it/pokemon-info.ts index 6da12e30720..9d8780e656b 100644 --- a/src/locales/it/pokemon-info.ts +++ b/src/locales/it/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "Dif. Sp.", "SPDEFshortened": "DifSp", "SPD": "Velocità", - "SPDshortened": "Vel" + "SPDshortened": "Vel", + "ACC": "Precisione", + "EVA": "Elusione" }, Type: { diff --git a/src/locales/it/pokemon.ts b/src/locales/it/pokemon.ts index 400a34e6e8b..8d0830aeb79 100644 --- a/src/locales/it/pokemon.ts +++ b/src/locales/it/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bulbasaur", diff --git a/src/locales/it/save-slot-select-ui-handler.ts b/src/locales/it/save-slot-select-ui-handler.ts index 16e36e471a5..d1825daeb1f 100644 --- a/src/locales/it/save-slot-select-ui-handler.ts +++ b/src/locales/it/save-slot-select-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", - "wave": "Wave", + "overwriteData": "Sovrascrivere i dati nello slot selezionato?", + "loading": "Caricamento...", + "wave": "Onda", "lv": "Lv", "empty": "Vuoto", } as const; diff --git a/src/locales/it/settings.ts b/src/locales/it/settings.ts new file mode 100644 index 00000000000..af48368aeeb --- /dev/null +++ b/src/locales/it/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Ragazzo", + "girl": "Ragazza", + "general": "General", + "display": "Display", + "audio": "Audio", + "gamepad": "Gamepad", + "keyboard": "Keyboard", + "gameSpeed": "Game Speed", + "hpBarSpeed": "HP Bar Speed", + "expGainsSpeed": "EXP Gains Speed", + "expPartyDisplay": "Show EXP Party", + "skipSeenDialogues": "Skip Seen Dialogues", + "battleStyle": "Battle Style", + "enableRetries": "Enable Retries", + "tutorials": "Tutorials", + "touchControls": "Touch Controls", + "vibrations": "Vibrations", + "normal": "Normal", + "fast": "Fast", + "faster": "Faster", + "skip": "Skip", + "levelUpNotifications": "Level Up Notifications", + "on": "On", + "off": "Off", + "switch": "Switch", + "set": "Set", + "auto": "Auto", + "disabled": "Disabled", + "language": "Language", + "change": "Change", + "uiTheme": "UI Theme", + "default": "Default", + "legacy": "Legacy", + "windowType": "Window Type", + "moneyFormat": "Money Format", + "damageNumbers": "Damage Numbers", + "simple": "Simple", + "fancy": "Fancy", + "abbreviated": "Abbreviated", + "moveAnimations": "Move Animations", + "showStatsOnLevelUp": "Show Stats on Level Up", + "candyUpgradeNotification": "Candy Upgrade Notification", + "passivesOnly": "Passives Only", + "candyUpgradeDisplay": "Candy Upgrade Display", + "icon": "Icon", + "animation": "Animation", + "moveInfo": "Move Info", + "showMovesetFlyout": "Show Moveset Flyout", + "showArenaFlyout": "Show Arena Flyout", + "showTimeOfDayWidget": "Show Time of Day Widget", + "timeOfDayAnimation": "Time of Day Animation", + "bounce": "Bounce", + "timeOfDay_back": "Back", + "spriteSet": "Sprite Set", + "consistent": "Consistent", + "mixedAnimated": "Mixed Animated", + "fusionPaletteSwaps": "Fusion Palette Swaps", + "playerGender": "Player Gender", + "typeHints": "Type Hints", + "masterVolume": "Master Volume", + "bgmVolume": "BGM Volume", + "seVolume": "SE Volume", + "musicPreference": "Music Preference", + "mixed": "Mixed", + "gamepadPleasePlug": "Please Plug in a Gamepad or Press a Button", + "delete": "Delete", + "keyboardPleasePress": "Please Press a Key on Your Keyboard", + "reset": "Reset", + "requireReload": "Reload Required", + "action": "Action", + "back": "Back", + "pressToBind": "Press to Bind", + "pressButton": "Press a Button...", + "buttonUp": "Up", + "buttonDown": "Down", + "buttonLeft": "Left", + "buttonRight": "Right", + "buttonAction": "Action", + "buttonMenu": "Menu", + "buttonSubmit": "Submit", + "buttonCancel": "Cancel", + "buttonStats": "Stats", + "buttonCycleForm": "Cycle Form", + "buttonCycleShiny": "Cycle Shiny", + "buttonCycleGender": "Cycle Gender", + "buttonCycleAbility": "Cycle Ability", + "buttonCycleNature": "Cycle Nature", + "buttonCycleVariant": "Cycle Variant", + "buttonSpeedUp": "Speed Up", + "buttonSlowDown": "Slow Down", + "alt": " (Alt)", + "mute": "Mute", + "controller": "Controller", + "gamepadSupport": "Gamepad Support", + "showBgmBar": "Show Music Names", +} as const; diff --git a/src/locales/it/splash-messages.ts b/src/locales/it/splash-messages.ts index 5fc1f7ed7b9..eeb71842094 100644 --- a/src/locales/it/splash-messages.ts +++ b/src/locales/it/splash-messages.ts @@ -1,14 +1,14 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "Battaglie Vinte!", "joinTheDiscord": "Entra nel Discord!", "infiniteLevels": "Livelli Infiniti!", "everythingStacks": "Tutto si impila!", - "optionalSaveScumming": "Salvataggio Facoltativo!", + "optionalSaveScumming": "Salvataggi Facoltativi!", "biomes": "35 Biomi!", "openSource": "Open Source!", - "playWithSpeed": "Gioca con il 5x di Velocità!", + "playWithSpeed": "Gioca con la velocità aumentata di 5 volte!", "liveBugTesting": "Test dei Bug in Tempo Reale!", "heavyInfluence": "Influenzato da RoR2!", "pokemonRiskAndPokemonRain": "Pokémon Risk e Pokémon Rain!", diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index 16061766f30..c84334fcd6a 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -7,38 +7,40 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; */ 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", + "gen1": "1ª", + "gen2": "2ª", + "gen3": "3ª", + "gen4": "4ª", + "gen5": "5ª", + "gen6": "6ª", + "gen7": "7ª", + "gen8": "8ª", + "gen9": "9ª", "growthRate": "Vel. Crescita:", "ability": "Abilità:", "passive": "Passiva:", "nature": "Natura:", - "eggMoves": "Mosse delle uova", - "start": "Inizia", - "addToParty": "Aggiungi al Gruppo", + "eggMoves": "Mosse da uova", + "addToParty": "Aggiungi al gruppo", "toggleIVs": "Vedi/Nascondi IV", - "manageMoves": "Gestisci Mosse", - "useCandies": "Usa Caramelle", + "manageMoves": "Gestisci mosse", + "manageNature": "Gestisci natura", + "useCandies": "Usa caramelle", + "selectNature": "Seleziona natura.", "selectMoveSwapOut": "Seleziona una mossa da scambiare.", "selectMoveSwapWith": "Seleziona una mossa da scambiare con", - "unlockPassive": "Sblocca Passiva", - "reduceCost": "Riduci Costo", + "sameSpeciesEgg": "Buy an Egg", + "unlockPassive": "Sblocca passiva", + "reduceCost": "Riduci costo", "cycleShiny": ": Shiny", "cycleForm": ": Forma", - "cycleGender": ": Sesso", + "cycleGender": ": Genere", "cycleAbility": ": Abilità", "cycleNature": ": Natura", "cycleVariant": ": Variante", - "enablePassive": "Attiva Passiva", - "disablePassive": "Disattiva Passiva", + "enablePassive": "Attiva passiva", + "disablePassive": "Disattiva passiva", "locked": "Bloccato", "disabled": "Disabilitato", - "uncaught": "Non Catturato" + "uncaught": "Non catturato" }; diff --git a/src/locales/it/status-effect.ts b/src/locales/it/status-effect.ts new file mode 100644 index 00000000000..1a402ac30fd --- /dev/null +++ b/src/locales/it/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 9c0a644c1c6..420b9bf9f24 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -6,258 +6,258 @@ export const titles: SimpleTranslationEntries = { "elite_four_female": "Superquattro", "gym_leader": "Capopalestra", "gym_leader_female": "Capopalestra", - "gym_leader_double": "Gym Leader Duo", + "gym_leader_double": "Duo Capopalestra", "champion": "Campione", - "champion_female": "Champion", - "champion_double": "Champion Duo", + "champion_female": "Campionessa", + "champion_double": "Duo Campioni", "rival": "Rivale", "professor": "Professore", - "frontier_brain": "Asso Lotta", + "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", - "firebreather": "Firebreather", - "fisherman": "Fisherman", - "fisherman_female": "Fisherman", - "gentleman": "Gentleman", - "guitarist": "Guitarist", - "guitarist_female": "Guitarist", - "harlequin": "Harlequin", - "hiker": "Hiker", - "hooligans": "Hooligans", - "hoopster": "Hoopster", - "infielder": "Infielder", - "janitor": "Janitor", + "ace_trainer": "Fantallenatore", + "ace_trainer_female": "Fantallenatrice", + "ace_duo": "Fantallenatori", + "artist": "Artista", + "artist_female": "Artista", + "backers": "Fan", + "backpacker": "Giramondo", + "backpacker_female": "Giramondo", + "backpackers": "Giramondo", + "baker": "Panettiera", + "battle_girl": "Combat Girl", + "beauty": "Bellezza", + "beginners": "Novellini", + "biker": "Centauro", + "black_belt": "Cinturanera", + "breeder": "Allevapokémon", + "breeder_female": "Allevapokémon", + "breeders": "Allevapokémon", + "clerk": "Affarista", + "clerk_female": "Donna in carriera", + "colleagues": "Soci in affari", + "crush_kin": "Duo Lotta", + "cyclist": "Ciclista", + "cyclist_female": "Ciclista", + "cyclists": "Ciclisti", + "dancer": "Ballerino", + "dancer_female": "Ballerina", + "depot_agent": "Ferroviario", + "doctor": "Medico", + "doctor_female": "Medica", + "firebreather": "Mangiafuoco", + "fisherman": "Pescatore", + "fisherman_female": "Pescatrice", + "gentleman": "Gentiluomo", + "guitarist": "Chitarrista", + "guitarist_female": "Chitarrista", + "harlequin": "Buffone", + "hiker": "Montanaro", + "hooligans": "Teppisti", + "hoopster": "Cestista", + "infielder": "Battitore", + "janitor": "Netturbino", "lady": "Lady", - "lass": "Lass", - "linebacker": "Linebacker", - "maid": "Maid", + "lass": "Pupa", + "linebacker": "Quarterback", + "maid": "Domestica", "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", + "medical_team": "Équipe medica", + "musician": "Musicista", + "hex_maniac": "Streghetta", + "nurse": "Infermiera", + "nursery_aide": "Maestrina", + "officer": "Guardia", + "parasol_lady": "Ombrellina", + "pilot": "Pilota", + "pokéfan": "PokéFan", + "pokéfan_female": "PokéFan", + "pokéfan_family": "Famiglia PokéFan", + "preschooler": "Bimbo", + "preschooler_female": "Bimba", + "preschoolers": "Bimbi", + "psychic": "Sensitivo", + "psychic_female": "Sensitiva", + "psychics": "Sensitivi", "pokémon_ranger": "Pokémon Ranger", "pokémon_ranger_female": "Pokémon Ranger", - "pokémon_rangers": "Pokémon Ranger", + "pokémon_rangers": "Duo 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", - "sailor": "Sailor", - "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" + "restaurant_staff": "Personale del ristorante", + "rich": "Ricco", + "rich_female": "Ricca", + "rich_boy": "Elegantone", + "rich_couple": "Ricchi", + "rich_kid": "Bimbo ricco", + "rich_kid_female": "Bimba ricca", + "rich_kids": "Bimbi ricchi", + "roughneck": "Zuccapelata", + "sailor": "Marinaio", + "scientist": "Scienziato", + "scientist_female": "Scienziata", + "scientists": "Scienziati", + "smasher": "Tennista", + "snow_worker": "Lavoratore", + "snow_worker_female": "Lavoratrice", + "striker": "Calciatore", + "school_kid": "Alunno", + "school_kid_female": "Alunna", + "school_kids": "Alunni", + "swimmer": "Nuotatore", + "swimmer_female": "Nuotatrice", + "swimmers": "Nuotatori", + "twins": "Gemelli", + "veteran": "Veterano", + "veteran_female": "Veterana", + "veteran_duo": "Veterani", + "waiter": "Cameriere", + "waitress": "Cameriera", + "worker": "Operaio", + "worker_female": "Lavoratrice", + "workers": "Lavoratori", + "youngster": "Bullo" } 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", + "lt_surge": "Lt. Surge", "erika": "Erika", - "janine": "Janine", + "janine": "Nina", "sabrina": "Sabrina", "blaine": "Blaine", "giovanni": "Giovanni", - "falkner": "Falkner", - "bugsy": "Bugsy", - "whitney": "Whitney", - "morty": "Morty", - "chuck": "Chuck", + "falkner": "Valerio", + "bugsy": "Raffaello", + "whitney": "Chiara", + "morty": "Angelo", + "chuck": "Furio", "jasmine": "Jasmine", - "pryce": "Pryce", - "clair": "Clair", - "roxanne": "Roxanne", - "brawly": "Brawly", - "wattson": "Wattson", - "flannery": "Flannery", + "pryce": "Alfredo", + "clair": "Sandra", + "roxanne": "Petra", + "brawly": "Rudi", + "wattson": "Walter", + "flannery": "Fiammetta", "norman": "Norman", - "winona": "Winona", - "tate": "Tate", - "liza": "Liza", - "juan": "Juan", - "roark": "Roark", + "winona": "Alice", + "tate": "Tell", + "liza": "Pat", + "juan": "Rodolfo", + "roark": "Pedro", "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", + "maylene": "Marzia", + "crasher_wake": "Omar", + "fantina": "Fannie", + "byron": "Ferruccio", + "candice": "Bianca", + "volkner": "Corrado", + "cilan": "Spighetto", + "chili": "Chicco", + "cress": "Maisello", + "cheren": "Komor", + "lenora": "Aloé", + "roxie": "Velia", + "burgh": "Artemisio", + "elesa": "Camelia", + "clay": "Rafan", + "skyla": "Anemone", + "brycen": "Silvestro", + "drayden": "Aristide", + "marlon": "Ciprian", + "viola": "Violetta", + "grant": "Lino", + "korrina": "Ornella", + "ramos": "Amur", + "clemont": "Lem", + "valerie": "Valérie", + "olympia": "Astra", + "wulfric": "Edel", + "milo": "Yarrow", + "nessa": "Azzurra", "kabu": "Kabu", - "bea": "Bea", - "allister": "Allister", - "opal": "Opal", - "bede": "Bede", - "gordie": "Gordie", - "melony": "Melony", - "piers": "Piers", - "marnie": "Marnie", + "bea": "Fabia", + "allister": "Onion", + "opal": "Poppy", + "bede": "Beet", + "gordie": "Milo", + "melony": "Melania", + "piers": "Ginepro", + "marnie": "Mary", "raihan": "Raihan", - "katy": "Katy", + "katy": "Aceria", "brassius": "Brassius", - "iono": "Iono", - "kofu": "Kofu", - "larry": "Larry", + "iono": "Kissara", + "kofu": "Algaro", + "larry": "Ubaldo", "ryme": "Ryme", - "tulip": "Tulip", + "tulip": "Tulipa", "grusha": "Grusha", "lorelei": "Lorelei", "bruno": "Bruno", "agatha": "Agatha", "lance": "Lance", - "will": "Will", + "will": "Pino", "koga": "Koga", "karen": "Karen", - "sidney": "Sidney", - "phoebe": "Phoebe", - "glacia": "Glacia", + "sidney": "Fosco", + "phoebe": "Ester", + "glacia": "Frida", "drake": "Drake", "aaron": "Aaron", - "bertha": "Bertha", - "flint": "Flint", - "lucian": "Lucian", - "shauntal": "Shauntal", - "marshal": "Marshal", - "grimsley": "Grimsley", - "caitlin": "Caitlin", + "bertha": "Terrie", + "flint": "Vulcano", + "lucian": "Luciano", + "shauntal": "Antemia", + "marshal": "Marzio", + "grimsley": "Mirton", + "caitlin": "Catlina", "malva": "Malva", - "siebold": "Siebold", - "wikstrom": "Wikstrom", - "drasna": "Drasna", + "siebold": "Narciso", + "wikstrom": "Timeos", + "drasna": "Lila", "hala": "Hala", - "molayne": "Molayne", - "olivia": "Olivia", - "acerola": "Acerola", + "molayne": "Tapso", + "olivia": "Olive", + "acerola": "Mapli", "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", + "hassel": "Oranzio", + "crispin": "Piros", + "amarys": "Erin", + "lacey": "Rupi", + "drayton": "Aris", + "blue": "Blu", + "red": "Rosso", + "steven": "Rocco", + "wallace": "Adriano", + "cynthia": "Camilla", + "alder": "Nardo", "iris": "Iris", "diantha": "Diantha", "hau": "Hau", - "geeta": "Geeta", - "nemona": "Nemona", - "kieran": "Kieran", - "leon": "Leon", + "geeta": "Alisma", + "nemona": "Nemi", + "kieran": "Riben", + "leon": "Dandel", "rival": "Finn", "rival_female": "Ivy", // Double Names - "blue_red_double": "Blue & Red", - "red_blue_double": "Red & Blue", - "tate_liza_double": "Tate & Liza", - "liza_tate_double": "Liza & Tate", - "steven_wallace_double": "Steven & Wallace", - "wallace_steven_double": "Wallace & Steven", - "alder_iris_double": "Alder & Iris", - "iris_alder_double": "Iris & Alder", - "marnie_piers_double": "Marnie & Piers", - "piers_marnie_double": "Piers & Marnie", + "blue_red_double": "Blu & Rosso", + "red_blue_double": "Rosso & Blu", + "tate_liza_double": "Tell & Pat", + "liza_tate_double": "Pat & Tell", + "steven_wallace_double": "Rocco & Adriano", + "wallace_steven_double": "Adriano & Rocco", + "alder_iris_double": "Nardo & Iris", + "iris_alder_double": "Iris & Nardo", + "marnie_piers_double": "Mary & Ginepro", + "piers_marnie_double": "Ginepro & Mary", } as const; diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts index 8488fc3151f..1a746cf0db7 100644 --- a/src/locales/it/tutorial.ts +++ b/src/locales/it/tutorial.ts @@ -1,42 +1,42 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "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`, + $Questo gioco non è monetizzato e non siamo proprietari di Pokémon ed assets presenti nel gioco. + $Il progetto è work-in-progress, ma giocabile al 100%.\nPer segnalare eventuali bug è possibile contattarci al nostro apposito Discord. + $Se il gioco 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 menu, premi M o esc.\nDal menu puoi modificare le impostazioni, controllare la wiki ed accedere a varie features.", - "menu": `Da questo menù puoi accedere alle impostazioni. - $Dalle impostazioni puoi cambiare velocità di gioco, stile di finestra e altre opzioni. - $Ci sono varie funzionalità, controlla bene e non perderti nulla!`, + "menu": `Da questo menu puoi accedere alle impostazioni. + $Esse ti permettono di cambiare velocità di gioco, stile delle finestre ed 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 della tua squadra. $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. + $Puoi anche selezionare genere, 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. - $Se possiedi uno di questi starter,\nprova ad aggiungerlo al party. Ricorda di controllare le info!`, + "pokerus": `Giornalmente 3 starter casuali disponibili avranno il bordo viola. + $Se possiedi uno di questi starter,\nprova ad aggiungerlo alla squadra. Ricorda di controllarne 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 restano 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. - $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. - $Puoi anche passare un Item tenuto da un Pokèmon ad un altro attraverso l'opzione 'trasferisci strumento'. - $L'opzione 'trasferisci strumento' sarà disponibile solo dopo aver assegnato uno strumento ad un Pokèmon. - $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.`, + "selectItem": `Dopo ogni battaglia potrai scegliere tra 3 oggetti.\nPotrai prenderne solo uno. + $Questi spaziano tra consumabili, oggetti tenuti da Pokèmon o con un effetto passivo permanente. + $La maggior parte degli oggetti non consumabili possono accumulare i loro effetti in diversi modi. + $Alcuni risulteranno inoltre disponibili solo se possono essere usati, come ad esempio gli oggetti evolutivi. + $Puoi anche passare un oggetto tenuto da un Pokèmon a un altro attraverso l'opzione 'trasferisci strumento'. + $Quest'ultima sarà disponibile solo dopo aver assegnato uno strumento ad un Pokèmon. + $Puoi acquistare consumabili con le monete; progredendo saranno poi disponibili ulteriori oggetti. + $Assicurati di fare un acquisto prima di selezionare un item casuale, poichè dopo aver fatto ciò passerai subito alla lotta successiva.`, - "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. + "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, ma saranno\ninvece aggiunti ai tuoi starters. + $I Pokémon schiusi hanno (generalmente) IVs migliori rispetto ai\n Pokémon selvatici. + $Inoltre, alcuni Pokémon possono essere ottenuti solo tramite uova. $Ci sono 3 diversi macchinari con differenti\nbonus, scegli quello che preferisci!`, } as const; diff --git a/src/locales/it/voucher.ts b/src/locales/it/voucher.ts index f2bcb8d723c..54e81dbc9d4 100644 --- a/src/locales/it/voucher.ts +++ b/src/locales/it/voucher.ts @@ -1,11 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Vouchers", - "eggVoucher": "Egg Voucher", - "eggVoucherPlus": "Egg Voucher Plus", - "eggVoucherPremium": "Egg Voucher Premium", - "eggVoucherGold": "Egg Voucher Gold", - "locked": "Locked", - "defeatTrainer": "Defeat {{trainerName}}" -} as const; + "eggVoucher": "Voucher uovo", + "eggVoucherPlus": "Voucher uovo plus", + "eggVoucherPremium": "Voucher uovo premium", + "eggVoucherGold": "Voucher uovo dorato", + "locked": "Bloccato", + "defeatTrainer": "Sconfiggi {{trainerName}}" +} as const; diff --git a/src/locales/it/weather.ts b/src/locales/it/weather.ts index ed5d41a80af..2d169421a38 100644 --- a/src/locales/it/weather.ts +++ b/src/locales/it/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 3ce78178081..58ba7bf9aa6 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -1,10 +1,13 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", + "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", + "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", } as const; diff --git a/src/locales/ko/ability.ts b/src/locales/ko/ability.ts index c254ea635d6..18b102800cf 100644 --- a/src/locales/ko/ability.ts +++ b/src/locales/ko/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; /** * 본가 게임과 텍스트가 다를 경우 주석으로 표시 @@ -1154,7 +1154,7 @@ export const ability: AbilityTranslationEntries = { }, beadsOfRuin: { name: "재앙의구슬", - description: "재앙을 부르는 곡옥의 힘으 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." + description: "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다." }, orichalcumPulse: { name: "진홍빛고동", diff --git a/src/locales/ko/achv.ts b/src/locales/ko/achv.ts index 295c4cf72a1..d8b8cc54f66 100644 --- a/src/locales/ko/achv.ts +++ b/src/locales/ko/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { @@ -26,7 +26,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "DamageAchv": { - description: "한 번의 공격만으로 {{damageAmount}} 대미지", + description: "한 번의 공격만으로 {{damageAmount}} 데미지", }, "250_DMG": { name: "강타자", diff --git a/src/locales/ko/battle-message-ui-handler.ts b/src/locales/ko/battle-message-ui-handler.ts index 20266a063e5..fdd79044090 100644 --- a/src/locales/ko/battle-message-ui-handler.ts +++ b/src/locales/ko/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "최고", diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index cd81dce400f..e9bfb7cb307 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}}[[가]] 나타났다.", @@ -15,6 +15,7 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "{{trainerName}}[[와]]의\n승부에서 이겼다!", "moneyWon": "상금으로\n₽{{moneyAmount}}을 손에 넣었다!", "pokemonCaught": "신난다-!\n{{pokemonName}}[[를]] 잡았다!", + "addedAsAStarter": "{{pokemonName}}[[가]]\n스타팅 포켓몬에 추가되었다!", "partyFull": "지닌 포켓몬이 가득 찼습니다. {{pokemonName}}[[를]]\n대신해 포켓몬을 놓아주시겠습니까?", "pokemon": "포켓몬", "sendOutPokemon": "가랏! {{pokemonName}}!", @@ -25,6 +26,7 @@ export const battle: SimpleTranslationEntries = { "hitResultOneHitKO": "일격필살!", "attackFailed": "하지만 실패했다!", "attackHitsCount": "{{count}}번 맞았다!", + "rewardGain": "{{modifierName}}[[를]] 받았다!", "expGain": "{{pokemonName}}[[는]]\n{{exp}} 경험치를 얻었다!", "levelUp": "{{pokemonName}}[[는]]\n레벨 {{level}}[[로]] 올랐다!", "learnMove": "{{pokemonName}}[[는]] 새로\n{{moveName}}[[를]] 배웠다!", @@ -53,6 +55,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "교체할", "escapeVerbFlee": "도망칠", "notDisabled": "{{pokemonName}}의\n{{moveName}} 사슬묶기가 풀렸다!", + "turnEndHpRestore": "{{pokemonName}}의\n체력이 회복되었다!", + "hpIsFull": "그러나 {{pokemonName}}의\n체력이 가득 찬 상태다!", "skipItemQuestion": "아이템을 받지 않고 넘어가시겠습니까?", "eggHatching": "어라…?", "ivScannerUseQuestion": "{{pokemonName}}에게 개체값탐지기를 사용하시겠습니까?", @@ -60,6 +64,73 @@ export const battle: SimpleTranslationEntries = { "foePokemonWithAffix": "상대 {{pokemonName}}", "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", - "regainHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!", + "stealEatBerry": "{{pokemonName}}[[가]]\n{{targetName}}의 {{berryName}}[[를]] 빼앗아 먹었다!", + "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", + "statRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statSharplyRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statRoseDrastically": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statHarshlyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statSeverelyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", + "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}로부터 풀려났다!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}[[는]] 풀이 죽어\n움직일 수 없었다!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠졌다!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}의\n혼란이 풀렸다!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 혼란에 빠져 있다", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}[[는]]\n혼란에 빠져 있다!", + "battlerTagsConfusedLapseHurtItself": "영문도 모른채\n자신을 공격했다!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}[[는]]\n길동무의 영향을 받지 않는다.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}[[는]] {{pokemonNameWithAffix2}}[[를]]\n길동무로 삼았다!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱해졌다!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 헤롱헤롱해있다!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonName}}에게 헤롱헤롱해 있다!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}[[는]] 헤롱헤롱해서\n기술을 쓸 수 없었다!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}[[는]]\n헤롱헤롱 상태에서 벗어났다.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}}에게\n씨앗을 심었다!", + "battlerTagsSeededLapse": "씨뿌리기가 {{pokemonNameWithAffix}}의\n체력을 빼앗는다!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}[[는]]\n씨앗을 날려버렸다!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}[[는]]\n악몽을 꾸기 시작했다!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}[[는]]\n이미 악몽을 꾸고 있다!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}[[는]]\n악몽에 시달리고 있다!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}[[는]]\n앙코르를 받았다!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}의\n앙코르 상태가 풀렸다!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}[[는]] {{pokemonName}}에게\n도우미가 되어주려 한다!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!", + "battlerTagsAquaRingLapse": "{{moveName}} 효과로 \n{{pokemonName}}[[는]] HP를 회복했다!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n휘감겼다!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}[[는]]\n소용돌이 속에 갇혔다!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}[[는]] {{pokemonName}}의\n껍질에 꼈다!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{moveName}}에 붙잡혔다!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}[[는]]\n마그마의 소용돌이에 갇혔다!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}[[는]]\n집게덫에 붙잡혔다!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}[[는]]\n{{pokemonNameWithAffix}}를 가두었다!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}[[는]]\n{{sourcePokemonNameWithAffix}}에게 엉겨 붙었다!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n방어 태세에 들어갔다!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}[[는]]\n공격으로부터 몸을 지켰다!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}[[는]]\n버티기 태세에 들어갔다!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!", + "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", } as const; diff --git a/src/locales/ko/berry.ts b/src/locales/ko/berry.ts index bea5d9ee13c..722edf62c9a 100644 --- a/src/locales/ko/berry.ts +++ b/src/locales/ko/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts new file mode 100644 index 00000000000..c133a93450e --- /dev/null +++ b/src/locales/ko/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "BW2 관동 챔피언 배틀", + "battle_johto_champion": "BW2 성도 챔피언 배틀", + "battle_hoenn_champion": "BW2 호연 챔피언 배틀", + "battle_sinnoh_champion": "BW2 신오 챔피언 배틀", + "battle_champion_alder": "BW 하나 챔피언 배틀", + "battle_champion_iris": "BW2 하나 챔피언 배틀", + "battle_kalos_champion": "XY 칼로스 챔피언 배틀", + "battle_alola_champion": "USUM 알로라 챔피언 배틀", + "battle_galar_champion": "SWSH 가라르 챔피언 배틀", + "battle_champion_geeta": "SV 챔피언 테사 배틀", + "battle_champion_nemona": "SV 챔피언 네모 배틀", + "battle_champion_kieran": "SV 챔피언 카지 배틀", + "battle_hoenn_elite": "ORAS 사천왕 배틀", + "battle_unova_elite": "BW 사천왕 배틀", + "battle_kalos_elite": "XY 사천왕 배틀", + "battle_alola_elite": "SM 사천왕 배틀", + "battle_galar_elite": "SWSH 리그 토너먼트 배틀", + "battle_paldea_elite": "SV 사천왕 배틀", + "battle_bb_elite": "SV 블루베리 리그 사천왕 배틀", + "battle_final_encounter": "불가사의 던전 구조대 DX 레쿠쟈의 영역", + "battle_final": "BW 게치스 배틀", + "battle_kanto_gym": "BW2 관동 체육관 배틀", + "battle_johto_gym": "BW2 성도 체육관 배틀", + "battle_hoenn_gym": "BW2 호연 체육관 배틀", + "battle_sinnoh_gym": "BW2 신오 체육관 배틀", + "battle_unova_gym": "BW 하나 체육관 배틀", + "battle_kalos_gym": "XY 칼로스 체육관 배틀", + "battle_galar_gym": "SWSH 가라르 체육관 배틀", + "battle_paldea_gym": "SV 팔데아 체육관 배틀", + "battle_legendary_kanto": "XY 관동 전설 조우 배틀", + "battle_legendary_raikou": "HGSS 라이코 배틀", + "battle_legendary_entei": "HGSS 엔테이 배틀", + "battle_legendary_suicune": "HGSS 스이쿤 배틀", + "battle_legendary_lugia": "HGSS 루기아 배틀", + "battle_legendary_ho_oh": "HGSS 칠색조 배틀", + "battle_legendary_regis_g5": "BW2 레지시리즈 배틀", + "battle_legendary_regis_g6": "ORAS 레지시리즈 배틀", + "battle_legendary_gro_kyo": "ORAS 그란돈 & 가이오가 배틀", + "battle_legendary_rayquaza": "ORAS 레쿠쟈 배틀", + "battle_legendary_deoxys": "ORAS 데오키시스 배틀", + "battle_legendary_lake_trio": "ORAS 호수의 수호신 배틀", + "battle_legendary_sinnoh": "ORAS 신오 전설 조우 배틀", + "battle_legendary_dia_pal": "ORAS 디아루가 & 펄기아 배틀", + "battle_legendary_giratina": "ORAS 기라티나 배틀", + "battle_legendary_arceus": "HGSS 아르세우스 배틀", + "battle_legendary_unova": "BW 하나 전설 조우 배틀", + "battle_legendary_kyurem": "BW 큐레무 배틀", + "battle_legendary_res_zek": "BW 레시라무 & 제크로무 배틀", + "battle_legendary_xern_yvel": "XY 제르네아스 & 이벨타르 배틀", + "battle_legendary_tapu": "SM 섬 수호신 배틀", + "battle_legendary_sol_lun": "SM 솔가레오 & 루나아라 배틀", + "battle_legendary_ub": "SM 울트라비스트 배틀", + "battle_legendary_dusk_dawn": "USUM 황혼의 갈기 & 새벽의 날개 네크로즈마 배틀", + "battle_legendary_ultra_nec": "USUM 울트라 네크로즈마 배틀", + "battle_legendary_zac_zam": "SWSH 자시안 & 자마젠타 배틀", + "battle_legendary_glas_spec": "SWSH 블리자포스 & 레이스포스 배틀", + "battle_legendary_calyrex": "SWSH 버드렉스 배틀", + "battle_legendary_birds_galar": "SWSH 가라르 전설의 새 배틀", + "battle_legendary_ruinous": "SV 재앙의 보물 배틀", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV 세벗들 배틀", + "battle_legendary_ogerpon": "SV 오거폰 배틀", + "battle_legendary_terapagos": "SV 테라파고스 배틀", + "battle_legendary_pecharunt": "SV 복숭악동 배틀", + "battle_rival": "BW 라이벌 배틀", + "battle_rival_2": "BW N 배틀", + "battle_rival_3": "BW 최종전 N 배틀", + "battle_trainer": "BW 트레이너 배틀", + "battle_wild": "BW 야생 포켓몬 배틀", + "battle_wild_strong": "BW 강한 야생 포켓몬 조우 배틀", + "end_summit": "불가사의 던전 구조대 DX 천공의 탑 꼭대기", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW 플라스마단 배틀", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "불가사의 던전 하늘의 탐험대 어둠의 화구", + "badlands": "불가사의 던전 하늘의 탐험대 불모의 계곡", + "beach": "불가사의 던전 하늘의 탐험대 축축한 암반", + "cave": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 동굴", + "construction_site": "불가사의 던전 하늘의 탐험대 바위 채석장", + "desert": "불가사의 던전 하늘의 탐험대 북쪽 사막", + "dojo": "불가사의 던전 하늘의 탐험대 텅구리 도장", + "end": "불가사의 던전 구조대DX 천공의 탑", + "factory": "불가사의 던전 하늘의 탐험대 숨겨진 유적", + "fairy_cave": "불가사의 던전 하늘의 탐험대 별의 동굴", + "forest": "불가사의 던전 하늘의 탐험대 검은 숲", + "grass": "불가사의 던전 하늘의 탐험대 사과의 숲", + "graveyard": "불가사의 던전 하늘의 탐험대 신비의 숲", + "ice_cave": "불가사의 던전 하늘의 탐험대 광대한 얼음산", + "island": "불가사의 던전 하늘의 탐험대 연안의 암반", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "불가사의 던전 하늘의 탐험대 수정 동굴", + "meadow": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 숲", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "불가사의 던전 하늘의 탐험대 뿔산", + "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", + "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", + "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", + "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", + "space": "Firel - Aether", + "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", + "tall_grass": "불가사의 던전 하늘의 탐험대 짙은 안개의 숲", + "temple": "불가사의 던전 하늘의 탐험대 파수꾼의 동굴", + "town": "불가사의 던전 하늘의 탐험대 랜덤 던전 테마 3", + "volcano": "불가사의 던전 하늘의 탐험대 열수의 동굴", + "wasteland": "불가사의 던전 하늘의 탐험대 환상의 대지", + + // Encounter + "encounter_ace_trainer": "BW 눈이 마주치면 승부! (엘리트 트레이너)", + "encounter_backpacker": "BW 눈이 마주치면 승부! (등산가)", + "encounter_clerk": "BW 눈이 마주치면 승부! (회사원)", + "encounter_cyclist": "BW 눈이 마주치면 승부! (사이클링)", + "encounter_lass": "BW 눈이 마주치면 승부! (짧은 치마)", + "encounter_parasol_lady": "BW 눈이 마주치면 승부! (파라솔 아가씨)", + "encounter_pokefan": "BW 눈이 마주치면 승부! (애호가클럽)", + "encounter_psychic": "BW 눈이 마주치면 승부! (초능력자)", + "encounter_rich": "BW 눈이 마주치면 승부! (신사)", + "encounter_rival": "BW 체렌", + "encounter_roughneck": "BW 눈이 마주치면 승부! (빡빡이)", + "encounter_scientist": "BW 눈이 마주치면 승부! (연구원)", + "encounter_twins": "BW 눈이 마주치면 승부! (쌍둥이)", + "encounter_youngster": "BW 눈이 마주치면 승부! (반바지 꼬마)", + + // Other + "heal": "BW 포켓몬 센터", + "menu": "불가사의 던전 하늘의 탐험대 포켓몬 세계에 온 것을 환영한다!", + "title": "불가사의 던전 하늘의 탐험대 메뉴 테마", +} as const; diff --git a/src/locales/ko/biome.ts b/src/locales/ko/biome.ts index 60fb016df64..7167618d161 100644 --- a/src/locales/ko/biome.ts +++ b/src/locales/ko/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "기억할 수 없는 곳", diff --git a/src/locales/ko/challenges.ts b/src/locales/ko/challenges.ts index 3dad36fd8d1..1f10c4f215a 100644 --- a/src/locales/ko/challenges.ts +++ b/src/locales/ko/challenges.ts @@ -1,67 +1,26 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "챌린지 조건 설정", - "points": "Bad Ideas", - "confirm_start": "이 조건으로 챌린지를 진행하시겠습니까?", - "singleGeneration.name": "단일 세대", - "singleGeneration.value.0": "설정 안함", - "singleGeneration.desc.0": "선택한 세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.1": "1세대", - "singleGeneration.desc.1": "1세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.2": "2세대", - "singleGeneration.desc.2": "2세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.3": "3세대", - "singleGeneration.desc.3": "3세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.4": "4세대", - "singleGeneration.desc.4": "4세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.5": "5세대", - "singleGeneration.desc.5": "5세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.6": "6세대", - "singleGeneration.desc.6": "6세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.7": "7세대", - "singleGeneration.desc.7": "7세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.8": "8세대", - "singleGeneration.desc.8": "8세대의 포켓몬만 사용할 수 있습니다.", - "singleGeneration.value.9": "9세대", - "singleGeneration.desc.9": "9세대의 포켓몬만 사용할 수 있습니다.", - "singleType.name": "단일 타입", - "singleType.value.0": "설정 안함", - "singleType.desc.0": "선택한 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.1": "노말", - "singleType.desc.1": "노말 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.2": "격투", - "singleType.desc.2": "격투 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.3": "비행", - "singleType.desc.3": "비행 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.4": "독", - "singleType.desc.4": "독 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.5": "땅", - "singleType.desc.5": "땅 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.6": "바위 ", - "singleType.desc.6": "바위 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.7": "벌레", - "singleType.desc.7": "벌레 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.8": "고스트", - "singleType.desc.8": "고스트 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.9": "강철", - "singleType.desc.9": "강철 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.10": "불꽃", - "singleType.desc.10": "불꽃 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.11": "물", - "singleType.desc.11": "물 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.12": "풀", - "singleType.desc.12": "풀 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.13": "전기", - "singleType.desc.13": "전기 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.14": "에스퍼", - "singleType.desc.14": "에스퍼 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.15": "얼음", - "singleType.desc.15": "얼음 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.16": "드래곤", - "singleType.desc.16": "드래곤 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.17": "악", - "singleType.desc.17": "악 타입의 포켓몬만 사용할 수 있습니다.", - "singleType.value.18": "페어리", - "singleType.desc.18": "페어리 타입의 포켓몬만 사용할 수 있습니다.", + "illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!", + "singleGeneration": { + "name": "단일 세대", + "desc": "{{gen}}의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 세대의 포켓몬만 사용할 수 있습니다.", + "gen_1": "1세대", + "gen_2": "2세대", + "gen_3": "3세대", + "gen_4": "4세대", + "gen_5": "5세대", + "gen_6": "6세대", + "gen_7": "7세대", + "gen_8": "8세대", + "gen_9": "9세대", + }, + "singleType": { + "name": "단일 타입", + "desc": "{{type}} 타입의 포켓몬만 사용할 수 있습니다.", + "desc_default": "선택한 타입의 포켓몬만 사용할 수 있습니다." + //type in pokemon-info + }, } as const; diff --git a/src/locales/ko/command-ui-handler.ts b/src/locales/ko/command-ui-handler.ts index b10534cfb92..a40ec0316bf 100644 --- a/src/locales/ko/command-ui-handler.ts +++ b/src/locales/ko/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "싸운다", diff --git a/src/locales/ko/common.ts b/src/locales/ko/common.ts new file mode 100644 index 00000000000..d87be482f99 --- /dev/null +++ b/src/locales/ko/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "시작", +} as const; diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index ca14d87cc10..59603c8519d 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const koConfig = { ability: ability, @@ -46,9 +50,11 @@ export const koConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const koConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index 016bf046dd6..a98b31a7c61 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -1,4 +1,4 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/plugins/i18n"; +import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -860,19 +860,19 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "crasher_wake": { "encounter": { - 1: "Crash! Crash! Watch out!\nCrasher Wake…is…heeere!", - 2: "Crash! Crash! Crasher Wake!", - 3: "I'm the tidal wave of power to wash you away!" + 1: "철썩! 철썩! 조심해라!\n맥시멈 가면이…지금…간다!", + 2: "철썩! 철썩! 파도의 맥시멈 가면!", + 3: "밀물같은 힘으로 쓸려나가도록 해보실까!!" }, "victory": { - 1: "That puts a grin on my face!\nGuhahaha! That was a blast!", - 2: "Hunwah! It's gone and ended!\nHow will I say this…\nI want more! I wanted to battle a lot more!", - 3: "WHAAAAT!?" + 1: "저절로 웃음이 나오게 되는군!\n크하하핫! 정말 훌륭했다!", + 2: "우왓! 끝나버렸나!\n뭐랄까…\n좀 더 싸우고 싶은 기분이야!", + 3: "이럴수가!?" }, "defeat": { - 1: "Yeeeeah! That's right!", - 2: "I won, but I want more! I wanted to battle a lot more!", - 3: "So long!" + 1: "으하하핫! 보람차군!", + 2: "내가 이겼지만, 아쉽군! 좀 더 배틀하고 싶은데!", + 3: "잘 가게나!" } }, "falkner": { @@ -928,108 +928,108 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "marlon": { "encounter": { - 1: "You look strong! Shoots! Let's start!", - 2: "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.", - 3: "Oh ho, so I'm facing you! That's off the wall." + 1: "너 강해보이네! 받아라! 승부 시작이야!", + 2: "난 넓은 대양처럼 강인하다고. 너 분명히 휩쓸려 갈거야.", + 3: "오, 내가 너를 마주 보고 있군! 둘다 파도에서 떨어지겠어." }, "victory": { - 1: "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!", - 2: "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!", - 3: "You're strong as a gnarly wave!" + 1: "너… 좋은 포켓몬을 키우고 있구나! 꽤 하는군! 끝내주는 트레이너야!", + 2: "강해 보이는 게 아니고 진짜 강하구나! 에-, 나도 휩쓸려버렸어!", + 3: "넌 거친 파도처럼 강인하구나!" }, "defeat": { - 1: "You're tough, but it's not enough to sway the sea, 'K!", - 2: "Hee! Looks like I went and won again!", - 3: "Sweet, sweet victory!" + 1: "넌 강하지만, 바다를 흔들기에는 역부족이네, 그치!", + 2: "아하핫! 내가 또 이긴 것 같네!", + 3: "달콤하네, 승리 역시 달콤하고!" } }, "shauntal": { "encounter": { - 1: "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.", - 2: "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?", - 3: "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?" + 1: "미안합니다. 도전자이시죠?\n고스트포켓몬 조련사인 사천왕 망초가 상대하겠습니다.", + 2: "겨루었던 트레이너와 포켓몬의 마음이 통하는 모습을 이야기로 만드는 것을 좋아해서요!\n그러니까 당신들에 대한 취재를 허락해 주세요?", + 3: "포켓몬과 함께 일하는 모든 사람들은 각자 이야기를 갖고 있죠.\n어떤 이야기를 들려드릴까요?" }, "victory": { - 1: "Wow. I'm dumbstruck!", - 2: "S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!", - 3: "Even in light of that, I'm still one of the Elite Four!" + 1: "…우와. 저 아연실색 망연자실이에요!", + 2: "미-미 미안합니다! 먼저 포켓몬에게 사과해야지…\n\n나 때문에 괴로운 기억을 만들게 돼서 정말 미안해!", + 3: "그치만, 전 여전히 사천왕인걸요!" }, "defeat": { - 1: "Eheh.", - 2: "That gave me excellent material for my next novel!", - 3: "And so, another tale ends…" + 1: "에헤헤.", + 2: "다음 소설의 완벽한 소재를 얻었다!", + 3: "그리고 이렇게, 또 다른 이야기가 끝났습니다…" } }, "marshal": { "encounter": { - 1: "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!", - 2: "Victory, decisive victory, is my intention! Challenger, here I come!", - 3: "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!" + 1: "노간주 스승님이, 잠재력을 보고 네게 관심을 갖고 계시더군.\n그 힘의 한계까지 데려가는 것이 이번 의도다! 그럼 간다!", + 2: "승리, 압도적인 승리, 내가 바라는 것이다! 강인한 도전자여, 간다!", + 3: "깨뜨리는 것은 약한 자신, 관철하는 것은 강한 신념!\n 그리고 바라는 것은 압도적인 승리!" }, "victory": { - 1: "Whew! Well done!", - 2: "As your battles continue, aim for even greater heights!", - 3: "The strength shown by you and your Pokémon has deeply impressed me…" + 1: "후우! 잘 싸웠다!", + 2: "역시 대단하구나! 싸워서 더욱더 높은 곳을 노려라…!", + 3: "너와 네 포켓몬이 보여준 그 힘, 감명 깊군…" }, "defeat": { - 1: "Hmm.", - 2: "That was good battle.", - 3: "Haaah! Haaah! Haiyaaaah!" + 1: "흐음.", + 2: "좋은 승부였다.", + 3: "하압! 하압! 히야아아압!!!!" } }, "cheren": { "encounter": { - 1: "You remind me of an old friend. That makes me excited about this Pokémon battle!", - 2: `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.`, - 3: "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you." + 1: "넌 내 오랜 친구가 생각나게 하는군. 그 덕분에 이 배틀이 기대돼!", + 2: `왜 하고 있는지 생각하지 않으면, 포켓몬 배틀은 의미가 없어 . + $좋게 말하면, 함께 포켓몬과 승부하는 것이 무의미해 지는 것이지.`, + 3: "내 이름은 체렌! 체육관 관장이자 선생님을 하고 있지! 널 만나게 되서 기쁘군." }, "victory": { - 1: "Thank you! I saw what was missing in me.", - 2: "Thank you! I feel like I saw a little of the way toward my ideals.", - 3: "Hmm… This is problematic." + 1: "고마워! 내 안에 무엇이 부족했는지 알게 됐네.", + 2: "고마워! 내가 추구하는 이상에 조금 다가간 것 같아.", + 3: "으음… 이건 문제가 있군." }, "defeat": { - 1: "As a Gym Leader, I aim to be a wall for you to overcome.", - 2: "All right!", - 3: "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." + 1: "체육관 관장으로서, 나는 넘어야할 벽이 되고자 하고 있거든.", + 2: "좋았어!", + 3: "포켓몬이 곁에 있었기 때문에 여기까지 올 수 있었어.\n생명체와 생명체라는 동등한 관계에서 포켓몬이 우리에게 도움을 주는 이유를 생각해 볼 필요는 있지." } }, "chili": { "encounter": { - 1: "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!", - 2: "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!", - 3: "I'm going to show you what me and my blazing Fire types can do!" + 1: "이얏호-! 형제중 가장 강한 나하고 놀자고!", + 2: "짜잔! 불꽃타입 불꽃의 남자 팟, 바로 너의 상대가 되어주지!", + 3: "나와 내 불타오르는 불꽃타입 포켓몬들이 뭘 할수 있는지 보여주지!" }, "victory": { - 1: "You got me. I am… burned… out…", - 2: "Whoa ho! You're on fire!", - 3: "Augh! You got me!" + 1: "졌지만… 모 두 불 태 웠 어!!", + 2: "와우! 불태워졌네!", + 3: "으악! 너가 나를 이겨버렸잖아!" }, "defeat": { - 1: "I'm on fire! Play with me, and you'll get burned!", - 2: "When you play with fire, you get burned!", - 3: "I mean, c'mon, your opponent was me! You didn't have a chance!" + 1: "난 지금 불타오르고 있어, 나와 싸우게 된다면 넌 다치게 될거야!", + 2: "불장난하면 밤에 이불에 지도를 그리는 법이지!", + 3: "그러니까, 상대가 나였잖아? 너에게는 처음부터 기회가 없었다고!" } }, "cilan": { "encounter": { - 1: `Nothing personal... No hard feelings... Me and my Grass-type Pokémon will... - $Um... We're gonna battle come what may.`, - 2: "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.", - 3: "OK… So, um, I'm Cilan, I like Grass-type Pokémon." + 1: `개인적으로 받아들이지 마세요… 감정 상하지도 말고요… 저와 제 풀타입 포켓몬들이라면… + $음… 무슨 일이 있더라도 배틀을 할 겁니다.`, + 2: "네. 저로 괜찮다면 진심을 담아서 상대해 드리겠습니다.", + 3: "네… 그, 음, 저는 덴트입니다, 풀타입 포켓몬을 좋아합니다." }, "victory": { - 1: "Er… Is it over now?", - 2: `…What a surprise. You are very strong, aren't you? - $I guess my brothers wouldn't have been able to defeat you either…`, - 3: "…Huh. Looks like my timing was, um, off?" + 1: "…에- 그게… 끝나버렸나요?", + 2: `…놀랐습니다. 당신 아주 강하군요. + $팟이나 콘이라도 이길 수 없었을 것 같습니다…`, + 3: "…어라, 타이밍이 좀 잘못된것 같네요?" }, "defeat": { - 1: "Huh? Did I win?", - 2: `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.`, - 3: "It…it was quite a thrilling experience…" + 1: "어라? 제가 이긴 건가요?", + 2: `제 생각엔… + $아무래도 제가 이겼어야만 했을 거라 생각합니다, 팟과 콘이랑 배틀하면서 우리는 모두 더 강해졌기 때문이죠.`, + 3: "정말… 아주 짜릿한 경험이었습니다…" } }, "roark": { @@ -1164,19 +1164,19 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "candice": { "encounter": { - 1: `You want to challenge Candice? Sure thing! I was waiting for someone tough! - $But I should tell you, I'm tough because I know how to focus.`, - 2: `Pokémon, fashion, romance… It's all about focus! - $I'll show you just what I mean. Get ready to lose!` + 1: `나, 무청에게 도전하고 싶은거야? 좋아! 강한 사람을 기다리고 있었으니까! + $그치만 말해두는데, 집중하는 방법을 아는 나도 강력하거든.`, + 2: `포켓몬도 멋도 연애도 정신 집중이 중요하다고! + $무슨 뜻인지 보여줄테니까 각오해!` }, "victory": { - 1: "I must say, I'm warmed up to you! I might even admire you a little.", - 2: `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` + 1: "있지, 나 조금 불타오르게 됐어! 널 조금 존경하게 될지도 몰라.", + 2: `우와! 제법인데! 내가 존경하게 만들다니! + $네 집중력과 의지, 완전히 나를 압도하는 같아. ` }, "defeat": { - 1: "I sensed your will to win, but I don't lose!", - 2: "See? Candice's focus! My Pokémon's focus is great, too!" + 1: "이기고자 하는 의지는 전해졌지만, 난 지지 않았어!", + 2: "봤지? 무청의 집중력! 내 포켓몬의 집중력도 대단하다구!" } }, "gardenia": { @@ -1192,24 +1192,24 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "aaron": { "encounter": { - 1: "Ok! Let me take you on!" + 1: "좋습니다! 그럼 상대해 드리죠!" }, "victory": { - 1: "Battling is a deep and complex affair…" + 1: "승부는 딥하고 컴플렉스한 일이네요…" }, "defeat": { - 1: "Victory over an Elite Four member doesn't come easily." + 1: "사천왕을 상대로 하는 승리는 쉽게 오지 않는다구요." } }, "cress": { "encounter": { - 1: "That is correct! It shall be I and my esteemed Water types that you must face in battle!" + 1: "맞습니다! 당신은 저와 제 자랑스러운 물타입 포켓몬들과 상대하게 될것입니다." }, "victory": { - 1: "Lose? Me? I don't believe this." + 1: "곤란하네… 이 콘이 질 줄이야." }, "defeat": { - 1: "This is the appropriate result when I'm your opponent." + 1: "제가 당신의 상대였기 때문에 이건 당연한 결과였습니다." } }, "allister": { @@ -1226,14 +1226,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "clay": { "encounter": { - 1: "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!" + 1: "실망스럽군! 나를 기다리게 하다니, 이 꼬마가. 아무튼 실력을 확인해 볼까!" }, "victory": { - 1: "Man oh man… It feels good to go all out and still be defeated!" + 1: "이런 이런… 진심으로 싸워서 진 거라 오히려 시원한 기분이군!" }, "defeat": { - 1: `What's important is how ya react to losin'. - $That's why folks who use losin' as fuel to get better are tough.`, + 1: `중요한 것은 패배에 어떻게 반응하는 거다. + $그렇기 때문에 패배를 연료로 삼아 나아가는 사람들은 강인하지.`, } }, "kofu": { @@ -1260,68 +1260,68 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "sidney": { "encounter": { - 1: `I like that look you're giving me. I guess you'll give me a good match. - $That's good! Looking real good! All right! - $You and me, let's enjoy a battle that can only be staged here!`, + 1: `음, 좋은 표정이야. 꽤나 즐길 수 있겠는데. + $좋아! 아주 좋아! 좋았어! + $우리 함께, 포켓몬리그에서만 맛볼 수 있는 배틀을 즐겨보도록 하자!`, }, "victory": { - 1: "Well, how do you like that? I lost! Eh, it was fun, so it doesn't matter." + 1: "이런, 이런 져버렸군? 뭐, 꽤 즐겼으니 상관없지만." }, "defeat": { - 1: "No hard feelings, alright?" + 1: "기분 나빠하지 마, 알겠지?" } }, "phoebe": { "encounter": { - 1: `While I trained, I gained the ability to commune with Ghost-type Pokémon. - $Yes, the bond I developed with Pokémon is extremely tight. - $So, come on, just try and see if you can even inflict damage on my Pokémon!`, + 1: `송화산에서 수행하면서, 고스트 타입 포켓몬과 마음이 통하게 됐어. + $응, 나와 내 포켓몬의 유대감은 정말 강해! + $이런 내 포켓몬들에게 과연 데미지를 줄 수 있을지 한번 시험해봐!`, }, "victory": { - 1: "Oh, darn. I've gone and lost." + 1: "아- 아, 내가 져버렸다." }, "defeat": { - 1: "I look forward to battling you again sometime!" + 1: "언젠가 다시 승부할 수 있기를 기대할게!" } }, "glacia": { "encounter": { - 1: `All I have seen are challenges by weak Trainers and their Pokémon. - $What about you? It would please me to no end if I could go all out against you!`, + 1: `이곳에 도전하러 오는 건 모두 어설픈 트레이너와 포켓몬뿐…. + $당신은 어떤가요? 제 진짜 실력을 발휘해도 괜찮을 정도라면 정말 기쁠텐데 말이죠…!`, }, "victory": { - 1: `You and your Pokémon… How hot your spirits burn! - $The all-consuming heat overwhelms. - $It's no surprise that my icy skills failed to harm you.`, + 1: `당신과… 당신 포켓몬들의 뜨거운 혼! + $정말로 압도적인 뜨거움이네요. + $내 얼음 기술로 피해를 주지 못한 것도 놀랍지 않을정도로요!`, }, "defeat": { - 1: "A fiercely passionate battle, indeed." + 1: "저런, 정말로 치열한 승부였네요." } }, "drake": { "encounter": { - 1: `For us to battle with Pokémon as partners, do you know what it takes? Do you know what is needed? - $If you don't, then you will never prevail over me!`, + 1: `파트너로 포켓몬과 함께하는 승부에 무엇이 필요한지 넌 알고 있는가? + $그걸 모른다면 넌 이 몸을 이길 수 없다!`, }, "victory": { - 1: "Superb, it should be said." + 1: "훌륭하다, 라고 할 만 하군!" }, "defeat": { - 1: "I gave my all for that battle!" + 1: "난 승부에서 최선을 다했으니까!" } }, "wallace": { "encounter": { - 1: `There's something about you… A difference in your demeanor. - $I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. - $And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!`, + 1: `뭐랄까, 너의 분위기가 조금 변한 것 같은… + $그런 느낌이 드는군. 자, 그럼 한번 확인해볼까? 너와 포켓몬의 힘을. + $그리고 확실하게 보여주도록 하지. 나와 포켓몬에 의한 물의 일루전을!`, }, "victory": { - 1: `Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. - $I find much joy in having met you and your Pokémon. You have proven yourself worthy.`, + 1: `훌륭하군. 넌 정말 굉장한 포켓몬 트레이너다. + $그런 너와 너의 포켓몬을 만나게 된 걸 기쁘게 생각해. 스스로 그 가치를 증명하다니!`, }, "defeat": { - 1: "A grand illusion!" + 1: "거대한 일루전이로군!" } }, "lorelei": { @@ -1350,37 +1350,37 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "malva": { "encounter": { - 1: `I feel like my heart might just burst into flames. - $I'm burning up with my hatred for you, runt!`, + 1: `심장이 불에 타버릴 것만 같아요. + $당신에 대한 증오로 불타고 있거든요, 얄미운 트레이너!`, }, "victory": { - 1: "What news… So a new challenger has defeated Malva!" + 1: "도전자가… 사천왕 파키라에게서 멋지게 승리를 쟁취했습니다!" }, "defeat": { - 1: "I am delighted! Yes, delighted that I could squash you beneath my heel." + 1: "기쁘네요! 당신을 짓밟을 수 있어서 말이죠!" } }, "hala": { "encounter": { - 1: "Old Hala is here to make you holler!" + 1: "그럼…진심을 담아서 진지한 할라로 임하겠다!" }, "victory": { - 1: "I could feel the power you gained on your journey." + 1: "네가 순례하면서 갖추게 된 강함을 느낄 수 있었다." }, "defeat": { - 1: "Haha! What a delightful battle!" + 1: "하하! 경쾌한 승부였구나!" } }, "molayne": { "encounter": { - 1: `I gave the captain position to my cousin Sophocles, but I'm confident in my ability. - $My strength is like that of a supernova!`, + 1: `사촌인 마마네에게 캡틴 자리는 줬지만, 아직 실력에는 자신 있어요. + $제 실력은 초신성처럼 빛나니까요!`, }, "victory": { - 1: "I certainly found an interesting Trainer to face!" + 1: "확실히 겨룰 흥미로운 트레이너를 찾았네요!" }, "defeat": { - 1: "Ahaha. What an interesting battle." + 1: "아하하. 흥미로운 배틀이었네요." } }, "rika": { @@ -1429,60 +1429,60 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "bertha": { "encounter": { - 1: "Well, would you show this old lady how much you've learned?" + 1: "그럼, 할머니가 네가 얼마나 해낼 수 있는지 보도록 할게?" }, "victory": { - 1: `Well! Dear child, I must say, that was most impressive. - $Your Pokémon believed in you and did their best to earn you the win. - $Even though I've lost, I find myself with this silly grin!`, + 1: `좋아! 꼬마야, 정말로, 인상적이었단다. + $Y네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. + $비록 내가 졌지만, 좋아서 바보같이 웃음이 나오는구나!`, }, "defeat": { - 1: "Hahahahah! Looks like this old lady won!" + 1: "호호호! 이 할머니가 이겼구나!" } }, "lenora": { "encounter": { - 1: "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!" + 1: "자 그럼 도전자여, 애정을 담아 키운 포켓몬으로 어떤 방식으로 싸우는지 연구해 보겠다!" }, "victory": { - 1: "My theory about you was correct. You're more than just talented… You're motivated! I salute you!" + 1: "너에 대한 내 가설이 맞았네. 재능만 있는 게 아니라… 대단한 녀석이구나! 너 반할것 같잖아!" }, "defeat": { - 1: "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!" + 1: "아 하 하! 패배했다면, 그 이유를 분석하고, 다음 승부에서 그 지식을 활용하도록!" } }, "siebold": { "encounter": { - 1: "As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!" + 1: "살아가는 동안, 궁극적인 요리와 강력한 상대를 찾기 위해… 열과 성을 다할 것입니다!" }, "victory": { - 1: "I shall store my memory of you and your Pokémon forever away within my heart." + 1: "당신에 대한 기억을 제 가슴 속에 담아두겠습니다." }, "defeat": { - 1: `Our Pokémon battle was like food for my soul. It shall keep me going. - $That is how I will pay my respects to you for giving your all in battle!`, + 1: `우리의 포켓몬 배틀은 영혼의 양식과 같습니다. 그건 저를 계속 지탱할 거예요. + $이것이 제가 전투에서 모든 것을 바친 당신에게, 경의를 표하는 방법입니다!`, } }, "roxie": { "encounter": { - 1: "Get ready! I'm gonna knock some sense outta ya!" + 1: "간다! 너의 이성을 싹 날려줄 거야!!" }, "victory": { - 1: "Wild! Your reason's already more toxic than mine!" + 1: "굉-장해! 네 이성, 이미 나보다 TOXIC해버렸잖아!" }, "defeat": { - 1: "Hey, c'mon! Get serious! You gotta put more out there!" + 1: "헤이, 잠깐-! 좀 더 진지해져! 넌 더 날아가야한다구!" } }, "olivia": { "encounter": { - 1: "No introduction needed here. Time to battle me, Olivia!" + 1: "여기에 소개는 필요 없지. 자, 라이치님과 승부할 시간이다!" }, "victory": { - 1: "Really lovely… Both you and your Pokémon…" + 1: "정말 훌륭하군… 당신과 포켓몬 둘 다…" }, "defeat": { - 1: "Mmm-hmm." + 1: "흐-음." } }, "poppy": { @@ -1510,74 +1510,74 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "flint": { "encounter": { - 1: "Hope you're warmed up, cause here comes the Big Bang!" + 1: "뜨겁게 타오를 준비는 됐겠지, 이제 곧 대폭발이 다가올테니까!" }, "victory": { - 1: "Incredible! Your moves are so hot, they make mine look lukewarm!" + 1: "놀랍군! 네 기술이 너무 뜨거워서, 내가 미적지근해보이잖아!" }, "defeat": { - 1: "Huh? Is that it? I think you need a bit more passion." + 1: "하? 그게 다야? 좀 더 열정이 필요해보이는걸." } }, "grimsley": { "encounter": { - 1: "The winner takes everything, and there's nothing left for the loser." + 1: "이긴 자가 모든 것을 갖고 패배한 자에겐 아무것도 남지 않는다." }, "victory": { - 1: "When one loses, they lose everything… The next thing I'll look for will be victory, too!" + 1: "누군가가 이기면 상대한 누군가가 진다… 난 다음 승리를 목표로 하겠어!" }, "defeat": { - 1: "If somebody wins, the person who fought against that person will lose." + 1: "누군가가 이기면, 그 사람과 싸운 사람은 지게 되는 것이지." } }, "caitlin": { "encounter": { - 1: `It's me who appeared when the flower opened up. You who have been waiting… - $You look like a Pokémon Trainer with refined strength and deepened kindness. - $What I look for in my opponent is superb strength… - $Please unleash your power to the fullest!`, + 1: `피어난 꽃에서 나타난 것은 나. 거기 있는 당신… + $강함과 상냥함을 함께 갖춘 포켓몬 트레이너인 것 같네. + $이 카틀레야가 대전 상대로 원하는 건 최고의 강함… + $너도 그 실력을 마음껏 펼쳐 봐!`, }, "victory": { - 1: "My Pokémon and I learned so much! I offer you my thanks." + 1: "대전을 통해서 저도 포켓몬도 성장합니다. 감사드립니다." }, "defeat": { - 1: "I aspire to claim victory with elegance and grace." + 1: "더욱 엘레강트하고 엑셀런트하게 승리를 쟁취하고 싶거든." } }, "diantha": { "encounter": { - 1: `Battling against you and your Pokémon, all of you brimming with hope for the future… - $Honestly, it just fills me up with energy I need to keep facing each new day! It does!`, + 1: `미래를 향한 희망으로 빛나는 당신과, 당신의 포켓몬을 상대로 승부하는 것… + $솔직히, 매일매일 새로운 날을 위해 필요한 에너지가 채워지는 것 같아요! 정말로요!`, }, "victory": { - 1: "Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…" + 1: "고귀한 영혼을 지닌 포켓몬과 트레이너의 모습에 격하게 마음이 흔들려서…" }, "defeat": { - 1: "Oh, fantastic! What did you think? My team was pretty cool, right?" + 1: "정말, 환상적이야! 어떻게 생각하시나요? 저의 포켓몬들, 꽤 멋있었죠?" } }, "wikstrom": { "encounter": { - 1: `Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! - $Let the battle begin! En garde!`, + 1: `잘 왔네, 젊은 도전자여! 이 몸은 사천왕 중 한 명인 강철의 남자 간피다! + $자 그럼 간다, 간다! 간닷!`, }, "victory": { - 1: "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!" + 1: "정말 영광이군! 자네의 포켓몬과 서로 신뢰하는 힘, 날 능가하는군!!" }, "defeat": { - 1: `What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! - $Winning against such a worthy opponent doth give my soul wings--thus do I soar!`, + 1: `이게 무슨 마법이지? 내 마음의 떨림이 멈추질 않는군! + $가치 있는 상대를 이기는 것은 영혼에 날개를 달아주는 것과 같지--그런 내가 비상하는 것일까!`, } }, "acerola": { "encounter": { - 1: "Battling is just plain fun! Come on, I can take you!" + 1: "포켓몬 배틀은 언제나 재미있지! 자, 내가 상대해줄게!" }, "victory": { - 1: "I'm… I'm speechless! How did you do it?!" + 1: "아세로라… 입이 딱 벌어졌어! 어떻게 해낸 거야?!" }, "defeat": { - 1: "Ehaha! What an amazing victory!" + 1: "후아~! 놀라운 승리네!" } }, "larry_elite": { @@ -1638,39 +1638,39 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "lucian": { "encounter": { - 1: `Just a moment, please. The book I'm reading has nearly reached its thrilling climax… - $The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. - $Since you've made it this far, I'll put that aside and battle you. - $Let me see if you'll achieve as much glory as the hero of my book!,` + 1: `잠깐, 기다려주세요. 제가 읽던 책이 거의 클라이맥스에 도달했거든요… + $주인공이 성스러운 검을 얻었고 마지막 시련을 앞두고 있는데… 아, 신경 쓰지 마세요. + $여기까지 왔으니, 그건 제쳐두고 당신과 싸워야겠습니다. + $당신이 과연 주인공이 될 그릇인지 확인해 보도록 하죠!` }, "victory": { - 1: "I see… It appears you've put me in checkmate." + 1: "그렇군요… 결국 체크메이트인가요." }, "defeat": { - 1: "I have a reputation to uphold." + 1: "제 평판을 지켜냈네요." } }, "drasna": { "encounter": { - 1: `You must be a strong Trainer. Yes, quite strong indeed… - $That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!` + 1: `당신 강하시죠? 그것도 상당히 꽤 말이에요… + $어머 기뻐라! 그런 상대와 놀면 포켓몬들도 쑥쑥 크겠어요!` }, "victory": { - 1: "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!" + 1: "어머머 벌써 끝나버리다니… 미안해요, 괜찮으면 또 오세요!" }, "defeat": { - 1: "How can this be?" + 1: "어머, 웬일이야?" } }, "kahili": { "encounter": { - 1: "So, here you are… Why don't we see who the winds favor today, you… Or me?" + 1: "자, 여기에서… 승리의 바람이 부는 쪽은 당신과 저 중에 어느 쪽일까요?" }, "victory": { - 1: "It's frustrating to me as a member of the Elite Four, but it seems your strength is the real deal." + 1: "사천왕으로서 분하지만 당신들의 강함은 진정한 강함이군요." }, "defeat": { - 1: "That was an ace!" + 1: "이것이 에이스니까요!" } }, "hassel": { @@ -1742,79 +1742,79 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "steven": { "encounter": { - 1: `Tell me… What have you seen on your journey with your Pokémon? - $What have you felt, meeting so many other Trainers out there? - $Traveling this rich land… Has it awoken something inside you? - $I want you to come at me with all that you've learned. - $My Pokémon and I will respond in turn with all that we know!`, + 1: `넌… 포켓몬과 함께 모험을 하면서 무엇을 봤지? + $많은 트레이너와 만나면서 무엇을 느꼈지? + $풍요로운 이 지역을 돌아다니면서, 네 안에서 눈뜨기 시작한 무언가… + $그 모든 것을 나에게 쏟아부었으면 좋겠어. + $나와 내 포켓몬들도 전력을 다해 상대해줄 테니까!`, }, "victory": { - 1: "So I, the Champion, fall in defeat…" + 1: "챔피언인 내가 질 줄이야…" }, "defeat": { - 1: "That was time well spent! Thank you!" + 1: "덕분에 즐거웠어! 고마워!" } }, "cynthia": { "encounter": { - 1: "I, Cynthia, accept your challenge! There won't be any letup from me!" + 1: "나, 난천은, 네 도전을 받아들일게! 온 힘을 다해 너와 시합하겠어!" }, "victory": { - 1: "No matter how fun the battle is, it will always end sometime…" + 1: "포켓몬 배틀보다 재밌는 것은 없지만, 언젠간 끝나기 마련이니…" }, "defeat": { - 1: "Even if you lose, never lose your love of Pokémon." + 1: "비록 졌어도, 포켓몬에 대한 사랑은 잃지 않도록 해." } }, "iris": { "encounter": { - 1: `Know what? I really look forward to having serious battles with strong Trainers! - $I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! - #And they are battling alongside Pokémon that have been through countless difficult battles! - $If I battle with people like that, not only will I get stronger, my Pokémon will, too! - $And we'll get to know each other even better! OK! Brace yourself! - $I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`, + 1: `나는 말이지, 강한 트레이너와의 진지한 승부를 즐겨! + $왜냐면 그렇잖아! 이곳에 오는 건 마음 깊이 승리를 추구하는 트레이너. + #함께 싸우는 건 수많은 승부를 헤쳐온 포켓몬. + $그런 상대와 겨룰 수 있다면 나도! 내 포켓몬도! + $더욱더 강해지고 서로 알 수 있으니까! 으응! 그럼 간다! + $포켓몬리그 챔피언 아이리스! 당신을 이기겠습니다!!`, }, "victory": { - 1: "Aghhhh… I did my best, but we lost…" + 1: "후와아아아… 힘을 모두 발휘했는데도 우리가 졌네." }, "defeat": { - 1: "Yay! We won!" + 1: "우와! 이겼다!" } }, "hau": { "encounter": { - 1: `I wonder if a Trainer battles differently depending on whether they're from a warm region or a cold region. - $Let's test it out!`, + 1: `트레이너가 따뜻한 지역 출신인지 추운 지역 출신인지에 따라 배틀 스타일이 달라지는지 궁금해졌어. + $그럼 테스트 해볼게~!`, }, "victory": { - 1: "That was awesome! I think I kinda understand your vibe a little better now!" + 1: "멋진데~! 이제 너의 스타일을 조금 더 잘 알게된 것 같아!" }, "defeat": { - 1: "Ma-an, that was some kinda battle!" + 1: "이런, 그건 그냥 승부였는데~!" } }, "geeta": { "encounter": { - 1: `I decided to throw my hat in the ring once more. - $Come now… Show me the fruits of your training.`, + 1: `그 도전장, 한 번 더 승낙하도록 하죠. + $자… 훈련의 결실을 보여주세요.`, }, "victory": { - 1: "I eagerly await news of all your achievements!" + 1: "당신이 이룰 업적에 대한 소식들, 기다리고 있겠습니다!" }, "defeat": { - 1: "What's the matter? This isn't all, is it?" + 1: "무슨 문제라도 있나요? 이게 전부라니, 그럴리 없잖아요?" } }, "nemona": { "encounter": { - 1: "Yesss! I'm so psyched! Time for us to let loose!" + 1: "만세! 나 너무 기대돼! 이제 전력으로 승부하는거야~!" }, "victory": { - 1: "Well, that stinks, but I still had fun! I'll getcha next time!" + 1: "우와, 조금 문제 있지만, 그래도 너무 재밌었어! 다음에는 지지 않을거야!" }, "defeat": { - 1: "Well, that was a great battle! Fruitful for sure." + 1: "우와, 너무 멋진 승부였어! 정말로 강하네." } }, "leon": { @@ -1911,169 +1911,169 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "byron": { "encounter": { - 1: `Trainer! You're young, just like my son, Roark. - $With more young Trainers taking charge, the future of Pokémon is bright! - $So, as a wall for young people, I'll take your challenge!`, + 1: `젊은 트레이너여! 자네는 내 아들 강석처럼 젊군. + $젊은 트레이너가 많아질수록, 포켓몬의 미래도 밝지! + $그러니, 젊은이들이 넘어야할 벽으로서 상대해주겠다!`, }, "victory": { - 1: "Hmm! My sturdy Pokémon--defeated!" + 1: "흠! 내 견고한 포켓몬이--져버렸군!" }, "defeat": { - 1: "Gwahahaha! How were my sturdy Pokémon?!" + 1: "으하하핫! 내 견고한 포켓몬은 어땠나?!" } }, "olympia": { "encounter": { - 1: "An ancient custom deciding one's destiny. The battle begins!" + 1: "이 의식은 앞으로의 길을 정하는 것입니다. 포켓몬 승부를 시작해볼까요!" }, "victory": { - 1: "Create your own path. Let nothing get in your way. Your fate, your future." + 1: "당신이라면 별이라도 움직여서 가야 할 길을 만들어 낼 것 같습니다." }, "defeat": { - 1: "Our path is clear now." + 1: "우리의 길은 이제 분명해졌습니다." } }, "volkner": { "encounter": { - 1: `Since you've come this far, you must be quite strong… - $I hope you're the Trainer who'll make me remember how fun it is to battle!`, + 1: `여기까지 왔으니, 넌 꽤 강하겠군… + $네가 내게 포켓몬 승부의 즐거움을 상기시켜 줄 트레이너이길 바란다!`, }, "victory": { - 1: `You've got me beat… - $Your desire and the noble way your Pokémon battled for you… - $I even felt thrilled during our match. That was a very good battle.`, + 1: `너 나를 이겼군… + $네 열정과 포켓몬이 그런 너를 위해 싸워준 고귀한 방식… + $심지어 스릴까지 넘쳤다. 아주 좋은 승부였어.`, }, "defeat": { - 1: `It was not shocking at all… - $That is not what I wanted!`, + 1: `전혀 충격적이지 않았다… + $이런 건 원하지 않았어!`, } }, "burgh": { "encounter": { - 1: `M'hm… If I win this battle, I feel like I can draw a picture unlike any before it. - $OK! I can hear my battle muse loud and clear. Let's get straight to it!`, - 2: `Of course, I'm really proud of all of my Pokémon! - $Well now… Let's get right to it!` + 1: `으-음… 이번 배틀에서 이기면, 예전과는 다른 그림을 그릴 수 있을 것 같아. + $맞아! 난 승리 뮤즈의 목소리를 선명하게 들을 수 있거든. 그럼 승부다!`, + 2: `물론, 난 내 포켓몬을 자랑스럽게 생각하거든! + $자 그럼… 바로 승부할까!` }, "victory": { - 1: "Is it over? Has my muse abandoned me?", - 2: "Hmm… It's over! You're incredible!" + 1: "벌써 끝이라고? 뮤즈가 나를 버리고 떠나버렸나?", + 2: "아우… 져버렸네! 너 굉장히 강하잖아!" }, "defeat": { - 1: "Wow… It's beautiful somehow, isn't it…", - 2: `Sometimes I hear people say something was an ugly win. - $I think if you're trying your best, any win is beautiful.` + 1: "우와… 왠지 뭔가 아름답네, 그치…", + 2: `가끔 사람들이 못난 승리라고 말하는 걸 듣곤 해. + $그치만 난 최선을 다했다면, 어떤 승리든 아름답다고 생각하거든.` } }, "elesa": { "encounter": { - 1: `C'est fini! When I'm certain of that, I feel an electric jolt run through my body! - $I want to feel the sensation, so now my beloved Pokémon are going to make your head spin!`, + 1: `컴플리트…! 확신이 들때면, 내 몸을 통하는 전기가 짜릿짜릿하게 느껴져! + $그 감각을 느끼고 싶으니까…, 다음은 사랑스러운 포켓몬들로 너를 어질어질하게 할게!`, }, "victory": { - 1: "I meant to make your head spin, but you shocked me instead." + 1: "어질어질하게 만들 셈이였는데, 너한테는 짜릿짜릿하게 당해버렸네." }, "defeat": { - 1: "That was unsatisfying somehow… Will you give it your all next time?" + 1: "왠지 부족한 기분이야… 다음에는 최선을 다할 수 있지?" } }, "skyla": { "encounter": { - 1: `It's finally time for a showdown! That means the Pokémon battle that decides who's at the top, right? - $I love being on the summit! 'Cause you can see forever and ever from high places! - $So, how about you and I have some fun?`, + 1: `드디어 대결의 시간이야! 누가 정상에 오를지 결정짓는 포켓몬 배틀, 그치? + $난 정상에 있는 게 좋아! 높은 곳에서는 항상 멀리 볼 수 있으니까! + $그럼, 다음은 나랑 더욱 즐거운 것을 할까?`, }, "victory": { - 1: "Being your opponent in battle is a new source of strength to me. Thank you!" + 1: "배틀에서 네 상대가 되는 거, 뭔가 새로운 모티브가 되네. 고마워!" }, "defeat": { - 1: "Win or lose, you always gain something from a battle, right?" + 1: "이기든 지든, 항상 무언가를 얻게 돼, 그치?" } }, "brycen": { "encounter": { - 1: `There is also strength in being with other people and Pokémon. - $Receiving their support makes you stronger. I'll show you this power!`, + 1: `다른사람이나 포켓몬과 함께 있을 때도 힘이 생긴다. + $그 도움을 받는 것이 너를 강하게 만들었겠지. 그 힘을 보이거라!`, }, "victory": { - 1: "The wonderful combination of you and your Pokémon! What a beautiful friendship!" + 1: "너와 포켓몬과! 멋진 콤비네이션! 아름다운 우정!" }, "defeat": { - 1: "Extreme conditions really test you and train you!" + 1: "극한에서 시험받고 단련하도록!" } }, "drayden": { "encounter": { - 1: `What I want to find is a young Trainer who can show me a bright future. - $Let's battle with everything we have: your skill, my experience, and the love we've raised our Pokémon with!`, + 1: `지금 찾는 것은 밝은 미래를 보여줄 젋은 트레이너의 존재. + $승부에서 모든 걸 보이도록. 네 기술, 내 경험, 그리고 포켓몬을 키워온 사랑도 함께!`, }, "victory": { - 1: "This intense feeling that floods me after a defeat… I don't know how to describe it." + 1: "패배하여 끓어오르는 이 마음… 뭐라고 표현해야 좋을까." }, "defeat": { - 1: "Harrumph! I know your ability is greater than that!" + 1: "실망스럽군! 난 자네의 능력이 그보다 더 크다는 걸 알고있네!" } }, "grant": { "encounter": { - 1: `There is only one thing I wish for. - $That by surpassing one another, we find a way to even greater heights.`, + 1: `제가 바라는 것은 단 하나뿐입니다. + $서로가 서로를 뛰어넘어, 더 높은 벽에 도달하는 것입니다.`, }, "victory": { - 1: "You are a wall that I am unable to surmount!" + 1: "내 앞에 솟아 있는 높은 벽… 그건 바로 당신입니다." }, "defeat": { - 1: `Do not give up. - $That is all there really is to it. - $The most important lessons in life are simple.`, + 1: `인생에서 중요한 교훈은 간단합니다. + $포기하지 않는 것. + $이것이 전부입니다.`, } }, "korrina": { "encounter": { - 1: "Time for Lady Korrina's big appearance!" + 1: "코르니 납시오!" }, "victory": { - 1: "It's your very being that allows your Pokémon to evolve!" + 1: "네 존재가 너의 포켓몬을 점점 진화시키고 있어!" }, "defeat": { - 1: "What an explosive battle!" + 1: "정말 멋진 배틀이었어!" } }, "clemont": { "encounter": { - 1: "Oh! I'm glad that we got to meet!" + 1: "아앗! 잘 부탁드립니다!" }, "victory": { - 1: "Your passion for battle inspires me!" + 1: "당신들의 승부를 향한 마음에 자극을 받았습니다!" }, "defeat": { - 1: "Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!" + 1: "저의 슈퍼트레이닝 발명품이 효과가 있는 것 같군요!" } }, "valerie": { "encounter": { - 1: `Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. - $Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. - $The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.`, + 1: `어라,트레이너님… 슝슝 워프해서… 이렇게 만나서 반갑네. + $그리고 내가 보기엔 당신은 노력했기에, 이 승부에 참가할 수 있게 된 것 같아. + $찾기 힘든 요정 같은 페어리 타입, 우리 포켓몬들 사뿐하고 화사하지만 강하다구.`, }, "victory": { - 1: "I hope that you will find things worth smiling about tomorrow…" + 1: "난 당신이 내일을 생각하며 웃을 수 있는 것들을 찾길 바라고 있을게…" }, "defeat": { - 1: "Oh goodness, what a pity…" + 1: "앗 이런, 가엾어라…" } }, "wulfric": { "encounter": { - 1: `You know what? We all talk big about what you learn from battling and bonds and all that… - $But really, I just do it 'cause it's fun. - $Who cares about the grandstanding? Let's get to battling!`, + 1: `그거 알아? 그거… 전투와 유대감을 통해 배운다거나 하는… 거 뭐더라, 음. + $여튼 말이지, 난 그냥 재밌어서 하는 거야. + $내 자랑은 별로 듣고 싶지 않으려나? 자, 포켓몬을 꺼내자!`, }, "victory": { - 1: "Outstanding! I'm tough as an iceberg, but you smashed me through and through!" + 1: "그거야, 바로 그거! 멋지다고. 단단한 얼음을 깨부쉈구나!" }, "defeat": { - 1: "Tussle with me and this is what happens!" + 1: "나와 싸우면 그런 일이 벌어진다니까!" } }, "kabu": { @@ -2287,6 +2287,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "넌 내 폭풍을 잡아냈잖아! 다음엔 더 잘해봐!" } }, + "alder": { + "encounter": { + 1: "하나지방에서 가장 강한 트레이너를 상대할 준비는 됐나?" + }, + "victory": { + 1: "장하구나! 실로 견줄 자가 천하에 없도다!" + }, + "defeat": { + 1: `나의 마음에 상쾌한 바람이 지나갔다... + $정말 대단한 노력이다!` + } + }, + "kieran": { + "encounter": { + 1: `난 노력을 통해 강해지고 또 강해지지! + $난 지지 않아.` + }, + "victory": { + 1: `믿을 수 없어... + $정말 재밌고 가슴 뛰는 배틀이었어!` + }, + "defeat": { + 1: `세상에 마상에! 정말 멋진 배틀이었어! + $네가 더 열심히 훈련할 시간이야.` + } + }, "rival": { "encounter": { 1: `@c{smile}오, 찾았다! 떠나려는 건 알고 있었지만\n인사정도는 해줄 줄 알았는데… diff --git a/src/locales/ko/egg.ts b/src/locales/ko/egg.ts index abb1f3ceadf..88a845c6424 100644 --- a/src/locales/ko/egg.ts +++ b/src/locales/ko/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "알", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "바우처가 충분하지 않습니다!", "tooManyEggs": "알을 너무 많이 갖고 있습니다!", "pull": "뽑기", - "pulls": "뽑기" + "pulls": "뽑기", + "sameSpeciesEgg": "{{species}}[[가]] 이 알에서 부화할 거야!", + "hatchFromTheEgg": "알이 부화해서\n{{pokemonName}}[[가]] 태어났다!", + "eggMoveUnlock": "알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", + "rareEggMoveUnlock": "레어 알 기술 {{moveName}}[[를]]\n사용할 수 있게 되었다!", } as const; diff --git a/src/locales/ko/fight-ui-handler.ts b/src/locales/ko/fight-ui-handler.ts index 6ce47e759fe..cf840cc4495 100644 --- a/src/locales/ko/fight-ui-handler.ts +++ b/src/locales/ko/fight-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", diff --git a/src/locales/ko/game-mode.ts b/src/locales/ko/game-mode.ts index ad387010a8f..423f2adb26a 100644 --- a/src/locales/ko/game-mode.ts +++ b/src/locales/ko/game-mode.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "클래식", - "endless": "엔들리스", - "endlessSpliced": "엔들리스(융합체)", + "endless": "엔드리스", + "endlessSpliced": "엔드리스(융합체)", "dailyRun": "데일리 런", "unknown": "언노운", "challenge": "챌린지", diff --git a/src/locales/ko/game-stats-ui-handler.ts b/src/locales/ko/game-stats-ui-handler.ts index c408e480b85..d21f1b2acda 100644 --- a/src/locales/ko/game-stats-ui-handler.ts +++ b/src/locales/ko/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "통계", diff --git a/src/locales/ko/growth.ts b/src/locales/ko/growth.ts index 72dbfcde934..941198fd5d4 100644 --- a/src/locales/ko/growth.ts +++ b/src/locales/ko/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "불규칙", diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.ts index efca85d3e48..94c3cb2df0c 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "게임 설정", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "데이터 불러오기", "exportData": "데이터 내보내기", "cancel": "취소", - "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?" + "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index 9245d67533a..cf72dab8a37 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "세션 불러오기 성공.", "failedToLoadSession": "세션을 불러올 수 없었습니다.\n파일이 손상되었을 수 있습니다.", "boyOrGirl": "너는 남자니?\n아니면 여자니?", - "boy": "남자", - "girl": "여자", "evolving": "…오잉!?\n{{pokemonName}}의 모습이…!", "stoppedEvolving": "얼라리…?\n{{pokemonName}}의 변화가 멈췄다!", "pauseEvolutionsQuestion": "{{pokemonName}}[[를]] 진화하지 않게 만드시겠습니까?\n포켓몬 화면에서 다시 활성화시킬 수 있습니다.", @@ -44,6 +42,10 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "일간 랭킹", "weeklyRankings": "주간 랭킹", "noRankings": "랭킹 정보 없음", + "positionIcon": "#", + "usernameScoreboard": "이름", + "score": "점수", + "wave": "웨이브", "loading": "로딩 중…", "loadingAsset": "Loading asset: {{assetName}}", "playersOnline": "플레이어 온라인", @@ -51,4 +53,6 @@ export const menu: SimpleTranslationEntries = { "no":"아니오", "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", + "choosePokemon": "포켓몬을 선택하세요.", + "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", } as const; diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index d181ca55a25..7a8f1bef8e9 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "평온의방울" }, + "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, + "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다 (합연산)." }, "NUGGET": { name: "금구슬" }, @@ -199,7 +201,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "MULTI_LENS": { name: "멀티렌즈" }, - "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술을 썼을 때 효율이 10% 증가한다 (부활 제외)." }, + "HEALING_CHARM": { name: "치유의부적", description: "HP를 회복하는 기술이나 도구를 썼을 때 효율이 10% 증가한다 (부활 제외)." }, "CANDY_JAR": { name: "사탕단지", description: "이상한사탕 종류의 아이템이 올려주는 레벨이 1 증가한다." }, "BERRY_POUCH": { name: "열매주머니", description: "사용한 나무열매가 소모되지 않을 확률이 30% 추가된다." }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "버티기 토큰" }, "ENEMY_FUSED_CHANCE": { name: "합체 토큰", description: "야생 포켓몬이 합체되어 등장할 확률이 1% 추가된다." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "전기구슬", description: "피카츄에게 지니게 하면 공격과 특수공격이 올라가는 이상한 구슬." }, + "THICK_CLUB": { name: "굵은뼈", description: "무언가의 단단한 뼈. 탕구리 혹은 텅구리에게 지니게 하면 공격이 올라간다." }, + "METAL_POWDER": { name: "금속파우더", description: "메타몽에게 지니게 하면 방어가 올라가는 이상한 가루. 매우 잘고 단단하다." }, + "QUICK_POWDER": { name: "스피드파우더", description: "메타몽에게 지니게 하면 스피드가 올라가는 이상한 가루. 매우 잘고 단단하다." } + }, TempBattleStatBoosterItem: { "x_attack": "플러스파워", "x_defense": "디펜드업", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "잘-맞히기", "dire_hit": "크리티컬커터", }, + + TempBattleStatBoosterStatName: { + "ATK": "공격", + "DEF": "방어", + "SPATK": "특수공격", + "SPDEF": "특수방어", + "SPD": "스피드", + "ACC": "명중률", + "CRIT": "급소율", + "EVA": "회피율", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "실크스카프", "black_belt": "검은띠", diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts index a40625893ac..3781725bc6f 100644 --- a/src/locales/ko/move.ts +++ b/src/locales/ko/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; /** * 본가 게임과 텍스트가 다르거나 번역문을 완전히 확인하지 못한 경우 주석으로 표시 @@ -2937,7 +2937,7 @@ export const move: MoveTranslationEntries = { }, bouncyBubble: { name: "생생버블", - effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 데미지의 절만큼 HP를 회복한다." + effect: "물덩어리를 부딪쳐서 공격한다. 물을 흡수하여 준 데미지만큼 HP를 회복한다." }, buzzyBuzz: { name: "찌릿찌릿일렉", diff --git a/src/locales/ko/nature.ts b/src/locales/ko/nature.ts index 3581f2a7c94..2d7e2ec85f4 100644 --- a/src/locales/ko/nature.ts +++ b/src/locales/ko/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "노력", diff --git a/src/locales/ko/party-ui-handler.ts b/src/locales/ko/party-ui-handler.ts index ce731e4915f..15a42ae0521 100644 --- a/src/locales/ko/party-ui-handler.ts +++ b/src/locales/ko/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { "SEND_OUT": "교체한다", diff --git a/src/locales/ko/pokeball.ts b/src/locales/ko/pokeball.ts index 123df79ea93..195ae3a3594 100644 --- a/src/locales/ko/pokeball.ts +++ b/src/locales/ko/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "몬스터볼", diff --git a/src/locales/ko/pokemon-info-container.ts b/src/locales/ko/pokemon-info-container.ts index c1477ffc08b..31048dee3ef 100644 --- a/src/locales/ko/pokemon-info-container.ts +++ b/src/locales/ko/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "기술", diff --git a/src/locales/ko/pokemon-info.ts b/src/locales/ko/pokemon-info.ts index aadc3611692..89d1742f437 100644 --- a/src/locales/ko/pokemon-info.ts +++ b/src/locales/ko/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "특수방어", "SPDEFshortened": "특방", "SPD": "스피드", - "SPDshortened": "스피드" + "SPDshortened": "스피드", + "ACC": "명중률", + "EVA": "회피율" }, Type: { diff --git a/src/locales/ko/pokemon.ts b/src/locales/ko/pokemon.ts index d0ef9c3923c..68eae6b9ca6 100644 --- a/src/locales/ko/pokemon.ts +++ b/src/locales/ko/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "이상해씨", diff --git a/src/locales/ko/save-slot-select-ui-handler.ts b/src/locales/ko/save-slot-select-ui-handler.ts index 213da34bda5..29f77cd325f 100644 --- a/src/locales/ko/save-slot-select-ui-handler.ts +++ b/src/locales/ko/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "선택한 슬롯에 데이터를 덮어쓰시겠습니까?", diff --git a/src/locales/ko/settings.ts b/src/locales/ko/settings.ts new file mode 100644 index 00000000000..ef1469fc8cb --- /dev/null +++ b/src/locales/ko/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "남자", + "girl": "여자", + "general": "일반", + "display": "디스플레이", + "audio": "오디오", + "gamepad": "게임패드", + "keyboard": "키보드", + "gameSpeed": "게임 속도", + "hpBarSpeed": "HP 바 속도", + "expGainsSpeed": "경험치 획득 속도", + "expPartyDisplay": "파티 경험치 표시", + "skipSeenDialogues": "본 대화 생략", + "battleStyle": "시합 룰", + "enableRetries": "재도전 허용", + "tutorials": "튜토리얼", + "touchControls": "터치 컨트롤", + "vibrations": "진동", + "normal": "보통", + "fast": "빠르게", + "faster": "더 빠르게", + "skip": "스킵", + "levelUpNotifications": "레벨업 알림", + "on": "설정", + "off": "해제", + "switch": "교체", + "set": "토너먼트", + "auto": "자동", + "disabled": "비활성", + "language": "언어", + "change": "변경", + "uiTheme": "UI 테마", + "default": "기본", + "legacy": "레거시", + "windowType": "윈도우 타입", + "moneyFormat": "소지금 표시", + "damageNumbers": "데미지 숫자 표시", + "simple": "심플", + "fancy": "팬시", + "abbreviated": "축약", + "moveAnimations": "배틀 애니메이션", + "showStatsOnLevelUp": "레벨업 능력치 표시", + "candyUpgradeNotification": "사탕 업그레이드 알림", + "passivesOnly": "패시브만", + "candyUpgradeDisplay": "사탕 업그레이드 표시", + "icon": "아이콘", + "animation": "애니메이션", + "moveInfo": "기술 정보", + "showMovesetFlyout": "상대 기술 보기", + "showArenaFlyout": "배틀 효과 보기", + "showTimeOfDayWidget": "시간 위젯", + "timeOfDayAnimation": "시간 애니메이션", + "bounce": "흔들림", + "timeOfDay_back": "고정", + "spriteSet": "스프라이트 표시", + "consistent": "기본", + "mixedAnimated": "믹스", + "fusionPaletteSwaps": "셰이더 적용", + "playerGender": "플레이어 성별", + "typeHints": "상성 힌트", + "masterVolume": "마스터 볼륨", + "bgmVolume": "BGM 볼륨", + "seVolume": "SE 볼륨", + "musicPreference": "음악 설정", + "mixed": "믹스", + "gamepadPleasePlug": "게임패드를 연결하거나 버튼을 입력하세요", + "delete": "삭제", + "keyboardPleasePress": "키보드의 키를 입력하세요", + "reset": "리셋", + "requireReload": "새로고침 필요", + "action": "액션", + "back": "고정", + "pressToBind": "할당을 위해 입력하세요", + "pressButton": "버튼을 입력하세요", + "buttonUp": "위", + "buttonDown": "아래", + "buttonLeft": "왼쪽", + "buttonRight": "오른쪽", + "buttonAction": "액션", + "buttonMenu": "메뉴", + "buttonSubmit": "확인", + "buttonCancel": "취소", + "buttonStats": "스탯", + "buttonCycleForm": "폼 변환", + "buttonCycleShiny": "특별한 색 변환", + "buttonCycleGender": "성별 변환", + "buttonCycleAbility": "특성 변환", + "buttonCycleNature": "성격 변환", + "buttonCycleVariant": "색상 변환", + "buttonSpeedUp": "속도 올리기", + "buttonSlowDown": "속도 내리기", + "alt": " (대체)", + "mute": "음소거", + "controller": "컨트롤러", + "gamepadSupport": "게임패드 지원", + "showBgmBar": "BGM 제목 보여주기", +} as const; diff --git a/src/locales/ko/splash-messages.ts b/src/locales/ko/splash-messages.ts index 33006370b93..b875e7b282f 100644 --- a/src/locales/ko/splash-messages.ts +++ b/src/locales/ko/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "전투에서 승리하세요!", diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index 587baa3abc4..6fdd21a3454 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -6,7 +6,7 @@ import { SimpleTranslationEntries } from "#app/plugins/i18n"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"이 포켓몬들로 시작하시겠습니까?", + "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "패시브:", "nature": "성격:", "eggMoves": "알 기술", - "start": "시작", "addToParty": "파티에 추가", "toggleIVs": "개체값 토글", "manageMoves": "기술 관리", + "manageNature": "성격 관리", "useCandies": "사탕 사용", + "selectNature": "교체할 성격을 선택해주세요.", "selectMoveSwapOut": "교체할 기술을 선택해주세요.", "selectMoveSwapWith": "교체될 기술을 선택해주세요. 대상:", "unlockPassive": "패시브 해금", "reduceCost": "코스트 줄이기", + "sameSpeciesEgg": "알 구매하기", "cycleShiny": ": 특별한 색", "cycleForm": ": 폼", "cycleGender": ": 암수", diff --git a/src/locales/ko/status-effect.ts b/src/locales/ko/status-effect.ts new file mode 100644 index 00000000000..c4e0ab52722 --- /dev/null +++ b/src/locales/ko/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "없음", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "독", + description: "독", + obtain: "{{pokemonNameWithAffix}}의\n몸에 독이 퍼졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 독이 퍼졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + toxic: { + name: "맹독", + description: "독", + obtain: "{{pokemonNameWithAffix}}의\n몸에 맹독이 퍼졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 몸에 맹독이 퍼졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n독에 의한 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n몸에 독이 퍼진 상태다.", + heal: "{{pokemonNameWithAffix}}의 독은\n말끔하게 해독됐다!" + }, + paralysis: { + name: "마비", + description: "마비", + obtain: "{{pokemonNameWithAffix}}[[는]] 마비되어\n기술이 나오기 어려워졌다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]] {{sourceText}} 때문에\n마비되어 기술이 나오기 어려워졌다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n몸이 저려서 움직일 수 없다!", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 마비되어 있다!", + heal: "{{pokemonNameWithAffix}}의\n몸저림이 풀렸다!" + }, + sleep: { + name: "잠듦", + description: "잠듦", + obtain: "{{pokemonNameWithAffix}}[[는]]\n잠들어 버렸다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 잠들어 버렸다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n쿨쿨 잠들어 있다.", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 잠들어 있다.", + heal: "{{pokemonNameWithAffix}}[[는]]\n눈을 떴다!" + }, + freeze: { + name: "얼음", + description: "얼음", + obtain: "{{pokemonNameWithAffix}}[[는]]\n얼어붙었다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 얼어붙었다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n얼어 버려서 움직일 수 없다!", + overlap: "{{pokemonNameWithAffix}}[[는]]\n이미 얼어 있다.", + heal: "{{pokemonNameWithAffix}}의\n얼음 상태가 나았다!" + }, + burn: { + name: "화상", + description: "화상", + obtain: "{{pokemonNameWithAffix}}[[는]]\n화상을 입었다!", + obtainSource: "{{pokemonNameWithAffix}}[[는]]\n{{sourceText}} 때문에 화상을 입었다!", + activation: "{{pokemonNameWithAffix}}[[는]]\n화상 데미지를 입었다!", + overlap: "{{pokemonNameWithAffix}}[[는]] 이미\n화상을 입은 상태다.", + heal: "{{pokemonNameWithAffix}}의\n화상이 나았다!" + }, +} as const; diff --git a/src/locales/ko/trainers.ts b/src/locales/ko/trainers.ts index 2a61627c5a7..429ab13b223 100644 --- a/src/locales/ko/trainers.ts +++ b/src/locales/ko/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -112,7 +112,7 @@ export const trainerClasses: SimpleTranslationEntries = { "school_kid": "학원끝난 아이", "school_kid_female": "학원끝난 아이", "school_kids": "학원끝난 아이", - "swimmer": "수연팬티 소년", + "swimmer": "수영팬티 소년", "swimmer_female": "비키니 아가씨", "swimmers": "수영팬티 소년 & 비키니 아가씨", // 확인 필요 "twins": "쌍둥이", diff --git a/src/locales/ko/tutorial.ts b/src/locales/ko/tutorial.ts index 1e0f8af3ce1..834f1be6345 100644 --- a/src/locales/ko/tutorial.ts +++ b/src/locales/ko/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { intro: `포켓로그에 오신 것을 환영합니다! 로그라이트 요소가 가미된 전투 중심의 포켓몬 팬게임입니다. diff --git a/src/locales/ko/voucher.ts b/src/locales/ko/voucher.ts index df9e6b31728..dd63977a218 100644 --- a/src/locales/ko/voucher.ts +++ b/src/locales/ko/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "바우처", diff --git a/src/locales/ko/weather.ts b/src/locales/ko/weather.ts index 81340d9567a..7fbd1eaf20b 100644 --- a/src/locales/ko/weather.ts +++ b/src/locales/ko/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index 6aee4d542f4..526c6def80d 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -1,8 +1,13 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{abilityName}} de {{pokemonName}}\nprotegeu-o do dano de recuo!", "badDreams": "{{pokemonName}} está tendo pesadelos!", + "costar": "{{pokemonName}} copiou as mudanças\nde atributo de {{allyName}}!", + "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!", + "perishBody": "{{abilityName}} de {{pokemonName}}\nirá desmaiar ambos os Pokémon em 3 turnos!", + "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaurou seus PS um pouco!", + "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", - "iceFaceAvoidedDamage": "{{pokemonName}} evitou\ndanos com sua {{abilityName}}!" + "quickDraw":"{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", } as const; diff --git a/src/locales/pt_BR/ability.ts b/src/locales/pt_BR/ability.ts index 48e8790b227..2dd4550aabd 100644 --- a/src/locales/pt_BR/ability.ts +++ b/src/locales/pt_BR/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { @@ -331,7 +331,7 @@ export const ability: AbilityTranslationEntries = { }, angerPoint: { name: "Anger Point", - description: "Quando recebe um golpe crítico se enraivece, e com isso, aumenta seu Ataque.", + description: "Quando recebe um acerto crítico se enraivece, e com isso, aumenta seu Ataque.", }, unburden: { name: "Unburden", diff --git a/src/locales/pt_BR/achv.ts b/src/locales/pt_BR/achv.ts index 0c591e18e0f..ea77e0c17e9 100644 --- a/src/locales/pt_BR/achv.ts +++ b/src/locales/pt_BR/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { @@ -212,7 +212,7 @@ export const PGMachv: AchievementTranslationEntries = { description: "Complete o desafio de monotipo {{type}}.", }, "MONO_NORMAL": { - name: "Tenho medo de fantasma", + name: "Extra Ordinário", }, "MONO_FIGHTING": { name: "Briga de Rua", @@ -224,16 +224,16 @@ export const PGMachv: AchievementTranslationEntries = { name: "Menina Veneno", }, "MONO_GROUND": { - name: "Deixou eles comendo poeira!", + name: "Comendo Poeira", }, "MONO_ROCK": { - name: "Duro como Pedra", + name: "Duro Como Pedra", }, "MONO_BUG": { name: "Vida de Inseto", }, "MONO_GHOST": { - name: "Posso dormir com você hoje, mamãe?", + name: "Fantasminha Camarada", }, "MONO_STEEL": { name: "Levantando Ferro", @@ -242,7 +242,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Tá Pegando Fogo, Bicho!", }, "MONO_WATER": { - name: "Água mole em pedra dura...", + name: "Água Mole em Pedra Dura...", }, "MONO_GRASS": { name: "Jardim Botânico", @@ -260,7 +260,7 @@ export const PGMachv: AchievementTranslationEntries = { name: "Caverna do Dragão", }, "MONO_DARK": { - name: "É só uma fase", + name: "É Só Uma Fase", }, "MONO_FAIRY": { name: "Clube das Winx", @@ -530,6 +530,6 @@ export const PGFachv: AchievementTranslationEntries = { name: "É Só Uma Fase", }, "MONO_FAIRY": { - name: "O Clube das Winx", + name: "Clube das Winx", }, } 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 b0d5d17e496..a7b0fb1f13b 100644 --- a/src/locales/pt_BR/battle-message-ui-handler.ts +++ b/src/locales/pt_BR/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "Perfeito", diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index 3fc8eb1a5d6..15f1d83c3c9 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} apareceu.", @@ -15,16 +15,18 @@ export const battle: SimpleTranslationEntries = { "trainerDefeated": "Você derrotou\n{{trainerName}}!", "moneyWon": "Você ganhou\n₽{{moneyAmount}} por ganhar!", "pokemonCaught": "{{pokemonName}} foi capturado!", + "addedAsAStarter": "{{pokemonName}} foi adicionado\naos seus iniciais!", "partyFull": "Sua equipe está cheia.\nSolte um Pokémon para ter espaço para {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", - "hitResultCriticalHit": "Um golpe crítico!", + "hitResultCriticalHit": "Foi um acerto crítico!", "hitResultSuperEffective": "É supereficaz!", "hitResultNotVeryEffective": "É pouco eficaz...", "hitResultNoEffect": "Isso não afeta {{pokemonName}}!", "hitResultOneHitKO": "Foi um nocaute de um golpe!", "attackFailed": "Mas falhou!", "attackHitsCount": "Acertou {{count}} vezes.", + "rewardGain": "Você recebeu\n{{modifierName}}!", "expGain": "{{pokemonName}} ganhou\n{{exp}} pontos de experiência.", "levelUp": "{{pokemonName}} subiu para \nNv. {{level}}!", "learnMove": "{{pokemonName}} aprendeu {{moveName}}!", @@ -53,6 +55,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "trocar", "escapeVerbFlee": "fugir", "notDisabled": "O movimento {{moveName}}\nnão está mais desabilitado!", + "turnEndHpRestore": "Os PS de {{pokemonName}} foram restaurados!", + "hpIsFull": "Os PS de {{pokemonName}}\njá estão cheios!", "skipItemQuestion": "Tem certeza de que não quer escolher um item?", "eggHatching": "Opa?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", @@ -61,5 +65,72 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} usou {{moveName}}!", "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} desmaiou!", + "statRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", + "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", + "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", + "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", + "statFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", + "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", + "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", + "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}} hesitou!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}} ficou\nconfuso!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}} saiu\nde sua confusão!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}} já\nestá confuso!", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}} está\nconfuso!", + "battlerTagsConfusedLapseHurtItself": "Se machucou em sua\nconfusão!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}} não é afetado\npelos efeitos de Destiny Bond.", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} levou\n{{pokemonNameWithAffix2}} junto com ele!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}} se apaixonou\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}} já\nestá apaixonado!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}} está apaixonado\npor {{sourcePokemonName}}!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} está\nimobilizado pelo amor!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} superou\nsua paixão.", + "battlerTagsSeededOnAdd": "{{pokemonNameWithAffix}} foi semeado!", + "battlerTagsSeededLapse": "A saúde de {{pokemonNameWithAffix}}\nfoi sugada pelo Leech Seed!", + "battlerTagsSeededLapseShed": "O Leech Seed de{{pokemonNameWithAffix}}\nsugou todo o gotejamento!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}} começou\na ter um Nightmare!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}} já\nestá preso em um Nightmare!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}} está preso\nem um Nightmare!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}} ganhou\num Encore!", + "battlerTagsEncoreOnRemove": "O Encore de {{pokemonNameWithAffix}}\nacabou!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}} está pronto para\najudar {{pokemonName}}!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}} absorveu\nnutrientes com suas raízes!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}} plantou suas raízes!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}} se cercou\ncom um véu de água!", + "battlerTagsAquaRingLapse": "{{moveName}} restaurou\nPS de {{pokemonName}}!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}} ficou com sono!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}} foi ferido\npelo {{moveName}}!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}} foi espremido\npelo {{moveName}} de {{sourcePokemonName}}!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}} foi enrolado\npor {{sourcePokemonName}}!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}} ficou preso\nno vórtice!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}} foi preso\npor {{moveName}}!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}} foi preso\npor um redemoinho de magma!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}} foi preso\npor uma armadilha!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}} prendeu\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}} foi ferido por \numa infestação de {{sourcePokemonNameWithAffix}}!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\nse protegeu!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}} está\npreparado!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", + "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", + "battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", + "battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!" } as const; diff --git a/src/locales/pt_BR/berry.ts b/src/locales/pt_BR/berry.ts index e36d0b0f180..d409565168f 100644 --- a/src/locales/pt_BR/berry.ts +++ b/src/locales/pt_BR/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts new file mode 100644 index 00000000000..ef15c6c6dcb --- /dev/null +++ b/src/locales/pt_BR/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/pt_BR/biome.ts b/src/locales/pt_BR/biome.ts index 6ba9c7e47f1..46dad06b0de 100644 --- a/src/locales/pt_BR/biome.ts +++ b/src/locales/pt_BR/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "Em algum lugar do qual você não se lembra", diff --git a/src/locales/pt_BR/challenges.ts b/src/locales/pt_BR/challenges.ts index 9b7bfe1973c..7c991189bc8 100644 --- a/src/locales/pt_BR/challenges.ts +++ b/src/locales/pt_BR/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "Desafios", - "start": "Iniciar", "illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!", - "singleGeneration.name": "Geração Única", - "singleGeneration.value.0": "Desligado", - "singleGeneration.desc.0": "Você só pode user Pokémon de uma única geração.", - "singleGeneration.value.1": "Geração 1", - "singleGeneration.desc.1": "Você só pode user Pokémon da primeira geração.", - "singleGeneration.value.2": "Geração 2", - "singleGeneration.desc.2": "Você só pode user Pokémon da segunda geração.", - "singleGeneration.value.3": "Geração 3", - "singleGeneration.desc.3": "Você só pode user Pokémon da terceira geração.", - "singleGeneration.value.4": "Geração 4", - "singleGeneration.desc.4": "Você só pode user Pokémon da quarta geração.", - "singleGeneration.value.5": "Geração 5", - "singleGeneration.desc.5": "Você só pode user Pokémon da quinta geração.", - "singleGeneration.value.6": "Geração 6", - "singleGeneration.desc.6": "Você só pode user Pokémon da sexta geração.", - "singleGeneration.value.7": "Geração 7", - "singleGeneration.desc.7": "Você só pode user Pokémon da sétima geração.", - "singleGeneration.value.8": "Geração 8", - "singleGeneration.desc.8": "Você só pode user Pokémon da oitava geração.", - "singleGeneration.value.9": "Geração 9", - "singleGeneration.desc.9": "Você só pode user Pokémon da nona geração.", - "singleType.name": "Tipo Único", - "singleType.value.0": "Desligado", - "singleType.desc.0": "Você só pode user Pokémon de um único tipo.", - "singleType.value.1": "Normal", - "singleType.desc.1": "Você só pode user Pokémon do tipo Normal.", - "singleType.value.2": "Lutador", - "singleType.desc.2": "Você só pode user Pokémon do tipo Lutador.", - "singleType.value.3": "Voador", - "singleType.desc.3": "Você só pode user Pokémon do tipo Voador.", - "singleType.value.4": "Veneno", - "singleType.desc.4": "Você só pode user Pokémon do tipo Veneno.", - "singleType.value.5": "Terra", - "singleType.desc.5": "Você só pode user Pokémon do tipo Terra.", - "singleType.value.6": "Pedra", - "singleType.desc.6": "Você só pode user Pokémon do tipo Pedra.", - "singleType.value.7": "Inseto", - "singleType.desc.7": "Você só pode user Pokémon do tipo Inseto.", - "singleType.value.8": "Fantasma", - "singleType.desc.8": "Você só pode user Pokémon do tipo Fantasma.", - "singleType.value.9": "Aço", - "singleType.desc.9": "Você só pode user Pokémon do tipo Aço.", - "singleType.value.10": "Fogo", - "singleType.desc.10": "Você só pode user Pokémon do tipo Fogo.", - "singleType.value.11": "Água", - "singleType.desc.11": "Você só pode user Pokémon do tipo Água.", - "singleType.value.12": "Grama", - "singleType.desc.12": "Você só pode user Pokémon do tipo Grama.", - "singleType.value.13": "Elétrico", - "singleType.desc.13": "Você só pode user Pokémon do tipo Elétrico.", - "singleType.value.14": "Psíquico", - "singleType.desc.14": "Você só pode user Pokémon do tipo Psíquico.", - "singleType.value.15": "Gelo", - "singleType.desc.15": "Você só pode user Pokémon do tipo Gelo.", - "singleType.value.16": "Dragão", - "singleType.desc.16": "Você só pode user Pokémon do tipo Dragão.", - "singleType.value.17": "Sombrio", - "singleType.desc.17": "Você só pode user Pokémon do tipo Sombrio.", - "singleType.value.18": "Fada", - "singleType.desc.18": "Você só pode user Pokémon do tipo Fada.", + "singleGeneration": { + "name": "Geração Única", + "desc": "Você só pode user Pokémon da {{gen}} geração.", + "desc_default": "Você só pode user Pokémon de uma única geração.", + "gen_1": "primeira", + "gen_2": "segunda", + "gen_3": "terceira", + "gen_4": "quarta", + "gen_5": "quinta", + "gen_6": "sexta", + "gen_7": "sétima", + "gen_8": "oitava", + "gen_9": "nona", + }, + "singleType": { + "name": "Monotipo", + "desc": "Você só pode user Pokémon do tipo {{type}}.", + "desc_default": "Você só pode user Pokémon de um único tipo." + }, } as const; diff --git a/src/locales/pt_BR/command-ui-handler.ts b/src/locales/pt_BR/command-ui-handler.ts index 2ad14e4ae94..cd8f7c4a378 100644 --- a/src/locales/pt_BR/command-ui-handler.ts +++ b/src/locales/pt_BR/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "Lutar", diff --git a/src/locales/pt_BR/common.ts b/src/locales/pt_BR/common.ts new file mode 100644 index 00000000000..d7cbfd5d052 --- /dev/null +++ b/src/locales/pt_BR/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "Iniciar", +} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 7fa3c483926..ac4176144c6 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -27,7 +28,6 @@ import { menuUiHandler } from "./menu-ui-handler"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; -import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; import { pokemonInfo } from "./pokemon-info"; @@ -35,10 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; +import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const ptBrConfig = { ability: ability, @@ -46,9 +50,11 @@ export const ptBrConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -75,6 +81,8 @@ export const ptBrConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + statusEffect: statusEffect, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, titles: titles, @@ -82,5 +90,5 @@ export const ptBrConfig = { trainerNames: trainerNames, tutorial: tutorial, voucher: voucher, - weather: weather, + weather: weather }; diff --git a/src/locales/pt_BR/dialogue.ts b/src/locales/pt_BR/dialogue.ts index dbae36075ec..3325cf81cf9 100644 --- a/src/locales/pt_BR/dialogue.ts +++ b/src/locales/pt_BR/dialogue.ts @@ -1,4 +1,4 @@ -import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/plugins/i18n"; +import { DialogueTranslationEntries, SimpleTranslationEntries } from "#app/interfaces/locales"; // Diálogo dos NPCs no jogo quando o personagem do jogador é masculino (ou não definido) export const PGMdialogue: DialogueTranslationEntries = { @@ -23,9 +23,9 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "Eu não tive chance, né?", 3: "Vou te encontrar de novo quando for mais velho e te vencer!", 4: "Ugh. Não tenho mais Pokémon.", - 5: "Não acredito… NÃO ACREDITO! Como posso perder de novo…", + 5: "Não acredito… NÃO ACREDITO! Como pude perder de novo…", 6: "Não! Eu perdi!", - 7: "Whoa! Você é incrível! Estou surpreso!", + 7: "Uau! Você é incrível! Estou surpreso!", 8: "Pode ser… Como… Eu e meus Pokémon somos os mais fortes, porém…", 9: "Não vou perder da próxima vez! Vamos batalhar de novo algum dia!", 10: "Aff! Não vê que sou apenas uma criança? Não foi justo você ir com tudo!", @@ -36,7 +36,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "lass": { "encounter": { - 1: "Vamos ter uma batalha, pode ser?", + 1: "Vamos batalhar, pode ser?", 2: "Você parece um treinador novo. Vamos batalhar!", 3: "Não te reconheço. Que tal uma batalha?", 4: "Vamos ter uma batalha Pokémon divertida!", @@ -44,7 +44,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 6: "Uma batalha séria começa com um começo sério! Tem certeza que está pronto?", 7: "Você só é jovem uma vez. E só tem uma chance em cada batalha. Logo, você será apenas uma memória.", 8: "Vai com calma comigo, tá? Mas vou lutar sério!", - 9: "A escola é chata. Não tenho nada para fazer. Yawn. Só estou batalhando para passar o tempo." + 9: "A escola é chata. Não tenho nada para fazer. Só estou batalhando para passar o tempo." }, "victory": { 1: "Isso foi impressionante! Tenho muito a aprender.", @@ -61,7 +61,7 @@ export const PGMdialogue: DialogueTranslationEntries = { "breeder": { "encounter": { 1: "Pokémon obedientes, Pokémon egoístas… Pokémon têm características únicas.", - 2: "Embora minha criação e comportamento sejam pobres, criei meus Pokémon bem.", + 2: "Embora minha criação e comportamento sejam ruins, criei meus Pokémon bem.", 3: "Hmm, você disciplina seus Pokémon? Mimar demais não é bom." }, "victory": { @@ -94,14 +94,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "fisherman": { "encounter": { - 1: "Aack! Você me fez perder uma fisgada!\nO que vai fazer sobre isso?", - 2: "Saia daqui! Você está assustando os Pokémon!", + 1: "Anem! Você me fez perder uma fisgada!\nO que vai fazer sobre isso?", + 2: "Sai daqui! Você está assustando os Pokémon!", 3: "Vamos ver se você consegue fisgar uma vitória!", }, "victory": { 1: "Esqueça isso.", 2: "Da próxima vez, eu vou pescar a vitória!", - 3: "Acho que subestimei as correntes dessa vez.", + 3: "Acho que subestimei a força das correntes dessa vez.", }, }, "fisherman_female": { @@ -146,14 +146,14 @@ export const PGMdialogue: DialogueTranslationEntries = { "encounter": { 1: "Você parece bastante confiante.", 2: "Seus Pokémon… Mostre-os para mim…", - 3: "Como sou um Treinador Ace, as pessoas acham que sou forte.", - 4: "Você sabe o que é preciso para ser um Treinador Ace?" + 3: "Como sou um Treinador Ás, as pessoas acham que sou forte.", + 4: "Você sabe o que é preciso para ser um Treinador Ás?" }, "victory": { 1: "Sim… Você tem bons Pokémon…", 2: "O quê?! Mas sou um gênio das batalhas!", 3: "Claro, você é o personagem principal!", - 4: "OK! OK! Você poderia ser um Treinador Ace!" + 4: "OK! OK! Você poderia ser um Treinador Ás!" }, "defeat": { 1: "Estou dedicando corpo e alma às batalhas de Pokémon!", @@ -194,7 +194,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Pé no pedal, vamos ver se você consegue acompanhar!" }, "victory": { - 1: "Os raios podem estar parados, mas a determinação continua a pedalar.", + 1: "As rodas podem estar paradas, mas a determinação continua a pedalar.", 2: "Fui mais rápido!", 3: "O caminho para a vitória tem muitas curvas e voltas para explorar." }, @@ -251,11 +251,11 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "school_kid": { "encounter": { - 1: "…Heehee. Estou confiante nos meus cálculos e análises.", + 1: "Heehee. Estou confiante nos meus cálculos e análises.", 2: "Estou ganhando o máximo de experiência que posso porque quero ser um Líder de Ginásio um dia." }, "victory": { - 1: "Ohhhh… Cálculo e análise talvez não sejam páreo para o acaso…", + 1: "Aff… Cálculo e análise talvez não sejam páreo para o acaso…", 2: "Até experiências difíceis e desafiadoras têm seu propósito, eu acho." } }, @@ -322,7 +322,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Oi! Concentre-se!", }, "victory": { - 1: "Eeeeek!", + 1: "Perdi minha concentração!", }, }, "officer": { @@ -383,6 +383,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Estou achando que quem tá enjoado sou eu..." }, }, + "rocket_grunt": { + "encounter": { + 1: "Se prepara pra encrenca!" + }, + "victory": { + 1: "Equipe Rocket decolando de novo!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "Se você se meter com a Equipe Magma, não teremos piedade!" + }, + "victory": { + 1: "Ahn? Eu perdi?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "Não pegamos leve com quem se mete com a Equipe Aqua, nem mesmo crianças!" + }, + "victory": { + 1: "Tá de brincadeira!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Não mexe com a Equipe Galáctica!" + }, + "victory": { + 1: "Fui amassado..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "Não toleramos pessoas que pensam diferente de nós!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "A moda é a coisa mais importante pra gente!" + }, + "victory": { + 1: "O futuro não parece brilhante pra mim." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "Tenho que admitir, estou impressionado que tenha chegado até aqui!" + }, + "victory": { + 1: "QUÊ! Isso não é possível!" + }, + "defeat": { + 1: "Guarde minhas palavras.\nNão ser capaz de medir sua própria força mostra que você ainda é uma criança." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "Meus antigos associados precisam de mim... Você vai ficar no meu caminho?" + }, + "victory": { + 1: "Como isso é possível...?\nO precioso sonho da Equipe Rocket se tornou pouco mais que uma ilusão..." + }, + "defeat": { + 1: "A Equipe Rocket renascerá, e eu dominarei o mundo!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "Eu vou te enterrar com minhas próprias mãos.\nEspero que você aprecie essa honra!" + }, + "victory": { + 1: "Ugh! Você é... bastante capaz...\nEu fiquei para trás, mas apenas por um triz..." + }, + "defeat": { + 1: "A Equipe Magma vai prevalecer!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "Você é o último obstáculo entre mim e meus objetivos.\nPrepare-se para meu ataque final! Fuhahaha!" + }, + "victory": { + 1: "Isso... Isso não é... Ngh..." + }, + "defeat": { + 1: "E agora... Eu transformarei este planeta em uma terra ideal para a humanidade." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "Eu sou o líder da Equipe Aqua, então temo que esse seja o fim da linha para você." + }, + "victory": { + 1: "Vamos nos encontrar de novo em algum lugar. Eu vou ter certeza de lembrar desse rosto." + }, + "defeat": { + 1: "Brilhante! Nada vai parar minha equipe agora!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "Estive esperando tanto tempo por este dia.\nEste é o verdadeiro poder da minha equipe!" + }, + "victory": { + 1: "Como eu suspeitava..." + }, + "defeat": { + 1: "Eu vou voltar tudo neste mundo ao seu estado puro e original!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!" + }, + "victory": { + 1: "Interessante. E bastante curioso." + }, + "defeat": { + 1: "Eu criarei meu novo mundo..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "Nos encontramos novamente. Parece que nossos destinos estão entrelaçados.\nMas aqui e agora, eu finalmente quebrarei esse vínculo!" + }, + "victory": { + 1: "Como? Como? COMO?!" + }, + "defeat": { + 1: "Até logo." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "Ninguém pode me deter! Não importa quem seja ou o que faça!" + }, + "victory": { + 1: "Como isso é possível? Eu sou o criador da Equipe Plasma! Eu sou perfeito!" + }, + "defeat": { + 1: "Eu sou o governante perfeito de um novo mundo perfeito! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Vamos! Eu quero ver sua cara depois que você perder toda a esperança!" + }, + "victory": { + 1: "Meus cálculos... Não! Meus planos cuidadosos! O mundo deveria ser meu!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Você está aqui para me deter? Mostre-me em batalha." + }, + "victory": { + 1: "Você está aqui para me deter. Mas eu peço que você espere." + }, + "defeat": { + 1: "Pokémon... não devem mais existir." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "O futuro que você quer, ou o futuro que eu quero... Vamos ver qual é o mais merecedor, não é mesmo?" + }, + "victory": { + 1: "Uau!" + }, + "defeat": { + 1: "Tolos sem visão continuarão a poluir este belo mundo." + } + }, "brock": { "encounter": { 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", @@ -408,7 +588,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: "Você realmente é forte… Vou admitir que você é habilidoso…", - 2: "Grrr… Você sabe que só teve sorte, certo?!", + 2: "Hmm… Você sabe que só teve sorte, certo?!", 3: "Uau, você é demais! Não acredito que me venceu!" }, "defeat": { @@ -425,7 +605,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: "Whoa! Seu time é de verdade, garoto!", - 2: "Aaargh, você é forte! Até meus truques elétricos perderam para você.", + 2: "Uau, você é forte! Até meus truques elétricos perderam para você.", 3: "Isso foi uma derrota absolutamente chocante!" }, "defeat": { @@ -466,7 +646,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Vou me aplicar de verdade e melhorar minhas habilidades." }, "defeat": { - 1: "Fufufu… o veneno drenou todas as suas forças para lutar.", + 1: "Hehe… o veneno drenou todas as suas forças para lutar.", 2: "Ha! Você não teve chance contra minhas habilidades superiores de ninja!", 3: "A fé do meu pai em mim não foi mal colocada." } @@ -513,7 +693,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: "O QUE! Eu, perder?! Não tenho nada a dizer a você!", - 2: "Hmph… Você nunca poderia entender o que espero alcançar.", + 2: "Hmm… Você nunca entenderia o que quero alcançar.", 3: "Esta derrota está apenas adiando o inevitável.\nVou ressurgir a Equipe Rocket das cinzas a tempo." }, "defeat": { @@ -542,11 +722,11 @@ export const PGMdialogue: DialogueTranslationEntries = { "brawly": { "encounter": { 1: "Oh cara, um desafiante!\nVamos ver o que você pode fazer!", - 2: "Você parece um grande onda.\nVamos batalhar!", + 2: "Você parece uma grande onda.\nVamos batalhar!", 3: "Hora de criar uma tempestade!\nVamos!" }, "victory": { - 1: "Oh woah, você me derrotou!", + 1: "Uau, você me derrotou!", 2: "Você surfou minha onda e me derrubou!", 3: "Sinto-me perdido na Caverna Granito!" }, @@ -726,7 +906,7 @@ export const PGMdialogue: DialogueTranslationEntries = { "defeat": { 1: "A onda furiosa ataca novamente!", 2: "Hora de surfar na onda da vitória!", - 3: "Ehehe!" + 3: "Hehe!" } }, "melony": { @@ -775,7 +955,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "Mesmo com isso, ainda sou uma da Elite dos Quatro!" }, "defeat": { - 1: "Eheh.", + 1: "Hehe.", 2: "Isso me deu um excelente material para meu próximo romance!", 3: "E assim, outra história termina..." } @@ -816,14 +996,14 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "chili": { "encounter": { - 1: "Yeeeeooow! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", + 1: "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", 2: "Ta-da! O incendiário do tipo Fogo Chili—sou eu—será seu oponente!", 3: "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!" }, "victory": { 1: "Você me pegou. Estou... queimado...", 2: "Uau! Você está pegando fogo!", - 3: "Augh! Você me pegou!" + 3: "Ai! Você me pegou!" }, "defeat": { 1: "Estou pegando fogo! Jogue comigo, e você se queimará!", @@ -905,7 +1085,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "defeat": { 1: "Ei, espere um segundo. Eu acabei de vencer? Acho que acabei de vencer! Que satisfação!", - 2: "Uooo! Isso foi incrível!" + 2: "Uou! Isso foi incrível!" } }, "amarys": { @@ -1408,7 +1588,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: "Você me pegou. Você é magnífico!", - 2: "Nunca esperei que outro treinador me derrotasse… Estou surpreso." + 2: "Nunca esperei que outro Treinador me derrotasse… Estou surpreso." }, "defeat": { 1: "Isso foi por pouco. Quer tentar de novo?", @@ -2009,7 +2189,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Vamos lá, baby! Me agite até os ossos!" }, "victory": { - 1: "Você é legal, meu amigo—você move minha ALMA!" + 1: "Você é legal, meu amigo, você move minha ALMA!" }, "defeat": { 1: "Até mais, baby!" @@ -2096,6 +2276,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "Você foi pego na minha tempestade! Melhor sorte na próxima vez!" } }, + "alder": { + "encounter": { + 1: "Se prepare para uma batalha contra o Treinador mais forte de Unova!" + }, + "victory": { + 1: "Muito bem! Você certamente é um talento incomparável." + }, + "defeat": { + 1: `Um vento fresco sopra em meu coração... + $Que esforço extraordinário!` + } + }, + "kieran": { + "encounter": { + 1: `Através do trabalho duro, eu me torno cada vez mais forte! + $Eu não perco.` + }, + "victory": { + 1: `Eu não acredito... + $Que batalha divertida e emocionante!` + }, + "defeat": { + 1: `Uau, que batalha! + $Hora de você treinar ainda mais.` + } + }, "rival": { "encounter": { 1: `@c{smile}Eai, estava procurando você! Sabia que você estava ansioso para começar, mas esperava pelo menos um tchau… @@ -2286,13 +2492,2320 @@ export const PGMdialogue: DialogueTranslationEntries = { // Diálogo dos NPCs no jogo quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMdialogue. -export const PGFdialogue: DialogueTranslationEntries = PGMdialogue; +export const PGFdialogue: DialogueTranslationEntries = { + "youngster": { + "encounter": { + 1: "Eai, quer batalhar?", + 2: "Você também é uma treinadora nova?", + 3: "Eai, nunca te vi antes. Vamos batalhar!", + 4: "Acabei de perder, então estou tentando encontrar mais Pokémon.\nEspera! Você parece fraca! Vamos batalhar!", + 5: "A gente já se conheceu antes? Não lembro muito bem. Enfim, prazer te conhecer!", + 6: "Beleza! Vamos nessa!", + 7: "Beleza! Lá vou eu! Vou te mostrar meu poder!", + 8: "Hahaha... Vou te mostrar o quão incríveis são meus Pokémon!", + 9: "Sem perder tempo com cumprimentos. Vamos logo, quando estiver pronta!", + 10: "Não baixe a guarda, ou você pode acabar chorando quando uma criança te vencer.", + 11: "Eu criei meus Pokémon com muito cuidado. Você não tem permissão para machucá-los!", + 12: "Que bom que você chegou! Não vai ser fácil daqui pra frente.", + 13: "As batalhas continuam para sempre! Bem-vinda ao mundo sem fim!" + }, + "victory": { + 1: "Uau! Você é forte!", + 2: "Eu não tive chance, né?", + 3: "Vou te encontrar de novo quando for mais velho e te vencer!", + 4: "Ugh. Não tenho mais Pokémon.", + 5: "Não acredito… NÃO ACREDITO! Como pude de novo…", + 6: "Não! Eu perdi!", + 7: "Uau! Você é incrível! Estou surpreso!", + 8: "Pode ser… Como… Eu e meus Pokémon somos os mais fortes, porém…", + 9: "Não vou perder da próxima vez! Vamos batalhar de novo algum dia!", + 10: "Aff! Não vê que sou apenas uma criança? Não foi justo você ir com tudo!", + 11: "Seus Pokémon são incríveis! Troca comigo!", + 12: "Me empolguei um pouco antes, mas sobre qual trabalho eu estava falando?", + 13: "Ahaha! É isso aí! Você já está em casa nesse mundo!" + } + }, + "lass": { + "encounter": { + 1: "Vamos batalhar, pode ser?", + 2: "Você parece uma treinadora nova. Vamos batalhar!", + 3: "Não te reconheço. Que tal uma batalha?", + 4: "Vamos ter uma batalha Pokémon divertida!", + 5: "Vou te mostrar como realmente usar Pokémon!", + 6: "Uma batalha séria começa com um começo sério! Tem certeza que está pronta?", + 7: "Você só é jovem uma vez. E só tem uma chance em cada batalha. Logo, você será apenas uma memória.", + 8: "Vai com calma comigo, tá? Mas vou lutar sério!", + 9: "A escola é chata. Não tenho nada para fazer. Só estou batalhando para passar o tempo." + }, + "victory": { + 1: "Isso foi impressionante! Tenho muito a aprender.", + 2: "Não pensei que você me venceria tão fácil…", + 3: "Espero que possamos ter uma revanche um dia.", + 4: "Isso foi incrivelmente divertido! Você me esgotou totalmente…", + 5: "Você realmente me ensinou uma lição! Você é incrível!", + 6: "Sério, eu perdi. Isso é, tipo, seriamente deprimente, mas você foi seriamente legal.", + 7: "Não preciso de memórias como essa. Deletando memória…", + 8: "Ei! Eu te disse para pegar leve comigo! Mesmo assim, você é legal quando fica séria.", + 9: "Estou realmente cansando de batalhar… Deve haver algo novo para fazer…" + } + }, + "breeder": { + "encounter": { + 1: "Pokémon obedientes, Pokémon egoístas… Pokémon têm características únicas.", + 2: "Embora minha criação e comportamento sejam ruins, criei meus Pokémon bem.", + 3: "Hmm, você disciplina seus Pokémon? Mimar demais não é bom." + }, + "victory": { + 1: "É importante nutrir e treinar as características de cada Pokémon.", + 2: "Ao contrário do meu lado diabólico, esses são bons Pokémon.", + 3: "Muito elogio pode estragar tanto Pokémon quanto pessoas." + }, + "defeat": { + 1: "Você não deve ficar com raiva dos seus Pokémon, mesmo se perder uma batalha.", + 2: "Certo? Pokémon bons, né? Eu sou adequado para criar coisas.", + 3: "Não importa o quanto você ame seus Pokémon, ainda precisa discipliná-los quando se comportam mal." + } + }, + "breeder_female": { + "encounter": { + 1: "Pokémon nunca te traem. Eles retribuem todo o amor que você dá a eles.", + 2: "Quer uma dica para treinar bons Pokémon?", + 3: "Eu criei esses Pokémon muito especiais usando um método especial." + }, + "victory": { + 1: "Ugh… Não era para ser assim. Será que administrei a mistura errada?", + 2: "Como isso aconteceu com meus Pokémon… O que você está dando de comer aos seus Pokémon?", + 3: "Se eu perder, isso significa que eu estava só matando o tempo. Não machuca meu ego nem um pouco." + }, + "defeat": { + 1: "Isso prova que meus Pokémon aceitaram meu amor.", + 2: "O verdadeiro truque para treinar bons Pokémon é capturar bons Pokémon.", + 3: "Pokémon serão fortes ou fracos dependendo de como você os cria." + } + }, + "fisherman": { + "encounter": { + 1: "Anem! Você me fez perder uma fisgada!\nO que vai fazer sobre isso?", + 2: "Sai daqui! Você está assustando os Pokémon!", + 3: "Vamos ver se você consegue fisgar uma vitória!", + }, + "victory": { + 1: "Esqueça isso.", + 2: "Da próxima vez, eu vou pescar a vitória!", + 3: "Acho que subestimei a força das correntes dessa vez.", + }, + }, + "fisherman_female": { + "encounter": { + 1: "Uau! Peguei um grande!", + 2: "Linha lançada, pronta para pescar o sucesso!", + 3: "Pronta para fazer ondas!" + }, + "victory": { + 1: "Vou voltar com um anzol mais forte.", + 2: "Vou pescar a vitória na próxima vez.", + 3: "Estou só afiando meus anzóis para a revanche!" + }, + }, + "swimmer": { + "encounter": { + 1: "Hora de mergulhar!", + 2: "Vamos surfar nas ondas da vitória!", + 3: "Pronto para fazer um splash!", + }, + "victory": { + 1: "Molhado na derrota!", + 2: "Uma onda de derrota!", + 3: "De volta à praia, eu acho.", + }, + }, + "backpacker": { + "encounter": { + 1: "Prepare-se, vamos começar!", + 2: "Vamos ver se você consegue acompanhar!", + 3: "Prepare-se, desafiante!", + 4: "Passei 20 anos tentando me encontrar… Mas onde estou?" + }, + "victory": { + 1: "Dessa vez tropecei!", + 2: "Ah, acho que estou perdido.", + 3: "Caminho sem saída!", + 4: "Espere um segundo! Ei! Você não sabe quem eu sou?" + }, + }, + "ace_trainer": { + "encounter": { + 1: "Você parece bastante confiante.", + 2: "Seus Pokémon… Mostre-os para mim…", + 3: "Como sou um Treinador Ás, as pessoas acham que sou forte.", + 4: "Você sabe o que é preciso para ser um Treinador Ás?" + }, + "victory": { + 1: "Sim… Você tem bons Pokémon…", + 2: "O quê?! Mas sou um gênio das batalhas!", + 3: "Claro, você é a personagem principal!", + 4: "OK! OK! Você poderia ser uma Treinador Ás!" + }, + "defeat": { + 1: "Estou dedicando corpo e alma às batalhas de Pokémon!", + 2: "Tudo dentro das minhas expectativas… Nada para se surpreender…", + 3: "Eu achava que cresceria para ser uma pessoa frágil que parecia que quebraria se você apertasse muito.", + 4: "Claro que sou forte e não perco. É importante ganhar com graça." + } + }, + "parasol_lady": { + "encounter": { + 1: "Hora de embelezar o campo de batalha com elegância e postura!", + }, + "victory": { + 1: "Minha elegância permanece inabalável!", + } + }, + "twins": { + "encounter": { + 1: "Prepare-se, porque quando nos unimos, é o dobro do problema!", + 2: "Dois corações, uma estratégia – vamos ver se você consegue acompanhar nosso poder de gêmeos!", + 3: "Espero que esteja pronta para o dobro do problema, porque estamos prestes a causar!" + }, + "victory": { + 1: "Podemos ter perdido essa rodada, mas nosso vínculo permanece inquebrável!", + 2: "Nosso espírito de gêmeos não será apagado por muito tempo.", + 3: "Voltaremos mais fortes como uma dupla dinâmica!" + }, + "defeat": { + 1: "O poder dos gêmeos reina supremo!", + 2: "Dois corações, um triunfo!", + 3: "Dobro de sorrisos, dobro da dança da vitória!" + } + }, + "cyclist": { + "encounter": { + 1: "Prepare-se para comer poeira!", + 2: "Prepare-se, desafiante! Estou prestes a te deixar para trás!", + 3: "Pé no pedal, vamos ver se você consegue acompanhar!" + }, + "victory": { + 1: "As rodas podem estar paradas, mas a determinação continua a pedalar.", + 2: "Fui mais rápido!", + 3: "O caminho para a vitória tem muitas curvas e voltas para explorar." + }, + }, + "black_belt": { + "encounter": { + 1: "Elogio sua coragem ao me desafiar! Pois eu sou o que tem o chute mais forte!", + 2: "Oh, entendo. Você gostaria de ser cortada em pedaços? Ou prefere o papel de saco de pancadas?" + }, + "victory": { + 1: "Oh. Os Pokémon fizeram a luta. Meu chute forte não ajudou em nada.", + 2: "Hmmm… Se eu ia perder de qualquer maneira, esperava ficar totalmente destruído no processo." + }, + }, + "battle_girl": { + "encounter": { + 1: "Você não precisa tentar me impressionar. Você pode perder contra mim.", + }, + "victory": { + 1: "É difícil dizer adeus, mas estamos ficando sem tempo…", + }, + }, + "hiker": { + "encounter": { + 1: "Minha barriga de meia-idade me deu tanta gravidade quanto as montanhas que eu escalo!", + 2: "Herdei esse corpo ossudo dos meus pais… Sou como uma cadeia de montanhas viva…", + }, + "victory": { + 1: "Pelo menos não posso perder quando se trata de IMC!", + 2: "Não é suficiente… Nunca é suficiente. Meu colesterol ruim não está alto o suficiente…" + }, + }, + "ranger": { + "encounter": { + 1: "Quando estou cercado pela natureza, a maioria das outras coisas deixa de importar.", + 2: "Quando estou vivendo sem natureza na minha vida, às vezes sinto uma crise de ansiedade se aproximando." + }, + "victory": { + 1: "Não importa para a vastidão da natureza se eu ganhar ou perder…", + 2: "Algo assim é bastante trivial comparado aos sentimentos sufocantes da vida na cidade." + }, + "defeat": { + 1: "Ganhei a batalha. Mas a vitória não é nada comparada à vastidão da natureza…", + 2: "Tenho certeza de que como você se sente não é tão ruim se comparar aos meus ataques de ansiedade…" + } + }, + "scientist": { + "encounter": { + 1: "Minha pesquisa levará este mundo à paz e alegria.", + }, + "victory": { + 1: "Sou um gênio… Não devo perder para alguém como você…", + }, + }, + "school_kid": { + "encounter": { + 1: "Heehee. Estou confiante nos meus cálculos e análises.", + 2: "Estou ganhando o máximo de experiência que posso porque quero ser um Líder de Ginásio um dia." + }, + "victory": { + 1: "Aff… Cálculo e análise talvez não sejam páreo para o acaso…", + 2: "Até experiências difíceis e desafiadoras têm seu propósito, eu acho." + } + }, + "artist": { + "encounter": { + 1: "Eu costumava ser popular, mas agora estou acabado.", + }, + "victory": { + 1: "À medida que os tempos mudam, os valores também mudam. Percebi isso tarde demais.", + }, + }, + "guitarist": { + "encounter": { + 1: "Prepare-se para sentir o ritmo da derrota enquanto eu toco minha vitória!", + }, + "victory": { + 1: "Silenciado por agora, mas minha melodia de resiliência continuará a tocar.", + }, + }, + "worker": { + "encounter": { + 1: "Me incomoda que as pessoas sempre me entendam mal. Sou muito mais puro do que todos pensam.", + }, + "victory": { + 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho.", + }, + }, + "worker_female": { + "encounter": { + 1: `Me incomoda que as pessoas sempre me entendam mal. + $Sou muito mais pura do que todos pensam.` + }, + "victory": { + 1: "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho." + }, + "defeat": { + 1: "Meu corpo e mente nem sempre estão necessariamente em sincronia." + } + }, + "worker_double": { + "encounter": { + 1: "Vou te mostrar que podemos te quebrar. Estamos treinando no campo!", + }, + "victory": { + 1: "Que estranho… Como isso pode ser… Não deveria ter sido superado.", + }, + }, + "hex_maniac": { + "encounter": { + 1: "Normalmente, só escuto música clássica, mas se eu perder, acho que vou tentar um pouco de new age!", + 2: "Eu fico mais forte a cada lágrima que derramo." + }, + "victory": { + 1: "É o início da era de Aquário?", + 2: "Agora posso ficar ainda mais forte. Cresço com cada rancor." + }, + "defeat": { + 1: "New age se refere simplesmente aos compositores clássicos do século XX, certo?", + 2: "Não fique preso na tristeza ou frustração. Você pode usar seus rancores para se motivar." + } + }, + "psychic": { + "encounter": { + 1: "Oi! Concentre-se!", + }, + "victory": { + 1: "Perdi minha concentração!", + }, + }, + "officer": { + "encounter": { + 1: "Prepare-se, porque a justiça está prestes a ser servida!", + 2: "Pronto para defender a lei e servir a justiça no campo de batalha!" + }, + "victory": { + 1: "O peso da justiça parece mais pesado do que nunca…", + 2: "As sombras da derrota pairam no distrito." + } + }, + "beauty": { + "encounter": { + 1: "Minha última batalha… É assim que eu gostaria que víssemos esta partida…", + }, + "victory": { + 1: "Foi divertido… Vamos ter outra última batalha algum dia…", + }, + }, + "baker": { + "encounter": { + 1: "Espero que esteja pronta para saborear a derrota!" + }, + "victory": { + 1: "Vou assar uma revanche." + }, + }, + "biker": { + "encounter": { + 1: "Hora de acelerar e te deixar na poeira!" + }, + "victory": { + 1: "Vou me ajustar para a próxima corrida." + }, + }, + "firebreather": { + "encounter": { + 1: "Minhas chamas irão te consumir!", + 2: "Minha alma está pegando fogo. Irei te mostrar como queima!", + 3: "Cola aqui e dá uma olhada!" + }, + "victory": { + 1: "Fui reduzido a cinzas…", + 2: "Uau! Isso foi quente!", + 3: "Ai! Queimei minha língua!" + }, + }, + "sailor": { + "encounter": { + 1: "Mano, você vai andar na prancha se perder!", + 2: "Vem com tudo! Sou um marinheiro com orgulho!", + 3: "Ahoy marujo! Tá enjoado, é?!" + }, + "victory": { + 1: "Argh! Perdi pra uma criança!", + 2: "Sua vontade de ganhar me afogou!", + 3: "Estou achando que quem tá enjoado sou eu..." + }, + }, + "brock": { + "encounter": { + 1: "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!", + 2: "Minha vontade firme como pedra vai te sobrecarregar!", + 3: "Permita-me mostrar a verdadeira força dos meus Pokémon!" + }, + "victory": { + 1: "A força dos seus Pokémon superou minhas defesas de pedra!", + 2: "O mundo é enorme! Estou feliz por ter tido a chance de batalhar com você.", + 3: "Talvez eu deva voltar a perseguir meu sonho de ser Criador de Pokémon…" + }, + "defeat": { + 1: "A melhor defesa é um bom ataque!\nEssa é a minha maneira de fazer as coisas!", + 2: "Venha estudar rochas comigo da próxima vez para aprender melhor a combatê-las!", + 3: "Hah, todas as minhas viagens pelas regiões estão valendo a pena!" + } + }, + "misty": { + "encounter": { + 1: "Minha política é um ataque total com Pokémon do tipo Água!", + 2: "Oi, vou mostrar a força dos meus Pokémon aquáticos!", + 3: "Meu sonho era viajar e batalhar com treinadores poderosos…\nVocê será um desafio suficiente?" + }, + "victory": { + 1: "Você realmente é forte… Vou admitir que você é habilidosa…", + 2: "Hmm… Você sabe que só teve sorte, certo?!", + 3: "Uau, você é demais! Não acredito que me venceu!" + }, + "defeat": { + 1: "A poderosa Misty foi demais para você?", + 2: "Espero que você tenha visto as técnicas de natação elegantes dos meus Pokémon!", + 3: "Seus Pokémon não foram páreo para meus orgulhos e alegrias!" + } + }, + "lt_surge": { + "encounter": { + 1: "Meus Pokémon Elétricos me salvaram durante a guerra! Vou te mostrar como!", + 2: "Em sentido! Vou te chocar até você se render!", + 3: "Vou te eletrizar como faço com todos os meus inimigos na batalha!" + }, + "victory": { + 1: "Whoa! Seu time é de verdade, garota!", + 2: "Uau, você é forte! Até meus truques elétricos perderam para você.", + 3: "Isso foi uma derrota absolutamente chocante!" + }, + "defeat": { + 1: "Oh sim! Quando se trata de Pokémon do tipo Elétrico, sou o número um do mundo!", + 2: "Hahaha! Foi uma batalha eletrizante, garota!", + 3: "Uma batalha de Pokémon é guerra, e eu te mostrei combate em primeira mão!" + } + }, + "erika": { + "encounter": { + 1: "Ah, o tempo está adorável aqui…\nOh, uma batalha? Muito bem então.", + 2: "Minhas habilidades de batalha Pokémon rivalizam com minhas habilidades de arranjo de flores.", + 3: "Oh, espero que o aroma agradável dos meus Pokémon não me faça dormir de novo…", + 4: "Ver flores em um jardim é tão calmante." + }, + "victory": { + 1: "Oh! Eu concedo a derrota.", + 2: "Aquela partida foi muito agradável.", + 3: "Ah, parece que perdi…", + 4: "Oh, meu Deus." + }, + "defeat": { + 1: "Tinha medo de adormecer…", + 2: "Oh, meu Deus, parece que meus Pokémon de Grama te dominaram.", + 3: "Essa batalha foi uma experiência tão calmante.", + 4: "Oh… É só isso?" + } + }, + "janine": { + "encounter": { + 1: "Estou dominando a arte dos ataques venenosos.\nVou lutar com você hoje!", + 2: "Meu pai confia que posso me defender.\nVou provar que ele está certo!", + 3: "Minhas técnicas de ninja só perdem para as do meu pai!\nVocê consegue acompanhar?" + }, + "victory": { + 1: "Ainda preciso de treinamento… Entendi.", + 2: "Sua técnica de batalha superou a minha.", + 3: "Vou me aplicar de verdade e melhorar minhas habilidades." + }, + "defeat": { + 1: "Hehe… o veneno drenou todas as suas forças para lutar.", + 2: "Ha! Você não teve chance contra minhas habilidades superiores de ninja!", + 3: "A fé do meu pai em mim não foi mal colocada." + } + }, + "sabrina": { + "encounter": { + 1: "Através da minha habilidade psíquica, tive uma visão da sua chegada!", + 2: "Não gosto de lutar, mas se você quiser, vou mostrar meus poderes!", + 3: "Posso sentir grande ambição em você. Vou ver se não é infundada." + }, + "victory": { + 1: "Seu poder… Ele supera o que eu previa…", + 2: "Não consegui prever seu poder com precisão.", + 3: "Mesmo com meus imensos poderes psíquicos, não consigo sentir outro tão forte quanto você." + }, + "defeat": { + 1: "Essa vitória… É exatamente como previ nas minhas visões!", + 2: "Talvez fosse outra pessoa que eu sentisse um grande desejo…", + 3: "Aprimore suas habilidades antes de entrar em batalha precipitadamente.\nVocê nunca sabe o que o futuro pode reservar se fizer isso…" + } + }, + "blaine": { + "encounter": { + 1: "Hah! Espero que tenha trazido uma Cura de Queimadura!", + 2: "Meus Pokémon de Fogo vão incinerar todos os desafiantes!", + 3: "Prepare-se para brincar com fogo!" + }, + "victory": { + 1: "Queimei até não restar nada! Nem cinzas sobraram!", + 2: "Não acendi as chamas alto o suficiente?", + 3: "Estou completamente exausto… Mas isso faz minha motivação para melhorar queimar ainda mais!" + }, + "defeat": { + 1: "Meu inferno ardente não pode ser apagado!", + 2: "Meus Pokémon foram fortalecidos com o calor desta vitória!", + 3: "Hah! Minha paixão queima mais do que a sua!" + } + }, + "giovanni": { + "encounter": { + 1: "Eu, o líder da Equipe Rocket, vou te fazer sentir um mundo de dor!", + 2: "Meu treinamento aqui será vital antes de enfrentar meus antigos associados novamente.", + 3: "Não acho que você está preparada para o nível de fracasso que está prestes a experimentar!" + }, + "victory": { + 1: "O QUE! Eu, perder?! Não tenho nada a dizer a você!", + 2: "Hmm… Você nunca entenderia o que quero alcançar.", + 3: "Esta derrota está apenas adiando o inevitável.\nVou ressurgir a Equipe Rocket das cinzas a tempo." + }, + "defeat": { + 1: "Não ser capaz de medir sua própria força mostra que você ainda é apenas uma criança.", + 2: "Não tente interferir comigo novamente.", + 3: "Espero que entenda o quão tolo foi me desafiar." + } + }, + "roxanne": { + "encounter": { + 1: "Você poderia gentilmente demonstrar como batalha?", + 2: "Você pode aprender muitas coisas batalhando com muitos treinadores.", + 3: "Oh, você me pegou estrategizando.\nGostaria de batalhar?" + }, + "victory": { + 1: "Oh, parece que perdi.\nEu entendo.", + 2: "Parece que ainda tenho muito mais a aprender quando se trata de batalhas.", + 3: "Vou levar o que aprendi aqui hoje a sério." + }, + "defeat": { + 1: "Aprendi muitas coisas com nossa batalha.\nEspero que você também tenha aprendido.", + 2: "Espero batalhar com você novamente.\nEspero que use o que aprendeu aqui.", + 3: "Venci devido a tudo o que aprendi." + } + }, + "brawly": { + "encounter": { + 1: "Oh cara, uma desafiante!\nVamos ver o que você pode fazer!", + 2: "Você parece uma grande onda.\nVamos batalhar!", + 3: "Hora de criar uma tempestade!\nVamos!" + }, + "victory": { + 1: "Uau, você me derrotou!", + 2: "Você surfou minha onda e me derrubou!", + 3: "Sinto-me perdido na Caverna Granito!" + }, + "defeat": { + 1: "Haha, eu surfei a grande onda!\nDesafie-me novamente algum dia.", + 2: "Surfe comigo novamente algum dia!", + 3: "Assim como as marés vão e vêm, espero que você volte para me desafiar novamente." + } + }, + "wattson": { + "encounter": { + 1: "Hora de levar um choque!\nWahahahaha!", + 2: "Vou fazer faíscas voarem!\nWahahahaha!", + 3: "Espero que tenha trazido Cura de Paralisia!\nWahahahaha!" + }, + "victory": { + 1: "Parece que estou sem carga!\nWahahahaha!", + 2: "Você me aterrissou completamente!\nWahahahaha!", + 3: "Obrigado pela emoção!\nWahahahaha!" + }, + "defeat": { + 1: "Você está totalmente carregado agora!\nWahahahaha!", + 2: "Espero ver você faíscando em batalhas futuras!\nWahahahaha!", + 3: "Wahahahaha! Que batalha eletrizante!" + } + }, + "flannery": { + "encounter": { + 1: "Meus Pokémon de fogo estão prontos para queimar a concorrência!\nVamos nessa!", + 2: "Prepare-se para sentir o calor da minha determinação!\nNão vou segurar nada!", + 3: "Minhas habilidades vão incinerar você!\nPrepare-se para a batalha mais quente da sua vida!" + }, + "victory": { + 1: "Essa derrota só faz minha determinação queimar mais!", + 2: "Essa perda não apagará minhas chamas!\nEstarei de volta mais forte!", + 3: "Vou usar essa experiência para reacender meu espírito competitivo!" + }, + "defeat": { + 1: "Minhas chamas nunca se apagarão!\nSou muito apaixonada por isso!", + 2: "Você foi incrível!\nVamos fazer isso de novo algum dia!", + 3: "Que batalha ardente!\nMal posso esperar pela próxima!" + } + }, + "norman": { + "encounter": { + 1: "Você está pronta para enfrentar a força pura do meu time?\nVou te mostrar o poder do equilíbrio!", + 2: "Minha experiência em batalha vai fazer você suar!\nPrepare-se!", + 3: "Treinei meu time rigorosamente.\nVamos ver se você consegue igualar!" + }, + "victory": { + 1: "Parece que subestimei você.\nFoi uma batalha dura.", + 2: "Você é forte, mas ainda há muito para aprender.", + 3: "Essa derrota não abalará minha determinação.\nEstarei de volta mais forte!" + }, + "defeat": { + 1: "Você lutou bravamente!\nEspero batalhar com você novamente.", + 2: "Sua força é incrível!\nNão posso esperar pela nossa próxima batalha.", + 3: "Foi uma honra batalhar com você!\nAté a próxima!" + } + }, + "winona": { + "encounter": { + 1: "Tenho sobrevoado os céus em busca de presas...\nE você é meu alvo!", + 2: "Não importa como será nossa batalha, meus Pokémon Voadores e eu triunfaremos com graça. Vamos batalhar!", + 3: "Espero que você não tenha medo de altura.\nVamos subir!" + }, + "victory": { + 1: "Você é a primeira Treinadora que vejo com mais graça do que eu.\nJogou excelentemente.", + 2: "Oh, meus Pokémon Voadores despencaram!\nMuito bem.", + 3: "Embora eu tenha caído, meus Pokémon continuarão a voar!" + }, + "defeat": { + 1: "Meus Pokémon Voadores e eu sempre dançaremos com elegância!", + 2: "Espero que tenha gostado do nosso show.\nNossa dança graciosa terminou.", + 3: "Você não quer ver nossa coreografia elegante novamente?" + } + }, + "tate": { + "encounter": { + 1: "Hehehe... Ficou surpreso de me ver sem minha irmã?", + 2: "Posso ver o que você está pensando...\nVocê quer batalhar!", + 3: "Como você pode derrotar alguém...\nQue sabe todos os seus movimentos?" + }, + "victory": { + 1: "Não pode ser ajudado...\nSinto falta da Liza...", + 2: "Seu vínculo com seus Pokémon era mais forte que o meu.", + 3: "Se eu estivesse com Liza, teríamos vencido.\nConseguimos completar os pensamentos um do outro!" + }, + "defeat": { + 1: "Meus Pokémon e eu somos superiores!", + 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Liza também.", + 3: "Tudo graças ao meu treinamento rigoroso com Liza.\nPosso me tornar um com os Pokémon." + } + }, + "liza": { + "encounter": { + 1: "Fufufu... Ficou surpreso de me ver sem meu irmão?", + 2: "Posso determinar o que você deseja...\nVocê quer batalhar, não quer?", + 3: "Como você pode derrotar alguém...\nQue é um com seus Pokémon?" + }, + "victory": { + 1: "Não pode ser ajudado...\nSinto falta do Tate...", + 2: "Seu vínculo com seus Pokémon...\nÉ mais forte que o meu.", + 3: "Se eu estivesse com Tate, teríamos vencido.\nPodemos terminar as frases um do outro!" + }, + "defeat": { + 1: "Meus Pokémon e eu somos vitoriosos.", + 2: "Se você não consegue nem me derrotar, nunca será capaz de derrotar Tate também.", + 3: "Tudo graças ao meu treinamento rigoroso com Tate.\nPosso me sincronizar com meus Pokémon." + } + }, + "juan": { + "encounter": { + 1: "Agora não é hora de agir timidamente.\nVamos batalhar!", + 2: "Ahahaha, você será testemunha da minha arte com Pokémon de Água!", + 3: "Um tufão se aproxima!\nVocê será capaz de me testar?", + 4: "Por favor, você será testemunha da nossa arte.\nUma grande ilusão de água esculpida por meus Pokémon e por mim!" + }, + "victory": { + 1: "Você pode ser um gênio que pode enfrentar Wallace!", + 2: "Eu me concentrei na elegância enquanto você treinava.\nÉ natural que você me derrotasse.", + 3: "Ahahaha!\nMuito bem, você venceu desta vez.", + 4: "De você, sinto o brilho brilhante da habilidade que superará tudo." + }, + "defeat": { + 1: "Meus Pokémon e eu esculpimos uma ilusão de Água e saímos vitoriosos.", + 2: "Ahahaha, eu venci, e você perdeu.", + 3: "Posso emprestar meu traje? Pode te ajudar a batalhar!\nAhahaha, estou brincando!", + 4: "Eu sou o vencedor! O que quer dizer, você perdeu." + } + }, + "crasher_wake": { + "encounter": { + 1: "Crash! Crash! Cuidado!\nCrasher Wake… está… aqui!", + 2: "Crash! Crash! Crasher Wake!", + 3: "Sou a onda de poder que vai te lavar!" + }, + "victory": { + 1: "Isso coloca um sorriso no meu rosto!\nGuhahaha! Foi uma explosão!", + 2: "Hunwah! Acabou e terminou!\nComo vou dizer isso...\nQuero mais! Queria batalhar muito mais!", + 3: "O QUÊ?!" + }, + "defeat": { + 1: "Siiiiim! Isso mesmo!", + 2: "Eu venci, mas quero mais! Queria batalhar muito mais!", + 3: "Até logo!" + } + }, + "falkner": { + "encounter": { + 1: "Vou mostrar o verdadeiro poder dos magníficos Pokémon pássaros!", + 2: "Ventos, fiquem comigo!", + 3: "Pai! Espero que esteja vendo minha batalha de cima!" + }, + "victory": { + 1: "Eu entendo... Vou sair graciosamente.", + 2: "Uma derrota é uma derrota. Você é realmente forte.", + 3: "...Droga! Sim, eu perdi." + }, + "defeat": { + 1: "Pai! Venci com seus amados Pokémon pássaros...", + 2: "Pokémon pássaros são os melhores afinal!", + 3: "Sinto que estou alcançando meu pai!" + } + }, + "nessa": { + "encounter": { + 1: "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-la.", + 2: "Não estou aqui para conversar. Estou aqui para vencer!", + 3: "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-la!" + }, + "victory": { + 1: "Você e seus Pokémon são demais...", + 2: "Como...? Como isso pode ser?!", + 3: "Fui totalmente arrastada!" + }, + "defeat": { + 1: "A onda furiosa ataca novamente!", + 2: "Hora de surfar na onda da vitória!", + 3: "Hehe!" + } + }, + "melony": { + "encounter": { + 1: "Não vou me segurar!", + 2: "Tudo bem, acho que devemos começar.", + 3: "Vou congelar você completamente!" + }, + "victory": { + 1: "Você... Você é muito boa, hein?", + 2: "Se você encontrar Gordie por aí, certifique-se de dar uma boa surra nele, ok?", + 3: "Acho que você levou a quebra de gelo um pouco literalmente demais..." + }, + "defeat": { + 1: "Agora você vê como as batalhas podem ser severas?", + 2: "Hee! Parece que ganhei de novo!", + 3: "Você está segurando?" + } + }, + "marlon": { + "encounter": { + 1: "Você parece forte! Vamos começar!", + 2: "Sou forte como a amplitude do oceano. Você vai ser varrido, com certeza.", + 3: "Oh ho, então estou enfrentando você! Isso é fora do comum." + }, + "victory": { + 1: "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinador!", + 2: "Você não apenas parece forte, você é forte de verdade! Eh, eu também fui varrido!", + 3: "Você é forte como uma onda impressionante!" + }, + "defeat": { + 1: "Você é forte, mas não é o suficiente para mudar o mar, ok!", + 2: "Hee! Parece que ganhei de novo!", + 3: "Doce, doce vitória!" + } + }, + "shauntal": { + "encounter": { + 1: "Com licença. Você é uma desafiante, certo?\nSou a usuária de Pokémon do tipo Fantasma da Elite dos Quatro, Shauntal, e serei sua oponente.", + 2: "Adoro escrever sobre Treinadores que vêm aqui e os Pokémon que treinam.\nPosso usar você e seus Pokémon como tema?", + 3: "Cada pessoa que trabalha com Pokémon tem uma história para contar.\nQue história está prestes a ser contada?" + }, + "victory": { + 1: "Uau. Estou sem palavras!", + 2: "D-desculpe! Primeiro, preciso me desculpar com meus Pokémon...\n\nLamento muito que você tenha tido uma experiência ruim por minha causa!", + 3: "Mesmo com isso, ainda sou uma da Elite dos Quatro!" + }, + "defeat": { + 1: "Hehe.", + 2: "Isso me deu um excelente material para meu próximo romance!", + 3: "E assim, outra história termina..." + } + }, + "marshal": { + "encounter": { + 1: "Meu mentor, Alder, vê seu potencial como Treinadora e está interessado em você.\nMeu objetivo é testá-lo—levar você aos limites da sua força. Kiai!", + 2: "Vitória, vitória decisiva, é meu objetivo! Desafiante, aqui vou eu!", + 3: "Em mim mesmo, procuro desenvolver a força de um lutador e eliminar qualquer fraqueza em mim!\nPrevalecendo com a força de minhas convicções!" + }, + "victory": { + 1: "Ufa! Bem feito!", + 2: "À medida que suas batalhas continuarem, mire em alturas ainda maiores!", + 3: "A força demonstrada por você e seus Pokémon me impressionou profundamente..." + }, + "defeat": { + 1: "Hmm.", + 2: "Isso foi uma boa batalha.", + 3: "Haaah! Haaah! Haiyaaaah!" + } + }, + "cheren": { + "encounter": { + 1: "Você me lembra um velho amigo. Isso me deixa animado para essa batalha Pokémon!", + 2: "As batalhas Pokémon não têm sentido se você não pensa por que você batalha.\nOu melhor, isso torna as batalhas junto com Pokémon sem sentido.", + 3: "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-la." + }, + "victory": { + 1: "Obrigado! Vi o que estava faltando em mim.", + 2: "Obrigado! Sinto que vi um pouco do caminho em direção aos meus ideais.", + 3: "Hmm... Isso é problemático." + }, + "defeat": { + 1: "Como Líder de Ginásio, meu objetivo é ser um obstáculo para você superar.", + 2: "Tudo bem!", + 3: "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos." + } + }, + "chili": { + "encounter": { + 1: "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!", + 2: "Ta-da! O incendiário do tipo Fogo Chili—sou eu—será seu oponente!", + 3: "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!" + }, + "victory": { + 1: "Você me pegou. Estou... queimado...", + 2: "Uau! Você está pegando fogo!", + 3: "Ai! Você me pegou!" + }, + "defeat": { + 1: "Estou pegando fogo! Jogue comigo, e você se queimará!", + 2: "Quando você brinca com fogo, você se queima!", + 3: "Quero dizer, vamos lá, seu oponente era eu! Você não tinha chance!" + } + }, + "cilan": { + "encounter": { + 1: "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\nUm... Vamos batalhar, aconteça o que acontecer.", + 2: "Então, hum, se você está bem comigo, vou, hum, colocar tudo o que tenho em ser, er, você sabe, seu oponente.", + 3: "OK… Então, hum, eu sou o Cilan, gosto de Pokémon do tipo Grama." + }, + "victory": { + 1: "Er... Acabou agora?", + 2: "…Que surpresa. Você é muito forte, não é?\nAcho que meus irmãos também não teriam sido capazes de te derrotar...", + 3: "…Huh. Parece que meu timing estava, hum, errado?" + }, + "defeat": { + 1: "Huh? Ganhei?", + 2: "Acho...\nSuponho que ganhei, porque competi com meus irmãos Chili e Cress, e todos conseguimos ficar mais fortes.", + 3: "Foi... uma experiência bastante emocionante..." + } + }, + "roark": { + "encounter": { + 1: "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!", + 2: "Vamos lá! Estes são meus Pokémon de pedra, meu orgulho e alegria!", + 3: "Pokémon do tipo Pedra são simplesmente os melhores!", + 4: "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!" + }, + "victory": { + 1: "O-o que? Isso não pode ser! Meus Pokémon fortificados!", + 2: "...Perdemos o controle. Da próxima vez, gostaria de desafiá-la a uma corrida de escavação de fósseis no subsolo.", + 3: "Com habilidade como a sua, é natural que você vença.", + 4: "O-o que?! Não pode ser! Nem isso foi suficiente?", + 5: "Eu estraguei tudo." + }, + "defeat": { + 1: "Veja? Estou orgulhoso do meu estilo de batalha rochoso!", + 2: "Obrigado! A batalha me deu confiança de que talvez eu consiga vencer meu pai!", + 3: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!" + } + }, + "morty": { + "encounter": { + 1: "Com um pouco mais, eu poderia ver um futuro em que encontro o Pokémon lendário.\nVocê vai me ajudar a alcançar esse nível!", + 2: "Dizem que um Pokémon com cores de arco-íris aparecerá diante de um Treinador verdadeiramente poderoso.\nAcreditei nessa história, então treinei secretamente aqui a vida toda. Como resultado, agora posso ver o que os outros não podem.\nVejo uma sombra da pessoa que fará o Pokémon aparecer.\nAcredito que essa pessoa sou eu! Você vai me ajudar a alcançar esse nível!", + 3: "Quer você escolha acreditar ou não, o poder místico existe.", + 4: "Você pode testemunhar os frutos do meu treinamento.", + 5: "Você deve fazer sua alma se tornar uma com a dos Pokémon. Você pode fazer isso?", + 6: "Diga, você quer fazer parte do meu treinamento?" + }, + "victory": { + 1: "Ainda não sou bom o suficiente...", + 2: "Eu vejo... Sua jornada o levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...", + 3: "Como isso é possível...", + 4: "Não acho que nossos potenciais sejam tão diferentes.\nMas você parece ter algo mais do que isso... Que seja.", + 5: "Acho que preciso de mais treinamento.", + 6: "Isso é uma pena." + }, + "defeat": { + 1: "Eu me movi... mais um passo adiante.", + 2: "Fufufu...", + 3: "O-o que?! Não pode ser! Nem isso foi suficiente?", + 4: "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!", + 5: "Ahahahah!", + 6: "Eu sabia que venceria!" + } + }, + "crispin": { + "encounter": { + 1: "Quero vencer, então é exatamente isso que vou fazer!", + 2: "Eu batalho porque quero batalhar! E sabe de uma coisa? É assim que deve ser!" + }, + "victory": { + 1: "Queria vencer... mas perdi!", + 2: "Eu perdi... porque não consegui vencer!" + }, + "defeat": { + 1: "Ei, espere um segundo. Eu acabei de vencer? Acho que acabei de vencer! Que satisfação!", + 2: "Uou! Isso foi incrível!" + } + }, + "amarys": { + "encounter": { + 1: "Quero ser a pessoa a ajudar alguém em particular. Sendo assim, não posso me dar ao luxo de perder.\n... Nossa batalha começa agora." + }, + "victory": { + 1: "Eu sou... não o suficiente, eu vejo." + }, + "defeat": { + 1: "A vitória pertence a mim. Bem lutado." + } + }, + "lacey": { + "encounter": { + 1: "Vou enfrentar você com meu time usual como membro da Elite dos Quatro." + }, + "victory": { + 1: "Foi uma excelente batalha. Estou ansiosa para o próximo desafio." + }, + "defeat": { + 1: "Fufufu... Nada mal.\nDesafiantes que derrotam a Elite dos Quatro são dignos de notar." + } + }, + "drayton": { + "encounter": { + 1: `Cara, eu amo cadeiras. Você não ama cadeiras? Que salva-vidas. + $Não entendo por que todo mundo não fica sentado o tempo todo. Ficar de pé é cansativo!`, + }, + "victory": { + 1: "Acho que deveria ter esperado por isso!" + }, + "defeat": { + 1: "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateado, mas não vá dar uma de Kieran comigo, OK?" + } + }, + "ramos": { + "encounter": { + 1: `Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas? + $A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronta para enfrentar tudo isso?`, + }, + "victory": { + 1: "Você acredita nos seus Pokémon... E eles acreditam em você também... Foi uma boa batalha, broto." + }, + "defeat": { + 1: "Hohoho... De fato. Pequenas lâminas frágeis de grama conseguem quebrar até mesmo concreto." + } + }, + "viola": { + "encounter": { + 1: `Seja as lágrimas de frustração que seguem uma derrota ou o florescer da alegria que vem com a vitória… + $Ambos são ótimos temas para minha câmera! Fantástico! Isso vai ser simplesmente fantástico! + $Agora venha para cima de mim!`, + 2: "Minha lente está sempre focada na vitória – não vou deixar nada estragar esta foto!" + }, + "victory": { + 1: "Você e seus Pokémon me mostraram uma nova profundidade de campo! Fantástico! Simplesmente fantástico!", + 2: `O mundo que você vê através de uma lente, e o mundo que você vê com um Pokémon ao seu lado… + $O mesmo mundo pode parecer completamente diferente dependendo do seu ponto de vista.` + }, + "defeat": { + 1: "A foto do momento da minha vitória vai ser um verdadeiro sucesso!", + 2: "Sim! Tirei ótimas fotos!" + } + }, + "candice": { + "encounter": { + 1: `Você quer desafiar a Candice? Com certeza! Eu estava esperando por alguém forte! + $Mas devo te avisar, sou forte porque sei como focar.`, + 2: `Pokémon, moda, romance… É tudo uma questão de foco! + $Vou te mostrar exatamente o que quero dizer. Prepare-se para perder!` + }, + "victory": { + 1: "Devo dizer, estou aquecida para você! Posso até te admirar um pouco.", + 2: `Uau! Você é ótima! Ganhou meu respeito! + $Acho que seu foco e vontade nos derrubaram totalmente.` + }, + "defeat": { + 1: "Eu senti sua vontade de vencer, mas eu não perco!", + 2: "Viu? O foco da Candice! O foco dos meus Pokémon também é ótimo!" + } + }, + "gardenia": { + "encounter": { + 1: "Você tem uma aura vencedora. Então, de qualquer forma, isso vai ser divertido. Vamos ter nossa batalha!" + }, + "victory": { + 1: "Incrível! Você é muito boa, não é?" + }, + "defeat": { + 1: "Sim! Meus Pokémon e eu somos perfeitamente bons!" + } + }, + "aaron": { + "encounter": { + 1: "Ok! Deixe-me enfrentar você!" + }, + "victory": { + 1: "Batalhar é um assunto profundo e complexo..." + }, + "defeat": { + 1: "Vencer um membro da Elite dos Quatro não é fácil." + } + }, + "cress": { + "encounter": { + 1: "Isso mesmo! Serei eu e meus estimados tipos Água que você deve enfrentar na batalha!" + }, + "victory": { + 1: "Perder? Eu? Não acredito nisso." + }, + "defeat": { + 1: "Este é o resultado apropriado quando eu sou seu oponente." + } + }, + "allister": { + "encounter": { + 1: "'M Allister.\nA-aqui... vou eu..." + }, + "victory": { + 1: `Quase perdi minha máscara de tanto choque... Isso foi… + $Uau. Posso ver sua habilidade pelo que ela é.`, + }, + "defeat": { + 1: "I-isso foi incrível!" + } + }, + "clay": { + "encounter": { + 1: "Harrumph! Me deixou esperando, não foi, garota? Tudo bem, hora de ver o que você pode fazer!" + }, + "victory": { + 1: "Cara, como é bom dar tudo de si e ainda assim ser derrotado!" + }, + "defeat": { + 1: `O que importa é como você reage à derrota. + $É por isso que as pessoas que usam a derrota como combustível para melhorar são duras.`, + } + }, + "kofu": { + "encounter": { + 1: "Vou te servir um prato completo de Pokémon do tipo Água! Mas não tente comê-los!" + }, + "victory": { + 1: "Vaultin' Veluza! Você é animada, não é! Um pouco ANIMADO DEMAIS, se me permite dizer!" + }, + "defeat": { + 1: "Volte para me ver novamente, ouviu?" + } + }, + "tulip": { + "encounter": { + 1: "Permita-me usar minhas habilidades para deixar seus lindos Pokémon ainda mais bonitos!" + }, + "victory": { + 1: "Sua força tem uma magia que não pode ser apagada." + }, + "defeat": { + 1: "Você sabe, na minha linha de trabalho, pessoas que carecem de talento em uma área ou outra frequentemente desaparecem rapidamente - nunca mais se ouve falar delas." + } + }, + "sidney": { + "encounter": { + 1: `Gostei desse olhar que você me deu. Acho que você vai ser um bom desafio. + $Isso é ótimo! Parece muito bom! Vamos nessa! + $Você e eu, vamos curtir uma batalha que só pode acontecer aqui!`, + }, + "victory": { + 1: "E aí, gostou? Eu perdi! Mas foi divertido, então não importa." + }, + "defeat": { + 1: "Sem ressentimentos, beleza?" + } + }, + "phoebe": { + "encounter": { + 1: `Enquanto treinava, adquiri a habilidade de me comunicar com Pokémon do tipo Fantasma. + $Sim, o vínculo que desenvolvi com os Pokémon é extremamente forte. + $Então, vamos lá, tente ver se você consegue até mesmo causar dano aos meus Pokémon!`, + }, + "victory": { + 1: "Ah, droga. Eu perdi." + }, + "defeat": { + 1: "Estou ansiosa para batalhar com você de novo algum dia!" + } + }, + "glacia": { + "encounter": { + 1: `Tudo o que vi foram desafios de Treinadores fracos e seus Pokémon. + $E você? Ficaria extremamente satisfeita se pudesse dar tudo de mim contra você!`, + }, + "victory": { + 1: `Você e seus Pokémon… Como seus espíritos queimam! + $O calor consumido é esmagador. + $Não é surpresa que minhas habilidades geladas falharam em te machucar.`, + }, + "defeat": { + 1: "Uma batalha intensamente apaixonada, sem dúvida." + } + }, + "drake": { + "encounter": { + 1: `Para nós, batalhar com Pokémon como parceiros, você sabe o que é necessário? Você sabe o que precisa? + $Se não souber, nunca prevalecerá contra mim!`, + }, + "victory": { + 1: "Excelente, deve-se dizer." + }, + "defeat": { + 1: "Dei meu máximo nessa batalha!" + } + }, + "wallace": { + "encounter": { + 1: `Há algo em você… Uma diferença na sua postura. + $Acho que sinto isso em você. Agora, me mostre. Mostre-me o poder que você tem com seus Pokémon. + $E eu, por minha vez, apresentarei uma performance de ilusões na água com meus Pokémon!`, + }, + "victory": { + 1: `Bravo. Agora percebo sua autenticidade e magnificência como Treinadora de Pokémon. + $Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digno.`, + }, + "defeat": { + 1: "Uma grande ilusão!" + } + }, + "lorelei": { + "encounter": { + 1: `Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos! + $Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronta?`, + }, + "victory": { + 1: "Como ousa!" + }, + "defeat": { + 1: "Não há nada que você possa fazer quando está congelado." + } + }, + "will": { + "encounter": { + 1: `Treinei por todo o mundo, tornando meus Pokémon psíquicos poderosos. + $Eu só posso melhorar! Perder não é uma opção!`, + }, + "victory": { + 1: "Eu… Eu não… acredito…" + }, + "defeat": { + 1: "Isso foi por pouco. Me pergunto o que você está faltando." + } + }, + "malva": { + "encounter": { + 1: `Sinto que meu coração pode explodir em chamas. + $Estou ardendo de ódio por você, pirralha!`, + }, + "victory": { + 1: "Que novidade… Uma nova desafiadora derrotou Malva!" + }, + "defeat": { + 1: "Estou encantada! Sim, encantada por poder esmagar você sob meu calcanhar." + } + }, + "hala": { + "encounter": { + 1: "O velho Hala está aqui para fazer você gritar!" + }, + "victory": { + 1: "Pude sentir o poder que você ganhou na sua jornada." + }, + "defeat": { + 1: "Haha! Que batalha deliciosa!" + } + }, + "molayne": { + "encounter": { + 1: `Dei a posição de capitão ao meu primo Sophocles, mas estou confiante na minha habilidade. + $Minha força é como a de uma supernova!`, + }, + "victory": { + 1: "Certamente encontrei uma Treinadora interessante para enfrentar!" + }, + "defeat": { + 1: "Ahaha. Que batalha interessante." + } + }, + "rika": { + "encounter": { + 1: "Eu diria que vou pegar leve com você, mas… estaria mentindo! Pense rápido!" + }, + "victory": { + 1: "Nada mal, garota." + }, + "defeat": { + 1: "Nahahaha! Você realmente é algo mais, garota!" + } + }, + "bruno": { + "encounter": { + 1: "Nós vamos te triturar com nosso poder superior! Hoo hah!" + }, + "victory": { + 1: "Por quê? Como eu poderia perder?" + }, + "defeat": { + 1: "Você pode me desafiar o quanto quiser, mas os resultados nunca vão mudar!" + } + }, + "bugsy": { + "encounter": { + 1: "Sou Bugsy! Eu nunca perco quando se trata de Pokémon do tipo Inseto!" + }, + "victory": { + 1: "Uau, incrível! Você é uma especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu." + }, + "defeat": { + 1: "Obrigado! Graças à nossa batalha, eu também pude fazer progressos na minha pesquisa!" + } + }, + "koga": { + "encounter": { + 1: "Fwahahahaha! Pokémon não são apenas sobre força bruta--você verá em breve!" + }, + "victory": { + 1: "Ah! Você provou seu valor!" + }, + "defeat": { + 1: "Você aprendeu a temer as técnicas do ninja?" + } + }, + "bertha": { + "encounter": { + 1: "Bem, você mostraria a esta velha senhora o quanto aprendeu?" + }, + "victory": { + 1: `Bem! Querida criança, devo dizer, isso foi muito impressionante. + $Seus Pokémon acreditaram em você e fizeram o melhor para te dar a vitória. + $Mesmo tendo perdido, me encontro com esse sorriso bobo!`, + }, + "defeat": { + 1: "Hahahahah! Parece que esta velha senhora ganhou!" + } + }, + "lenora": { + "encounter": { + 1: "Bem, desafiador, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!" + }, + "victory": { + 1: "Minha teoria sobre você estava correta. Você é mais do que talentosa… Você é motivada! Eu te saúdo!" + }, + "defeat": { + 1: "Ah ha ha! Se você perder, certifique-se de analisar o porquê e use esse conhecimento na próxima batalha!" + } + }, + "siebold": { + "encounter": { + 1: "Enquanto eu estiver vivo, continuarei em busca da culinária suprema... e dos oponentes mais fortes em batalha!" + }, + "victory": { + 1: "Guardarei minha memória de você e seus Pokémon para sempre em meu coração." + }, + "defeat": { + 1: `Nossa batalha Pokémon foi como alimento para minha alma. Isso vai me manter em frente. + $É assim que vou prestar meus respeitos a você por dar tudo de si na batalha!`, + } + }, + "roxie": { + "encounter": { + 1: "Prepare-se! Vou arrancar algum senso de você!" + }, + "victory": { + 1: "Selvagem! Sua razão já é mais tóxica que a minha!" + }, + "defeat": { + 1: "Ei, vamos lá! Seja séria! Você tem que dar mais de si!" + } + }, + "olivia": { + "encounter": { + 1: "Não precisa de introdução aqui. Hora de batalhar comigo, Olivia!" + }, + "victory": { + 1: "Realmente encantador… Tanto você quanto seus Pokémon…" + }, + "defeat": { + 1: "Mmm-hmm." + } + }, + "poppy": { + "encounter": { + 1: "Oooh! Você quer ter uma batalha Pokémon comigo?" + }, + "victory": { + 1: "Uagh?! Mmmuuuggghhh…" + }, + "defeat": { + 1: `Yaaay! Eu consegui! Eu der-ro-tei você! Você pode vir para… Para… Uma revanche? + $Venha para uma revanche quando quiser!`, + } + }, + "agatha": { + "encounter": { + 1: "Pokémon são para batalhas! Vou te mostrar como um verdadeiro Treinador batalha!" + }, + "victory": { + 1: "Oh meu! Você é algo especial, criança!" + }, + "defeat": { + 1: "Bahaha. É assim que uma batalha adequada é feita!" + } + }, + "flint": { + "encounter": { + 1: "Espero que você esteja aquecida, porque aqui vem o Big Bang!" + }, + "victory": { + 1: "Incrível! Seus movimentos são tão quentes que fazem os meus parecerem mornos!" + }, + "defeat": { + 1: "Huh? Isso é tudo? Acho que você precisa de um pouco mais de paixão." + } + }, + "grimsley": { + "encounter": { + 1: "O vencedor leva tudo, e não sobra nada para o perdedor." + }, + "victory": { + 1: "Quando se perde, perde-se tudo… A próxima coisa que vou procurar será a vitória, também!" + }, + "defeat": { + 1: "Se alguém vence, a pessoa que lutou contra essa pessoa perde." + } + }, + "caitlin": { + "encounter": { + 1: `Sou eu que apareci quando a flor se abriu. Você que estava esperando… + $Você parece uma Treinadora de Pokémon com força refinada e bondade profunda. + $O que eu procuro no meu oponente é uma força soberba… + $Por favor, libere seu poder ao máximo!`, + }, + "victory": { + 1: "Meus Pokémon e eu aprendemos muito! Agradeço a você." + }, + "defeat": { + 1: "Aspiro a reivindicar a vitória com elegância e graça." + } + }, + "diantha": { + "encounter": { + 1: `Batalhar contra você e seus Pokémon, todos vocês cheios de esperança para o futuro… + $Honestamente, isso apenas me enche da energia que preciso para continuar enfrentando cada novo dia! Sim!`, + }, + "victory": { + 1: "Testemunhar os espíritos nobres de você e seus Pokémon em batalha realmente tocou meu coração…" + }, + "defeat": { + 1: "Oh, fantástico! O que achou? Minha equipe foi bem legal, né?" + } + }, + "wikstrom": { + "encounter": { + 1: `Bem encontrado, jovem desafiador! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! + $Que a batalha comece! En garde!`, + }, + "victory": { + 1: "Glorioso! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!" + }, + "defeat": { + 1: `Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! + $Vencer contra um oponente tão digno dá asas à minha alma--assim eu voo!`, + } + }, + "acerola": { + "encounter": { + 1: "Batalhar é simplesmente divertido! Vamos lá, eu posso te derrotar!" + }, + "victory": { + 1: "Eu… Estou sem palavras! Como você conseguiu?!" + }, + "defeat": { + 1: "Ehaha! Que vitória incrível!" + } + }, + "larry_elite": { + "encounter": { + 1: `Olá… Sou eu, Larry. + $Eu também sou membro da Elite dos Quatro, sim… Infelizmente para mim.`, + }, + "victory": { + 1: "Bem, isso tirou o vento debaixo das nossas asas…" + }, + "defeat": { + 1: "É hora de uma reunião com o chefe." + } + }, + "lance": { + "encounter": { + 1: "Estive esperando por você. Permita-me testar suas habilidades.", + 2: "Achei que você conseguiria chegar tão longe. Vamos começar." + }, + "victory": { + 1: "Você me pegou. Você é magnífica!", + 2: "Nunca esperei que outro Treinador me derrotasse… Estou surpreso." + }, + "defeat": { + 1: "Isso foi por pouco. Quer tentar de novo?", + 2: "Não é que você seja fraco. Não se incomode com isso." + } + }, + "karen": { + "encounter": { + 1: "Eu sou Karen. Você gostaria de um duelo com meus Pokémon do tipo Sombrio?", + 2: "Sou diferente daqueles que você já conheceu.", + 3: "Você montou uma equipe charmosa. Nossa batalha deve ser boa." + }, + "victory": { + 1: "Não! Eu não posso vencer. Como você ficou tão forte?", + 2: "Não me desviarei do meu caminho escolhido.", + 3: "O Campeão está ansioso para te conhecer." + }, + "defeat": { + 1: "Isso era o que eu esperava.", + 2: "Bem, isso foi relativamente divertido.", + 3: "Venha me visitar a qualquer momento." + } + }, + "milo": { + "encounter": { + 1: `Parece que você entende bem os Pokémon. + $Isso vai ser uma batalha e tanto! + $Vou ter que usar a Dynamax no meu Pokémon se eu quiser vencer!`, + }, + "victory": { + 1: "O poder da Grama murchou… Que desafiador incrível!" + }, + "defeat": { + 1: "Isso realmente vai te deixar em choque e admiração." + } + }, + "lucian": { + "encounter": { + 1: `Só um momento, por favor. O livro que estou lendo está quase no clímax emocionante… + $O herói obteve uma espada mística e está prestes a enfrentar sua prova final… Ah, tanto faz. + $Já que você chegou tão longe, vou deixar isso de lado e batalhar com você. + $Deixe-me ver se você alcançará tanta glória quanto o herói do meu livro!`, + }, + "victory": { + 1: "Eu vejo… Parece que você me colocou em xeque-mate." + }, + "defeat": { + 1: "Tenho uma reputação a manter." + } + }, + "drasna": { + "encounter": { + 1: `Você deve ser uma Treinadora forte. Sim, bastante forte… + $Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!`, + }, + "victory": { + 1: "Oh, meu Deus. Isso foi uma batalha rápida… Espero que você volte novamente algum dia!" + }, + "defeat": { + 1: "Como isso é possível?" + } + }, + "kahili": { + "encounter": { + 1: "Então, aqui está você… Por que não vemos para quem os ventos favorecem hoje, você… ou eu?" + }, + "victory": { + 1: "É frustrante para mim como membro da Elite dos Quatro, mas parece que sua força é real." + }, + "defeat": { + 1: "Essa foi uma jogada de mestre!" + } + }, + "hassel": { + "encounter": { + 1: "Prepare-se para aprender em primeira mão como é a respiração ardente de uma batalha feroz!" + }, + "victory": { + 1: `A sorte sorriu para mim desta vez, mas… + $Julgando pelo andamento da luta, quem sabe se serei tão sortudo na próxima vez.`, + }, + "defeat": { + 1: "Essa foi uma jogada de mestre!" + } + }, + "blue": { + "encounter": { + 1: "Você deve ser muito boa para chegar tão longe." + }, + "victory": { + 1: "Só perdi para ele e agora para você… Ele? Hee, hee…" + }, + "defeat": { + 1: "Viu? Meu poder é o que me trouxe até aqui." + } + }, + "piers": { + "encounter": { + 1: "Prepare-se para uma mosh pit comigo e minha galera! Spikemuth, é hora de roquear!" + }, + "victory": { + 1: "Eu e minha equipe demos o nosso melhor. Vamos nos encontrar novamente para uma batalha algum dia…" + }, + "defeat": { + 1: "Minha garganta está desgastada de tanto gritar… Mas essa foi uma batalha empolgante!" + } + }, + "red": { + "encounter": { + 1: "…!" + }, + "victory": { + 1: "…?" + }, + "defeat": { + 1: "…!" + } + }, + "jasmine": { + "encounter": { + 1: "Oh… Seus Pokémon são impressionantes. Acho que vou gostar disso." + }, + "victory": { + 1: "Você é realmente forte. Vou ter que me esforçar muito mais também." + }, + "defeat": { + 1: "Eu nunca esperei ganhar." + } + }, + "lance_champion": { + "encounter": { + 1: "Ainda sou o Campeão. Não vou segurar nada." + }, + "victory": { + 1: "Esta é a emergência de uma nova Campeã." + }, + "defeat": { + 1: "Defendi com sucesso meu Campeonato." + } + }, + "steven": { + "encounter": { + 1: `Diga-me… O que você viu na sua jornada com seus Pokémon? + $O que você sentiu, encontrando tantos outros Treinadores por aí? + $Viajar por esta terra rica… Isso despertou algo dentro de você? + $Quero que você venha até mim com tudo o que aprendeu. + $Meus Pokémon e eu responderemos com tudo o que sabemos!`, + }, + "victory": { + 1: "Então eu, o Campeão, caio em derrota…" + }, + "defeat": { + 1: "Esse tempo foi bem gasto! Obrigado!" + } + }, + "cynthia": { + "encounter": { + 1: "Eu, Cynthia, aceito seu desafio! Não haverá nenhuma trégua da minha parte!" + }, + "victory": { + 1: "Não importa o quão divertida a batalha seja, ela sempre terminará algum dia…" + }, + "defeat": { + 1: "Mesmo que você perca, nunca perca o amor pelos Pokémon." + } + }, + "iris": { + "encounter": { + 1: `Sabe de uma coisa? Estou realmente ansiosa para ter batalhas sérias com Treinadores fortes! + $Quero dizer, vamos lá! Os Treinadores que chegam aqui são Treinadores que desejam a vitória com todas as fibras do seu ser! + #E eles estão batalhando ao lado de Pokémon que passaram por inúmeras batalhas difíceis! + $Se eu batalhar com pessoas assim, não só eu ficarei mais forte, meus Pokémon também! + $E nós vamos nos conhecer ainda melhor! OK! Prepare-se! + $Sou Iris, a Campeã da Liga Pokémon, e vou te derrotar!`, + }, + "victory": { + 1: "Aghhhh… Eu dei o meu melhor, mas nós perdemos…" + }, + "defeat": { + 1: "Yay! Nós vencemos!" + } + }, + "hau": { + "encounter": { + 1: `Eu me pergunto se um Treinador batalha de maneira diferente dependendo se ele é de uma região quente ou fria. + $Vamos testar isso!`, + }, + "victory": { + 1: "Isso foi incrível! Acho que entendi um pouco melhor seu estilo agora!" + }, + "defeat": { + 1: "Cara, essa foi uma batalha e tanto!" + } + }, + "geeta": { + "encounter": { + 1: `Decidi entrar na batalha mais uma vez. + $Venha agora… Mostre-me os frutos do seu treinamento.`, + }, + "victory": { + 1: "Estou ansiosa para notícias de todas as suas conquistas!" + }, + "defeat": { + 1: "Qual o problema? Isso é tudo?" + } + }, + "nemona": { + "encounter": { + 1: "Yesss! Estou tão empolgada! Hora de soltar tudo!" + }, + "victory": { + 1: "Bem, isso foi ruim, mas ainda me diverti! Eu te pego na próxima!" + }, + "defeat": { + 1: "Bem, essa foi uma ótima batalha! Frutífera, com certeza." + } + }, + "leon": { + "encounter": { + 1: "Vamos ter um tempo absolutamente campeão!" + }, + "victory": { + 1: `Meu tempo como Campeão acabou… + $Mas que tempo campeão foi! + $Obrigado pela melhor batalha que já tive!`, + }, + "defeat": { + 1: "Um tempo absolutamente campeão, foi!" + } + }, + "whitney": { + "encounter": { + 1: "Eai! Você não acha que os Pokémon são, tipo, super fofos?" + }, + "victory": { + 1: "Waaah! Waaah! Você é tão má!" + }, + "defeat": { + 1: "E é isso!" + } + }, + "chuck": { + "encounter": { + 1: "Hah! Você quer me desafiar? É corajosa ou apenas ignorante?" + }, + "victory": { + 1: "Você é forte! Por favor, me faça seu aprendiz?" + }, + "defeat": { + 1: "Aí está. Você percebe o quanto sou mais poderoso que você?" + } + }, + "katy": { + "encounter": { + 1: "Não baixe a guarda, a menos que queira se ver jogada no chão!" + }, + "victory": { + 1: "Todos os meus adoráveis Pokémon caíram como moscas!" + }, + "defeat": { + 1: "Coma, meu adorável Vivillon!" + } + }, + "pryce": { + "encounter": { + 1: "A juventude sozinha não garante a vitória! Experiência é o que conta." + }, + "victory": { + 1: "Excelente! Isso foi perfeito. Tente não esquecer o que sente agora." + }, + "defeat": { + 1: "Exatamente como eu imaginei." + } + }, + "clair": { + "encounter": { + 1: "Você sabe quem eu sou? E ainda se atreve a me desafiar?" + }, + "victory": { + 1: "Eu me pergunto até onde você pode ir com seu nível de habilidade. Isso deve ser fascinante." + }, + "defeat": { + 1: "E é isso." + } + }, + "maylene": { + "encounter": { + 1: `Vim desafiá-la agora e não vou segurar nada. + $Por favor, prepare-se para a batalha!`, + }, + "victory": { + 1: "Eu admito a derrota…" + }, + "defeat": { + 1: "Isso foi incrível." + } + }, + "fantina": { + "encounter": { + 1: `Você vai me desafiar, não é? Mas eu vou ganhar. + $É o que a Líder do Ginásio de Hearthome faz, não?`, + }, + "victory": { + 1: "Você é tão incrivelmente forte. Sei porque perdi." + }, + "defeat": { + 1: "Estou tão, tão, muito feliz!" + } + }, + "byron": { + "encounter": { + 1: `Treinadora! Você é jovem, assim como meu filho, Roark. + $Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! + $Então, como uma parede para os jovens, aceitarei seu desafio!`, + }, + "victory": { + 1: "Hmm! Meus Pokémon robustos--derrotados!" + }, + "defeat": { + 1: "Gwahahaha! Como foram meus Pokémon robustos?!" + } + }, + "olympia": { + "encounter": { + 1: "Um costume antigo decidindo o destino de alguém. A batalha começa!" + }, + "victory": { + 1: "Crie seu próprio caminho. Não deixe nada te atrapalhar. Seu destino, seu futuro." + }, + "defeat": { + 1: "Nosso caminho está claro agora." + } + }, + "volkner": { + "encounter": { + 1: `Já que você chegou tão longe, deve ser bastante forte… + $Espero que você seja a Treinadora que me faça lembrar como é divertido batalhar!`, + }, + "victory": { + 1: `Você me venceu… + $Seu desejo e a maneira nobre como seus Pokémon batalharam por você… + $Eu até me senti emocionado durante nossa luta. Foi uma batalha muito boa.`, + }, + "defeat": { + 1: `Não foi nada chocante… + $Isso não é o que eu queria!`, + } + }, + "burgh": { + "encounter": { + 1: `M'hm… Se eu ganhar esta batalha, sinto que posso desenhar um quadro diferente de qualquer outro. + $OK! Posso ouvir minha musa da batalha claramente. Vamos direto ao ponto!`, + 2: `Claro, estou realmente orgulhoso de todos os meus Pokémon! + $Bem agora… Vamos direto ao ponto!` + }, + "victory": { + 1: "Acabou? Minha musa me abandonou?", + 2: "Hmm… Acabou! Você é incrível!" + }, + "defeat": { + 1: "Uau… É bonito de alguma forma, não é…", + 2: `Às vezes ouço as pessoas dizerem que foi uma vitória feia. + $Acho que se você está dando o seu melhor, qualquer vitória é bonita.` + } + }, + "elesa": { + "encounter": { + 1: `C'est fini! Quando tenho certeza disso, sinto um choque elétrico percorrer meu corpo! + $Quero sentir essa sensação, então agora meus amados Pokémon vão fazer sua cabeça girar!`, + }, + "victory": { + 1: "Eu queria fazer sua cabeça girar, mas você me surpreendeu." + }, + "defeat": { + 1: "Isso foi insatisfatório de alguma forma… Você dará tudo de si na próxima vez?" + } + }, + "skyla": { + "encounter": { + 1: `Finalmente é hora do confronto! Isso significa a batalha Pokémon que decide quem está no topo, certo? + $Eu amo estar no topo! Porque você pode ver para sempre e sempre de lugares altos! + $Então, que tal nós nos divertirmos?`, + }, + "victory": { + 1: "Ser seu oponente na batalha é uma nova fonte de força para mim. Obrigada!" + }, + "defeat": { + 1: "Ganhar ou perder, você sempre ganha algo com uma batalha, certo?" + } + }, + "brycen": { + "encounter": { + 1: `Há também força em estar com outras pessoas e Pokémon. + $Receber o apoio deles te fortalece. Vou te mostrar esse poder!`, + }, + "victory": { + 1: "A maravilhosa combinação de você e seus Pokémon! Que amizade linda!" + }, + "defeat": { + 1: "Condições extremas realmente testam e treinam você!" + } + }, + "drayden": { + "encounter": { + 1: `O que eu quero encontrar é um jovem Treinador que possa me mostrar um futuro brilhante. + $Vamos batalhar com tudo o que temos: sua habilidade, minha experiência e o amor com que criamos nossos Pokémon!`, + }, + "victory": { + 1: "Esse sentimento intenso que me invade após uma derrota… Não sei como descrevê-lo." + }, + "defeat": { + 1: "Harrumph! Sei que sua habilidade é maior que isso!" + } + }, + "grant": { + "encounter": { + 1: `Só há uma coisa que desejo. + $Que, superando um ao outro, encontremos um caminho para alturas ainda maiores.`, + }, + "victory": { + 1: "Você é uma parede que não consigo superar!" + }, + "defeat": { + 1: `Não desista. + $Isso é tudo o que realmente importa. + $As lições mais importantes da vida são simples.`, + } + }, + "korrina": { + "encounter": { + 1: "Hora da grande aparição de Lady Korrina!" + }, + "victory": { + 1: "É o seu próprio ser que permite que seus Pokémon evoluam!" + }, + "defeat": { + 1: "Que batalha explosiva!" + } + }, + "clemont": { + "encounter": { + 1: "Oh! Estou feliz por termos nos encontrado!" + }, + "victory": { + 1: "Sua paixão pela batalha me inspira!" + }, + "defeat": { + 1: "Parece que minha Máquina Treinadora-Crescer-Forte, Mach 2 está realmente funcionando!" + } + }, + "valerie": { + "encounter": { + 1: `Oh, se não é uma jovem Treinadora… É adorável conhecê-lo assim. + $Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. + $O elusivo Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte.`, + }, + "victory": { + 1: "Espero que você encontre coisas para sorrir amanhã…" + }, + "defeat": { + 1: "Oh meu Deus, que pena…" + } + }, + "wulfric": { + "encounter": { + 1: `Sabe de uma coisa? Todos falamos muito sobre o que você aprende com as batalhas e os laços e tudo mais… + $Mas realmente, eu só faço isso porque é divertido. + $Quem se importa com o grandioso? Vamos batalhar!`, + }, + "victory": { + 1: "Incrível! Sou duro como um iceberg, mas você me quebrou por completo!" + }, + "defeat": { + 1: "Lute comigo e é isso que acontece!" + } + }, + "kabu": { + "encounter": { + 1: `Todo Treinador e Pokémon treina duro em busca da vitória. + $Mas isso significa que seu oponente também está se esforçando para vencer. + $No final, a partida é decidida por qual lado é capaz de liberar seu verdadeiro potencial.`, + }, + "victory": { + 1: "Estou feliz por poder lutar com você hoje!" + }, + "defeat": { + 1: "É uma ótima maneira de sentir meu próprio crescimento!" + } + }, + "bea": { + "encounter": { + 1: `Você tem um espírito inabalável que não será movido, não importa como você seja atacado? + $Acho que vou testar isso, certo?`, + }, + "victory": { + 1: "Senti o espírito de luta de seus Pokémon enquanto você os liderava na batalha." + }, + "defeat": { + 1: "Essa foi a melhor partida que alguém poderia esperar." + } + }, + "opal": { + "encounter": { + 1: "Deixe-me ver como você e seu Pokémon parceiro se comportam!" + }, + "victory": { + 1: "Seu rosa ainda está faltando, mas você é uma Treinadora excelente com Pokémon excelentes." + }, + "defeat": { + 1: "Muito ruim para você, eu acho." + } + }, + "bede": { + "encounter": { + 1: "Suponho que devo provar além de qualquer dúvida o quão patética você é e quão forte eu sou." + }, + "victory": { + 1: "Eu vejo… Bem, tudo bem. Eu não estava me esforçando muito de qualquer maneira." + }, + "defeat": { + 1: "Bom trabalho, eu suponho." + } + }, + "gordie": { + "encounter": { + 1: "Então, vamos acabar com isso." + }, + "victory": { + 1: "Eu só quero me enterrar em um buraco… Bem, acho que seria mais como cair daqui." + }, + "defeat": { + 1: "Batalhe como sempre faz, a vitória seguirá!" + } + }, + "marnie": { + "encounter": { + 1: `A verdade é que, quando tudo está dito e feito… Eu realmente só quero me tornar Campeã por mim mesma! + $Então, não leve para o pessoal quando eu chutar seu traseiro!`, + }, + "victory": { + 1: "OK, então eu perdi… Mas consegui ver muitos dos pontos bons de você e seus Pokémon!" + }, + "defeat": { + 1: "Espero que você tenha gostado das nossas táticas de batalha." + } + }, + "raihan": { + "encounter": { + 1: "Vou derrotar o Campeão, vencer todo o torneio e provar ao mundo o quão forte o grande Raihan realmente é!" + }, + "victory": { + 1: `Eu pareço bem mesmo quando perco. + $É uma verdadeira maldição. + $Acho que é hora de mais uma selfie!`, + }, + "defeat": { + 1: "Vamos tirar uma selfie para lembrar disso." + } + }, + "brassius": { + "encounter": { + 1: "Pressuponho que você está pronta? Que nossa obra de arte colaborativa comece!" + }, + "victory": { + 1: "Ahhh…avant-garde!" + }, + "defeat": { + 1: "Começarei uma nova peça imediatamente!" + } + }, + "iono": { + "encounter": { + 1: `Como você está se sentindo sobre esta batalha? + $... + $Vamos começar o show! Quão forte é o nossa desafiadora? + $Eu não sei! Vamos descobrir juntos!`, + }, + "victory": { + 1: "Você é tão chamativa e brilhante quanto um Raio do Trovão de 10.000.000 volts, amiga!" + }, + "defeat": { + 1: "Seus olhos são MEUS!" + } + }, + "larry": { + "encounter": { + 1: "Quando tudo está dito e feito, a simplicidade é mais forte." + }, + "victory": { + 1: "Uma porção de derrota, hein?" + }, + "defeat": { + 1: "Vou encerrar o dia." + } + }, + "ryme": { + "encounter": { + 1: "Vamos lá, baby! Me agite até os ossos!" + }, + "victory": { + 1: "Você é legal, minha amiga, você move minha ALMA!" + }, + "defeat": { + 1: "Até mais, baby!" + } + }, + "grusha": { + "encounter": { + 1: "Tudo o que preciso fazer é garantir que o poder do meu Pokémon te arrependa até os ossos!" + }, + "victory": { + 1: "Sua paixão ardente... Eu meio que gosto, para ser honesto." + }, + "defeat": { + 1: "As coisas não esquentaram para você." + } + }, + "marnie_elite": { + "encounter": { + 1: "Você chegou até aqui, hein? Vamos ver se você pode lidar com meus Pokémon!", + 2: "Vou dar o meu melhor, mas não pense que vou pegar leve com você!" + }, + "victory": { + 1: "Não acredito que perdi... Mas você mereceu essa vitória. Bem feito!", + 2: "Parece que ainda tenho muito a aprender. Grande batalha, porém!" + }, + "defeat": { + 1: "Você lutou bem, mas eu tenho a vantagem! Melhor sorte na próxima vez!", + 2: "Parece que meu treinamento valeu a pena. Obrigado pela batalha!" + } + }, + "nessa_elite": { + "encounter": { + 1: "As marés estão mudando a meu favor. Pronta para ser levada pela corrente?", + 2: "Vamos fazer ondas com esta batalha! Espero que esteja preparada!" + }, + "victory": { + 1: "Você navegou nessas águas perfeitamente... Bem feito!", + 2: "Parece que minhas correntes não foram páreo para você. Bom trabalho!" + }, + "defeat": { + 1: "A água sempre encontra um caminho. Essa foi uma batalha refrescante!", + 2: "Você lutou bem, mas o poder do oceano é imparável!" + } + }, + "bea_elite": { + "encounter": { + 1: "Prepare-se! Meu espírito de luta brilha intensamente!", + 2: "Vamos ver se você consegue acompanhar meu ritmo implacável!" + }, + "victory": { + 1: "Sua força... É impressionante. Você realmente merece essa vitória.", + 2: "Nunca senti essa intensidade antes. Trabalho incrível!" + }, + "defeat": { + 1: "Outra vitória para meu rigoroso regime de treinamento! Bem feito!", + 2: "Você tem força, mas eu treinei mais. Grande batalha!" + } + }, + "allister_elite": { + "encounter": { + 1: "As sombras caem... Você está pronta para enfrentar seus medos?", + 2: "Vamos ver se você pode lidar com a escuridão que eu comando." + }, + "victory": { + 1: "Você dissipou as sombras... Por enquanto. Bem feito.", + 2: "Sua luz atravessou minha escuridão. Ótimo trabalho." + }, + "defeat": { + 1: "As sombras falaram... Sua força não é suficiente.", + 2: "A escuridão triunfa... Talvez na próxima vez você veja a luz." + } + }, + "raihan_elite": { + "encounter": { + 1: "Tempestade se formando! Vamos ver se você aguenta essa luta!", + 2: "Prepare-se para enfrentar o olho da tempestade!" + }, + "victory": { + 1: "Você enfrentou a tempestade... Trabalho incrível!", + 2: "Você navegou nos ventos perfeitamente... Grande batalha!" + }, + "defeat": { + 1: "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!", + 2: "Você foi pego na minha tempestade! Melhor sorte na próxima vez!" + } + }, + "alder": { + "encounter": { + 1: "Se prepare para uma batalha contra o Treinador mais forte de Unova!" + }, + "victory": { + 1: "Muito bem! Você certamente é um talento incomparável." + }, + "defeat": { + 1: `Um vento fresco sopra em meu coração... + $Que esforço extraordinário!` + } + }, + "kieran": { + "encounter": { + 1: `Através do trabalho duro, eu me torno cada vez mais forte! + $Eu não perco.` + }, + "victory": { + 1: `Eu não acredito... + $Que batalha divertida e emocionante!` + }, + "defeat": { + 1: `Uau, que batalha! + $Hora de você treinar ainda mais.` + } + }, + "rival": { + "encounter": { + 1: `@c{smile}Eai, estava procurando você! Sabia que você estava ansiosa para começar, mas esperava pelo menos um tchau… + $@c{smile_eclosed}Então você está realmente perseguindo seu sonho, hein?\n Quase não consigo acreditar. + $@c{serious_smile_fists}Já que estamos aqui, que tal uma batalha?\nAfinal, quero ter certeza de que você está pronta. + $@c{serious_mopen_fists}Não se segure, quero que você dê tudo de si!` + }, + "victory": { + 1: `@c{shock}Caramba… Você me limpou.\nVocê é mesmo uma novata? + $@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim. + $Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais. + $@c{serious_smile_fists}Boa sorte lá fora!` + }, + }, + "rival_female": { + "encounter": { + 1: `@c{smile_wave}Aí está você! Procurei você em todo lugar!\n@c{angry_mopen}Esqueceu de se despedir da sua melhor amiga? + $@c{smile_ehalf}Você está indo atrás do seu sonho, né?\nEsse dia realmente chegou, não é… + $@c{smile}Enfim, vou te perdoar por ter me esquecido, mas com uma condição. @c{smile_wave_wink}Você tem que lutar comigo! + $@c{angry_mopen}Dê o seu melhor! Não quer que sua aventura acabe antes de começar, né?` + }, + "victory": { + 1: `@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi? + $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora. + $@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis! + $@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!` + }, + }, + "rival_2": { + "encounter": { + 1: `@c{smile}Eai, você também está aqui?\n@c{smile_eclosed}Ainda com um recorde perfeito, hein…? + $@c{serious_mopen_fists}Sei que parece que eu te segui até aqui, mas isso não é totalmente verdade. + $@c{serious_smile_fists}Sinceramente, tenho estado ansioso por uma revanche desde que você me venceu em casa. + $Tenho treinado bastante, então vou dar uma luta difícil desta vez. + $@c{serious_mopen_fists}Não se segure, assim como antes!\nVamos lá!` + }, + "victory": { + 1: `@c{neutral_eclosed}Ah. Acho que fui confiante demais. + $@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n + $@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer. + $@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente. + $@c{smile}Enfim, cuide-se!` + }, + }, + "rival_2_female": { + "encounter": { + 1: `@c{smile_wave}Oh, que surpresa te encontrar aqui. Parece que você ainda está invicto. @c{angry_mopen}Hum… Nada mal! + $@c{angry_mopen}Eu sei o que você está pensando, e não, eu não estava te espionando. @c{smile_eclosed}Acontece que eu estava na área. + $@c{smile_ehalf}Estou feliz por você, mas só quero te avisar que está tudo bem perder às vezes. + $@c{smile}Aprendemos com nossos erros, muitas vezes mais do que se continuássemos vencendo. + $@c{angry_mopen}De qualquer forma, tenho treinado duro para nossa revanche, então é melhor você dar o seu melhor!` + }, + "victory": { + 1: `@c{neutral}Eu… não era para eu perder dessa vez… + $@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez! + $@c{smile_wave}Também consegui mais um desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~. + $@c{angry_mopen}Este é o último, hein! Você não vai ganhar mais nenhum presente de mim depois desse! + $@c{smile_wave}Continue assim!` + }, + "defeat": { + 1: "Está tudo bem perder às vezes…" + } + }, + "rival_3": { + "encounter": { + 1: `@c{smile}Eai, olha quem é! Faz um tempo.\n@c{neutral}Você… ainda está invicto? Hum. + $@c{neutral_eclosed}As coisas têm sido meio… estranhas.\nNão é a mesma coisa em casa sem você. + $@c{serious}Eu sei que é egoísta, mas preciso desabafar.\n@c{neutral_eclosed}Acho que você está se metendo em algo grande demais aqui. + $@c{serious}Nunca perder é irrealista.\nPrecisamos perder às vezes para crescer. + $@c{neutral_eclosed}Você teve uma grande jornada, mas ainda há muito pela frente, e só vai ficar mais difícil. @c{neutral}Você está preparada para isso? + $@c{serious_mopen_fists}Se sim, prove para mim.` + }, + "victory": { + 1: "@c{angry_mhalf}Isso é ridículo… Eu mal parei de treinar…\nComo ainda estamos tão distantes?" + }, + }, + "rival_3_female": { + "encounter": { + 1: `@c{smile_wave}Quanto tempo! Ainda não perdeu, né.\n@c{angry}Você está começando a me irritar. @c{smile_wave_wink}Brincadeirinha! + $@c{smile_ehalf}Mas sério, você não sente saudades de casa? Ou… de mim?\nEu… Eu quero dizer, sentimos muito a sua falta. + $@c{smile_eclosed}Eu apoio o seu sonho e tudo mais, mas a realidade é que você vai perder mais cedo ou mais tarde. + $@c{smile}E quando isso acontecer, estarei lá para você, como sempre.\n@c{angry_mopen}Agora, deixe-me mostrar o quão forte eu me tornei!` + }, + "victory": { + 1: "@c{shock}Depois de tudo isso… não foi o suficiente…?\nVocê nunca vai voltar a esse ritmo…" + }, + "defeat": { + 1: "Você deu o seu melhor, agora vamos para casa." + } + }, + "rival_4": { + "encounter": { + 1: `@c{neutral}Oi. + $Não vou enrolar com você.\n@c{neutral_eclosed}Estou aqui para vencer, simples assim. + $@c{serious_mhalf_fists}Aprendi a maximizar meu potencial dedicando todo o meu tempo ao treino. + $@c{smile}Você ganha muito tempo extra quando corta o sono e a interação social desnecessários. + $@c{serious_mopen_fists}Nada disso importa mais, não até eu vencer. + $@c{neutral_eclosed}Cheguei ao ponto de não perder mais.\n@c{smile_eclosed}Acho que sua filosofia não estava tão errada afinal. + $@c{angry_mhalf}Perder é para os fracos, e eu não sou mais fraco. + $@c{serious_mopen_fists}Prepare-se.` + }, + "victory": { + 1: "@c{neutral}O que…@d{64} O que você é?" + }, + }, + "rival_4_female": { + "encounter": { + 1: `@c{neutral}Sou eu! Você não esqueceu de mim de novo… esqueceu? + $@c{smile}Você deveria se orgulhar de até onde chegou. Parabéns!\nMas parece que é o fim da sua jornada. + $@c{smile_eclosed}Você despertou algo em mim que eu nunca soube que existia.\nParece que agora tudo o que faço é treinar. + $@c{smile_ehalf}Eu mal como ou durmo agora, só treino meus Pokémon o dia todo, ficando mais forte a cada vez. + $@c{neutral}Na verdade, eu… mal me reconheço. + $E agora, finalmente atingi o desempenho máximo.\nNão acho que alguém poderia me vencer agora. + $E sabe de uma coisa? É tudo por sua causa.\n@c{smile_ehalf}Eu não sei se te agradeço ou te odeio. + $@c{angry_mopen}Prepare-se.` + }, + "victory": { + 1: "@c{neutral}O que…@d{64} O que você é?" + }, + "defeat": { + 1: "$@c{smile}Você deveria se orgulhar de até onde chegou." + } + }, + "rival_5": { + "encounter": { + 1: "@c{neutral}…" + }, + "victory": { + 1: "@c{neutral}…" + }, + }, + "rival_5_female": { + "encounter": { + 1: "@c{neutral}…" + }, + "victory": { + 1: "@c{neutral}…" + }, + "defeat": { + 1: "$@c{smile_ehalf}…" + } + }, + "rival_6": { + "encounter": { + 1: `@c{smile_eclosed}Nos encontramos de novo. + $@c{neutral}Tive um tempo para refletir sobre tudo isso.\nHá uma razão para tudo isso parecer tão estranho. + $@c{neutral_eclosed}Seu sonho, minha vontade de te vencer…\nTudo faz parte de algo maior. + $@c{serious}Isso não é sobre mim, nem sobre você… É sobre o mundo, @c{serious_mhalf_fists}e é meu propósito te levar ao limite. + $@c{neutral_eclosed}Se cumpri esse propósito, não posso dizer, mas fiz tudo ao meu alcance. + $@c{neutral}Este lugar em que acabamos é assustador… Mas de alguma forma me sinto indiferente, como se já tivesse estado aqui antes. + $@c{serious_mhalf_fists}Você sente o mesmo, não sente? + $@c{serious}…é como se algo aqui estivesse falando comigo.\nIsso é tudo o que o mundo conhece há muito tempo. + $Aqueles momentos que apreciamos juntos que parecem tão recentes não passam de uma memória distante. + $@c{neutral_eclosed}Quem pode dizer se eles foram realmente reais em primeiro lugar. + $@c{serious_mopen_fists}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é a única que pode fazer isso. + $@c{serious_smile_fists}Eu mal sei o que tudo isso significa, só sei que é verdade. + $@c{serious_mopen_fists}Se você não pode me derrotar aqui e agora, você não terá chance.` + }, + "victory": { + 1: `@c{smile_eclosed}Parece que meu trabalho aqui está feito. + $Quero que você me prometa uma coisa.\n@c{smile}Depois que curar o mundo, por favor, volte para casa.` + }, + }, + "rival_6_female": { + "encounter": { + 1: `@c{smile_ehalf}Então somos só nós de novo. + $@c{smile_eclosed}Sabe, continuo pensando nisso… + $@c{smile_ehalf}Há algo nisso tudo, por que tudo parece tão estranho agora… + $@c{smile}Você tem seu sonho, e eu tenho essa ambição em mim… + $Não consigo evitar sentir que há um propósito maior em tudo isso, no que estamos fazendo, você e eu. + $@c{smile_eclosed}Acho que devo te levar ao limite. + $@c{smile_ehalf}Não tenho certeza se estou fazendo um bom trabalho nisso, mas tentei meu melhor até agora. + $Há algo neste lugar estranho e terrível… Tudo parece tão claro… + $Isso… é tudo o que o mundo conhece há muito tempo. + $@c{smile_eclosed}É como se eu mal pudesse lembrar das memórias que apreciamos juntos. + $@c{smile_ehalf}Elas foram reais? Elas parecem tão distantes agora… + $@c{angry_mopen}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é o único que pode fazer isso. + $@c{smile_ehalf}Eu… não sei o que tudo isso significa… mas sinto que é verdade. + $@c{neutral}Se você não pode me derrotar aqui e agora, você não terá chance.` + }, + "victory": { + 1: `@c{smile_ehalf}Eu… acho que cumpri meu propósito… + $@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa. + $@c{smile_ehalf}…Obrigada.` + }, + }, +}; // Diálogo do chefe final do jogo quando o personagem do jogador é masculino (ou não definido) export const PGMbattleSpecDialogue: SimpleTranslationEntries = { "encounter": `Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe? $Você foi atraído para cá, porque já esteve aqui antes.\nInúmeras vezes. - $Embora, talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu 5.643.853º ciclo. + $Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu 5.643.853º ciclo. $A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos "eus" permanecem. $Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n $Você é o único aqui, embora pareça haver... outro. @@ -2304,7 +4817,19 @@ export const PGMbattleSpecDialogue: SimpleTranslationEntries = { }; // Diálogo do chefe final do jogo quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMbattleSpecDialogue. -export const PGFbattleSpecDialogue: SimpleTranslationEntries = PGMbattleSpecDialogue; +export const PGFbattleSpecDialogue: SimpleTranslationEntries = { + "encounter": `Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe? + $Você foi atraída para cá, porque já esteve aqui antes.\nInúmeras vezes. + $Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu 5.643.853º ciclo. + $A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos "eus" permanecem. + $Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n + $Você é a única aqui, embora pareça haver... outro. + $Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios? + $Vamos começar.`, + "firstStageWin": `Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar. + $Não me decepcione.`, + "secondStageWin": "…Magnífico." +}; // Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é masculino export const PGMmiscDialogue: SimpleTranslationEntries = { @@ -2324,10 +4849,31 @@ export const PGMmiscDialogue: SimpleTranslationEntries = { $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" }; // Diálogo que não se enquadra em nenhuma outra categoria (por exemplo, mensagens de tutorial ou o final do jogo). Para quando o personagem do jogador é feminino. Para idiomas que não possuem pronomes de gênero, isso pode ser definido como PGMmiscDialogue. -export const PGFmiscDialogue: SimpleTranslationEntries = PGMmiscDialogue; +export const PGFmiscDialogue: SimpleTranslationEntries = { + "ending": + `@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora. + $@c{smile}Acabou.@d{64} Você quebrou o ciclo. + $@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez. + $@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é? + $@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações. + $@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa. + $@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver disposta.`, + "ending_female": + `@c{shock}Você está de volta?@d{32} Isso significa que…@d{96} você venceu?!\n@c{smile_ehalf}Eu deveria saber que você conseguiria. + $@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo. + $@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez. + $Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer! + $@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações. + $@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar. + $Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?`, + "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.", + "ending_name": "Desenvolvedores" +}; // Diálogo das batalhas duplas nomeadas no jogo. Para quando o jogador é masculino (ou não definido). @@ -2447,4 +4993,116 @@ export const PGMdoubleBattleDialogue: DialogueTranslationEntries = { // Dialogue of the named double battles in the game. For when the player is female. For languages that do not have gendered pronouns, this can be set to PGMdoubleBattleDialogue. -export const PGFdoubleBattleDialogue: DialogueTranslationEntries = PGMdoubleBattleDialogue; +export const PGFdoubleBattleDialogue: DialogueTranslationEntries = { + "blue_red_double": { + "encounter": { + 1: `Blue: Ei Red, vamos mostrar do que somos feitos! + $Red: ... + $Blue: Este é o poder da Cidade de Pallet!`, + }, + "victory": { + 1: `Blue: Essa foi uma ótima batalha! + $Red: ...`, + }, + }, + "red_blue_double": { + "encounter": { + 1: `Red: ...! + $Blue: Ele nunca fala muito. + $Blue: Mas não se deixe enganar! Ele é um campeão, afinal!`, + }, + "victory": { + 1: `Red: ...! + $Blue: Da próxima vez, vamos vencer você!`, + }, + }, + "tate_liza_double": { + "encounter": { + 1: `Tate: Está surpreso? + $Liza: Somos dois líderes de ginásio ao mesmo tempo! + $Tate: Somos gêmeos! + $Liza: Não precisamos falar para nos entender! + $Tate: Duas vezes o poder... + $Liza: Você consegue lidar com isso?`, + }, + "victory": { + 1: `Tate: O quê? Nossa combinação foi perfeita! + $Liza: Parece que precisamos treinar mais...`, + }, + }, + "liza_tate_double": { + "encounter": { + 1: `Liza: Hihihi... Está surpreso? + $Tate: Sim, somos realmente dois líderes de ginásio ao mesmo tempo! + $Liza: Este é meu irmão gêmeo Tate! + $Tate: E esta é minha irmã gêmea Liza! + $Liza: Não acha que somos uma combinação perfeita?` + }, + "victory": { + 1: `Liza: Nós somos... + $Tate: ...não tão fortes quanto pensávamos?`, + }, + }, + "wallace_steven_double": { + "encounter": { + 1: `Steven: Wallace, vamos mostrar a eles o poder dos campeões! + $Wallace: Vamos mostrar o poder de Hoenn! + $Steven: Vamos lá!`, + }, + "victory": { + 1: `Steven: Essa foi uma ótima batalha! + $Wallace: Vamos vencer da próxima vez!`, + }, + }, + "steven_wallace_double": { + "encounter": { + 1: `Steven: Você tem algum Pokémon raro? + $Wallace: Steven... Estamos aqui para uma batalha, não para mostrar nossos Pokémon. + $Steven: Ah... Entendi... Vamos lá então!`, + }, + "victory": { + 1: `Steven: Agora que terminamos a batalha, vamos mostrar nossos Pokémon! + $Wallace: Steven...`, + }, + }, + "alder_iris_double": { + "encounter": { + 1: `Alder: Somos os treinadores mais fortes de Unova! + $Iris: Lutas contra treinadores fortes são as melhores!`, + }, + "victory": { + 1: `Alder: Uau! Você é super forte! + $Iris: Vamos vencer da próxima vez!`, + }, + }, + "iris_alder_double": { + "encounter": { + 1: `Iris: Bem-vinda, Desafiante! Eu sou A Campeã de Unova! + $Alder: Iris, você não está um pouco empolgada demais?`, + }, + "victory": { + 1: `Iris: Uma derrota como essa não é fácil de engolir... + $Alder: Mas só ficaremos mais fortes a cada derrota!`, + }, + }, + "piers_marnie_double": { + "encounter": { + 1: `Marnie: Irmão, vamos mostrar a eles o poder de Spikemuth! + $Piers: Nós trazemos a escuridão!`, + }, + "victory": { + 1: `Marnie: Você trouxe luz para nossa escuridão! + $Piers: Está muito claro...`, + }, + }, + "marnie_piers_double": { + "encounter": { + 1: `Piers: Prontos para um show? + $Marnie: Irmão... Eles estão aqui para lutar, não para cantar...`, + }, + "victory": { + 1: `Piers: Agora esse foi um ótimo show! + $Marnie: Irmão...`, + }, + }, +}; diff --git a/src/locales/pt_BR/egg.ts b/src/locales/pt_BR/egg.ts index 996ab85d8c5..6690c293aaf 100644 --- a/src/locales/pt_BR/egg.ts +++ b/src/locales/pt_BR/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "Ovo", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "Você não tem vouchers suficientes!", "tooManyEggs": "Você já tem muitos ovos!", "pull": "Prêmio", - "pulls": "Prêmios" + "pulls": "Prêmios", + "sameSpeciesEgg": "{{species}} vai rachar desse ovo!", + "hatchFromTheEgg": "{{pokemonName}} nasceu do ovo!", + "eggMoveUnlock": "Movimento de Ovo desbloqueado: {{moveName}}", + "rareEggMoveUnlock": "Movimento Raro de Ovo desbloqueado: {{moveName}}", } as const; diff --git a/src/locales/pt_BR/fight-ui-handler.ts b/src/locales/pt_BR/fight-ui-handler.ts index a8e5d3c3cda..6ce615ad5b1 100644 --- a/src/locales/pt_BR/fight-ui-handler.ts +++ b/src/locales/pt_BR/fight-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", diff --git a/src/locales/pt_BR/game-mode.ts b/src/locales/pt_BR/game-mode.ts index 5f0e930703b..44396635c6c 100644 --- a/src/locales/pt_BR/game-mode.ts +++ b/src/locales/pt_BR/game-mode.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { "classic": "Clássico", diff --git a/src/locales/pt_BR/game-stats-ui-handler.ts b/src/locales/pt_BR/game-stats-ui-handler.ts index 396b30b4c78..863f9e773f6 100644 --- a/src/locales/pt_BR/game-stats-ui-handler.ts +++ b/src/locales/pt_BR/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "Estatísticas", diff --git a/src/locales/pt_BR/growth.ts b/src/locales/pt_BR/growth.ts index 945520c91d7..7b268ae49ef 100644 --- a/src/locales/pt_BR/growth.ts +++ b/src/locales/pt_BR/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "Muito Rápido", diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index 8e6fc83eb36..75e5adcfd87 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "Configurações", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "Importar dados", "exportData": "Exportar dados", "cancel": "Cancelar", - "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?" + "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?", + "noEggs": "Você não está chocando\nnenhum ovo no momento!" } as const; diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index f4fc8cc3a72..a200f2c9abe 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "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.", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "Classificação Diária", "weeklyRankings": "Classificação Semanal", "noRankings": "Sem Classificação", + "positionIcon": "#", + "usernameScoreboard": "Usuário", + "score": "Pontuação", + "wave": "Onda", "loading": "Carregando…", "loadingAsset": "Carregando recurso: {{assetName}}", "playersOnline": "Jogadores Ativos", "yes": "Sim", "no": "Não", "disclaimer": "AVISO", - "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis perdas de dados salvos),\n sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído." + "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", + "choosePokemon": "Escolha um Pokémon.", + "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente.", } as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index b0df31d5f65..a6504b931f0 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -1,14 +1,14 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { "AddPokeballModifierType": { name: "{{modifierCount}}x {{pokeballName}}", - description: "Ganhe x{{modifierCount}} {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", + description: "Ganhe {{modifierCount}}x {{pokeballName}} (Mochila: {{pokeballAmount}}) \nChance de captura: {{catchRate}}.", }, "AddVoucherModifierType": { name: "{{modifierCount}}x {{voucherTypeName}}", - description: "Ganhe x{{modifierCount}} {{voucherTypeName}}.", + description: "Ganhe {{modifierCount}}x {{voucherTypeName}}.", }, "PokemonHeldItemModifierType": { extra: { @@ -182,6 +182,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Guizo" }, + "EVIOLITE": { name: "Eviolita", description: "Esse misterioso caroço evolutivo aumenta os atributos de Defesa e Def. Esp. quando segurado por um Pokémon que ainda pode evoluir." }, + "SOUL_DEW": { name: "Joia da Alma", description: "Aumenta a influência da natureza de um Pokémon em seus atributos em 10% (cumulativo)." }, "NUGGET": { name: "Pepita" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "Token de Persistência" }, "ENEMY_FUSED_CHANCE": { name: "Token de Fusão", description: "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão." }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "Bola de Luz", description: "Orbe intrigante que aumenta os atributos de Ataque e Ataque Esp. de Pikachu." }, + "THICK_CLUB": { name: "Osso Grosso", description: "Este duro osso de origem desconhecida aumenta o atributo de Ataque de Cubone ou Marowak." }, + "METAL_POWDER": { name: "Pó Metálico", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Defesa de Ditto." }, + "QUICK_POWDER": { name: "Pó Veloz", description: "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Velocidade de Ditto." } + }, TempBattleStatBoosterItem: { "x_attack": "Ataque X", "x_defense": "Defesa X", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "Precisão X", "dire_hit": "Direto", }, + + TempBattleStatBoosterStatName: { + "ATK": "Ataque", + "DEF": "Defesa", + "SPATK": "Ataque Esp.", + "SPDEF": "Defesa Esp.", + "SPD": "Velocidade", + "ACC": "Precisão", + "CRIT": "Chance de Acerto Crítico", + "EVA": "Evasão", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "Lenço de Seda", "black_belt": "Faixa Preta", @@ -389,7 +410,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "CHILL_DRIVE": "CrioDisco", "DOUSE_DRIVE": "HidroDisco", - "FIST_PLATE": "Placa de Punho", + "FIST_PLATE": "Placa do Punho", "SKY_PLATE": "Placa do Céu", "TOXIC_PLATE": "Placa Tóxica", "EARTH_PLATE": "Placa Terrestre", @@ -399,15 +420,15 @@ export const modifierType: ModifierTypeTranslationEntries = { "IRON_PLATE": "Placa de Ferro", "FLAME_PLATE": "Placa da Chama", "SPLASH_PLATE": "Placa de Respingo", - "MEADOW_PLATE": "Placa de Prado", + "MEADOW_PLATE": "Placa da Planície", "ZAP_PLATE": "Placa Elétrica", "MIND_PLATE": "Placa Mental", "ICICLE_PLATE": "Placa de Gelo", - "DRACO_PLATE": "Placa de Draco", - "DREAD_PLATE": "Placa do Pavor", - "PIXIE_PLATE": "Placa Duende", + "DRACO_PLATE": "Placa do Dragão", + "DREAD_PLATE": "Placa Sombria", + "PIXIE_PLATE": "Placa de Fada", "BLANK_PLATE": "Placa em Branco", - "LEGEND_PLATE": "Placa de Legenda", + "LEGEND_PLATE": "Placa Lendária", "FIGHTING_MEMORY": "Memória de Lutador", "FLYING_MEMORY": "Memória Voadora", "POISON_MEMORY": "Memória Venenosa", @@ -423,7 +444,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "PSYCHIC_MEMORY": "Memória Psíquica", "ICE_MEMORY": "Memória de Gelo", "DRAGON_MEMORY": "Memória do Dragão", - "DARK_MEMORY": "Memória Negra", + "DARK_MEMORY": "Memória Sombria", "FAIRY_MEMORY": "Memória de Fada", "BLANK_MEMORY": "Memória Vazia", }, diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 98d5c6a562e..0008cc55416 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { @@ -2095,7 +2095,7 @@ export const move: MoveTranslationEntries = { }, "frostBreath": { name: "Frost Breath", - effect: "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um golpe crítico." + effect: "O usuário sopra sua respiração gelada no alvo. Esse ataque sempre resulta em um acerto crítico." }, "dragonTail": { name: "Dragon Tail", @@ -2219,7 +2219,7 @@ export const move: MoveTranslationEntries = { }, "snarl": { name: "Snarl", - effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo a Defesa Especial do Pokémon oponente." + effect: "O usuário grita como se ele estivesse reclamando de algo, diminuindo o Ataque Especial do Pokémon oponente." }, "icicleCrash": { name: "Icicle Crash", @@ -2691,7 +2691,7 @@ export const move: MoveTranslationEntries = { }, "laserFocus": { name: "Laser Focus", - effect: "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um golpe crítico." + effect: "O usuário se concentra intensamente. O ataque no próximo turno sempre resultará em um acerto crítico." }, "gearUp": { name: "Gear Up", @@ -3267,11 +3267,11 @@ export const move: MoveTranslationEntries = { }, wickedBlow: { name: "Wicked Blow", - effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um golpe crítico." + effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um acerto crítico." }, surgingStrikes: { name: "Surging Strikes", - effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Este ataque sempre resulta em um golpe crítico." + effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Estes ataques sempre resultam em acertos críticos." }, thunderCage: { name: "Thunder Cage", @@ -3359,7 +3359,7 @@ export const move: MoveTranslationEntries = { }, esperWing: { name: "Esper Wing", - effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um golpe crítico." + effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um acerto crítico." }, bitterMalice: { name: "Bitter Malice", @@ -3371,7 +3371,7 @@ export const move: MoveTranslationEntries = { }, tripleArrows: { name: "Triple Arrows", - effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um golpe crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." + effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um acerto crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." }, infernalParade: { name: "Infernal Parade", @@ -3611,7 +3611,7 @@ export const move: MoveTranslationEntries = { }, "flowerTrick": { name: "Flower Trick", - effect: "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um golpe crítico." + effect: "O usuário lança um buquê de flores armado no alvo. Este ataque nunca erra e sempre resulta em um acerto crítico." }, "torchSong": { name: "Torch Song", @@ -3711,7 +3711,7 @@ export const move: MoveTranslationEntries = { }, "aquaCutter": { name: "Aqua Cutter", - effect: "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um golpe crítico." + effect: "O usuário expele água pressurizada para cortar o alvo como uma lâmina. Este movimento tem uma chance aumentada de resultar em um acerto crítico." }, "blazingTorque": { name: "Blazing Torque", @@ -3747,7 +3747,7 @@ export const move: MoveTranslationEntries = { }, "ivyCudgel": { name: "Ivy Cudgel", - effect: "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um golpe crítico." + effect: "O usuário golpeia com um porrete envolto em hera. O tipo deste movimento muda dependendo da máscara usada pelo usuário, e tem uma chance aumentada de resultar em um acerto crítico." }, "electroShot": { name: "Electro Shot", diff --git a/src/locales/pt_BR/nature.ts b/src/locales/pt_BR/nature.ts index 47f2f5f0930..976778bd1cb 100644 --- a/src/locales/pt_BR/nature.ts +++ b/src/locales/pt_BR/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "Destemida", diff --git a/src/locales/pt_BR/party-ui-handler.ts b/src/locales/pt_BR/party-ui-handler.ts index 763d733f3e8..683dc4b368a 100644 --- a/src/locales/pt_BR/party-ui-handler.ts +++ b/src/locales/pt_BR/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { "SEND_OUT": "Trocar", diff --git a/src/locales/pt_BR/pokeball.ts b/src/locales/pt_BR/pokeball.ts index d7c5656fe5c..ee29b9612e6 100644 --- a/src/locales/pt_BR/pokeball.ts +++ b/src/locales/pt_BR/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "Poké Bola", diff --git a/src/locales/pt_BR/pokemon-info-container.ts b/src/locales/pt_BR/pokemon-info-container.ts index 2ee774888da..31b93d90daf 100644 --- a/src/locales/pt_BR/pokemon-info-container.ts +++ b/src/locales/pt_BR/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "Movimentos", diff --git a/src/locales/pt_BR/pokemon-info.ts b/src/locales/pt_BR/pokemon-info.ts index 70b0664f30b..a4af3f3e34a 100644 --- a/src/locales/pt_BR/pokemon-info.ts +++ b/src/locales/pt_BR/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "Def. Esp.", "SPDEFshortened": "DefEsp", "SPD": "Veloc.", - "SPDshortened": "Veloc." + "SPDshortened": "Veloc.", + "ACC": "Precisão", + "EVA": "Evasão", }, Type: { diff --git a/src/locales/pt_BR/pokemon.ts b/src/locales/pt_BR/pokemon.ts index 663c0f2163d..b3151eabb29 100644 --- a/src/locales/pt_BR/pokemon.ts +++ b/src/locales/pt_BR/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "Bulbasaur", diff --git a/src/locales/pt_BR/save-slot-select-ui-handler.ts b/src/locales/pt_BR/save-slot-select-ui-handler.ts index 23aeed7c5c7..6dee8a1a16a 100644 --- a/src/locales/pt_BR/save-slot-select-ui-handler.ts +++ b/src/locales/pt_BR/save-slot-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Substituir os dados desse slot?", diff --git a/src/locales/pt_BR/settings.ts b/src/locales/pt_BR/settings.ts new file mode 100644 index 00000000000..9d336cf0757 --- /dev/null +++ b/src/locales/pt_BR/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "Menino", + "girl": "Menina", + "general": "Geral", + "display": "Exibição", + "audio": "Áudio", + "gamepad": "Controle", + "keyboard": "Teclado", + "gameSpeed": "Velocidade do Jogo", + "hpBarSpeed": "Velocidade da Barra de PS", + "expGainsSpeed": "Velocidade do Ganho de EXP", + "expPartyDisplay": "Exibição de EXP da Equipe", + "skipSeenDialogues": "Pular Diálogos Vistos", + "battleStyle": "Estilo de Batalha", + "enableRetries": "Habilitar Novas Tentativas", + "tutorials": "Tutorial", + "touchControls": "Controles de Toque", + "vibrations": "Vibração", + "normal": "Normal", + "fast": "Rápido", + "faster": "Mais Rápido", + "skip": "Pular", + "levelUpNotifications": "Notificação", + "on": "Ligado", + "off": "Desligado", + "switch": "Alternar", + "set": "Definido", + "auto": "Automático", + "disabled": "Desativado", + "language": "Idioma", + "change": "Mudar", + "uiTheme": "Tema da Interface", + "default": "Padrão", + "legacy": "Legado", + "windowType": "Estilo da Janela", + "moneyFormat": "Formatação do Dinheiro", + "damageNumbers": "Números de Dano", + "simple": "Simples", + "fancy": "Detalhado", + "abbreviated": "Abreviado", + "moveAnimations": "Animações de Movimento", + "showStatsOnLevelUp": "Mostrar Atributos ao Subir de Nível", + "candyUpgradeNotification": "Exibir Melhorias com Doce", + "passivesOnly": "Passivas", + "candyUpgradeDisplay": "Modo Melhorias com Doce", + "icon": "Ícone", + "animation": "Animação", + "moveInfo": "Informações de Movimento", + "showMovesetFlyout": "Mostrar Flutuante de Movimentos", + "showArenaFlyout": "Mostrar Flutuante de Bioma", + "showTimeOfDayWidget": "Widget da Hora do Dia", + "timeOfDayAnimation": "Animação da Hora do Dia", + "bounce": "Saltar", + "timeOfDay_back": "Voltar", + "spriteSet": "Conjunto de Sprites", + "consistent": "Consistente", + "mixedAnimated": "Animado", + "fusionPaletteSwaps": "Cores da Paleta de Fusão", + "playerGender": "Gênero do Jogador", + "typeHints": "Dicas de Tipo", + "masterVolume": "Volume Mestre", + "bgmVolume": "Volume de BGM", + "seVolume": "Volume de SE", + "musicPreference": "Preferência de Música", + "mixed": "Misto", + "gamepadPleasePlug": "Conecte um controle ou pressione um botão", + "delete": "Deletar", + "keyboardPleasePress": "Pressione uma tecla", + "reset": "Redefinir", + "requireReload": "Requer Reinício", + "action": "Ação", + "back": "Voltar", + "pressToBind": "Pressione para Atribuir", + "pressButton": "Pressione um Botão...", + "buttonUp": "Cima", + "buttonDown": "Baixo", + "buttonLeft": "Esquerda", + "buttonRight": "Direita", + "buttonAction": "Ação", + "buttonMenu": "Menu", + "buttonSubmit": "Confirmar", + "buttonCancel": "Cancelar", + "buttonStats": "Atributos", + "buttonCycleForm": "Próxima Forma", + "buttonCycleShiny": "Próximo Shiny", + "buttonCycleGender": "Próximo Gênero", + "buttonCycleAbility": "Próxima Habilidade", + "buttonCycleNature": "Próxima Natureza", + "buttonCycleVariant": "Próxima Variante", + "buttonSpeedUp": "Acelerar", + "buttonSlowDown": "Desacelerar", + "alt": " (Alt)", + "mute": "Mudo", + "controller": "Controle", + "gamepadSupport": "Suporte para Controle", + "showBgmBar": "Show Music Names", +} as const; diff --git a/src/locales/pt_BR/splash-messages.ts b/src/locales/pt_BR/splash-messages.ts index 498b64d1e01..d21945943a0 100644 --- a/src/locales/pt_BR/splash-messages.ts +++ b/src/locales/pt_BR/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "Batalhas Ganhas!", diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index fc98e72c614..eb2709a0da8 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "Passiva:", "nature": "Natureza:", "eggMoves": "Mov. de Ovo", - "start": "Iniciar", "addToParty": "Adicionar à equipe", "toggleIVs": "Mostrar IVs", "manageMoves": "Mudar Movimentos", + "manageNature": "Mudar Natureza", "useCandies": "Usar Doces", + "selectNature": "Escolha uma natureza.", "selectMoveSwapOut": "Escolha um movimento para substituir.", "selectMoveSwapWith": "Escolha o movimento que substituirá", "unlockPassive": "Aprender Passiva", "reduceCost": "Reduzir Custo", + "sameSpeciesEgg": "Comprar Ovo", "cycleShiny": ": » Shiny", "cycleForm": ": » Forma", "cycleGender": ": » Gênero", diff --git a/src/locales/pt_BR/status-effect.ts b/src/locales/pt_BR/status-effect.ts new file mode 100644 index 00000000000..d99e2bd5ec1 --- /dev/null +++ b/src/locales/pt_BR/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "Nenhum", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Envenenamento", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi envenenado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi envenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + toxic: { + name: "Toxic", + description: "envenenamento", + obtain: "{{pokemonNameWithAffix}}\nfoi seriamente envenenado!", + obtainSource: "{{pokemonNameWithAffix}} foi seriamente\nenvenenado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\ncom o veneno!", + overlap: "{{pokemonNameWithAffix}} já\nestá envenenado!", + heal: "{{pokemonNameWithAffix}} se\ncurou do envenenamento!" + }, + paralysis: { + name: "Paralisia", + description: "paralisia", + obtain: "{{pokemonNameWithAffix}} foi paralisado,\nTalvez ele não consiga se mover!", + obtainSource: "{{pokemonNameWithAffix}} foi paralisado por {{sourceText}},\nTalvez ele não consiga se mover!", + activation: "{{pokemonNameWithAffix}} está paralisado!\nEle não consegue se mover!", + overlap: "{{pokemonNameWithAffix}} já\nestá paralisado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado da paralisia!" + }, + sleep: { + name: "Dormindo", + description: "dormindo", + obtain: "{{pokemonNameWithAffix}}\nadormeceu!", + obtainSource: "{{pokemonNameWithAffix}}\ndormiu devido a {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está dormindo profundamente.", + overlap: "{{pokemonNameWithAffix}} já\nestá dormindo!", + heal: "{{pokemonNameWithAffix}} acordou!" + }, + freeze: { + name: "Congelamento", + description: "congelando", + obtain: "{{pokemonNameWithAffix}}\nfoi congelado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi congelado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} está\ncongelado!", + overlap: "{{pokemonNameWithAffix}} já\nestá congelado!", + heal: "{{pokemonNameWithAffix}} foi\ndescongelado!" + }, + burn: { + name: "Queimadura", + description: "queimadura", + obtain: "{{pokemonNameWithAffix}}\nfoi queimado!", + obtainSource: "{{pokemonNameWithAffix}}\nfoi queimado por {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} foi ferido\npor sua queimadura!", + overlap: "{{pokemonNameWithAffix}} já\nestá queimado!", + heal: "{{pokemonNameWithAffix}} foi\ncurado de sua queimadura!" + }, +} as const; diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index 9ada154e3a5..57fbe220412 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { diff --git a/src/locales/pt_BR/tutorial.ts b/src/locales/pt_BR/tutorial.ts index bc0c5610e60..a64a7458881 100644 --- a/src/locales/pt_BR/tutorial.ts +++ b/src/locales/pt_BR/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; 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. diff --git a/src/locales/pt_BR/voucher.ts b/src/locales/pt_BR/voucher.ts index 6ffffd48735..8c115caa810 100644 --- a/src/locales/pt_BR/voucher.ts +++ b/src/locales/pt_BR/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "Vouchers", diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index 07854512fdc..6aaab6d3cd9 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index 07fedd8ac3e..a9d7fa5b202 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -1,8 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "windPowerCharged": "受 {{moveName}} 的影响, {{pokemonName}} 提升了能力!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "blockRecoilDamage" : "{{pokemonName}}的{{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}}被折磨着!", + "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", + "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", + "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", + "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", + "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", } as const; diff --git a/src/locales/zh_CN/ability.ts b/src/locales/zh_CN/ability.ts index 77034d61743..82bc403ad84 100644 --- a/src/locales/zh_CN/ability.ts +++ b/src/locales/zh_CN/ability.ts @@ -1,13 +1,13 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { name: "恶臭", - description: "通过释放臭臭的气味,在攻\n击的时候,有时会使对手畏\n缩。", + description: "通过释放臭臭的气味,在攻击的时\n候,有时会使对手畏缩。", }, drizzle: { name: "降雨", - description: "出场时,会将天气变为下雨\n。", + description: "出场时,会将天气变为下雨。", }, speedBoost: { name: "加速", @@ -15,39 +15,39 @@ export const ability: AbilityTranslationEntries = { }, battleArmor: { name: "战斗盔甲", - description: "被坚硬的甲壳守护着,不会\n被对手的攻击击中要害。", + description: "被坚硬的甲壳守护着,不会被对手\n的攻击击中要害。", }, sturdy: { name: "结实", - description: "在HP全满时,即使受到招\n式攻击,也不会被一击打倒\n。一击必杀的招式也没有效\n果。", + description: "在HP全满时,即使受到招式攻击\n,也不会被一击打倒。一击必杀的\n招式也没有效果。", }, damp: { name: "湿气", - description: "通过把周围都弄湿,使谁都\n无法使用自爆等爆炸类的招\n式。", + description: "通过把周围都弄湿,使谁都无法使\n用自爆等爆炸类的招式。", }, limber: { name: "柔软", - description: "因为身体柔软,不会变为麻\n痹状态。", + description: "因为身体柔软,不会变为麻痹状态\n。", }, sandVeil: { name: "沙隐", - description: "在沙暴的时候,闪避率会提\n高。", + description: "在沙暴的时候,闪避率会提高。", }, static: { name: "静电", - description: "身上带有静电,有时会让接\n触到的对手麻痹。", + description: "身上带有静电,有时会让接触到的\n对手麻痹。", }, voltAbsorb: { name: "蓄电", - description: "受到电属性的招式攻击时,\n不会受到伤害,而是会回复。", + description: "受到电属性的招式攻击时,不会受\n到伤害,而是会回复。", }, waterAbsorb: { name: "储水", - description: "受到水属性的招式攻击时,\n不会受到伤害,而是会回复。", + description: "受到水属性的招式攻击时,不会受\n到伤害,而是会回复。", }, oblivious: { name: "迟钝", - description: "因为感觉迟钝,不会变为着\n迷和被挑衅状态。对威吓也\n毫不动摇。", + description: "因为感觉迟钝,不会变为着迷和被\n挑衅状态。对威吓也毫不动摇。", }, cloudNine: { name: "无关天气", @@ -55,79 +55,79 @@ export const ability: AbilityTranslationEntries = { }, compoundEyes: { name: "复眼", - description: "因为拥有复眼,招式的命中\n率会提高。", + description: "因为拥有复眼,招式的命中率会提\n高。", }, insomnia: { name: "不眠", - description: "因为有着睡不着的体质,所\n以不会陷入睡眠状态。", + description: "因为有着睡不着的体质,所以不会\n陷入睡眠状态。", }, colorChange: { name: "变色", - description: "自己的属性会变为从对手处\n所受招式的属性。", + description: "自己的属性会变为从对手处所受招\n式的属性。", }, immunity: { name: "免疫", - description: "因为体内拥有免疫能力,不\n会变为中毒状态。", + description: "因为体内拥有免疫能力,不会变为\n中毒状态。", }, flashFire: { name: "引火", - description: "受到火属性的招式攻击时,\n吸收火焰,自己使出的火属\n性招式会变强。", + description: "受到火属性的招式攻击时,吸收火\n焰,自己使出的火属性招式会变强\n。", }, shieldDust: { name: "鳞粉", - description: "被鳞粉守护着,不会受到招\n式的追加效果影响。", + description: "被鳞粉守护着,不会受到招式的追\n加效果影响。", }, ownTempo: { name: "我行我素", - description: "因为我行我素,不会变为混\n乱状态。对威吓也毫不动摇。", + description: "因为我行我素,不会变为混乱状态\n。对威吓也毫不动摇。", }, suctionCups: { name: "吸盘", - description: "用吸盘牢牢贴在地面上,让\n替换宝可梦的招式和道具无\n效。", + description: "用吸盘牢牢贴在地面上,让替换宝\n可梦的招式和道具无效。", }, intimidate: { name: "威吓", - description: "出场时威吓对手,让其退缩\n,降低对手的攻击。", + description: "出场时威吓对手,让其退缩,降低\n对手的攻击。", }, shadowTag: { name: "踩影", - description: "踩住对手的影子使其无法逃\n走或替换。", + description: "踩住对手的影子使其无法逃走或替\n换。", }, roughSkin: { name: "粗糙皮肤", - description: "受到攻击时,用粗糙的皮肤\n弄伤接触到自己的对手。", + description: "受到攻击时,用粗糙的皮肤弄伤接\n触到自己的对手。", }, wonderGuard: { name: "神奇守护", - description: "不可思议的力量,只有效果\n绝佳的招式才能击中。", + description: "不可思议的力量,只有效果绝佳的\n招式才能击中。", }, levitate: { name: "飘浮", - description: "从地面浮起,从而不会受到\n地面属性招式的攻击。", + description: "从地面浮起,从而不会受到地面属\n性招式的攻击。", }, effectSpore: { name: "孢子", - description: "受到攻击时,有时会把接触\n到自己的对手变为中毒、麻\n痹或睡眠状态。", + description: "受到攻击时,有时会把接触到自己\n的对手变为中毒、麻痹或睡眠状态\n。", }, synchronize: { name: "同步", - description: "将自己的中毒、麻痹或灼伤\n状态传染给对手。", + description: "将自己的中毒、麻痹或灼伤状态传\n染给对手。", }, clearBody: { name: "恒净之躯", - description: "不会因为对手的招式或特性\n而被降低能力。", + description: "不会因为对手的招式或特性而被降\n低能力。", }, naturalCure: { name: "自然回复", - description: "回到同行队伍后,异常状态\n就会被治愈。", + description: "回到同行队伍后,异常状态就会被\n治愈。", }, lightningRod: { name: "避雷针", - description: "将电属性的招式吸引到自己\n身上,不会受到伤害,而是\n会提高特攻。", + description: "将电属性的招式吸引到自己身上,\n不会受到伤害,而是会提高特攻。", }, sereneGrace: { name: "天恩", - description: "托天恩的福,招式的追加效\n果容易出现。", + description: "托天恩的福,招式的追加效果容易\n出现。", }, swiftSwim: { name: "悠游自如", @@ -139,43 +139,43 @@ export const ability: AbilityTranslationEntries = { }, illuminate: { name: "发光", - description: "通过让周围变亮来保持命中\n率不会被降低。", + description: "通过让周围变亮来保持命中率不会\n被降低。", }, trace: { name: "复制", - description: "出场时,复制对手的特性,\n变为与之相同的特性。", + description: "出场时,复制对手的特性,变为与\n之相同的特性。", }, hugePower: { name: "大力士", - description: "物理攻击的威力会变为2倍\n。", + description: "物理攻击的威力会变为2倍。", }, poisonPoint: { name: "毒刺", - description: "有时会让接触到自己的对手\n变为中毒状态。", + description: "有时会让接触到自己的对手变为中\n毒状态。", }, innerFocus: { name: "精神力", - description: "拥有经过锻炼的精神,而不\n会因对手的攻击而畏缩。对\n威吓也毫不动摇。", + description: "拥有经过锻炼的精神,而不会因对\n手的攻击而畏缩。对威吓也毫不动\n摇。", }, magmaArmor: { name: "熔岩铠甲", - description: "将炽热的熔岩覆盖在身上,\n不会变为冰冻状态。", + description: "将炽热的熔岩覆盖在身上,不会变\n为冰冻状态。", }, waterVeil: { name: "水幕", - description: "将水幕裹在身上,不会变为\n灼伤状态。", + description: "将水幕裹在身上,不会变为灼伤状\n态。", }, magnetPull: { name: "磁力", - description: "用磁力吸住钢属性的宝可梦\n,使其无法逃走。", + description: "用磁力吸住钢属性的宝可梦,使其\n无法逃走。", }, soundproof: { name: "隔音", - description: "通过屏蔽声音,不受到声音\n招式的影响。", + description: "通过屏蔽声音,不受到声音招式的\n影响。", }, rainDish: { name: "雨盘", - description: "下雨天气时,会缓缓回复\nHP。", + description: "下雨天气时,会缓缓回复HP。", }, sandStream: { name: "扬沙", @@ -183,99 +183,99 @@ export const ability: AbilityTranslationEntries = { }, pressure: { name: "压迫感", - description: "给予对手压迫感,大量减少\n其使用招式的PP。", + description: "给予对手压迫感,大量减少其使用\n招式的PP。", }, thickFat: { name: "厚脂肪", - description: "因为被厚厚的脂肪保护着,\n会让火属性和冰属性的招式\n伤害减半。", + description: "因为被厚厚的脂肪保护着,会让火\n属性和冰属性的招式伤害减半。", }, earlyBird: { name: "早起", - description: "即使变为睡眠状态,也能以\n2倍的速度提早醒来。", + description: "即使变为睡眠状态,也能以2倍的\n速度提早醒来。", }, flameBody: { name: "火焰之躯", - description: "有时会让接触到自己的对手\n变为灼伤状态。", + description: "有时会让接触到自己的对手变为灼\n伤状态。", }, runAway: { name: "逃跑", - description: "一定能从野生宝可梦那儿逃\n走。", + description: "一定能从野生宝可梦那儿逃走。", }, keenEye: { name: "锐利目光", - description: "多亏了锐利的目光,命中率\n不会被降低。", + description: "多亏了锐利的目光,命中率不会被\n降低。", }, hyperCutter: { name: "怪力钳", - description: "因为拥有以力量自豪的钳子,\n不会被对手降低攻击。", + description: "因为拥有以力量自豪的钳子,不会\n被对手降低攻击。", }, pickup: { name: "捡拾", - description: "有时会捡来对手用过的道具,\n冒险过程中也会捡到。", + description: "有时会捡来对手用过的道具,冒险\n过程中也会捡到。", }, truant: { name: "懒惰", - description: "如果使出招式,下一回合就\n会休息。", + description: "如果使出招式,下一回合就会休息\n。", }, hustle: { name: "活力", - description: "自己的攻击变高,但命中率\n会降低。", + description: "自己的攻击变高,但命中率会降低\n。", }, cuteCharm: { name: "迷人之躯", - description: "有时会让接触到自己的对手\n着迷。", + description: "有时会让接触到自己的对手着迷。", }, plus: { name: "正电", - description: "出场的伙伴之间如果有正电\n或负电特性的宝可梦,自己\n的特攻会提高。", + description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", }, minus: { name: "负电", - description: "出场的伙伴之间如果有正电\n或负电特性的宝可梦,自己\n的特攻会提高。", + description: "出场的伙伴之间如果有正电或负电\n特性的宝可梦,自己的特攻会提高\n。", }, forecast: { name: "阴晴不定", - description: "受天气的影响,会变为水属\n性、火属性或冰属性中的某\n一个。", + description: "受天气的影响,会变为水属性、火\n属性或冰属性中的某一个。", }, stickyHold: { name: "黏着", - description: "因为道具是粘在黏性身体上\n的,所以不会被对手夺走。", + description: "因为道具是粘在黏性身体上的,所\n以不会被对手夺走。", }, shedSkin: { name: "蜕皮", - description: "通过蜕去身上的皮,有时会\n治愈异常状态。", + description: "通过蜕去身上的皮,有时会治愈异\n常状态。", }, guts: { name: "毅力", - description: "如果变为异常状态,会拿出\n毅力,攻击会提高。", + description: "如果变为异常状态,会拿出毅力,\n攻击会提高。", }, marvelScale: { name: "神奇鳞片", - description: "如果变为异常状态,神奇鳞\n片会发生反应,防御会提高。", + description: "如果变为异常状态,神奇鳞片会发\n生反应,防御会提高。", }, liquidOoze: { name: "污泥浆", - description: "吸收了污泥浆的对手会因强\n烈的恶臭而受到伤害,减少\nHP。", + description: "吸收了污泥浆的对手会因强烈的恶\n臭而受到伤害,减少HP。", }, overgrow: { name: "茂盛", - description: "HP减少的时候,草属性的\n招式威力会提高。", + description: "HP减少的时候,草属性的招式威\n力会提高。", }, blaze: { name: "猛火", - description: "HP减少的时候,火属性的\n招式威力会提高。", + description: "HP减少的时候,火属性的招式威\n力会提高。", }, torrent: { name: "激流", - description: "HP减少的时候,水属性的\n招式威力会提高。", + description: "HP减少的时候,水属性的招式威\n力会提高。", }, swarm: { name: "虫之预感", - description: "HP减少的时候,虫属性的\n招式威力会提高。", + description: "HP减少的时候,虫属性的招式威\n力会提高。", }, rockHead: { name: "坚硬脑袋", - description: "即使使出会受反作用力伤害\n的招式,HP也不会减少。", + description: "即使使出会受反作用力伤害的招式\n,HP也不会减少。", }, drought: { name: "日照", @@ -287,19 +287,19 @@ export const ability: AbilityTranslationEntries = { }, vitalSpirit: { name: "干劲", - description: "通过激发出干劲,不会变为\n睡眠状态。", + description: "通过激发出干劲,不会变为睡眠状\n态。", }, whiteSmoke: { name: "白色烟雾", - description: "被白色烟雾保护着,不会被\n对手降低能力。", + description: "被白色烟雾保护着,不会被对手降\n低能力。", }, purePower: { name: "瑜伽之力", - description: "因瑜伽的力量,物理攻击的\n威力会变为2倍。", + description: "因瑜伽的力量,物理攻击的威力会\n变为2倍。", }, shellArmor: { name: "硬壳盔甲", - description: "被坚硬的壳保护着,对手的\n攻击不会击中要害。", + description: "被坚硬的壳保护着,对手的攻击不\n会击中要害。", }, airLock: { name: "气闸", @@ -307,19 +307,19 @@ export const ability: AbilityTranslationEntries = { }, tangledFeet: { name: "蹒跚", - description: "在混乱状态时,闪避率会提\n高。", + description: "在混乱状态时,闪避率会提高。", }, motorDrive: { name: "电气引擎", - description: "受到电属性的招式攻击时,\n不会受到伤害,而是速度会\n提高。", + description: "受到电属性的招式攻击时,不会受\n到伤害,而是速度会提高。", }, rivalry: { name: "斗争心", - description: "面对性别相同的对手,会燃\n起斗争心,变得更强。而面\n对性别不同的,则会变弱。", + description: "面对性别相同的对手,会燃起斗争\n心,变得更强。而面对性别不同的\n,则会变弱。", }, steadfast: { name: "不屈之心", - description: "每次畏缩时,不屈之心就会\n燃起,速度也会提高。", + description: "每次畏缩时,不屈之心就会燃起,\n速度也会提高。", }, snowCloak: { name: "雪隐", @@ -327,19 +327,19 @@ export const ability: AbilityTranslationEntries = { }, gluttony: { name: "贪吃鬼", - description: "原本HP变得很少时才会吃\n树果,在HP还有一半时就\n会把它吃掉。", + description: "原本HP变得很少时才会吃树果,\n在HP还有一半时就会把它吃掉。", }, angerPoint: { name: "愤怒穴位", - description: "要害被击中时,会大发雷霆\n,攻击力变为最大。", + description: "要害被击中时,会大发雷霆,攻击\n力变为最大。", }, unburden: { name: "轻装", - description: "失去所持有的道具时,速度\n会提高。", + description: "失去所持有的道具时,速度会提高\n。", }, heatproof: { name: "耐热", - description: "耐热的体质会让火属性的招\n式伤害减半。", + description: "耐热的体质会让火属性的招式伤害\n减半。", }, simple: { name: "单纯", @@ -347,11 +347,11 @@ export const ability: AbilityTranslationEntries = { }, drySkin: { name: "干燥皮肤", - description: "下雨天气时和受到水属性的\n招式时,HP会回复。晴朗\n天气时和受到火属性的招式\n时,HP会减少。", + description: "下雨天气时和受到水属性的招式时\n,HP会回复。晴朗天气时和受到\n火属性的招式时,HP会减少。", }, download: { name: "下载", - description: "比较对手的防御和特防,根\n据较低的那项能力相应地提\n高自己的攻击或特攻。", + description: "比较对手的防御和特防,根据较低\n的那项能力相应地提高自己的攻击\n或特攻。", }, ironFist: { name: "铁拳", @@ -359,35 +359,35 @@ export const ability: AbilityTranslationEntries = { }, poisonHeal: { name: "毒疗", - description: "变为中毒状态时,HP不会\n减少,反而会增加起来。", + description: "变为中毒状态时,HP不会减少,\n反而会增加起来。", }, adaptability: { name: "适应力", - description: "与自身同属性的招式威力会\n提高。", + description: "与自身同属性的招式威力会提高。", }, skillLink: { name: "连续攻击", - description: "如果使用连续招式,总是能\n使出最高次数。", + description: "如果使用连续招式,总是能使出最\n高次数。", }, hydration: { name: "湿润之躯", - description: "下雨天气时,异常状态会治\n愈。", + description: "下雨天气时,异常状态会治愈。", }, solarPower: { name: "太阳之力", - description: "晴朗天气时,特攻会提高,\n而每回合HP会减少。", + description: "晴朗天气时,特攻会提高,而每回\n合HP会减少。", }, quickFeet: { name: "飞毛腿", - description: "变为异常状态时,速度会提\n高。", + description: "变为异常状态时,速度会提高。", }, normalize: { name: "一般皮肤", - description: "无论是什么属性的招式,全\n部会变为一般属性。威力会\n少量提高。", + description: "无论是什么属性的招式,全部会变\n为一般属性。威力会少量提高。", }, sniper: { name: "狙击手", - description: "击中要害时,威力会变得更\n强。", + description: "击中要害时,威力会变得更强。", }, magicGuard: { name: "魔法防守", @@ -395,19 +395,19 @@ export const ability: AbilityTranslationEntries = { }, noGuard: { name: "无防守", - description: "由于无防守战术,双方使出\n的招式都必定会击中。", + description: "由于无防守战术,双方使出的招式\n都必定会击中。", }, stall: { name: "慢出", - description: "使出招式的顺序必定会变为\n最后。", + description: "使出招式的顺序必定会变为最后。", }, technician: { name: "技术高手", - description: "攻击时可以将低威力招式的\n威力提高。", + description: "攻击时可以将低威力招式的威力提\n高。", }, leafGuard: { name: "叶子防守", - description: "晴朗天气时,不会变为异常\n状态。", + description: "晴朗天气时,不会变为异常状态。", }, klutz: { name: "笨拙", @@ -415,55 +415,55 @@ export const ability: AbilityTranslationEntries = { }, moldBreaker: { name: "破格", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, superLuck: { name: "超幸运", - description: "因为拥有超幸运,攻击容易\n击中对手的要害。", + description: "因为拥有超幸运,攻击容易击中对\n手的要害。", }, aftermath: { name: "引爆", - description: "变为濒死时,会对接触到自\n己的对手造成伤害。", + description: "变为濒死时,会对接触到自己的对\n手造成伤害。", }, anticipation: { name: "危险预知", - description: "可以察觉到对手拥有的危险\n招式。", + description: "可以察觉到对手拥有的危险招式。", }, forewarn: { name: "预知梦", - description: "出场时,只读取1个对手拥\n有的招式。", + description: "出场时,只读取1个对手拥有的招\n式。", }, unaware: { name: "纯朴", - description: "可以无视对手能力的变化,\n进行攻击。", + description: "可以无视对手能力的变化,进行攻\n击。", }, tintedLens: { name: "有色眼镜", - description: "可以将效果不好的招式以通\n常的威力使出。", + description: "可以将效果不好的招式以通常的威\n力使出。", }, filter: { name: "过滤", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, slowStart: { name: "慢启动", - description: "在5回合内,攻击和速度减\n半。", + description: "在5回合内,攻击和速度减半。", }, scrappy: { name: "胆量", - description: "一般属性和格斗属性的招式\n可以击中幽灵属性的宝可梦\n。对威吓也毫不动摇。", + description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。对威吓也毫\n不动摇。", }, stormDrain: { name: "引水", - description: "将水属性的招式引到自己身\n上,不会受到伤害,而是会\n提高特攻。", + description: "将水属性的招式引到自己身上,不\n会受到伤害,而是会提高特攻。", }, iceBody: { name: "冰冻之躯", - description: "下雪天气时,会缓缓回复\nHP。", + description: "下雪天气时,会缓缓回复HP。", }, solidRock: { name: "坚硬岩石", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, snowWarning: { name: "降雪", @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "采蜜", - description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", + description: "The Pokémon gat\nhers Honey afte\nr a battle. The\n Honey is then \nsold for money.", }, frisk: { name: "察觉", @@ -479,15 +479,15 @@ export const ability: AbilityTranslationEntries = { }, reckless: { name: "舍身", - description: "自己会因反作用力受伤的招\n式,其威力会提高。", + description: "自己会因反作用力受伤的招式,其\n威力会提高。", }, multitype: { name: "多属性", - description: "自己的属性会根据持有的石\n板而改变。", + description: "自己的属性会根据持有的石板而改\n变。", }, flowerGift: { name: "花之礼", - description: "晴朗天气时,自己与同伴的\n攻击和特防能力会提高。", + description: "晴朗天气时,自己与同伴的攻击和\n特防能力会提高。", }, badDreams: { name: "梦魇", @@ -495,31 +495,31 @@ export const ability: AbilityTranslationEntries = { }, pickpocket: { name: "顺手牵羊", - description: "盗取接触到自己的对手的道\n具。", + description: "盗取接触到自己的对手的道具。", }, sheerForce: { name: "强行", - description: "招式的追加效果消失,但因\n此能以更高的威力使出招式\n。", + description: "招式的追加效果消失,但因此能以\n更高的威力使出招式。", }, contrary: { name: "唱反调", - description: "能力的变化发生逆转,原本\n提高时会降低,而原本降低\n时会提高。", + description: "能力的变化发生逆转,原本提高时\n会降低,而原本降低时会提高。", }, unnerve: { name: "紧张感", - description: "让对手紧张,使其无法食用\n树果。", + description: "让对手紧张,使其无法食用树果。", }, defiant: { name: "不服输", - description: "被对手降低能力时,攻击会\n大幅提高。", + description: "被对手降低能力时,攻击会大幅提\n高。", }, defeatist: { name: "软弱", - description: "HP减半时,会变得软弱,\n攻击和特攻会减半。", + description: "HP减半时,会变得软弱,攻击和\n特攻会减半。", }, cursedBody: { name: "诅咒之躯", - description: "受到攻击时,有时会把对手\n的招式变为定身法状态。", + description: "受到攻击时,有时会把对手的招式\n变为定身法状态。", }, healer: { name: "治愈之心", @@ -531,7 +531,7 @@ export const ability: AbilityTranslationEntries = { }, weakArmor: { name: "碎裂铠甲", - description: "受到物理招式的伤害时,防\n御会降低,速度会大幅提高。", + description: "受到物理招式的伤害时,防御会降\n低,速度会大幅提高。", }, heavyMetal: { name: "重金属", @@ -543,39 +543,39 @@ export const ability: AbilityTranslationEntries = { }, multiscale: { name: "多重鳞片", - description: "HP全满时,受到的伤害会\n变少。", + description: "HP全满时,受到的伤害会变少。", }, toxicBoost: { name: "中毒激升", - description: "变为中毒状态时,物理招式\n的威力会提高。", + description: "变为中毒状态时,物理招式的威力\n会提高。", }, flareBoost: { name: "受热激升", - description: "变为灼伤状态时,特殊招式\n的威力会提高。", + description: "变为灼伤状态时,特殊招式的威力\n会提高。", }, harvest: { name: "收获", - description: "可以多次制作出已被使用掉\n的树果。", + description: "可以多次制作出已被使用掉的树果\n。", }, telepathy: { name: "心灵感应", - description: "读取我方的攻击,并闪避其\n招式伤害。", + description: "读取我方的攻击,并闪避其招式伤\n害。", }, moody: { name: "心情不定", - description: "每一回合,能力中的某项会\n大幅提高,而某项会降低。", + description: "每一回合,能力中的某项会大幅提\n高,而某项会降低。", }, overcoat: { name: "防尘", - description: "不会受到沙暴的伤害。也不\n会受到粉末类和孢子类招式\n的影响。", + description: "不会受到沙暴的伤害。也不会受到\n粉末类和孢子类招式的影响。", }, poisonTouch: { name: "毒手", - description: "只通过接触就有可能让对手\n变为中毒状态。", + description: "只通过接触就有可能让对手变为中\n毒状态。", }, regenerator: { name: "再生力", - description: "退回同行队伍后,HP会少\n量回复。", + description: "退回同行队伍后,HP会少量回复\n。", }, bigPecks: { name: "健壮胸肌", @@ -587,15 +587,15 @@ export const ability: AbilityTranslationEntries = { }, wonderSkin: { name: "奇迹皮肤", - description: "成为不易受到变化招式攻击\n的身体。", + description: "成为不易受到变化招式攻击的身体\n。", }, analytic: { name: "分析", - description: "如果在最后使出招式,招式\n的威力会提高。", + description: "如果在最后使出招式,招式的威力\n会提高。", }, illusion: { name: "幻觉", - description: "假扮成同行队伍中的最后一\n只宝可梦出场,迷惑对手。", + description: "假扮成同行队伍中的最后一只宝可\n梦出场,迷惑对手。", }, imposter: { name: "变身者", @@ -603,31 +603,31 @@ export const ability: AbilityTranslationEntries = { }, infiltrator: { name: "穿透", - description: "可以穿透对手的壁障或替身\n进行攻击。", + description: "可以穿透对手的壁障或替身进行攻\n击。", }, mummy: { name: "木乃伊", - description: "被对手接触到后,会将对手\n变为木乃伊。", + description: "被对手接触到后,会将对手变为木\n乃伊。", }, moxie: { name: "自信过度", - description: "如果打倒对手,就会充满自\n信,攻击会提高。", + description: "如果打倒对手,就会充满自信,攻\n击会提高。", }, justified: { name: "正义之心", - description: "受到恶属性的招式攻击时,\n因为正义感,攻击会提高。", + description: "受到恶属性的招式攻击时,因为正\n义感,攻击会提高。", }, rattled: { name: "胆怯", - description: "受到恶属性、幽灵属性和虫\n属性的攻击或威吓时,会因\n胆怯而速度提高。", + description: "受到恶属性、幽灵属性和虫属性的\n攻击或威吓时,会因胆怯而速度提\n高。", }, magicBounce: { name: "魔法镜", - description: "可以不受到由对手使出的变\n化招式影响,并将其反弹。", + description: "可以不受到由对手使出的变化招式\n影响,并将其反弹。", }, sapSipper: { name: "食草", - description: "受到草属性的招式攻击时,\n不会受到伤害,而是攻击会\n提高。", + description: "受到草属性的招式攻击时,不会受\n到伤害,而是攻击会提高。", }, prankster: { name: "恶作剧之心", @@ -635,15 +635,15 @@ export const ability: AbilityTranslationEntries = { }, sandForce: { name: "沙之力", - description: "沙暴天气时,岩石属性、地\n面属性和钢属性的招式威力\n会提高。", + description: "沙暴天气时,岩石属性、地面属性\n和钢属性的招式威力会提高。", }, ironBarbs: { name: "铁刺", - description: "用铁刺给予接触到自己的对\n手伤害。", + description: "用铁刺给予接触到自己的对手伤害\n。", }, zenMode: { name: "达摩模式", - description: "HP变为一半以下时,样子\n会改变。", + description: "HP变为一半以下时,样子会改变\n。", }, victoryStar: { name: "胜利之星", @@ -651,67 +651,67 @@ export const ability: AbilityTranslationEntries = { }, turboblaze: { name: "涡轮火焰", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, teravolt: { name: "兆级电压", - description: "可以不受对手特性的干扰,\n向对手使出招式。", + description: "可以不受对手特性的干扰,向对手\n使出招式。", }, aromaVeil: { name: "芳香幕", - description: "可以防住向自己和同伴发出\n的心灵攻击。", + description: "可以防住向自己和同伴发出的心灵\n攻击。", }, flowerVeil: { name: "花幕", - description: "我方的草属性宝可梦能力不\n会降低,也不会变为异常状\n态。", + description: "我方的草属性宝可梦能力不会降低\n,也不会变为异常状态。", }, cheekPouch: { name: "颊囊", - description: "无论是哪种树果,食用后,\nHP都会回复。", + description: "无论是哪种树果,食用后,HP都\n会回复。", }, protean: { name: "变幻自如", - description: "变为与自己使出的招式相同\n的属性。每次出场战斗仅生\n效一次。", + description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", }, furCoat: { name: "毛皮大衣", - description: "对手给予的物理招式的伤害\n会减半。", + description: "对手给予的物理招式的伤害会减半\n。", }, magician: { name: "魔术师", - description: "夺走被自己的招式击中的对\n手的道具。", + description: "夺走被自己的招式击中的对手的道\n具。", }, bulletproof: { name: "防弹", - description: "可以防住对手的球和弹类招\n式。", + description: "可以防住对手的球和弹类招式。", }, competitive: { name: "好胜", - description: "如果被对手降低能力,特攻\n会大幅提高。", + description: "如果被对手降低能力,特攻会大幅\n提高。", }, strongJaw: { name: "强壮之颚", - description: "因为颚部强壮,啃咬类招式\n的威力会提高。", + description: "因为颚部强壮,啃咬类招式的威力\n会提高。", }, refrigerate: { name: "冰冻皮肤", - description: "一般属性的招式会变为冰属\n性。威力会少量提高。", + description: "一般属性的招式会变为冰属性。威\n力会少量提高。", }, sweetVeil: { name: "甜幕", - description: "自己和同伴的宝可梦不会变\n为睡眠状态。", + description: "自己和同伴的宝可梦不会变为睡眠\n状态。", }, stanceChange: { name: "战斗切换", - description: "如果使出攻击招式,会变为\n刀剑形态,如果使出招式“\n王者盾牌”,会变为盾牌形\n态。", + description: "如果使出攻击招式,会变为刀剑形\n态,如果使出招式“王者盾牌”,\n会变为盾牌形态。", }, galeWings: { name: "疾风之翼", - description: "HP全满时,飞行属性的招\n式可以率先使出。", + description: "HP全满时,飞行属性的招式可以\n率先使出。", }, megaLauncher: { name: "超级发射器", - description: "波动和波导类招式的威力会\n提高。", + description: "波动和波导类招式的威力会提高。", }, grassPelt: { name: "草之毛皮", @@ -719,23 +719,23 @@ export const ability: AbilityTranslationEntries = { }, symbiosis: { name: "共生", - description: "同伴使用道具时,会把自己\n持有的道具传递给同伴。", + description: "同伴使用道具时,会把自己持有的\n道具传递给同伴。", }, toughClaws: { name: "硬爪", - description: "接触到对手的招式威力会提\n高。", + description: "接触到对手的招式威力会提高。", }, pixilate: { name: "妖精皮肤", - description: "一般属性的招式会变为妖精\n属性。威力会少量提高。", + description: "一般属性的招式会变为妖精属性。\n威力会少量提高。", }, gooey: { name: "黏滑", - description: "对于用攻击接触到自己的对\n手,会降低其速度。", + description: "对于用攻击接触到自己的对手,会\n降低其速度。", }, aerilate: { name: "飞行皮肤", - description: "一般属性的招式会变为飞行\n属性。威力会少量提高。", + description: "一般属性的招式会变为飞行属性。\n威力会少量提高。", }, parentalBond: { name: "亲子爱", @@ -751,19 +751,19 @@ export const ability: AbilityTranslationEntries = { }, auraBreak: { name: "气场破坏", - description: "让气场的效果发生逆转,降\n低威力。", + description: "让气场的效果发生逆转,降低威力\n。", }, primordialSea: { name: "始源之海", - description: "变为不会受到火属性攻击的\n天气。", + description: "变为不会受到火属性攻击的天气。", }, desolateLand: { name: "终结之地", - description: "变为不会受到水属性攻击的\n天气。", + description: "变为不会受到水属性攻击的天气。", }, deltaStream: { name: "德尔塔气流", - description: "变为令飞行属性的弱点消失\n的天气。", + description: "变为令飞行属性的弱点消失的天气\n。", }, stamina: { name: "持久力", @@ -771,31 +771,31 @@ export const ability: AbilityTranslationEntries = { }, wimpOut: { name: "跃跃欲逃", - description: "HP变为一半时,会慌慌张\n张逃走,退回同行队伍中。", + description: "HP变为一半时,会慌慌张张逃走\n,退回同行队伍中。", }, emergencyExit: { name: "危险回避", - description: "HP变为一半时,为了回避\n危险,会退回到同行队伍中。", + description: "HP变为一半时,为了回避危险,\n会退回到同行队伍中。", }, waterCompaction: { name: "遇水凝固", - description: "受到水属性的招式攻击时,\n防御会大幅提高。", + description: "受到水属性的招式攻击时,防御会\n大幅提高。", }, merciless: { name: "不仁不义", - description: "攻击中毒状态的对手时,\n必定会击中要害。", + description: "攻击中毒状态的对手时,必定会击\n中要害。", }, shieldsDown: { name: "界限盾壳", - description: "HP变为一半时,壳会坏掉,\n变得有攻击性。", + description: "HP变为一半时,壳会坏掉,变得\n有攻击性。", }, stakeout: { name: "蹲守", - description: "可以对替换出场的对手以2\n倍的伤害进行攻击。", + description: "可以对替换出场的对手以2倍的伤\n害进行攻击。", }, waterBubble: { name: "水泡", - description: "降低自己受到的火属性招式\n的威力,不会灼伤。", + description: "降低自己受到的火属性招式的威力\n,不会灼伤。", }, steelworker: { name: "钢能力者", @@ -803,7 +803,7 @@ export const ability: AbilityTranslationEntries = { }, berserk: { name: "怒火冲天", - description: "因对手的攻击HP变为一半\n时,特攻会提高。", + description: "因对手的攻击HP变为一半时,特\n攻会提高。", }, slushRush: { name: "拨雪", @@ -811,11 +811,11 @@ export const ability: AbilityTranslationEntries = { }, longReach: { name: "远隔", - description: "可以不接触对手就使出所有\n的招式。", + description: "可以不接触对手就使出所有的招式\n。", }, liquidVoice: { name: "湿润之声", - description: "所有的声音招式都变为水属\n性。", + description: "所有的声音招式都变为水属性。", }, triage: { name: "先行治疗", @@ -823,83 +823,83 @@ export const ability: AbilityTranslationEntries = { }, galvanize: { name: "电气皮肤", - description: "一般属性的招式会变为电属\n性。威力会少量提高。", + description: "一般属性的招式会变为电属性。威\n力会少量提高。", }, surgeSurfer: { name: "冲浪之尾", - description: "电气场地时,速度会变为2\n倍。", + description: "电气场地时,速度会变为2倍。", }, schooling: { name: "鱼群", - description: "HP多的时候会聚起来变强。\nHP剩余量变少时,群体\n会分崩离析。", + description: "HP多的时候会聚起来变强。HP\n剩余量变少时,群体会分崩离析。", }, disguise: { name: "画皮", - description: "通过画皮覆盖住身体,可以\n防住1次攻击。", + description: "通过画皮覆盖住身体,可以防住1\n次攻击。", }, battleBond: { name: "牵绊变身", - description: "打倒对手时,与训练家的牵\n绊会增强,自己的攻击、特\n攻、速度会提高。", + description: "打倒对手时,与训练家的牵绊会增\n强,自己的攻击、特攻、速度会提\n高。", }, powerConstruct: { name: "群聚变形", - description: "HP变为一半时,细胞们会\n赶来支援,变为完全体形态。", + description: "HP变为一半时,细胞们会赶来支\n援,变为完全体形态。", }, corrosion: { name: "腐蚀", - description: "可以使钢属性和毒属性的宝\n可梦也陷入中毒状态。", + description: "可以使钢属性和毒属性的宝可梦也\n陷入中毒状态。", }, comatose: { name: "绝对睡眠", - description: "总是半梦半醒的状态,绝对\n不会醒来。可以就这么睡着\n进行攻击。", + description: "总是半梦半醒的状态,绝对不会醒\n来。可以就这么睡着进行攻击。", }, queenlyMajesty: { name: "女王的威严", - description: "向对手施加威慑力,使其无\n法对我方使出先制招式。", + description: "向对手施加威慑力,使其无法对我\n方使出先制招式。", }, innardsOut: { name: "飞出的内在物", - description: "被对手打倒的时候,会给予\n对手相当于HP剩余量的伤\n害。", + description: "被对手打倒的时候,会给予对手相\n当于HP剩余量的伤害。", }, dancer: { name: "舞者", - description: "有谁使出跳舞招式时,自己\n也能就这么接着使出跳舞招\n式。", + description: "有谁使出跳舞招式时,自己也能就\n这么接着使出跳舞招式。", }, battery: { name: "蓄电池", - description: "会提高我方的特殊招式的威\n力。", + description: "会提高我方的特殊招式的威力。", }, fluffy: { name: "毛茸茸", - description: "会将对手所给予的接触类招\n式的伤害减半,但火属性招\n式的伤害会变为2倍。", + description: "会将对手所给予的接触类招式的伤\n害减半,但火属性招式的伤害会变\n为2倍。", }, dazzling: { name: "鲜艳之躯", - description: "让对手吓一跳,使其无法对\n我方使出先制招式。", + description: "让对手吓一跳,使其无法对我方使\n出先制招式。", }, soulHeart: { name: "魂心", - description: "宝可梦每次变为濒死状态时\n,特攻会提高。", + description: "宝可梦每次变为濒死状态时,特攻\n会提高。", }, tanglingHair: { name: "卷发", - description: "对于用攻击接触到自己的对\n手,会降低其速度。", + description: "对于用攻击接触到自己的对手,会\n降低其速度。", }, receiver: { name: "接球手", - description: "继承被打倒的同伴的特性,\n变为相同的特性。", + description: "继承被打倒的同伴的特性,变为相\n同的特性。", }, powerOfAlchemy: { name: "化学之力", - description: "继承被打倒的同伴的特性,\n变为相同的特性。", + description: "继承被打倒的同伴的特性,变为相\n同的特性。", }, beastBoost: { name: "异兽提升", - description: "打倒对手的时候,自己最高\n的那项能力会提高。", + description: "打倒对手的时候,自己最高的那项\n能力会提高。", }, rksSystem: { name: "AR系统", - description: "根据持有的存储碟,自己的\n属性会改变。", + description: "根据持有的存储碟,自己的属性会\n改变。", }, electricSurge: { name: "电气制造者", @@ -919,19 +919,19 @@ export const ability: AbilityTranslationEntries = { }, fullMetalBody: { name: "金属防护", - description: "不会因为对手的招式或特性\n而被降低能力。", + description: "不会因为对手的招式或特性而被降\n低能力。", }, shadowShield: { name: "幻影防守", - description: "HP全满时,受到的伤害会\n变少。", + description: "HP全满时,受到的伤害会变少。", }, prismArmor: { name: "棱镜装甲", - description: "受到效果绝佳的攻击时,可\n以减弱其威力。", + description: "受到效果绝佳的攻击时,可以减弱\n其威力。", }, neuroforce: { name: "脑核之力", - description: "效果绝佳的攻击,威力会变\n得更强。", + description: "效果绝佳的攻击,威力会变得更强\n。", }, intrepidSword: { name: "不挠之剑", @@ -943,39 +943,39 @@ export const ability: AbilityTranslationEntries = { }, libero: { name: "自由者", - description: "变为与自己使出的招式相同\n的属性。每次出场战斗仅生\n效一次。", + description: "变为与自己使出的招式相同的属性\n。每次出场战斗仅生效一次。", }, ballFetch: { name: "捡球", - description: "没有携带道具时,会拾取第\n1个投出后捕捉失败的精灵\n球。", + description: "没有携带道具时,会拾取第1个投\n出后捕捉失败的精灵球。", }, cottonDown: { name: "棉絮", - description: "受到攻击后撒下棉絮,降低\n除自己以外的所有宝可梦的\n速度。", + description: "受到攻击后撒下棉絮,降低除自己\n以外的所有宝可梦的速度。", }, propellerTail: { name: "螺旋尾鳍", - description: "能无视具有吸引对手招式效\n果的特性或招式的影响。", + description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", }, mirrorArmor: { name: "镜甲", - description: "只反弹自己受到的能力降低\n效果。", + description: "只反弹自己受到的能力降低效果。", }, gulpMissile: { name: "一口导弹", - description: "冲浪或潜水时会叼来猎物。\n受到伤害时,会吐出猎物进\n行攻击。", + description: "冲浪或潜水时会叼来猎物。受到伤\n害时,会吐出猎物进行攻击。", }, stalwart: { name: "坚毅", - description: "能无视具有吸引对手招式效\n果的特性或招式的影响。", + description: "能无视具有吸引对手招式效果的特\n性或招式的影响。", }, steamEngine: { name: "蒸汽机", - description: "受到水属性或火属性的招式\n攻击时,速度会巨幅提高。", + description: "受到水属性或火属性的招式攻击时\n,速度会巨幅提高。", }, punkRock: { name: "庞克摇滚", - description: "声音招式的威力会提高。受\n到的声音招式伤害会减半。", + description: "声音招式的威力会提高。受到的声\n音招式伤害会减半。", }, sandSpit: { name: "吐沙", @@ -983,7 +983,7 @@ export const ability: AbilityTranslationEntries = { }, iceScales: { name: "冰鳞粉", - description: "由于有冰鳞粉的守护,受到\n的特殊攻击伤害会减半。", + description: "由于有冰鳞粉的守护,受到的特殊\n攻击伤害会减半。", }, ripen: { name: "熟成", @@ -991,47 +991,47 @@ export const ability: AbilityTranslationEntries = { }, iceFace: { name: "结冻头", - description: "头部的冰会代替自己承受物\n理攻击,但是样子会改变。\n下雪时,冰会恢复原状。", + description: "头部的冰会代替自己承受物理攻击\n,但是样子会改变。下雪时,冰会\n恢复原状。", }, powerSpot: { name: "能量点", - description: "只要处在相邻位置,招式的\n威力就会提高。", + description: "只要处在相邻位置,招式的威力就\n会提高。", }, mimicry: { name: "拟态", - description: "宝可梦的属性会根据场地的\n状态而变化。", + description: "宝可梦的属性会根据场地的状态而\n变化。", }, screenCleaner: { name: "除障", - description: "出场时,敌方和我方的光墙\n、反射壁和极光幕的效果会\n消失。", + description: "出场时,敌方和我方的光墙、反射\n壁和极光幕的效果会消失。", }, steelySpirit: { name: "钢之意志", - description: "我方的钢属性攻击威力会提\n高。", + description: "我方的钢属性攻击威力会提高。", }, perishBody: { name: "灭亡之躯", - description: "受到接触类招式攻击时,双\n方都会在3回合后变为濒死\n状态。替换后效果消失。", + description: "受到接触类招式攻击时,双方都会\n在3回合后变为濒死状态。替换后\n效果消失。", }, wanderingSpirit: { name: "游魂", - description: "与使用接触类招式攻击自己\n的宝可梦互换特性。", + description: "与使用接触类招式攻击自己的宝可\n梦互换特性。", }, gorillaTactics: { name: "一猩一意", - description: "虽然攻击会提高,但是只能\n使出一开始所选的招式。", + description: "虽然攻击会提高,但是只能使出一\n开始所选的招式。", }, neutralizingGas: { name: "化学变化气体", - description: "特性为化学变化气体的宝可\n梦在场时,场上所有宝可梦\n的特性效果都会消失或者无\n法生效。", + description: "特性为化学变化气体的宝可梦在场\n时,场上所有宝可梦的特性效果都\n会消失或者无法生效。", }, pastelVeil: { name: "粉彩护幕", - description: "自己和同伴都不会陷入中毒\n的异常状态。", + description: "自己和同伴都不会陷入中毒的异常\n状态。", }, hungerSwitch: { name: "饱了又饿", - description: "每回合结束时会在满腹花纹\n与空腹花纹之间交替改变样\n子。", + description: "每回合结束时会在满腹花纹与空腹\n花纹之间交替改变样子。", }, quickDraw: { name: "速击", @@ -1039,11 +1039,11 @@ export const ability: AbilityTranslationEntries = { }, unseenFist: { name: "无形拳", - description: "如果使出的是接触到对手的\n招式,就可以无视守护效果\n进行攻击。", + description: "如果使出的是接触到对手的招式,\n就可以无视守护效果进行攻击。", }, curiousMedicine: { name: "怪药", - description: "出场时会从贝壳撒药,将我\n方的能力变化复原。", + description: "出场时会从贝壳撒药,将我方的能\n力变化复原。", }, transistor: { name: "电晶体", @@ -1055,51 +1055,51 @@ export const ability: AbilityTranslationEntries = { }, chillingNeigh: { name: "苍白嘶鸣", - description: "打倒对手时会用冰冷的声音\n嘶鸣并提高攻击。", + description: "打倒对手时会用冰冷的声音嘶鸣并\n提高攻击。", }, grimNeigh: { name: "漆黑嘶鸣", - description: "打倒对手时会用恐怖的声音\n嘶鸣并提高特攻。", + description: "打倒对手时会用恐怖的声音嘶鸣并\n提高特攻。", }, asOneGlastrier: { name: "人马一体", - description: "兼备蕾冠王的紧张感和雪暴\n马的苍白嘶鸣这两种特性。", + description: "兼备蕾冠王的紧张感和雪暴马的苍\n白嘶鸣这两种特性。", }, asOneSpectrier: { name: "人马一体", - description: "兼备蕾冠王的紧张感和灵幽\n马的漆黑嘶鸣这两种特性。", + description: "兼备蕾冠王的紧张感和灵幽马的漆\n黑嘶鸣这两种特性。", }, lingeringAroma: { name: "甩不掉的气味", - description: "被对手接触到后,甩不掉的\n气味会沾上对手。", + description: "被对手接触到后,甩不掉的气味会\n沾上对手。", }, seedSower: { name: "掉出种子", - description: "受到攻击时,会将脚下变成\n青草场地。", + description: "受到攻击时,会将脚下变成青草场\n地。", }, thermalExchange: { name: "热交换", - description: "受到火属性的招式攻击时,\n攻击会提高,且不会陷入灼\n伤状态。", + description: "受到火属性的招式攻击时,攻击会\n提高,且不会陷入灼伤状态。", }, angerShell: { name: "愤怒甲壳", - description: "因被对手攻击而HP变为一\n半时,会因愤怒降低防御和\n特防。但攻击、特攻、速度\n会提高。", + description: "因被对手攻击而HP变为一半时,\n会因愤怒降低防御和特防。但攻击\n、特攻、速度会提高。", }, purifyingSalt: { name: "洁净之盐", - description: "因洁净的盐而不会陷入异常\n状态。会让幽灵属性的招式\n伤害减半。", + description: "因洁净的盐而不会陷入异常状态。\n会让幽灵属性的招式伤害减半。", }, wellBakedBody: { name: "焦香之躯", - description: "受到火属性的招式攻击时,\n不会受到伤害,而是会大幅\n提高防御。", + description: "受到火属性的招式攻击时,不会受\n到伤害,而是会大幅提高防御。", }, windRider: { name: "乘风", - description: "吹起了顺风或受到风的招式\n攻击时,不会受到伤害,而\n是会提高攻击。", + description: "吹起了顺风或受到风的招式攻击时\n,不会受到伤害,而是会提高攻击\n。", }, guardDog: { name: "看门犬", - description: "受到威吓时,攻击会提高。\n让替换宝可梦的招式和道具\n无效。", + description: "受到威吓时,攻击会提高。让替换\n宝可梦的招式和道具无效。", }, rockyPayload: { name: "搬岩", @@ -1107,63 +1107,63 @@ export const ability: AbilityTranslationEntries = { }, windPower: { name: "风力发电", - description: "受到风的招式攻击时,会变\n为充电状态。", + description: "受到风的招式攻击时,会变为充电\n状态。", }, zeroToHero: { name: "全能变身", - description: "回到同行队伍后,会变为全\n能形态。", + description: "回到同行队伍后,会变为全能形态\n。", }, commander: { name: "发号施令", - description: "出场时,若我方当中有吃吼\n霸,就会进入其口中,并从\n其口中发出指令。", + description: "出场时,若我方当中有吃吼霸,就\n会进入其口中,并从其口中发出指\n令。", }, electromorphosis: { name: "电力转换", - description: "受到伤害时,会变为充电状\n态。", + description: "受到伤害时,会变为充电状态。", }, protosynthesis: { name: "古代活性", - description: "携带着驱劲能量或天气为晴\n朗时,数值最高的能力会提\n高。", + description: "携带着驱劲能量或天气为晴朗时,\n数值最高的能力会提高。", }, quarkDrive: { name: "夸克充能", - description: "携带着驱劲能量或在电气场\n地上时,数值最高的能力会\n提高。", + description: "携带着驱劲能量或在电气场地上时\n,数值最高的能力会提高。", }, goodAsGold: { name: "黄金之躯", - description: "不会氧化的坚固黄金身躯不\n会受到对手的变化招式的影\n响。", + description: "不会氧化的坚固黄金身躯不会受到\n对手的变化招式的影响。", }, vesselOfRuin: { name: "灾祸之鼎", - description: "以能呼唤灾厄的鼎的力量降\n低除自己以外的宝可梦的特\n攻。", + description: "以能呼唤灾厄的鼎的力量降低除自\n己以外的宝可梦的特攻。", }, swordOfRuin: { name: "灾祸之剑", - description: "以能呼唤灾厄的剑的力量降\n低除自己以外的宝可梦的防\n御。", + description: "以能呼唤灾厄的剑的力量降低除自\n己以外的宝可梦的防御。", }, tabletsOfRuin: { name: "灾祸之简", - description: "以能呼唤灾厄的简的力量降\n低除自己以外的宝可梦的攻\n击。", + description: "以能呼唤灾厄的简的力量降低除自\n己以外的宝可梦的攻击。", }, beadsOfRuin: { name: "灾祸之玉", - description: "以能呼唤灾厄的勾玉的力量\n降低除自己以外的宝可梦的\n特防。", + description: "以能呼唤灾厄的勾玉的力量降低除\n自己以外的宝可梦的特防。", }, orichalcumPulse: { name: "绯红脉动", - description: "出场时,会将天气变为晴朗\n。日照强烈时,会通过古代\n的脉动升高攻击。", + description: "出场时,会将天气变为晴朗。日照\n强烈时,会通过古代的脉动升高攻\n击。", }, hadronEngine: { name: "强子引擎", - description: "出场时,会布下电气场地。\n处于电气场地时,会通过未\n来的机关升高特攻。", + description: "出场时,会布下电气场地。处于电\n气场地时,会通过未来的机关升高\n特攻。", }, opportunist: { name: "跟风", - description: "对手的能力提高时,自己也\n会趁机同样地提高能力。", + description: "对手的能力提高时,自己也会趁机\n同样地提高能力。", }, cudChew: { name: "反刍", - description: "吃了树果后,会在下一回合\n结束时从胃反刍出来再吃1\n次。", + description: "吃了树果后,会在下一回合结束时\n从胃反刍出来再吃1次。", }, sharpness: { name: "锋锐", @@ -1171,74 +1171,74 @@ export const ability: AbilityTranslationEntries = { }, supremeOverlord: { name: "大将", - description: "出场时,攻击和特攻会按照\n目前被打倒的同伴数量逐渐\n提升,被打倒越多,提升越\n多。", + description: "出场时,攻击和特攻会按照目前被\n打倒的同伴数量逐渐提升,被打倒\n越多,提升越多。", }, costar: { name: "同台共演", - description: "出场时,复制同伴的能力变\n化。", + description: "出场时,复制同伴的能力变化。", }, toxicDebris: { name: "毒满地", - description: "受到物理招式的伤害时,会\n在对手脚下散布毒菱。", + description: "受到物理招式的伤害时,会在对手\n脚下散布毒菱。", }, armorTail: { name: "尾甲", - description: "包裹头部的神秘尾巴使对手\n无法对我方使出先制招式。", + description: "包裹头部的神秘尾巴使对手无法对\n我方使出先制招式。", }, earthEater: { name: "食土", - description: "受到地面属性的招式攻击时\n,不会受到伤害,而是会得\n到回复。", + description: "受到地面属性的招式攻击时,不会\n受到伤害,而是会得到回复。", }, myceliumMight: { name: "菌丝之力", - description: "使出变化招式时,虽然行动\n必定会变慢,但能不受对手\n的特性妨碍。", + description: "使出变化招式时,虽然行动必定会\n变慢,但能不受对手的特性妨碍。", }, mindsEye: { name: "心眼", - description: "一般属性和格斗属性的招式\n可以击中幽灵属性的宝可梦。\n无视对手的闪避率的变化,\n且命中率不会被降低。", + description: "一般属性和格斗属性的招式可以击\n中幽灵属性的宝可梦。无视对手的\n闪避率的变化,且命中率不会被降\n低。", }, supersweetSyrup: { name: "甘露之蜜", - description: "首次出场时,会散发出甜腻\n的蜜的香味来降低对手的闪\n避率。", + description: "首次出场时,会散发出甜腻的蜜的\n香味来降低对手的闪避率。", }, hospitality: { name: "款待", - description: "出场时款待同伴,回复其少\n量HP。", + description: "出场时款待同伴,回复其少量HP\n。", }, toxicChain: { name: "毒锁链", - description: "凭借含有毒素的锁链的力量,\n有时能让被招式击中的对\n手陷入剧毒状态。", + description: "凭借含有毒素的锁链的力量,有时\n能让被招式击中的对手陷入剧毒状\n态。", }, embodyAspectTeal: { name: "面影辉映", - description: "将回忆映于心中,让碧草面\n具发出光辉,提高自己的速\n度。", + description: "将回忆映于心中,让碧草面具发出\n光辉,提高自己的速度。", }, embodyAspectWellspring: { name: "面影辉映", - description: "将回忆映于心中,让水井面\n具发出光辉,提高自己的特\n防。", + description: "将回忆映于心中,让水井面具发出\n光辉,提高自己的特防。", }, embodyAspectHearthflame: { name: "面影辉映", - description: "将回忆映于心中,让火灶面\n具发出光辉,提高自己的攻\n击。", + description: "将回忆映于心中,让火灶面具发出\n光辉,提高自己的攻击。", }, embodyAspectCornerstone: { name: "面影辉映", - description: "将回忆映于心中,让础石面\n具发出光辉,提高自己的防\n御。", + description: "将回忆映于心中,让础石面具发出\n光辉,提高自己的防御。", }, teraShift: { name: "太晶变形", - description: "出场时,会吸收周围的能量\n,变为太晶形态。", + description: "出场时,会吸收周围的能量,变为\n太晶形态。", }, teraShell: { name: "太晶甲壳", - description: "甲壳蕴藏着全部属性的力量\n,会将自己HP全满时受到\n的伤害全都变为效果不好。", + description: "甲壳蕴藏着全部属性的力量,会将\n自己HP全满时受到的伤害全都变\n为效果不好。", }, teraformZero: { name: "归零化境", - description: "太乐巴戈斯变为星晶形态时\n,蕴藏在它身上的力量会将\n天气和场地的影响全部归零。", + description: "太乐巴戈斯变为星晶形态时,蕴藏\n在它身上的力量会将天气和场地的\n影响全部归零。", }, poisonPuppeteer: { name: "毒傀儡", - description: "因桃歹郎的招式而陷入中毒\n状态的对手同时也会陷入混\n乱状态。", + description: "因桃歹郎的招式而陷入中毒状态的\n对手同时也会陷入混乱状态。", }, } as const; diff --git a/src/locales/zh_CN/achv.ts b/src/locales/zh_CN/achv.ts index 10012592330..486ff3cc02b 100644 --- a/src/locales/zh_CN/achv.ts +++ b/src/locales/zh_CN/achv.ts @@ -1,4 +1,4 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { @@ -127,7 +127,7 @@ export const PGMachv: AchievementTranslationEntries = { }, "CATCH_SUB_LEGENDARY": { name: "二级传说", - description: "捕捉一只准传说宝可梦", + description: "捕捉一只二级传说宝可梦", }, "CATCH_LEGENDARY": { name: "传说", diff --git a/src/locales/zh_CN/battle-message-ui-handler.ts b/src/locales/zh_CN/battle-message-ui-handler.ts index 89be345c32f..fb6e74cf66b 100644 --- a/src/locales/zh_CN/battle-message-ui-handler.ts +++ b/src/locales/zh_CN/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "最棒", @@ -7,4 +7,4 @@ export const battleMessageUiHandler: SimpleTranslationEntries = { "ivPrettyGood": "相当好", "ivDecent": "一般般", "ivNoGood": "也许不行", -} as const; +} as const; diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index 3b7451f5cde..3fde016d5cc 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -1,65 +1,136 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出现了。", "trainerAppeared": "{{trainerName}}\n想要和你对战!", "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", - "trainerSendOut": "{{trainerName}} 派出了\n{{pokemonName}}!", - "singleWildAppeared": "一只野生 {{pokemonName}} 出现了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出现了!", - "playerComeBack": "回来吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了\n{{pokemonName}}!", + "trainerSendOut": "{{trainerName}}派出了\n{{pokemonName}}!", + "singleWildAppeared": "一只野生的{{pokemonName}}出现了!", + "multiWildAppeared": "野生的{{pokemonName1}}\n和{{pokemonName2}}出现了!", + "playerComeBack": "回来吧,{{pokemonName}}!", + "trainerComeBack": "{{trainerName}}收回了{{pokemonName}}!", + "playerGo": "去吧!{{pokemonName}}!", + "trainerGo": "{{trainerName}}派出了\n{{pokemonName}}!", "switchQuestion": "要更换\n{{pokemonName}}吗?", "trainerDefeated": "你击败了\n{{trainerName}}!", "moneyWon": "你赢得了\n₽{{moneyAmount}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", - "partyFull": "你的队伍已满员.是否放生其他宝可梦\n为 {{pokemonName}} 腾出空间?", + "pokemonCaught": "{{pokemonName}}被抓住了!", + "addedAsAStarter": "增加了{{pokemonName}}作为\n一个新的基础宝可梦!", + "partyFull": "你的队伍已满员。是否放生其他宝可梦\n为{{pokemonName}}腾出空间?", "pokemon": "宝可梦", "sendOutPokemon": "上吧!\n{{pokemonName}}!", "hitResultCriticalHit": "击中了要害!", "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "对 {{pokemonName}} 没有效果!!", + "hitResultNoEffect": "对{{pokemonName}}没有效果!!", "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", - "attackHitsCount": "击中 {{count}} 次!", - "expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!", - "levelUp": "{{pokemonName}} 升级到 Lv.{{level}}!", + "attackHitsCount": "击中{{count}}次!", + "rewardGain": "你获得了\n{{modifierName}}!", + "expGain": "{{pokemonName}}获得了 {{exp}} 点经验值!", + "levelUp": "{{pokemonName}}升级到 Lv.{{level}}!", "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", - "learnMovePrompt": "{{pokemonName}} 想要学习 {{moveName}}。", - "learnMoveLimitReached": "但是,{{pokemonName}} 已经学会了\n四个技能", - "learnMoveReplaceQuestion": "要忘记一个技能并学习 {{moveName}} 吗?", - "learnMoveStopTeaching": "不再尝试学习 {{moveName}}?", - "learnMoveNotLearned": "{{pokemonName}} 没有学会 {{moveName}}。", + "learnMovePrompt": "{{pokemonName}}想要学习{{moveName}}。", + "learnMoveLimitReached": "但是,{{pokemonName}}已经学会了\n四个技能", + "learnMoveReplaceQuestion": "要忘记一个技能并学习{{moveName}}吗?", + "learnMoveStopTeaching": "不再尝试学习{{moveName}}?", + "learnMoveNotLearned": "{{pokemonName}}没有学会{{moveName}}。", "learnMoveForgetQuestion": "要忘记哪个技能?", - "learnMoveForgetSuccess": "{{pokemonName}} 忘记了\n如何使用 {{moveName}}。", + "learnMoveForgetSuccess": "{{pokemonName}}忘记了\n如何使用{{moveName}}。", "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!", - "learnMoveAnd": "然后...", - "levelCapUp": "等级上限提升到 {{levelCap}}!", - "moveNotImplemented": "{{moveName}} 尚未实装,无法选择。", - "moveNoPP": "这个技能的 PP 用完了", - "moveDisabled": "{{moveName}} 被禁用!", + "learnMoveAnd": "然后……", + "levelCapUp": "等级上限提升到{{levelCap}}!", + "moveNotImplemented": "{{moveName}}尚未实装,无法选择。", + "moveNoPP": "这个技能的PP用完了", + "moveDisabled": "{{moveName}}被禁用!", "noPokeballForce": "一股无形的力量阻止了你使用精灵球。", "noPokeballTrainer": "你不能捕捉其他训练家的宝可梦!", "noPokeballMulti": "只能在剩下一只宝可梦时才能扔出精灵球!", - "noPokeballStrong": "目标宝可梦太强了,无法捕捉!你需要先\n削弱它!", + "noPokeballStrong": "目标宝可梦太强了,无法捕捉!\n你需要先削弱它!", "noEscapeForce": "一股无形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能从训练家战斗中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脱了!", - "runAwayCannotEscape": "你无法逃脱!", + "noEscapeTrainer": "你不能从与训练家的战斗中逃跑!", + "noEscapePokemon": "{{pokemonName}}的{{moveName}}\n阻止了你{{escapeVerb}}!", + "runAwaySuccess": "成功逃走了!", + "runAwayCannotEscape": "无法逃走!", "escapeVerbSwitch": "切换", "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}} 不再被禁用!", + "notDisabled": "{{moveName}}不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}的体力恢复了。", + "hpIsFull": "{{pokemonName}}的体力已满!", "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", - "ivScannerUseQuestion": "对 {{pokemonName}} 使用个体值扫描仪?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", + "wildPokemonWithAffix": "野生的{{pokemonName}}", + "foePokemonWithAffix": "对手 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}}使用了\n{{moveName}}!", + "drainMessage": "{{pokemonName}}\n吸取了体力!", + "regainHealth": "{{pokemonName}}\n回复了体力!", + "fainted": "{{pokemonNameWithAffix}}\n倒下了!", + "statRose": "{{pokemonNameWithAffix}}\n的{{stats}}提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}}\n的{{stats}}大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再提高了!", + "statFell": "{{pokemonNameWithAffix}}\n的{{stats}}降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}}\n的{{stats}}大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再降低了!", + "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}\n畏缩了,无法使出招式!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}\n混乱了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}\n的混乱解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}\n已经混乱了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}\n正在混乱中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻击了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}\n不再受到同命的影响", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}}\n和{{pokemonNameWithAffix2}}同归于尽了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}\n已经着迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}\n对{{sourcePokemonName}}着迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}}\n不会着迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}}\n治愈了着迷状态!", + "battlerTagsSeededOnAdd": "将种子种植在了\n{{pokemonNameWithAffix}}的身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}\n被寄生种子吸取了体力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}\n开始做恶梦了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}\n已经被恶梦缠身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}\n正被恶梦缠身!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}\n接受了再来一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}\n的再来一次状态解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}\n摆出了帮助{{pokemonName}}的架势!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}\n用扎根回复了体力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}\n扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}\n用水流环包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回复了\n{{pokemonName}}的体力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}\n产生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了\n{{moveName}}的伤害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}的{{moveName}}紧紧束缚住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被\n{{sourcePokemonName}}绑紧了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}\n被困在了旋涡之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用贝壳\n夹住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}\n被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}\n被困在了熔岩风暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}\n被捕兽夹困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了\n{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了\n{{sourcePokemonNameWithAffix}}的死缠烂打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}\n摆出了防守的架势!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}\n在攻击中保护了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}\n摆出了挺住攻击的架势!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" } as const; diff --git a/src/locales/zh_CN/berry.ts b/src/locales/zh_CN/berry.ts index 750a8bb2a2d..c13393f23a3 100644 --- a/src/locales/zh_CN/berry.ts +++ b/src/locales/zh_CN/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { @@ -45,4 +45,4 @@ export const berry: BerryTranslationEntries = { name: "苹野果", effect: "有招式的PP降到0时,恢复该招式10PP", }, -} as const; +} as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts new file mode 100644 index 00000000000..70e969d7b5e --- /dev/null +++ b/src/locales/zh_CN/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "BGM", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "黑2白2「决战!关都冠军」", + "battle_johto_champion": "黑2白2「决战!城都冠军」", + "battle_hoenn_champion": "黑2白2「决战!丰缘冠军」", + "battle_sinnoh_champion": "黑2白2「决战!神奥冠军」", + "battle_champion_alder": "黑白「决战!合众冠军」", + "battle_champion_iris": "黑2白2「决战!合众冠军」", + "battle_kalos_champion": "XY「决战!卡洛斯冠军」", + "battle_alola_champion": "究极日月「顶上决战!」", + "battle_galar_champion": "剑盾「决战!伽勒尔冠军」", + "battle_champion_geeta": "朱紫「决战!帕底亚首席也慈」", + "battle_champion_nemona": "朱紫「决战!帕底亚冠军妮莫」", + "battle_champion_kieran": "朱紫「决战!蓝莓学园冠军乌栗」", + "battle_hoenn_elite": "Ω红宝石α蓝宝石 「战斗!丰缘四天王」", + "battle_unova_elite": "黑白 「战斗!合众四天王」", + "battle_kalos_elite": "XY「战斗!卡洛斯四天王」", + "battle_alola_elite": "日月「战斗!阿罗拉四天王」", + "battle_galar_elite": "剑盾「联盟锦标赛」", + "battle_paldea_elite": "朱紫「战斗!帕底亚四天王」", + "battle_bb_elite": "朱紫「战斗!蓝之圆盘四天王」", + "battle_final_encounter": "探险队DX 「裂空座的领域」", + "battle_final": "黑白「战斗!魁奇思」", + "battle_kanto_gym": "黑2白2「战斗!关都道馆主」", + "battle_johto_gym": "黑2白2「战斗!城都道馆主」", + "battle_hoenn_gym": "黑2白2「战斗!合众道馆主」", + "battle_sinnoh_gym": "黑2白2「战斗!神奥道馆主」", + "battle_unova_gym": "黑白「战斗!合众道馆主」", + "battle_kalos_gym": "XY「战斗!卡洛斯道馆主」", + "battle_galar_gym": "剑盾「战斗!伽勒尔道馆主」", + "battle_paldea_gym": "朱紫「战斗!帕底亚道馆主」", + "battle_legendary_kanto": "XY「战斗!传说宝可梦(关都)」", + "battle_legendary_raikou": "心金魂银「战斗!雷公」", + "battle_legendary_entei": "心金魂银「战斗!炎帝」", + "battle_legendary_suicune": "心金魂银「战斗!水君」", + "battle_legendary_lugia": "心金魂银「战斗!洛奇亚」", + "battle_legendary_ho_oh": "心金魂银「战斗!凤王」", + "battle_legendary_regis_g5": "黑2白2「战斗!传说中的巨人」", + "battle_legendary_regis_g6": "Ω红宝石α蓝宝石「战斗!传说中的巨人」", + "battle_legendary_gro_kyo": "Ω红宝石α蓝宝石「战斗!原始回归」", + "battle_legendary_rayquaza": "Ω红宝石α蓝宝石「战斗!超古代宝可梦」", + "battle_legendary_deoxys": "Ω红宝石α蓝宝石「战斗!代欧奇希斯」", + "battle_legendary_lake_trio": "Ω红宝石α蓝宝石「战斗!由克希・艾姆利多・亚克诺姆」", + "battle_legendary_sinnoh": "Ω红宝石α蓝宝石「战斗!传说的宝可梦」", + "battle_legendary_dia_pal": "Ω红宝石α蓝宝石「战斗!帝牙卢卡・帕路奇亚」", + "battle_legendary_giratina": "Ω红宝石α蓝宝石「战斗!骑拉帝纳」", + "battle_legendary_arceus": "心金魂银「阿尔宙斯」", + "battle_legendary_unova": "黑白「战斗!传说的宝可梦」", + "battle_legendary_kyurem": "黑白「战斗!酋雷姆」", + "battle_legendary_res_zek": "黑白「战斗!莱希拉姆・捷克罗姆」", + "battle_legendary_xern_yvel": "XY「战斗!哲尔尼亚斯・伊裴尔塔尔」", + "battle_legendary_tapu": "日月「战斗!卡璞」", + "battle_legendary_sol_lun": "日月「战斗!露奈雅拉・索尔迦雷欧」", + "battle_legendary_ub": "日月「战斗!究极异兽」", + "battle_legendary_dusk_dawn": "究极日月「战斗!日食・月食 奈克洛兹玛」", + "battle_legendary_ultra_nec": "究极日月「战斗!究极奈克洛兹玛」", + "battle_legendary_zac_zam": "剑盾「战斗!苍响・藏玛然特」", + "battle_legendary_glas_spec": "剑盾「战斗! 雪暴马・灵幽马」", + "battle_legendary_calyrex": "剑盾「战斗!蕾冠王」", + "battle_legendary_birds_galar": "剑盾「战斗!传说的鸟宝可梦」", + "battle_legendary_ruinous": "朱紫「战斗!灾厄宝可梦」", + "battle_legendary_kor_mir": "朱紫「战斗!第零区的宝可梦2」", + "battle_legendary_loyal_three": "朱紫「战斗!宝伴」", + "battle_legendary_ogerpon": "朱紫「战斗!厄鬼椪」", + "battle_legendary_terapagos": "朱紫「战斗!太乐巴戈斯」", + "battle_legendary_pecharunt": "朱紫「战斗!桃歹郎」", + "battle_rival": "黑白「战斗!黑连・贝尔」", + "battle_rival_2": "黑白「战斗!N」", + "battle_rival_3": "黑白「决战!N」", + "battle_trainer": "黑白「战斗!训练师」", + "battle_wild": "黑白「战斗!野生宝可梦」", + "battle_wild_strong": "黑白「战斗!强大野生宝可梦」", + "end_summit": "探险队DX 「天空之柱 顶层」", + "battle_rocket_grunt": "心金魂银「战斗!火箭队」", + "battle_aqua_magma_grunt": "Ω红宝石α蓝宝石「战斗!熔岩队・海洋队」", + "battle_galactic_grunt": "晶灿钻石·明亮珍珠「战斗!银河队」", + "battle_plasma_grunt": "黑白「战斗!等离子团」", + "battle_flare_grunt": "XY「战斗!闪焰队」", + "battle_rocket_boss": "究极日月「战斗!坂木」", + "battle_aqua_magma_boss": "Ω红宝石α蓝宝石「战斗!水梧桐・赤焰松」", + "battle_galactic_boss": "晶灿钻石·明亮珍珠「战斗!赤日」", + "battle_plasma_boss": "黑2白2「战斗!魁奇思」", + "battle_flare_boss": "XY「战斗!弗拉达利」", + + // Biome Music + "abyss": "空之探险队「黑暗小丘」", + "badlands": "空之探险队「枯竭之谷」", + "beach": "空之探险队「潮湿岩地」", + "cave": "空之探险队「天空顶端(洞窟)」", + "construction_site": "空之探险队「幻影石室」", + "desert": "空之探险队「北方沙漠」", + "dojo": "空之探险队「嘎啦嘎啦道场」", + "end": "探险队DX「天空之柱」", + "factory": "空之探险队「隐藏遗迹」", + "fairy_cave": "空之探险队「星之洞窟」", + "forest": "空之探险队「黑暗森林」", + "grass": "空之探险队「苹果森林」", + "graveyard": "空之探险队「神秘森林」", + "ice_cave": "空之探险队「大冰山」", + "island": "空之探险队「沿岸岩地」", + "jungle": "Lmz - 丛林", // The composer thinks about a more creative name + "laboratory": "Firel - 研究所", // The composer thinks about a more creative name + "lake": "空之探险队「水晶洞窟」", + "meadow": "空之探险队「天空顶端(森林)」", + "metropolis": "Firel - 城市", // The composer thinks about a more creative name + "mountain": "空之探险队「角山」", + "plains": "空之探险队「天空顶端(草原)」", + "power_plant": "空之探险队「电气平原 深处」", + "ruins": "空之探险队「封印岩地 深处」", + "sea": "空之探险队「石滩洞窟」", + "seabed": "Firel - 海底", // The composer thinks about a more creative name + "slum": "空之探险队「天空顶端(岩场)」", + "snowy_forest": "空之探险队「天空顶端(雪山)」", + "space": "Firel - 太空", + "swamp": "空之探险队「封闭之海」", + "tall_grass": "空之探险队「浓雾森林」", + "temple": "空之探险队「守护洞穴」", + "town": "空之探险队「随机迷宫3」", + "volcano": "空之探险队「热水洞窟」", + "wasteland": "空之探险队「梦幻高原」", + + // Encounter + "encounter_ace_trainer": "黑白 「视线!精英训练师」", + "encounter_backpacker": "黑白 「视线!背包客」", + "encounter_clerk": "黑白 「视线!上班族」", + "encounter_cyclist": "黑白 「视线!自行车手」", + "encounter_lass": "黑白 「视线!迷你裙」", + "encounter_parasol_lady": "黑白 「视线!阳伞姐姐」", + "encounter_pokefan": "黑白 「视线!宝可梦爱好者」", + "encounter_psychic": "黑白 「视线!超能力者」", + "encounter_rich": "黑白 「视线!绅士」", + "encounter_rival": "黑白「黑连」", + "encounter_roughneck": "黑白 「视线!光头」", + "encounter_scientist": "黑白 「视线!科学家」", + "encounter_twins": "黑白 「视线!双胞胎」", + "encounter_youngster": "黑白 「视线!短裤小子」", + + // Other + "heal": "黑白「宝可梦回复」", + "menu": "空之探险队「欢迎来到宝可梦的世界」", + "title": "空之探险队「主题曲」", +} as const; diff --git a/src/locales/zh_CN/biome.ts b/src/locales/zh_CN/biome.ts index 3a72931e021..9026dc7fbee 100644 --- a/src/locales/zh_CN/biome.ts +++ b/src/locales/zh_CN/biome.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { "unknownLocation": "未知领域", diff --git a/src/locales/zh_CN/challenges.ts b/src/locales/zh_CN/challenges.ts index 8793f5177d7..4c1b523ef16 100644 --- a/src/locales/zh_CN/challenges.ts +++ b/src/locales/zh_CN/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "适用挑战条件", - "points": "Bad Ideas", - "confirm_start": "要执行这些挑战吗?", - "singleGeneration.name": "单一世代", - "singleGeneration.value.0": "关闭", - "singleGeneration.desc.0": "你只能使用所选世代的宝可梦", - "singleGeneration.value.1": "第一世代", - "singleGeneration.desc.1": "你只能使用第一世代的宝可梦", - "singleGeneration.value.2": "第二世代", - "singleGeneration.desc.2": "你只能使用第二世代的宝可梦", - "singleGeneration.value.3": "第三世代", - "singleGeneration.desc.3": "你只能使用第三世代的宝可梦", - "singleGeneration.value.4": "第四世代", - "singleGeneration.desc.4": "你只能使用第四世代的宝可梦", - "singleGeneration.value.5": "第五世代", - "singleGeneration.desc.5": "你只能使用第五世代的宝可梦", - "singleGeneration.value.6": "第六世代", - "singleGeneration.desc.6": "你只能使用第六世代的宝可梦", - "singleGeneration.value.7": "第七世代", - "singleGeneration.desc.7": "你只能使用第七世代的宝可梦", - "singleGeneration.value.8": "第八世代", - "singleGeneration.desc.8": "你只能使用第八世代的宝可梦", - "singleGeneration.value.9": "第九世代", - "singleGeneration.desc.9": "你只能使用第九世代的宝可梦", - "singleType.name": "单属性", - "singleType.value.0": "关闭", - "singleType.desc.0": "你只能使用所选属性的宝可梦", - "singleType.value.1": "普通", - "singleType.desc.1": "你只能使用普通属性的宝可梦", - "singleType.value.2": "格斗", - "singleType.desc.2": "你只能使用格斗属性的宝可梦", - "singleType.value.3": "飞行", - "singleType.desc.3": "你只能使用飞行属性的宝可梦", - "singleType.value.4": "毒", - "singleType.desc.4": "你只能使用毒属性的宝可梦", - "singleType.value.5": "地面", - "singleType.desc.5": "你只能使用地面属性的宝可梦", - "singleType.value.6": "岩石", - "singleType.desc.6": "你只能使用岩石属性的宝可梦", - "singleType.value.7": "虫", - "singleType.desc.7": "你只能使用虫属性的宝可梦", - "singleType.value.8": "幽灵", - "singleType.desc.8": "你只能使用幽灵属性的宝可梦", - "singleType.value.9": "钢", - "singleType.desc.9": "你只能使用钢属性的宝可梦", - "singleType.value.10": "火", - "singleType.desc.10": "你只能使用火属性的宝可梦", - "singleType.value.11": "水", - "singleType.desc.11": "你只能使用水属性的宝可梦", - "singleType.value.12": "草", - "singleType.desc.12": "你只能使用草属性的宝可梦", - "singleType.value.13": "电", - "singleType.desc.13": "你只能使用电属性的宝可梦", - "singleType.value.14": "超能", - "singleType.desc.14": "你只能使用超能属性的宝可梦", - "singleType.value.15": "冰", - "singleType.desc.15": "你只能使用冰属性的宝可梦", - "singleType.value.16": "龙", - "singleType.desc.16": "你只能使用龙属性的宝可梦", - "singleType.value.17": "恶", - "singleType.desc.17": "你只能使用恶属性的宝可梦", - "singleType.value.18": "妖精", - "singleType.desc.18": "你只能使用妖精属性的宝可梦", + "illegalEvolution": "{{pokemon}}变成了\n不符合此挑战条件的宝可梦!", + "singleGeneration": { + "name": "单一世代", + "desc": "你只能使用第{{gen}}\n世代的宝可梦", + "desc_default": "你只能使用所选\n世代的宝可梦", + "gen_1": "一", + "gen_2": "二", + "gen_3": "三", + "gen_4": "四", + "gen_5": "五", + "gen_6": "六", + "gen_7": "七", + "gen_8": "八", + "gen_9": "九", + }, + "singleType": { + "name": "单属性", + "desc": "你只能使用{{type}}\n属性的宝可梦", + "desc_default": "你只能使用所选\n属性的宝可梦" + }, } as const; diff --git a/src/locales/zh_CN/command-ui-handler.ts b/src/locales/zh_CN/command-ui-handler.ts index 3ab08355aaf..57397a930df 100644 --- a/src/locales/zh_CN/command-ui-handler.ts +++ b/src/locales/zh_CN/command-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "战斗", diff --git a/src/locales/zh_CN/common.ts b/src/locales/zh_CN/common.ts new file mode 100644 index 00000000000..29f54ff0dc9 --- /dev/null +++ b/src/locales/zh_CN/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "开始", +} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index 3f5504f64ce..1d987eaec16 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const zhCnConfig = { ability: ability, @@ -46,9 +50,11 @@ export const zhCnConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const zhCnConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/zh_CN/dialogue.ts b/src/locales/zh_CN/dialogue.ts index cbbc009f2e2..6afbcd71064 100644 --- a/src/locales/zh_CN/dialogue.ts +++ b/src/locales/zh_CN/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我晕船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "你要有麻烦了!" + }, + "victory": { + 1: "好讨厌的感觉啊!" + }, + }, + "magma_grunt": { + "encounter": { + 1: "如果你挡在熔岩队路上,那就别指望我们手下留情!" + }, + "victory": { + 1: "哈?我输了?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!" + }, + "victory": { + 1: "你在开玩笑吧?" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "别惹银河队!" + }, + "victory": { + 1: "停机了…" + }, + }, + "plasma_grunt": { + "encounter": { + 1: "异端不共戴天!" + }, + "victory": { + 1: "等离子子子子子子!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "时尚最重要!" + }, + "victory": { + 1: "未来一片黑暗啊…" + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "我不得不说,能来到这里,你的确很不简单!" + }, + "victory": { + 1: "什么!这不可能!" + }, + "defeat": { + 1: "记住我的话。无法衡量自己的力量,说明你还是个孩子。" + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "我的老伙计还需要我…你要挡我的路吗?" + }, + "victory": { + 1: "这怎么可能…?\n火箭队的梦想…就这么成为泡影了…" + }, + "defeat": { + 1: "火箭队会重生,而我会统治世界!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "我会亲手埋葬你,希望你能喜欢!" + }, + "victory": { + 1: "啊!你…很厉害…我落后了…一点…" + }, + "defeat": { + 1: "熔岩队必胜!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "你是我实现目标最后的障碍。\n准备好迎接我最强的一击吧!哈哈哈哈!" + }, + "victory": { + 1: "这…这不…呃" + }, + "defeat": { + 1: "现在…我要把这个星球变成人类的理想国度!" + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "我是海洋队的老大,所以,你的路大概走到头了。" + }, + "victory": { + 1: "下次再见吧。我会记住你的脸的。" + }, + "defeat": { + 1: "天才!我的队伍不会再退缩了!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "我等这一天很久了。\n这就是我的真实力量!" + }, + "victory": { + 1: "果然很强……啊!" + }, + "defeat": { + 1: "我会让这世界上的一切回归到最初的纯净状态!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "但在这之前,让我见识见识你那敢向银河队叫板的实力吧。" + }, + "victory": { + 1: "有意思,简直太有意思了。" + }, + "defeat": { + 1: "我要创造我的新世界…" + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "是啊,我和你还真是有缘呢。\n不过,这段孽缘…就让我在此斩断吧!" + }, + "victory": { + 1: "怎么可能!怎么可能!怎么可能!" + }, + "defeat": { + 1: "永别了。" + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "无论是谁做了什么!都无法阻止我!" + }, + "victory": { + 1: "怎么回事?我可是建立了等离子队的完美的人啊!\n是要改变世界的完美的统治者!" + }, + "defeat": { + 1: "我是坐拥世界的完美统治者!哇哈哈哈!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "来吧!让我看看你彻底绝望时的那张脸!" + }, + "victory": { + 1: "不!我的伟大目标!我要完全支配世界啊!" + }, + "defeat": { + 1: "酋雷姆!融合吧!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "你想要阻止我?在对战中展示给我看吧!" + }, + "victory": { + 1: "看来你的确是想要阻止我。但是,先等一下。" + }, + "defeat": { + 1: "宝可梦…不该存在。" + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "你我的未来…究竟哪个才正确,\n就让我们来问问各自的宝可梦吧!" + }, + "victory": { + 1: "哇啊啊啊!" + }, + "defeat": { + 1: "没有远见的蠢货会继续玷污这个美丽的世界。" + } + }, "brock": { "encounter": { 1: "我对岩石属性宝可梦的专精会击败你!来吧!", @@ -942,7 +1122,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "ramos": { "encounter": { - 1: "我用那些强壮的植物\n盖出来的游乐场精彩吗?$它们的力量象征著我这个园丁兼道馆馆主的实力,\n你真的确定能够与之抗衡吗?", + 1: "我用那些强壮的植物\n盖出来的游乐场精彩吗?$它们的力量象征着我这个园丁兼道馆馆主的实力,\n你真的确定能够与之抗衡吗?", }, "victory": { 1: "你信任你的宝可梦,\n它们也信任你…不错的战斗,小豆芽。", @@ -1278,13 +1458,13 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "agatha": { "encounter": { - 1: "Pokémon are for battling! I'll show you how a real Trainer battles!" + 1: "宝可梦是为战斗而生的! \n让我来告诉你什么是真正的战斗吧!" }, "victory": { - 1: "Oh my! You're something special, child!" + 1: "呵呵!你可真是了不起!" }, "defeat": { - 1: "Bahaha. That's how a proper battle's done!" + 1: "额哈哈哈,真正的战斗就是该这样。" } }, "flint": { @@ -1444,10 +1624,10 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "让你亲身感受一下什么叫做猛烈的对战气息吧!", }, "victory": { - 1: "这次幸运之神对我微笑了,但是……$谁知道我下次会不会这么幸运。", + 1: "这次幸运之神对你微笑了,但是……$谁知道你下次还会不会这么幸运。", }, "defeat": { - 1: "那可真厉害!", + 1: "那挺厉害的吧!", } }, "blue": { @@ -1995,16 +2175,42 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "raihan_elite": { "encounter": { - 1: "风暴来临!你能挺过这场战斗吗!", - 2: "准备好面对风暴之眼!", + 1: "虽然没法打败丹帝夺冠,\n让我觉得很遗憾……$但是有你这家伙当对手,\b倒是也还不赖啊!", + 2: "准备好面对龙之风暴!", }, "victory": { - 1: "你战胜了风暴...难以置信!", - 2: "你完美地驾驭了风……打得好!", + 1: "你的气势就像暴风一样,\n连我都甘拜下风了!", + 2: "你完美地驾驭了我的风暴……打得好!", }, "defeat": { - 1: "又一场风暴袭来,又一场胜利!打得好!", - 2: "你被我的风暴卷入了!祝你下次好运!", + 1: "又一场龙之风暴袭来,又一场胜利!打得好!", + 2: "你被我的龙之风暴卷入了!祝你下次好运!", + } + }, + "alder": { + "encounter": { + 1: "准备好和合众最强的训练家交手吧!" + }, + "victory": { + 1: "精彩!简直就是天下无双!" + }, + "defeat": { + 1: `战斗结束后,我的心像是吹过了温和的风…… + $真是厉害!` + } + }, + "kieran": { + "encounter": { + 1: `我的努力让我越来越强! + $所以我不会输。` + }, + "victory": { + 1: `不可能…… + $真是一场有趣又激动人心的战斗啊!` + }, + "defeat": { + 1: `哇塞,好一场战斗! + $你得多练练了。` } }, "rival": { @@ -2036,7 +2242,7 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "@c{smile_wave}哦,真巧,在这里遇见你。\n看来你还没输过嘛。@c{angry_mopen}哈……好家伙!$@c{angry_mopen}我知道你在想什么,\n不,我才不会跟踪你什么呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我为你感到高兴,但我只想让你知道\n有时输了是可以接受的。$@c{smile}我们从错误中学到的东西\n往往比我们一直成功时学到的还要多。$@c{angry_mopen}无论如何,我为了我们的复赛已经努力训练了\n所以你最好全力以赴!", }, "victory": { - 1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n 你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦!", + 1: "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦!", }, "defeat": { 1: "输了有时候也不要紧的…", @@ -2044,7 +2250,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_3": { "encounter": { - 1: "@c{smile}}嘿,看看这是谁!好久不见啊。$@c{neutral}你……还是没输过?哈…$@c{neutral_eclosed}这有点……不太对劲。$没有你一起,回家的感觉有很不一样。$@c{serious}虽然我知道这挺别扭的,但我就直说了。$@c{neutral_eclosed}我觉得你有点儿难以理喻。$@c{serious}没有人能够战无不胜。$失败乃成功之母。$@c{neutral_eclosed}你已经赢得了够好的成绩,\n但前面道阻且长,只会愈发艰难。 @c{neutral}你做好准备了没?$@c{serious_mopen_fists}如果做好了,证明给我看吧。", + 1: "@c{smile}嘿,看看这是谁!好久不见啊。$@c{neutral}你……还是没输过?哈…$@c{neutral_eclosed}这有点……不太对劲。$没有你一起,回家的感觉有很不一样。$@c{serious}虽然我知道这挺别扭的,但我就直说了。$@c{neutral_eclosed}我觉得你有点儿难以理喻。$@c{serious}没有人能够战无不胜。$失败乃成功之母。$@c{neutral_eclosed}你已经赢得了够好的成绩,\n但前面道阻且长,只会愈发艰难。 @c{neutral}你做好准备了没?$@c{serious_mopen_fists}如果做好了,证明给我看吧。", }, "victory": { 1: "@c{angry_mhalf}这太离谱了……我几乎从没停下训练……$我们之间的差距怎么还是这么大?", @@ -2052,7 +2258,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_3_female": { "encounter": { - 1: "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n 不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}}现在,给你看看我变得多强了吧!", + 1: "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!", }, "victory": { 1: "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……", @@ -2110,7 +2316,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_6_female": { "encounter": { - 1: "@c{smile_ehalf}又只有我们两个人了。$@c{smile_eclosed}你知道吗,我在心里想啊想,\n想了好久……$@c{smile_ehalf}这一切背后是有什么原因吗,\n为什么一切现在看起来都这么奇怪……$@c{smile}你有你的梦想,而我内心有这个抱负……$我不禁感觉这一切背后有一个更庞大的力量,$掌控者我们所做的一切,你和我之间。$@c{smile_eclosed}}我想我注定要推动你……到你的极限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到现在为止,我已经尽力了。$这个奇怪而可怕的地方……\n一切看起来都那么清晰……$这是世界早已记录的一切。$@c{smile_eclosed}我好像记不清我们一起度过的日子了。$@c{smile_ehalf}那些回忆到底是真的吗?\n怎么感觉这么久远……$@c{angry_mopen}你得继续前进,不然的话,这一切将永无止境。\n你是唯一能做到这件事的。$@c{smile_ehalf}}我……不知道这一切意味着什么……\n但我明白$@c{neutral}如果你现在不能就此击败我,\n你将毫无机会可言。", + 1: "@c{smile_ehalf}又只有我们两个人了。$@c{smile_eclosed}你知道吗,我在心里想啊想,\n想了好久……$@c{smile_ehalf}这一切背后是有什么原因吗,\n为什么一切现在看起来都这么奇怪……$@c{smile}你有你的梦想,而我内心有这个抱负……$我不禁感觉这一切背后有一个更庞大的力量,$掌控者我们所做的一切,你和我之间。$@c{smile_eclosed}我想我注定要推动你……到你的极限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到现在为止,我已经尽力了。$这个奇怪而可怕的地方……\n一切看起来都那么清晰……$这是世界早已记录的一切。$@c{smile_eclosed}我好像记不清我们一起度过的日子了。$@c{smile_ehalf}那些回忆到底是真的吗?\n怎么感觉这么久远……$@c{angry_mopen}你得继续前进,不然的话,这一切将永无止境。\n你是唯一能做到这件事的。$@c{smile_ehalf}我……不知道这一切意味着什么……\n但我明白$@c{neutral}如果你现在不能就此击败我,\n你将毫无机会可言。", }, "victory": { 1: "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答应我……在你拯救世界之后\n……要……平安到家。$@c{smile_ehalf}……谢谢你。", @@ -2129,7 +2335,7 @@ export const PGMbattleSpecDialogue: SimpleTranslationEntries = { $你被吸引到这里,因为你以前就来过这里。\n无数次。 $尽管,或许可以数一数。\n准确地说,这实际上是你的第5,643,853次循环。 $每一次循环,你的思想都会恢复到之前的状态。\n即便如此,不知何故,你之前自我的残留仍然存在。 - $直到现在,你仍未成功,但我感觉这次你身上有一种异样的气息。\n + $直到现在,你仍未成功,\n但我感觉这次你身上有一种异样的气息。 $你是这里唯一的人,尽管感觉上还有……另一个人。 $你最终会成为对我来的一个硬茬吗?\n我渴望了数千年的挑战? $我们,开始。`, diff --git a/src/locales/zh_CN/egg.ts b/src/locales/zh_CN/egg.ts index 99916ab0778..35334d75bdd 100644 --- a/src/locales/zh_CN/egg.ts +++ b/src/locales/zh_CN/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "蛋", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你没有足够的兑换券!", "tooManyEggs": "你的蛋太多啦!", "pull": "次", - "pulls": "次" + "pulls": "次", + "sameSpeciesEgg": "{{species}}将会从蛋中孵化!", + "hatchFromTheEgg": "{{pokemonName}} 从蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解锁: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解锁: {{moveName}}", } as const; diff --git a/src/locales/zh_CN/fight-ui-handler.ts b/src/locales/zh_CN/fight-ui-handler.ts index 7ccab7561da..07865250d9f 100644 --- a/src/locales/zh_CN/fight-ui-handler.ts +++ b/src/locales/zh_CN/fight-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "威力", "accuracy": "命中", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被动 ", // The space at the end is important } as const; diff --git a/src/locales/zh_CN/game-mode.ts b/src/locales/zh_CN/game-mode.ts index be342b4c390..ed96ac4c78e 100644 --- a/src/locales/zh_CN/game-mode.ts +++ b/src/locales/zh_CN/game-mode.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", + "classic": "经典模式", + "endless": "无尽模式", + "endlessSpliced": "融合无尽模式", + "dailyRun": "每日挑战", + "unknown": "未知", + "challenge": "挑战模式", } as const; diff --git a/src/locales/zh_CN/game-stats-ui-handler.ts b/src/locales/zh_CN/game-stats-ui-handler.ts index f44e1d8b9e9..9fb3b9f5af8 100644 --- a/src/locales/zh_CN/game-stats-ui-handler.ts +++ b/src/locales/zh_CN/game-stats-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { "stats": "统计", diff --git a/src/locales/zh_CN/growth.ts b/src/locales/zh_CN/growth.ts index 33a1dec8bb8..9362810c4f8 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"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { - "Erratic": "最快", - "Fast": "较快", - "Medium_Fast": "快", - "Medium_Slow": "慢", - "Slow": "较慢", - "Fluctuating": "最慢" -} as const; + "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 e3d0d158e33..71d79472a45 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "游戏设置", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "导入数据", "exportData": "导出数据", "cancel": "取消", - "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。是否\n继续?" + "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", + "noEggs": "当前没有任何蛋\n正在孵化中!" } as const; diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 39d8e5e3a04..c19c41333e8 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "会话加载成功。", "failedToLoadSession": "无法加载您的会话数据。它可能已损坏。", "boyOrGirl": "你是男孩还是女孩?", - "boy": "男孩", - "girl": "女孩", "evolving": "咦?\n{{pokemonName}} 开始进化了!", "stoppedEvolving": "{{pokemonName}} 停止了进化。", "pauseEvolutionsQuestion": "你确定要停止 {{pokemonName}} 的进化吗?\n你可以在队伍界面中重新进化。", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "每日排名", "weeklyRankings": "每周排名", "noRankings": "无排名", + "positionIcon": "#", + "usernameScoreboard": "用户名", + "score": "分数", + "wave": "层数", "loading": "加载中...", - "loadingAsset": "Loading asset: {{assetName}}", + "loadingAsset": "加载资源: {{assetName}}", "playersOnline": "在线玩家", "yes": "是", "no": "否", - "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed." + "disclaimer": "免责声明", + "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", + "choosePokemon": "选择一只宝可梦。", + "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", } as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 92617e39741..3ac9ac196cd 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "为一只宝可梦回复 {{restorePoints}} HP 或 {{restorePercent}}% HP,取较大值。", + description: "为一只宝可梦回复{{restorePoints}}HP或{{restorePercent}}%HP,取较大值。", extra: { "fully": "为一只宝可梦回复全部HP。", "fullyWithStatus": "为一只宝可梦回复全部HP并消除所有负面\n状态。", @@ -42,11 +42,11 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonPpUpModifierType": { - description: "为一只宝可梦的一个招式永久增加{{upPoints}}点\nPP每5点当前最大PP (最多3点)。", + description: "选择一只宝可梦的一个招式使用\n使其PP最大值提升基础的20% (最多3次)。", }, "PokemonNatureChangeModifierType": { name: "{{natureName}}薄荷", - description: "将一只宝可梦的性格改为{{natureName}}并为该宝可\n梦永久解锁该性格。", + description: "将一只宝可梦的性格改为{{natureName}}并为\n该宝可梦永久解锁该性格。", }, "DoubleBattleChanceBoosterModifierType": { description: "接下来的{{battleCount}}场战斗是双打的概率翻倍。", @@ -64,16 +64,16 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "所有成员宝可梦等级提升1级。", }, "PokemonBaseStatBoosterModifierType": { - description: "增加持有者的{{statName}}10%,个体值越高堆叠\n上限越高。", + description: "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。", }, "AllPokemonFullHpRestoreModifierType": { description: "所有宝可梦完全回复HP。", }, "AllPokemonFullReviveModifierType": { - description: "复活所有濒死宝可梦,完全回复HP。", + description: "复活所有濒死的宝可梦,\n并完全回复HP。", }, "MoneyRewardModifierType": { - description: "获得{{moneyMultiplier}}金钱 (₽{{moneyAmount}})。", + description: "获得{{moneyMultiplier}}金钱(₽{{moneyAmount}})。", extra: { "small": "少量", "moderate": "中等", @@ -90,18 +90,18 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "每场战斗获得的好感度提升50%。", }, "PokemonMoveAccuracyBoosterModifierType": { - description: "招式命中率增加{{accuracyAmount}} (最大100)。", + description: "招式命中率增加{{accuracyAmount}}(最大100)。", }, "PokemonMultiHitModifierType": { - description: "攻击造成一次额外伤害,每次堆叠额外伤害\n分别衰减60/75/82.5%。", + description: "攻击以40/25/12.5%的伤害造成2/3/4次伤害", }, "TmModifierType": { - name: "招式学习器 {{moveId}} - {{moveName}}", + name: "招式学习器\n{{moveId}} - {{moveName}}", description: "教会一只宝可梦{{moveName}}。", }, "TmModifierTypeWithInfo": { - name: "招式学习器 {{moveId}} - {{moveName}}", - description: "教会一只宝可梦{{moveName}}\n(Hold C or Shift for more info)。", + name: "招式学习器\n{{moveId}} - {{moveName}}", + description: "教会一只宝可梦{{moveName}}\n(按住C或者Shift查看更多信息)。", }, "EvolutionItemModifierType": { description: "使某些宝可梦进化。", @@ -114,29 +114,29 @@ export const modifierType: ModifierTypeTranslationEntries = { }, "TerastallizeModifierType": { name: "{{teraType}}太晶碎块", - description: "持有者获得{{teraType}}太晶化10场战斗。", + description: "持有者获得{{teraType}}太晶化,\n持续10场战斗。", }, "ContactHeldItemTransferChanceModifierType": { - description: "攻击时{{chancePercent}}%概率偷取对手物品。", + description: "攻击时{{chancePercent}}%概率\n偷取对手物品。", }, "TurnHeldItemTransferModifierType": { - description: "持有者每回合从对手那里获得一个持有的物品。", + description: "持有者每回合从对手那里\n获得一个持有的物品。", }, "EnemyAttackStatusEffectChanceModifierType": { description: "攻击时{{chancePercent}}%概率造成{{statusEffect}}。", }, "EnemyEndureChanceModifierType": { - description: "增加{{chancePercent}}%遭受攻击的概率。", + description: "敌方增加{{chancePercent}}%的概率\n在本回合不会倒下。", }, "RARE_CANDY": { name: "神奇糖果" }, "RARER_CANDY": { name: "超神奇糖果" }, - "MEGA_BRACELET": { name: "超级手镯", description: "能让携带着超级石战斗的宝可梦进行\n超级进化。" }, - "DYNAMAX_BAND": { name: "极巨腕带", description: "能让携带着极巨菇菇战斗的宝可梦进行\n极巨化。" }, - "TERA_ORB": { name: "太晶珠", description: "能让携带着太晶碎块战斗的宝可梦进行\n太晶化。" }, + "MEGA_BRACELET": { name: "MEGA手镯", description: "能让携带着MEGA石战斗的宝可梦\n进行MEGA进化。" }, + "DYNAMAX_BAND": { name: "极巨腕带", description: "能让携带着极巨菇菇战斗的宝可梦\n进行超极巨化。" }, + "TERA_ORB": { name: "太晶珠", description: "能让携带着太晶碎块战斗的宝可梦\n进行太晶化。" }, - "MAP": { name: "地图", description: "允许你在切换宝可梦群落时选择目的地。"}, + "MAP": { name: "地图", description: "有概率允许你在切换地区时\n选择目的地。"}, "POTION": { name: "伤药" }, "SUPER_POTION": { name: "好伤药" }, @@ -169,7 +169,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "MEMORY_MUSHROOM": { name: "回忆蘑菇", description: "回忆一个宝可梦已经遗忘的招式。" }, "EXP_SHARE": { name: "学习装置", description: "未参加对战的宝可梦获得20%的经验值。" }, - "EXP_BALANCE": { name: "均衡型学习装置", description: "队伍中的低级宝可梦获得更多经验值。" }, + "EXP_BALANCE": { name: "均衡型学习装置", description: "经验值会更多分给队伍中等级最低的宝可梦。" }, "OVAL_CHARM": { name: "圆形护符", description: "当多只宝可梦参与战斗,分别获得总经验值\n10%的额外经验值。" }, @@ -182,17 +182,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, - "SOUL_DEW": { name: "心之水滴", description: "增加宝可梦性格影响10% (加算)。" }, + "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, + + "SOUL_DEW": { name: "心之水滴", description: "增加10%宝可梦性格对数值的影响 (加算)。" }, "NUGGET": { name: "金珠" }, "BIG_NUGGET": { name: "巨大金珠" }, "RELIC_GOLD": { name: "古代金币" }, - "AMULET_COIN": { name: "护符金币", description: "金钱奖励增加20%。" }, + "AMULET_COIN": { name: "护符金币", description: "获得的金钱增加20%。" }, "GOLDEN_PUNCH": { name: "黄金拳头", description: "将50%造成的伤害转换为金钱。" }, - "COIN_CASE": { name: "代币盒", description: "每十场战斗, 获得自己金钱10%的利息。" }, + "COIN_CASE": { name: "代币盒", description: "每10场战斗, 获得自己金钱10%的利息。" }, - "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在刷新物品时锁定物品稀有度。" }, + "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在商店中刷新物品时,\n锁定物品的稀有度。" }, "GRIP_CLAW": { name: "紧缠钩爪" }, "WIDE_LENS": { name: "广角镜" }, @@ -204,33 +206,33 @@ export const modifierType: ModifierTypeTranslationEntries = { "BERRY_POUCH": { name: "树果袋", description: "使用树果时有30%的几率不会消耗树果。" }, - "FOCUS_BAND": { name: "气势头带", description: "携带该道具的宝可梦有10%几率在受到\n攻击而将陷入濒死状态时,保留1点HP不陷入濒死状态。" }, + "FOCUS_BAND": { name: "气势头带", description: "携带该道具的宝可梦有10%几率在受到攻击\n而将陷入濒死状态时,保留1点HP不陷入濒死状态。" }, "QUICK_CLAW": { name: "先制之爪", description: "有10%的几率无视速度优先使出招式\n(先制技能优先)。" }, - "KINGS_ROCK": { name: "王者之证", description: "携带该道具的宝可梦使用任意原本不会造成\n畏缩状态的攻击招式并造成伤害时,有\n10%几率使目标陷入畏缩状态。" }, + "KINGS_ROCK": { name: "王者之证", description: "使用任意原本不会造成畏缩状态的攻击,\n有10%几率使目标陷入畏缩状态。" }, - "LEFTOVERS": { name: "吃剩的东西", description: "携带该道具的宝可梦在每个回合结束时恢复\n最大HP的1/16。" }, - "SHELL_BELL": { name: "贝壳之铃", description: "携带该道具的宝可梦在攻击对方成功造成伤\n害时,携带者的HP会恢复其所造成伤害\n的1/8。" }, + "LEFTOVERS": { name: "吃剩的东西", description: "携带后,在每个回合结束时恢复\n最大HP的1/16。" }, + "SHELL_BELL": { name: "贝壳之铃", description: "携带后,在攻击对方成功造成伤害时,\n携带者的HP会恢复其所造成伤害的1/8。" }, - "TOXIC_ORB": { name: "Toxic Orb", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, - "FLAME_ORB": { name: "Flame Orb", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, + "TOXIC_ORB": { name: "剧毒宝珠", description: "触碰后会放出毒的神奇宝珠。携带后,在战斗时会变成剧毒状态。" }, + "FLAME_ORB": { name: "火焰宝珠", description: "触碰后会放出热量的神奇宝珠。携带后,在战斗时会变成灼伤状态。" }, "BATON": { name: "接力棒", description: "允许在切换宝可梦时保留能力变化, 对陷阱\n同样生效。" }, "SHINY_CHARM": { name: "闪耀护符", description: "显著增加野生宝可梦的闪光概率。" }, "ABILITY_CHARM": { name: "特性护符", description: "显著增加野生宝可梦有隐藏特性的概率。" }, - "IV_SCANNER": { name: "个体值探测器", description: "允许扫描野生宝可梦的个体值。可叠加,每多拥有一个多显示\n2项个体值. 最好的个体值优先显示。" }, + "IV_SCANNER": { name: "个体值探测器", description: "允许扫描野生宝可梦的个体值。每多拥有一个\n多显示两项个体值,优先显示最高项。" }, "DNA_SPLICERS": { name: "基因之楔" }, "MINI_BLACK_HOLE": { name: "迷你黑洞" }, - "GOLDEN_POKEBALL": { name: "黄金精灵球", description: "在每场战斗结束后增加一个额外物品选项。" }, + "GOLDEN_POKEBALL": { name: "黄金精灵球", description: "在每场战斗结束后,增加一个额外物品选项。" }, - "ENEMY_DAMAGE_BOOSTER": { name: "伤害硬币", description: "增加5%造成伤害。" }, - "ENEMY_DAMAGE_REDUCTION": { name: "防御硬币", description: "减少2.5%承受伤害。" }, + "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: "麻痹硬币" }, @@ -239,6 +241,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_ENDURE_CHANCE": { name: "忍受硬币" }, "ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率。" }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "电气球", description: "让皮卡丘携带后,攻击和特攻就会提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨头", description: "某种坚硬的骨头。让卡拉卡拉或嘎啦嘎啦携带后,攻击就会提高。" }, + "METAL_POWDER": { name: "金属粉", description: "让百变怪携带后,防御就会提高的神奇粉末。非常细腻坚硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "让百变怪携带后,速度就会提高的神奇粉末。非常细腻坚硬。" } + }, TempBattleStatBoosterItem: { "x_attack": "力量强化", "x_defense": "防御强化", @@ -248,6 +256,19 @@ export const modifierType: ModifierTypeTranslationEntries = { "x_accuracy": "命中强化", "dire_hit": "要害攻击", }, + + TempBattleStatBoosterStatName: { + "ATK": "攻击", + "DEF": "防御", + "SPATK": "特攻", + "SPDEF": "特防", + "SPD": "速度", + "ACC": "命中", + "CRIT": "会心", + "EVA": "闪避", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { "silk_scarf": "丝绸围巾", "black_belt": "黑带", @@ -277,7 +298,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "carbos": "速度增强剂", }, EvolutionItem: { - "NONE": "None", + "NONE": "无", "LINKING_CORD": "联系绳", "SUN_STONE": "日之石", @@ -310,7 +331,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "SYRUPY_APPLE": "蜜汁苹果", }, FormChangeItem: { - "NONE": "None", + "NONE": "无", "ABOMASITE": "暴雪王进化石", "ABSOLITE": "阿勃梭鲁进化石", diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index dfbd66bcf4f..f75ca001548 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { "pound": { @@ -671,7 +671,7 @@ export const move: MoveTranslationEntries = { }, "thief": { name: "小偷", - effect: "攻击的同时盗取道具。当自\n己携带道具时,不会去盗取", + effect: "攻击的同时盗取对手的道具。", }, "spiderWeb": { name: "蛛网", diff --git a/src/locales/zh_CN/nature.ts b/src/locales/zh_CN/nature.ts index 80fd8d89869..d4447e8b03d 100644 --- a/src/locales/zh_CN/nature.ts +++ b/src/locales/zh_CN/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "勤奋", diff --git a/src/locales/zh_CN/party-ui-handler.ts b/src/locales/zh_CN/party-ui-handler.ts index 6f4f4f4c88a..52529bf8fa9 100644 --- a/src/locales/zh_CN/party-ui-handler.ts +++ b/src/locales/zh_CN/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { "SEND_OUT": "上场", diff --git a/src/locales/zh_CN/pokeball.ts b/src/locales/zh_CN/pokeball.ts index 6bf20f7e276..b8df88983bb 100644 --- a/src/locales/zh_CN/pokeball.ts +++ b/src/locales/zh_CN/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "精灵球", diff --git a/src/locales/zh_CN/pokemon-info-container.ts b/src/locales/zh_CN/pokemon-info-container.ts index fae75e773b9..f7072276e65 100644 --- a/src/locales/zh_CN/pokemon-info-container.ts +++ b/src/locales/zh_CN/pokemon-info-container.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { "moveset": "招式", diff --git a/src/locales/zh_CN/pokemon-info.ts b/src/locales/zh_CN/pokemon-info.ts index 4c12acc3e67..f7aaf3a33cb 100644 --- a/src/locales/zh_CN/pokemon-info.ts +++ b/src/locales/zh_CN/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "特防", "SPDEFshortened": "特防", "SPD": "速度", - "SPDshortened": "速度" + "SPDshortened": "速度", + "ACC": "命中率", + "EVA": "回避率" }, Type: { @@ -38,4 +40,4 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "FAIRY": "妖精", "STELLAR": "星晶", }, -} as const; +} as const; diff --git a/src/locales/zh_CN/pokemon.ts b/src/locales/zh_CN/pokemon.ts index 6d6e372046e..5ff670637f4 100644 --- a/src/locales/zh_CN/pokemon.ts +++ b/src/locales/zh_CN/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "妙蛙种子", diff --git a/src/locales/zh_CN/save-slot-select-ui-handler.ts b/src/locales/zh_CN/save-slot-select-ui-handler.ts index 0d657235e49..001ecbe2d00 100644 --- a/src/locales/zh_CN/save-slot-select-ui-handler.ts +++ b/src/locales/zh_CN/save-slot-select-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", + "overwriteData": "要覆盖该槽位的存档吗?", "loading": "正在加载中...", - "wave": "Wave", + "wave": "层数", "lv": "Lv", "empty": "空", } as const; diff --git a/src/locales/zh_CN/settings.ts b/src/locales/zh_CN/settings.ts new file mode 100644 index 00000000000..3ca6cb435c6 --- /dev/null +++ b/src/locales/zh_CN/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "男孩", + "girl": "女孩", + "general": "常规", + "display": "显示", + "audio": "音频", + "gamepad": "手柄", + "keyboard": "键盘", + "gameSpeed": "游戏速度", + "hpBarSpeed": "血条速度", + "expGainsSpeed": "经验值获取动画速度", + "expPartyDisplay": "显示队伍经验", + "skipSeenDialogues": "跳过已读对话", + "battleStyle": "对战模式", + "enableRetries": "允许重试", + "tutorials": "教程", + "touchControls": "触摸操作", + "vibrations": "手柄震动", + "normal": "普通", + "fast": "快", + "faster": "更快", + "skip": "跳过", + "levelUpNotifications": "升级提示", + "on": "启用", + "off": "禁用", + "switch": "切换", + "set": "固定", + "auto": "自动", + "disabled": "禁用", + "language": "语言", + "change": "选择", + "uiTheme": "界面风格", + "default": "默认", + "legacy": "经典", + "windowType": "窗口类型", + "moneyFormat": "金钱格式", + "damageNumbers": "伤害数字", + "simple": "简单", + "fancy": "华丽", + "abbreviated": "缩略", + "moveAnimations": "招式动画", + "showStatsOnLevelUp": "升级时显示能力值", + "candyUpgradeNotification": "糖果升级提示", + "passivesOnly": "仅被动", + "candyUpgradeDisplay": "糖果升级显示", + "icon": "图标", + "animation": "动画", + "moveInfo": "招式信息", + "showMovesetFlyout": "显示招式池弹窗", + "showArenaFlyout": "显示战场弹窗", + "showTimeOfDayWidget": "显示时间指示器", + "timeOfDayAnimation": "时间指示器动画", + "bounce": "弹跳", + "timeOfDay_back": "不弹", + "spriteSet": "宝可梦动画", + "consistent": "默认", + "mixedAnimated": "全部动画", + "fusionPaletteSwaps": "融合色调切换", + "playerGender": "玩家性别", + "typeHints": "属性提示", + "masterVolume": "主音量", + "bgmVolume": "音乐", + "seVolume": "音效", + "musicPreference": "音乐偏好", + "mixed": "全曲混合", + "gamepadPleasePlug": "请链接手柄或按任意键", + "delete": "删除", + "keyboardPleasePress": "请点击键盘上的对应按键", + "reset": "重置", + "requireReload": "需要重新加载", + "action": "操作", + "back": "返回", + "pressToBind": "按下以绑定", + "pressButton": "请按键……", + "buttonUp": "上", + "buttonDown": "下", + "buttonLeft": "左", + "buttonRight": "右", + "buttonAction": "确认", + "buttonMenu": "菜单", + "buttonSubmit": "提交", + "buttonCancel": "取消", + "buttonStats": "状态", + "buttonCycleForm": "切换形态", + "buttonCycleShiny": "切换闪光", + "buttonCycleGender": "切换性别", + "buttonCycleAbility": "切换特性", + "buttonCycleNature": "切换性格", + "buttonCycleVariant": "切换变种", + "buttonSpeedUp": "加速", + "buttonSlowDown": "减速", + "alt": " (备用)", + "mute": "静音", + "controller": "控制器", + "gamepadSupport": "手柄支持", + "showBgmBar": "显示音乐名称", +} as const; diff --git a/src/locales/zh_CN/splash-messages.ts b/src/locales/zh_CN/splash-messages.ts index 1d5cf09fc16..35551cf1163 100644 --- a/src/locales/zh_CN/splash-messages.ts +++ b/src/locales/zh_CN/splash-messages.ts @@ -1,37 +1,37 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; 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!", + "battlesWon": "场胜利!", + "joinTheDiscord": "加入Discord!", + "infiniteLevels": "等级无限!", + "everythingStacks": "道具全部叠加!", + "optionalSaveScumming": "可用SL大法!", + "biomes": "35种地区!", + "openSource": "开源!", + "playWithSpeed": "请五倍速游玩!", + "liveBugTesting": "随时修复BUG!", + "heavyInfluence": "深受雨中冒险2影响!", + "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": "Yume Nikki 页游项目!", } 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 803e64e0439..059358078f4 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -21,15 +21,17 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "passive": "被动:", "nature": "性格:", "eggMoves": "蛋招式", - "start": "开始", "addToParty": "加入队伍", - "toggleIVs": "切换个体值", + "toggleIVs": "显示个体", "manageMoves": "管理招式", + "manageNature": "管理性格", "useCandies": "使用糖果", + "selectNature": "选择性格", "selectMoveSwapOut": "选择要替换的招式。", "selectMoveSwapWith": "选择要替换成的招式", "unlockPassive": "解锁被动", "reduceCost": "降低花费", + "sameSpeciesEgg": "兑换一颗蛋", "cycleShiny": ": 闪光", "cycleForm": ": 形态", "cycleGender": ": 性别", diff --git a/src/locales/zh_CN/status-effect.ts b/src/locales/zh_CN/status-effect.ts new file mode 100644 index 00000000000..b9df1733bc1 --- /dev/null +++ b/src/locales/zh_CN/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "无", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "中毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中毒了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中毒了!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + toxic: { + name: "剧毒", + description: "中毒", + obtain: "{{pokemonNameWithAffix}}中了剧毒!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}中了剧毒!", + activation: "{{pokemonNameWithAffix}}受到了毒的伤害!", + overlap: "{{pokemonNameWithAffix}}已经中毒了!", + heal: "{{pokemonNameWithAffix}}中的毒彻底清除了!" + }, + paralysis: { + name: "麻痹", + description: "麻痹", + obtain: "{{pokemonNameWithAffix}}麻痹了,很难使出招式!", + obtainSource: "{{pokemonNameWithAffix}}被{{sourceText}}麻痹了,很难使出招式!", + activation: "{{pokemonNameWithAffix}}因身体麻痹而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经麻痹了!", + heal: "{{pokemonNameWithAffix}}的麻痹治愈了!" + }, + sleep: { + name: "睡眠", + description: "睡眠", + obtain: "{{pokemonNameWithAffix}}睡着了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}睡着了!", + activation: "{{pokemonNameWithAffix}}正在呼呼大睡。", + overlap: "{{pokemonNameWithAffix}}已经睡着了!", + heal: "{{pokemonNameWithAffix}}醒了!" + }, + freeze: { + name: "冰冻", + description: "冰冻", + obtain: "{{pokemonNameWithAffix}}冻住了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}冻住了!", + activation: "{{pokemonNameWithAffix}}因冻住了而无法行动!", + overlap: "{{pokemonNameWithAffix}}已经冻住了!", + heal: "{{pokemonNameWithAffix}}治愈了冰冻状态!" + }, + burn: { + name: "灼伤", + description: "灼伤", + obtain: "{{pokemonNameWithAffix}}被灼伤了!", + obtainSource: "{{pokemonNameWithAffix}}因{{sourceText}}被灼伤了!", + activation: "{{pokemonNameWithAffix}}受到了灼伤的伤害!", + overlap: "{{pokemonNameWithAffix}}已经被灼伤了!", + heal: "{{pokemonNameWithAffix}}的灼伤治愈了!" + }, +} as const; diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 28b0760cc9b..534685d05d1 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -13,6 +13,12 @@ export const titles: SimpleTranslationEntries = { "rival": "劲敌", "professor": "博士", "frontier_brain": "开拓头脑", + "rocket_boss": "火箭队老大", + "magma_boss": "熔岩队老大", + "aqua_boss": "海洋队老大", + "galactic_boss": "银河队老大", + "plasma_boss": "等离子队老大", + "flare_boss": "闪焰队老大", // 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; @@ -48,7 +54,7 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "铁路员工", "doctor": "医生", "doctor_female": "医生", - "firebreather": "Firebreather", + "firebreather": "吹火人", "fisherman": "垂钓者", "fisherman_female": "垂钓者", "gentleman": "绅士", @@ -87,13 +93,13 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "宝可梦巡护员组合", "ranger": "巡护员", "restaurant_staff": "服务生组合", - "rich": "Rich", - "rich_female": "Rich", + "rich": "富豪", + "rich_female": "富豪太太", "rich_boy": "富家少爷", "rich_couple": "富豪夫妇", - "rich_kid": "Rich Kid", - "rich_kid_female": "Rich Kid", - "rich_kids": "富二代组合", + "rich_kid": "富家小孩", + "rich_kid_female": "富家小孩", + "rich_kids": "富家小孩组合", "roughneck": "光头男", "sailor": "水手", "scientist": "研究员", @@ -118,7 +124,19 @@ export const trainerClasses: SimpleTranslationEntries = { "worker": "工人", "worker_female": "工人", "workers": "工人组合", - "youngster": "短裤小子" + "youngster": "短裤小子", + "rocket_grunt": "火箭队手下", + "rocket_grunt_female": "火箭队手下", + "magma_grunt": "熔岩队手下", + "magma_grunt_female": "熔岩队手下", + "aqua_grunt": "海洋队手下", + "aqua_grunt_female": "海洋队手下", + "galactic_grunt": "银河队手下", + "galactic_grunt_female": "银河队手下", + "plasma_grunt": "等离子队手下", + "plasma_grunt_female": "等离子队手下", + "flare_grunt": "闪焰队手下", + "flare_grunt_female": "闪焰队手下", } as const; // Names of special trainers like gym leaders, elite four, and the champion @@ -304,6 +322,13 @@ export const trainerNames: SimpleTranslationEntries = { "rival": "芬恩", "rival_female": "艾薇", + // ---- 组织老大 Bosses ---- + "maxie": "赤焰松", + "archie": "水梧桐", + "cyrus": "赤日", + "ghetsis": "魁奇思", + "lysandre": "弗拉达利", + // Double Names "blue_red_double": "青绿 & 赤红", diff --git a/src/locales/zh_CN/tutorial.ts b/src/locales/zh_CN/tutorial.ts index 8b0e5aad8fd..e9c428aac9f 100644 --- a/src/locales/zh_CN/tutorial.ts +++ b/src/locales/zh_CN/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `欢迎来到PokéRogue!这是一款以战斗为核心的\n融合了roguelite元素的宝可梦同人游戏。 diff --git a/src/locales/zh_CN/voucher.ts b/src/locales/zh_CN/voucher.ts index f7ef39b1df3..613c96c6da8 100644 --- a/src/locales/zh_CN/voucher.ts +++ b/src/locales/zh_CN/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "兑换券", @@ -8,4 +8,4 @@ export const voucher: SimpleTranslationEntries = { "eggVoucherGold": "黄金扭蛋券", "locked": "锁定", "defeatTrainer": "你打败了{{trainerName}}" -} as const; +} as const; diff --git a/src/locales/zh_CN/weather.ts b/src/locales/zh_CN/weather.ts index 874b17f8fe8..ad1ecc65007 100644 --- a/src/locales/zh_CN/weather.ts +++ b/src/locales/zh_CN/weather.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index 1281a8720c1..c436e5021f7 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -1,8 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { - "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", - "badDreams": "{{pokemonName}} 被折磨着!", - "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", - "iceFaceAvoidedDamage": "{{pokemonName}} avoided\ndamage with {{abilityName}}!" + "blockRecoilDamage" : "{{pokemonName}} 的 {{abilityName}}\n抵消了反作用力!", + "badDreams": "{{pokemonName}} 被折磨着!", + "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", + "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", + "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", + "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", } as const; diff --git a/src/locales/zh_TW/ability.ts b/src/locales/zh_TW/ability.ts index a99d0acd10c..9fa520a81ff 100644 --- a/src/locales/zh_TW/ability.ts +++ b/src/locales/zh_TW/ability.ts @@ -1,4 +1,4 @@ -import { AbilityTranslationEntries } from "#app/plugins/i18n.js"; +import { AbilityTranslationEntries } from "#app/interfaces/locales.js"; export const ability: AbilityTranslationEntries = { stench: { diff --git a/src/locales/zh_TW/achv.ts b/src/locales/zh_TW/achv.ts index bf1bfc295e8..8b85f59447e 100644 --- a/src/locales/zh_TW/achv.ts +++ b/src/locales/zh_TW/achv.ts @@ -1,268 +1,268 @@ -import { AchievementTranslationEntries } from "#app/plugins/i18n.js"; +import { AchievementTranslationEntries } from "#app/interfaces/locales.js"; // Achievement translations for the when the player character is male export const PGMachv: AchievementTranslationEntries = { "Achievements": { - name: "Achievements", + name: "成就", }, "Locked": { - name: "Locked", + name: "未解鎖", }, "MoneyAchv": { - description: "Accumulate a total of ₽{{moneyAmount}}", + description: "累計獲得 ₽{{moneyAmount}}", }, "10K_MONEY": { - name: "Money Haver", + name: "小有積蓄", }, "100K_MONEY": { - name: "Rich", + name: "大戶人家", }, "1M_MONEY": { - name: "Millionaire", + name: "百萬富翁", }, "10M_MONEY": { - name: "One Percenter", + name: "暴發戶", }, "DamageAchv": { - description: "Inflict {{damageAmount}} damage in one hit", + description: "在單次攻擊中造成 {{damageAmount}} 點傷害", }, "250_DMG": { - name: "Hard Hitter", + name: "重拳出擊", }, "1000_DMG": { - name: "Harder Hitter", + name: "神拳猛擊", }, "2500_DMG": { - name: "That's a Lotta Damage!", + name: "奪少?", }, "10000_DMG": { - name: "One Punch Man", + name: "一拳超人", }, "HealAchv": { - description: "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item", + description: "通過技能、能力或攜帶的道具一次性治療 {{healAmount}} {{HP}}點", }, "250_HEAL": { - name: "Novice Healer", + name: "新手奶媽", }, "1000_HEAL": { - name: "Big Healer", + name: "治療擔當", }, "2500_HEAL": { - name: "Cleric", + name: "牧師", }, "10000_HEAL": { - name: "Recovery Master", + name: "泉水", }, "LevelAchv": { - description: "Level up a Pokémon to Lv{{level}}", + description: "將一隻寶可夢提升到 Lv{{level}}", }, "LV_100": { - name: "But Wait, There's More!", + name: "别急,後面還有", }, "LV_250": { - name: "Elite", + name: "精英", }, "LV_1000": { - name: "To Go Even Further Beyond", + name: "天外有天", }, "RibbonAchv": { - description: "Accumulate a total of {{ribbonAmount}} Ribbons", + description: "累計獲得 {{ribbonAmount}} 個勛章", }, "10_RIBBONS": { - name: "Pokémon League Champion", + name: "寶可夢聯盟冠軍", }, "25_RIBBONS": { - name: "Great League Champion", + name: "超級球聯盟冠軍", }, "50_RIBBONS": { - name: "Ultra League Champion", + name: "高級球聯盟冠軍", }, "75_RIBBONS": { - name: "Rogue League Champion", + name: "肉鴿球聯盟冠軍", }, "100_RIBBONS": { - name: "Master League Champion", + name: "大師球聯盟冠軍", }, "TRANSFER_MAX_BATTLE_STAT": { - name: "Teamwork", - description: "Baton pass to another party member with at least one stat maxed out", + name: "團隊協作", + description: "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢", }, "MAX_FRIENDSHIP": { - name: "Friendmaxxing", - description: "Reach max friendship on a Pokémon", + name: "親密無間", + description: "使一隻寶可夢的親密度達到最大值", }, "MEGA_EVOLVE": { - name: "Megamorph", - description: "Mega evolve a Pokémon", + name: "大變身", + description: "超級進化一隻寶可夢", }, "GIGANTAMAX": { - name: "Absolute Unit", - description: "Gigantamax a Pokémon", + name: "這位更是重量級", + description: "極巨化一隻寶可夢", }, "TERASTALLIZE": { - name: "STAB Enthusiast", - description: "Terastallize a Pokémon", + name: "本系愛好者", + description: "太晶化一隻寶可夢", }, "STELLAR_TERASTALLIZE": { - name: "The Hidden Type", - description: "Stellar Terastallize a Pokémon", + name: "隱藏屬性", + description: "星晶化一隻寶可夢", }, "SPLICE": { - name: "Infinite Fusion", - description: "Splice two Pokémon together with DNA Splicers", + name: "無限融合", + description: "使用基因之楔將兩隻寶可夢融合在一起", }, "MINI_BLACK_HOLE": { - name: "A Hole Lot of Items", - description: "Acquire a Mini Black Hole", + name: "一大洞的道具", + description: "獲得一個迷你黑洞", }, "CATCH_MYTHICAL": { - name: "Mythical", - description: "Catch a mythical Pokémon", + name: "神秘禮物", + description: "捕捉一隻幻之寶可夢", }, "CATCH_SUB_LEGENDARY": { - name: "(Sub-)Legendary", - description: "Catch a sub-legendary Pokémon", + name: "二級傳說", + description: "捕捉一隻準傳說寶可夢", }, "CATCH_LEGENDARY": { - name: "Legendary", - description: "Catch a legendary Pokémon", + name: "傳說", + description: "捕捉一隻傳說寶可夢", }, "SEE_SHINY": { - name: "Shiny", - description: "Find a shiny Pokémon in the wild", + name: "閃耀奪目", + description: "在野外找到一隻閃光寶可夢", }, "SHINY_PARTY": { - name: "That's Dedication", - description: "Have a full party of shiny Pokémon", + name: "嘔心瀝血", + description: "擁有一支由閃光寶可夢組成的滿員隊伍", }, "HATCH_MYTHICAL": { - name: "Mythical Egg", - description: "Hatch a mythical Pokémon from an egg", + name: "幻獸蛋", + description: "從蛋中孵化出一隻幻之寶可夢", }, "HATCH_SUB_LEGENDARY": { - name: "Sub-Legendary Egg", - description: "Hatch a sub-legendary Pokémon from an egg", + name: "二級傳說蛋", + description: "從蛋中孵化出一隻準傳說寶可夢", }, "HATCH_LEGENDARY": { - name: "Legendary Egg", - description: "Hatch a legendary Pokémon from an egg", + name: "傳說蛋", + description: "從蛋中孵化出一隻傳說寶可夢", }, "HATCH_SHINY": { - name: "Shiny Egg", - description: "Hatch a shiny Pokémon from an egg", + name: "金色傳說!", + description: "從蛋中孵化出一隻閃光寶可夢", }, "HIDDEN_ABILITY": { - name: "Hidden Potential", - description: "Catch a Pokémon with a hidden ability", + name: "隱藏實力", + description: "捕捉一隻擁有隱藏特性的寶可夢", }, "PERFECT_IVS": { - name: "Certificate of Authenticity", - description: "Get perfect IVs on a Pokémon", + name: "合格證", + description: "獲得一隻擁有完美個體值的寶可夢", }, "CLASSIC_VICTORY": { - name: "Undefeated", - description: "Beat the game in classic mode", + name: "戰無不勝", + description: "在經典模式中通關遊戲", }, "MONO_GEN_ONE": { - name: "The Original Rival", - description: "Complete the generation one only challenge.", + name: "最初的勁敵", + description: "完成僅限第一世代的挑戰.", }, "MONO_GEN_TWO": { - name: "Generation 1.5", - description: "Complete the generation two only challenge.", + name: "1.5世代", + description: "完成僅限第二世代的挑戰.", }, "MONO_GEN_THREE": { - name: "Too much water?", - description: "Complete the generation three only challenge.", + name: "“水太多了”", + description: "完成僅限第三世代的挑戰.", }, "MONO_GEN_FOUR": { - name: "Is she really the hardest?", - description: "Complete the generation four only challenge.", + name: "她真是最強冠軍嗎?", + description: "完成僅限第四世代的挑戰.", }, "MONO_GEN_FIVE": { - name: "All Original", - description: "Complete the generation five only challenge.", + name: "完全原創", + description: "完成僅限第五世代的挑戰.", }, "MONO_GEN_SIX": { - name: "Almost Royalty", - description: "Complete the generation six only challenge.", + name: "女大公", + description: "完成僅限第六世代的挑戰.", }, "MONO_GEN_SEVEN": { - name: "Only Technically", - description: "Complete the generation seven only challenge.", + name: "首屆冠軍", + description: "完成僅限第七世代的挑戰.", }, "MONO_GEN_EIGHT": { - name: "A Champion Time!", - description: "Complete the generation eight only challenge.", + name: "冠軍時刻!", + description: "完成僅限第八世代的挑戰.", }, "MONO_GEN_NINE": { - name: "She was going easy on you", - description: "Complete the generation nine only challenge.", + name: "她又放水了", + description: "完成僅限第九世代的挑戰.", }, "MonoType": { - description: "Complete the {{type}} monotype challenge.", + description: "完成 {{type}} 單屬性挑戰.", }, "MONO_NORMAL": { - name: "Mono NORMAL", + name: "異乎尋常的尋常", }, "MONO_FIGHTING": { - name: "I Know Kung Fu", + name: "我有真功夫", }, "MONO_FLYING": { - name: "Mono FLYING", + name: "憤怒的小鳥", }, "MONO_POISON": { - name: "Kanto's Favourite", + name: "關都地區特色", }, "MONO_GROUND": { - name: "Mono GROUND", + name: "地震預報", }, "MONO_ROCK": { - name: "Brock Hard", + name: "堅如磐石", }, "MONO_BUG": { - name: "Sting Like A Beedrill", + name: "音箱蟀俠", }, "MONO_GHOST": { - name: "Who you gonna call?", + name: "捉鬼敢死隊", }, "MONO_STEEL": { - name: "Mono STEEL", + name: "鐵巨人", }, "MONO_FIRE": { - name: "Mono FIRE", + name: "搓火球解決一切", }, "MONO_WATER": { - name: "When It Rains, It Pours", + name: "當雨來臨,傾盆而下", }, "MONO_GRASS": { - name: "Mono GRASS", + name: "別踏這個青", }, "MONO_ELECTRIC": { - name: "Mono ELECTRIC", + name: "瞄準大岩蛇的角!", }, "MONO_PSYCHIC": { - name: "Mono PSYCHIC", + name: "腦洞大開", }, "MONO_ICE": { - name: "Mono ICE", + name: "如履薄冰", }, "MONO_DRAGON": { - name: "Mono DRAGON", + name: "準神俱樂部", }, "MONO_DARK": { - name: "It's just a phase", + name: "總有叛逆期", }, "MONO_FAIRY": { - name: "Mono FAIRY", + name: "林克,醒醒!", }, } 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 3f8892749fe..3cd63de7961 100644 --- a/src/locales/zh_TW/battle-message-ui-handler.ts +++ b/src/locales/zh_TW/battle-message-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battleMessageUiHandler: SimpleTranslationEntries = { "ivBest": "最棒", diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index 086f0cf9266..077933c46d6 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -1,62 +1,133 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出現了.", - "trainerAppeared": "{{trainerName}}\n想要和你對戰!", - "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", - "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", - "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", - "playerComeBack": "回來吧, {{pokemonName}}!", - "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", - "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", - "switchQuestion": "要更換\n{{pokemonName}}嗎?", - "trainerDefeated": "你擊敗了\n{{trainerName}}!", - "pokemonCaught": "{{pokemonName}} 被抓住了!", + "trainerAppeared": "{{trainerName}}\n想要和你對戰!", + "trainerAppearedDouble": "{{trainerName}}\n想要和你對戰!", + "singleWildAppeared": "一隻野生的 {{pokemonName}} 出現了!", + "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出現了!", + "playerComeBack": "回來吧, {{pokemonName}}!", + "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", + "playerGo": "去吧! {{pokemonName}}!", + "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", + "switchQuestion": "要更換\n{{pokemonName}}嗎?", + "trainerDefeated": "你擊敗了\n{{trainerName}}!", + "pokemonCaught": "{{pokemonName}} 被抓住了!", + "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "pokemon": "寶可夢", - "sendOutPokemon": "上吧! {{pokemonName}}!", - "hitResultCriticalHit": "擊中了要害!", - "hitResultSuperEffective": "效果拔群!", + "sendOutPokemon": "上吧! {{pokemonName}}!", + "hitResultCriticalHit": "擊中了要害!", + "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", - "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", - "hitResultOneHitKO": "一擊切殺!", - "attackFailed": "但是失敗了!", - "attackHitsCount": "擊中 {{count}} 次!", - "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", - "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", - "learnMove": "{{pokemonName}} 學會了{{moveName}}!", + "hitResultNoEffect": "對 {{pokemonName}} 沒有效果!", + "hitResultOneHitKO": "一擊切殺!", + "attackFailed": "但是失敗了!", + "attackHitsCount": "擊中 {{count}} 次!", + "rewardGain": "You received\n{{modifierName}}!", + "expGain": "{{pokemonName}} 獲得了 {{exp}} 經驗值!", + "levelUp": "{{pokemonName}} 升級到 Lv. {{level}}!", + "learnMove": "{{pokemonName}} 學會了{{moveName}}!", "learnMovePrompt": "{{pokemonName}} 想要學習 {{moveName}}.", "learnMoveLimitReached": "但是, {{pokemonName}} 已經學會了\n四個招式.", - "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", - "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", + "learnMoveReplaceQuestion": "要忘記一個招式並學習 {{moveName}} 嗎?", + "learnMoveStopTeaching": "不再嘗試學習\n{{moveName}}嗎?", "learnMoveNotLearned": "{{pokemonName}} 沒有學會 {{moveName}}.", - "learnMoveForgetQuestion": "要忘記哪個技能?", + "learnMoveForgetQuestion": "要忘記哪個技能?", "learnMoveForgetSuccess": "{{pokemonName}} 忘記了 {{moveName}}.", - "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", + "countdownPoof": "@d{32}1, @d{15}2, 和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", "learnMoveAnd": "然後…", - "levelCapUp": "等級上限提升到 {{levelCap}}!", + "levelCapUp": "等級上限提升到 {{levelCap}}!", "moveNotImplemented": "{{moveName}} 未實裝,無法選擇。", "moveNoPP": "這個技能的PP用完了", - "moveDisabled": "{{moveName}} 被禁用!", + "moveDisabled": "{{moveName}} 被禁用!", "noPokeballForce": "一股無形的力量阻止了你使用精靈球。", - "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", - "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", - "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", + "noPokeballTrainer": "你不能捕捉其他訓練家的寶可夢!", + "noPokeballMulti": "只能在剩下一隻寶可夢時才能扔出精靈球!", + "noPokeballStrong": "目標寶可夢太強了,無法捕捉!你需要先\n削弱它!", "noEscapeForce": "一股無形的力量阻止你逃跑。", - "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", - "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", - "runAwaySuccess": "你成功逃脫了!", - "runAwayCannotEscape": "你無法逃脫!", + "noEscapeTrainer": "你不能從訓練家對戰中逃跑!", + "noEscapePokemon": "{{pokemonName}} 的 {{moveName}} 阻止了你 {{escapeVerb}}!", + "runAwaySuccess": "你成功逃脫了!", + "runAwayCannotEscape": "你無法逃脫!", "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", - "notDisabled": "{{moveName}} 不再被禁用!", - "skipItemQuestion": "你要跳過拾取道具嗎?", - "eggHatching": "咦?", - "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描?", - "wildPokemonWithAffix": "Wild {{pokemonName}}", - "foePokemonWithAffix": "Foe {{pokemonName}}", - "useMove": "{{pokemonNameWithAffix}} used {{moveName}}!", - "drainMessage": "{{pokemonName}} had its\nenergy drained!", - "regainHealth": "{{pokemonName}} regained\nhealth!", - "fainted": "{{pokemonNameWithAffix}} fainted!" + "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "notDisabled": "{{moveName}} 不再被禁用!", + "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", + "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "skipItemQuestion": "你要跳過拾取道具嗎?", + "eggHatching": "咦?", + "ivScannerUseQuestion": "對 {{pokemonName}} 使用個體值掃描儀?", + "wildPokemonWithAffix": "野生的 {{pokemonName}}", + "foePokemonWithAffix": "對手 {{pokemonName}}", + "useMove": "{{pokemonNameWithAffix}} 使用了 {{moveName}}!", + "drainMessage": "{{pokemonName}} 吸取了體力!", + "regainHealth": "{{pokemonName}} 回復了體力!", + "fainted": "{{pokemonNameWithAffix}} 倒下了!", + "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", + "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", + "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅提高了!", + "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再提高了!", + "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", + "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", + "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅降低了!", + "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再降低了!", + "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", + "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", + "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", + "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", + "battlerTagsFlinchedLapse": "{{pokemonNameWithAffix}}畏縮了!", + "battlerTagsConfusedOnAdd": "{{pokemonNameWithAffix}}混亂了!", + "battlerTagsConfusedOnRemove": "{{pokemonNameWithAffix}}的混亂解除了!", + "battlerTagsConfusedOnOverlap": "{{pokemonNameWithAffix}}已經混亂了。", + "battlerTagsConfusedLapse": "{{pokemonNameWithAffix}}正在混亂中!", + "battlerTagsConfusedLapseHurtItself": "不知所以地攻擊了自己!", + "battlerTagsDestinyBondLapseIsBoss": "{{pokemonNameWithAffix}}不再受到同命的影響", + "battlerTagsDestinyBondLapse": "{{pokemonNameWithAffix}} 和{{pokemonNameWithAffix2}} 同歸於盡了!", + "battlerTagsInfatuatedOnAdd": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷了!", + "battlerTagsInfatuatedOnOverlap": "{{pokemonNameWithAffix}}已經著迷了!", + "battlerTagsInfatuatedLapse": "{{pokemonNameWithAffix}}對{{sourcePokemonName}}著迷中!", + "battlerTagsInfatuatedLapseImmobilize": "{{pokemonNameWithAffix}} 不會著迷!", + "battlerTagsInfatuatedOnRemove": "{{pokemonNameWithAffix}} 治癒了著迷狀態!", + "battlerTagsSeededOnAdd": "將種子種植在了{{pokemonNameWithAffix}}身上!", + "battlerTagsSeededLapse": "{{pokemonNameWithAffix}}被寄生種子吸取了體力!", + "battlerTagsSeededLapseShed": "{{pokemonNameWithAffix}}吸到了污泥漿!", + "battlerTagsNightmareOnAdd": "{{pokemonNameWithAffix}}開始做惡夢了!", + "battlerTagsNightmareOnOverlap": "{{pokemonNameWithAffix}}已經被惡夢纏身!", + "battlerTagsNightmareLapse": "{{pokemonNameWithAffix}}正被惡夢纏身!", + "battlerTagsEncoreOnAdd": "{{pokemonNameWithAffix}}接受了再來一次!", + "battlerTagsEncoreOnRemove": "{{pokemonNameWithAffix}}的再來一次狀態解除了!", + "battlerTagsHelpingHandOnAdd": "{{pokemonNameWithAffix}}擺出了幫助{{pokemonName}} 的架勢!", + "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}用扎根回復了體力!", + "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}扎根了!", + "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}用水流環包裹了自己!", + "battlerTagsAquaRingLapse": "{{moveName}}回復了{{pokemonName}}的體力!", + "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}產生睡意了!", + "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}受到了{{moveName}}的傷害!", + "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}的 {{moveName}}緊緊束縛住了!", + "battlerTagsWrapOnTrap": "{{pokemonNameWithAffix}}被{{sourcePokemonName}}綁緊了!", + "battlerTagsVortexOnTrap": "{{pokemonNameWithAffix}}被困在了旋渦之中!", + "battlerTagsClampOnTrap": "{{sourcePokemonNameWithAffix}}用貝殼夾住了{{pokemonName}}!", + "battlerTagsSandTombOnTrap": "{{pokemonNameWithAffix}}被{{moveName}}困住了!", + "battlerTagsMagmaStormOnTrap": "{{pokemonNameWithAffix}}被困在了熔岩風暴之中!", + "battlerTagsSnapTrapOnTrap": "{{pokemonNameWithAffix}}被捕獸夾困住了!", + "battlerTagsThunderCageOnTrap": "{{sourcePokemonNameWithAffix}}困住了{{pokemonNameWithAffix}}!", + "battlerTagsInfestationOnTrap": "{{pokemonNameWithAffix}}受到了{{sourcePokemonNameWithAffix}}的死纏爛打!", + "battlerTagsProtectedOnAdd": "{{pokemonNameWithAffix}}擺出了防守的架勢!", + "battlerTagsProtectedLapse": "{{pokemonNameWithAffix}}在攻擊中保護了自己!", + "battlerTagsEnduringOnAdd": "{{pokemonNameWithAffix}}擺出了挺住攻擊的架勢!", + "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", + "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", + "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", + "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", + "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", + "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", } as const; diff --git a/src/locales/zh_TW/berry.ts b/src/locales/zh_TW/berry.ts index 931efb2c22f..a084ef91aa5 100644 --- a/src/locales/zh_TW/berry.ts +++ b/src/locales/zh_TW/berry.ts @@ -1,4 +1,4 @@ -import { BerryTranslationEntries } from "#app/plugins/i18n"; +import { BerryTranslationEntries } from "#app/interfaces/locales"; export const berry: BerryTranslationEntries = { "SITRUS": { diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts new file mode 100644 index 00000000000..ef15c6c6dcb --- /dev/null +++ b/src/locales/zh_TW/bgm-name.ts @@ -0,0 +1,145 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const bgmName: SimpleTranslationEntries = { + "music": "Music", + "missing_entries" : "{{name}}", + "battle_kanto_champion": "B2W2 Kanto Champion Battle", + "battle_johto_champion": "B2W2 Johto Champion Battle", + "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", + "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", + "battle_champion_alder": "BW Unova Champion Battle", + "battle_champion_iris": "B2W2 Unova Champion Battle", + "battle_kalos_champion": "XY Kalos Champion Battle", + "battle_alola_champion": "USUM Alola Champion Battle", + "battle_galar_champion": "SWSH Galar Champion Battle", + "battle_champion_geeta": "SV Champion Geeta Battle", + "battle_champion_nemona": "SV Champion Nemona Battle", + "battle_champion_kieran": "SV Champion Kieran Battle", + "battle_hoenn_elite": "ORAS Elite Four Battle", + "battle_unova_elite": "BW Elite Four Battle", + "battle_kalos_elite": "XY Elite Four Battle", + "battle_alola_elite": "SM Elite Four Battle", + "battle_galar_elite": "SWSH League Tournament Battle", + "battle_paldea_elite": "SV Elite Four Battle", + "battle_bb_elite": "SV BB League Elite Four Battle", + "battle_final_encounter": "PMD RTDX Rayquaza's Domain", + "battle_final": "BW Ghetsis Battle", + "battle_kanto_gym": "B2W2 Kanto Gym Battle", + "battle_johto_gym": "B2W2 Johto Gym Battle", + "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", + "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", + "battle_unova_gym": "BW Unova Gym Battle", + "battle_kalos_gym": "XY Kalos Gym Battle", + "battle_galar_gym": "SWSH Galar Gym Battle", + "battle_paldea_gym": "SV Paldea Gym Battle", + "battle_legendary_kanto": "XY Kanto Legendary Battle", + "battle_legendary_raikou": "HGSS Raikou Battle", + "battle_legendary_entei": "HGSS Entei Battle", + "battle_legendary_suicune": "HGSS Suicune Battle", + "battle_legendary_lugia": "HGSS Lugia Battle", + "battle_legendary_ho_oh": "HGSS Ho-oh Battle", + "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", + "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", + "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", + "battle_legendary_rayquaza": "ORAS Rayquaza Battle", + "battle_legendary_deoxys": "ORAS Deoxys Battle", + "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", + "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", + "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", + "battle_legendary_giratina": "ORAS Giratina Battle", + "battle_legendary_arceus": "HGSS Arceus Battle", + "battle_legendary_unova": "BW Unova Legendary Battle", + "battle_legendary_kyurem": "BW Kyurem Battle", + "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", + "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", + "battle_legendary_tapu": "SM Tapu Battle", + "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", + "battle_legendary_ub": "SM Ultra Beast Battle", + "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", + "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", + "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", + "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", + "battle_legendary_calyrex": "SWSH Calyrex Battle", + "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", + "battle_legendary_ruinous": "SV Treasures of Ruin Battle", + "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", + "battle_legendary_loyal_three": "SV Loyal Three Battle", + "battle_legendary_ogerpon": "SV Ogerpon Battle", + "battle_legendary_terapagos": "SV Terapagos Battle", + "battle_legendary_pecharunt": "SV Pecharunt Battle", + "battle_rival": "BW Rival Battle", + "battle_rival_2": "BW N Battle", + "battle_rival_3": "BW Final N Battle", + "battle_trainer": "BW Trainer Battle", + "battle_wild": "BW Wild Battle", + "battle_wild_strong": "BW Strong Wild Battle", + "end_summit": "PMD RTDX Sky Tower Summit", + "battle_rocket_grunt": "HGSS Team Rocket Battle", + "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", + "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_plasma_grunt": "BW Team Plasma Battle", + "battle_flare_grunt": "XY Team Flare Battle", + "battle_rocket_boss": "USUM Giovanni Battle", + "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", + "battle_galactic_boss": "BDSP Cyrus Battle", + "battle_plasma_boss": "B2W2 Ghetsis Battle", + "battle_flare_boss": "XY Lysandre Battle", + + // Biome Music + "abyss": "PMD EoS Dark Crater", + "badlands": "PMD EoS Barren Valley", + "beach": "PMD EoS Drenched Bluff", + "cave": "PMD EoS Sky Peak Cave", + "construction_site": "PMD EoS Boulder Quarry", + "desert": "PMD EoS Northern Desert", + "dojo": "PMD EoS Marowak Dojo", + "end": "PMD RTDX Sky Tower", + "factory": "PMD EoS Concealed Ruins", + "fairy_cave": "PMD EoS Star Cave", + "forest": "PMD EoS Dusk Forest", + "grass": "PMD EoS Apple Woods", + "graveyard": "PMD EoS Mystifying Forest", + "ice_cave": "PMD EoS Vast Ice Mountain", + "island": "PMD EoS Craggy Coast", + "jungle": "Lmz - Jungle", // The composer thinks about a more creative name + "laboratory": "Firel - Laboratory", // The composer thinks about a more creative name + "lake": "PMD EoS Crystal Cave", + "meadow": "PMD EoS Sky Peak Forest", + "metropolis": "Firel - Metropolis", // The composer thinks about a more creative name + "mountain": "PMD EoS Mt. Horn", + "plains": "PMD EoS Sky Peak Prairie", + "power_plant": "PMD EoS Far Amp Plains", + "ruins": "PMD EoS Deep Sealed Ruin", + "sea": "PMD EoS Brine Cave", + "seabed": "Firel - Seabed", // The composer thinks about a more creative name + "slum": "PMD EoS Sky Peak Coast", + "snowy_forest": "PMD EoS Sky Peak Snowfield", + "space": "Firel - Aether", + "swamp": "PMD EoS Surrounded Sea", + "tall_grass": "PMD EoS Foggy Forest", + "temple": "PMD EoS Aegis Cave", + "town": "PMD EoS Random Dungeon Theme 3", + "volcano": "PMD EoS Steam Cave", + "wasteland": "PMD EoS Hidden Highland", + + // Encounter + "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", + "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", + "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", + "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", + "encounter_lass": "BW Trainers' Eyes Meet (Lass)", + "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", + "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", + "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", + "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_rival": "BW Cheren", + "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", + "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", + "encounter_twins": "BW Trainers' Eyes Meet (Twins)", + "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + + // Other + "heal": "BW Pokémon Heal", + "menu": "PMD EoS Welcome to the World of Pokémon!", + "title": "PMD EoS Top Menu Theme", +} as const; diff --git a/src/locales/zh_TW/biome.ts b/src/locales/zh_TW/biome.ts index 5631b91b836..dbfa2f7adb9 100644 --- a/src/locales/zh_TW/biome.ts +++ b/src/locales/zh_TW/biome.ts @@ -1,40 +1,40 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const biome: SimpleTranslationEntries = { - "unknownLocation": "Somewhere you can\'t remember", - "TOWN": "Town", - "PLAINS": "Plains", - "GRASS": "Grassy Field", - "TALL_GRASS": "Tall Grass", - "METROPOLIS": "Metropolis", - "FOREST": "Forest", - "SEA": "Sea", - "SWAMP": "Swamp", - "BEACH": "Beach", - "LAKE": "Lake", - "SEABED": "Seabed", - "MOUNTAIN": "Mountain", - "BADLANDS": "Badlands", - "CAVE": "Cave", - "DESERT": "Desert", - "ICE_CAVE": "Ice Cave", - "MEADOW": "Meadow", - "POWER_PLANT": "Power Plant", - "VOLCANO": "Volcano", - "GRAVEYARD": "Graveyard", - "DOJO": "Dojo", - "FACTORY": "Factory", - "RUINS": "Ancient Ruins", - "WASTELAND": "Wasteland", - "ABYSS": "Abyss", - "SPACE": "Space", - "CONSTRUCTION_SITE": "Construction Site", - "JUNGLE": "Jungle", - "FAIRY_CAVE": "Fairy Cave", - "TEMPLE": "Temple", - "SLUM": "Slum", - "SNOWY_FOREST": "Snowy Forest", - "ISLAND": "Island", - "LABORATORY": "Laboratory", + "unknownLocation": "未知領域", + "TOWN": "城鎮", + "PLAINS": "平原", + "GRASS": "草地", + "TALL_GRASS": "高草叢", + "METROPOLIS": "城市", + "FOREST": "森林", + "SEA": "海洋", + "SWAMP": "沼澤", + "BEACH": "沙灘", + "LAKE": "湖泊", + "SEABED": "海底", + "MOUNTAIN": "山脈", + "BADLANDS": "不毛之地", + "CAVE": "洞窟", + "DESERT": "沙漠", + "ICE_CAVE": "寒冰洞窟", + "MEADOW": "花叢", + "POWER_PLANT": "發電廠", + "VOLCANO": "火山", + "GRAVEYARD": "墓地", + "DOJO": "道場", + "FACTORY": "工廠", + "RUINS": "遺跡", + "WASTELAND": "荒地龍巢", + "ABYSS": "幽谷深淵", + "SPACE": "太空", + "CONSTRUCTION_SITE": "工地", + "JUNGLE": "叢林", + "FAIRY_CAVE": "妖精洞窟", + "TEMPLE": "神殿", + "SLUM": "陋巷", + "SNOWY_FOREST": "冰雪森林", + "ISLAND": "島嶼", + "LABORATORY": "研究所", "END": "???", } as const; diff --git a/src/locales/zh_TW/challenges.ts b/src/locales/zh_TW/challenges.ts index c98b68137ad..e702ec4f278 100644 --- a/src/locales/zh_TW/challenges.ts +++ b/src/locales/zh_TW/challenges.ts @@ -1,67 +1,25 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { TranslationEntries } from "#app/interfaces/locales"; -export const challenges: SimpleTranslationEntries = { +export const challenges: TranslationEntries = { "title": "適用挑戰條件", - "points": "Bad Ideas", - "confirm_start": "要執行這些挑戰嗎?", - "singleGeneration.name": "單一世代", - "singleGeneration.value.0": "關閉", - "singleGeneration.desc.0": "你只能使用所選世代的寶可夢", - "singleGeneration.value.1": "第一世代", - "singleGeneration.desc.1": "你只能使用第一世代的寶可夢", - "singleGeneration.value.2": "第二世代", - "singleGeneration.desc.2": "你只能使用第二世代的寶可夢", - "singleGeneration.value.3": "第三世代", - "singleGeneration.desc.3": "你只能使用第三世代的寶可夢", - "singleGeneration.value.4": "第四世代", - "singleGeneration.desc.4": "你只能使用第四世代的寶可夢", - "singleGeneration.value.5": "第五世代", - "singleGeneration.desc.5": "你只能使用第五世代的寶可夢", - "singleGeneration.value.6": "第六世代", - "singleGeneration.desc.6": "你只能使用第六世代的寶可夢", - "singleGeneration.value.7": "第七世代", - "singleGeneration.desc.7": "你只能使用第七世代的寶可夢", - "singleGeneration.value.8": "第八世代", - "singleGeneration.desc.8": "你只能使用第八世代的寶可夢", - "singleGeneration.value.9": "第九世代", - "singleGeneration.desc.9": "你只能使用第九世代的寶可夢", - "singleType.name": "單屬性", - "singleType.value.0": "關閉", - "singleType.desc.0": "你只能使用所選屬性的寶可夢", - "singleType.value.1": "普通", - "singleType.desc.1": "你只能使用普通屬性的寶可夢", - "singleType.value.2": "格鬥", - "singleType.desc.2": "你只能使用格鬥屬性的寶可夢", - "singleType.value.3": "飛行", - "singleType.desc.3": "你只能使用飛行屬性的寶可夢", - "singleType.value.4": "毒", - "singleType.desc.4": "你只能使用毒屬性的寶可夢", - "singleType.value.5": "地面", - "singleType.desc.5": "你只能使用地面屬性的寶可夢", - "singleType.value.6": "岩石", - "singleType.desc.6": "你只能使用岩石屬性的寶可夢", - "singleType.value.7": "蟲", - "singleType.desc.7": "你只能使用蟲屬性的寶可夢", - "singleType.value.8": "幽靈", - "singleType.desc.8": "你只能使用幽靈屬性的寶可夢", - "singleType.value.9": "鋼", - "singleType.desc.9": "你只能使用鋼屬性的寶可夢", - "singleType.value.10": "火", - "singleType.desc.10": "你只能使用火屬性的寶可夢", - "singleType.value.11": "水", - "singleType.desc.11": "你只能使用水屬性的寶可夢", - "singleType.value.12": "草", - "singleType.desc.12": "你只能使用草屬性的寶可夢", - "singleType.value.13": "電", - "singleType.desc.13": "你只能使用電屬性的寶可夢", - "singleType.value.14": "超能", - "singleType.desc.14": "你只能使用超能屬性的寶可夢", - "singleType.value.15": "冰", - "singleType.desc.15": "你只能使用冰屬性的寶可夢", - "singleType.value.16": "龍", - "singleType.desc.16": "你只能使用龍屬性的寶可夢", - "singleType.value.17": "惡", - "singleType.desc.17": "你只能使用惡屬性的寶可夢", - "singleType.value.18": "妖精", - "singleType.desc.18": "你只能使用妖精屬性的寶可夢", + "illegalEvolution": "{{pokemon}} 進化成了不符合\n挑戰條件的寶可夢!", + "singleGeneration": { + "name": "單一世代", + "desc": "你只能使用第{{gen}}\n世代的寶可夢", + "desc_default": "你只能使用所選\n世代的寶可夢", + "gen_1": "一", + "gen_2": "二", + "gen_3": "三", + "gen_4": "四", + "gen_5": "五", + "gen_6": "六", + "gen_7": "七", + "gen_8": "八", + "gen_9": "九", + }, + "singleType": { + "name": "單屬性", + "desc": "你只能使用{{type}}\n屬性的寶可夢", + "desc_default": "你只能使用所選\n屬性的寶可夢" + }, } as const; diff --git a/src/locales/zh_TW/command-ui-handler.ts b/src/locales/zh_TW/command-ui-handler.ts index 6431d903447..300b20224b3 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"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const commandUiHandler: SimpleTranslationEntries = { "fight": "戰鬥", "ball": "精靈球", "pokemon": "寶可夢", "run": "逃跑", - "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", + "actionMessage": "要讓\n{{pokemonName}} 做甚麼?", } as const; diff --git a/src/locales/zh_TW/common.ts b/src/locales/zh_TW/common.ts new file mode 100644 index 00000000000..c3dc42785ee --- /dev/null +++ b/src/locales/zh_TW/common.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const common: SimpleTranslationEntries = { + "start": "開始", +} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 49e82f3b436..688f3b47033 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -4,6 +4,7 @@ import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; +import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; @@ -34,11 +35,14 @@ import { pokemonInfoContainer } from "./pokemon-info-container"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; +import { statusEffect } from "./status-effect"; import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { weather } from "./weather"; import { partyUiHandler } from "./party-ui-handler"; +import { settings } from "./settings.js"; +import { common } from "./common.js"; export const zhTwConfig = { ability: ability, @@ -46,9 +50,11 @@ export const zhTwConfig = { battle: battle, battleMessageUiHandler: battleMessageUiHandler, berry: berry, + bgmName: bgmName, biome: biome, challenges: challenges, commandUiHandler: commandUiHandler, + common: common, PGMachv: PGMachv, PGFachv: PGFachv, PGMdialogue: PGMdialogue, @@ -74,8 +80,10 @@ export const zhTwConfig = { pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, saveSlotSelectUiHandler: saveSlotSelectUiHandler, + settings: settings, splashMessages: splashMessages, starterSelectUiHandler: starterSelectUiHandler, + statusEffect: statusEffect, titles: titles, trainerClasses: trainerClasses, trainerNames: trainerNames, diff --git a/src/locales/zh_TW/dialogue.ts b/src/locales/zh_TW/dialogue.ts index ed66e946cc9..0823236bc84 100644 --- a/src/locales/zh_TW/dialogue.ts +++ b/src/locales/zh_TW/dialogue.ts @@ -1,4 +1,4 @@ -import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/plugins/i18n"; +import {DialogueTranslationEntries, SimpleTranslationEntries} from "#app/interfaces/locales"; // Dialogue of the NPCs in the game when the player character is male (or unset) export const PGMdialogue: DialogueTranslationEntries = { @@ -382,6 +382,186 @@ export const PGMdialogue: DialogueTranslationEntries = { 3: "好像是我暈船了…" }, }, + "rocket_grunt": { + "encounter": { + 1: "Prepare for trouble!" + }, + "victory": { + 1: "Team Rocket blasting off again!" + }, + }, + "magma_grunt": { + "encounter": { + 1: " If you get in the way of Team Magma, don’t expect any mercy!" + }, + "victory": { + 1: "Huh? I lost?!" + }, + }, + "aqua_grunt": { + "encounter": { + 1: "No one who crosses Team Aqua gets any mercy, not even kids!" + }, + "victory": { + 1: "You're kidding me!" + }, + }, + "galactic_grunt": { + "encounter": { + 1: "Don't mess with Team Galactic!" + }, + "victory": { + 1: "Shut down..." + }, + }, + "plasma_grunt": { + "encounter": { + 1: "We won't tolerate people who have different ideas!" + }, + "victory": { + 1: "Plasmaaaaaaaaa!" + }, + }, + "flare_grunt": { + "encounter": { + 1: "Fashion is most important to us!" + }, + "victory": { + 1: "The future doesn't look bright for me." + }, + }, + "rocket_boss_giovanni_1": { + "encounter": { + 1: "So! I must say, I am impressed you got here!" + }, + "victory": { + 1: "WHAT! This cannot be!" + }, + "defeat": { + 1: "Mark my words. Not being able to measure your own strength shows that you are still a child." + } + }, + "rocket_boss_giovanni_2": { + "encounter": { + 1: "My old associates need me... Are you going to get in my way?" + }, + "victory": { + 1: "How is this possible...?\nThe precious dream of Team Rocket has become little more than an illusion..." + }, + "defeat": { + 1: "Team Rocket will be reborn again, and I will rule the world!" + } + }, + "magma_boss_maxie_1": { + "encounter": { + 1: "I will bury you by my own hand. I hope you appreciate this honor!" + }, + "victory": { + 1: "Ugh! You are... quite capable...\nI fell behind, but only by an inch..." + }, + "defeat": { + 1: "Team Magma will prevail!" + } + }, + "magma_boss_maxie_2": { + "encounter": { + 1: "You are the final obstacle remaining between me and my goals.\nBrace yourself for my ultimate attack! Fuhahaha!" + }, + "victory": { + 1: "This... This is not.. Ngh..." + }, + "defeat": { + 1: "And now... I will transform this planet to a land ideal for humanity." + } + }, + "aqua_boss_archie_1": { + "encounter": { + 1: "I'm leader of Team Aqua, so I'm afraid it's the rope's end for you." + }, + "victory": { + 1: "Let's meet again somewhere. I'll be sure to remember that face." + }, + "defeat": { + 1: "Brilliant! My team won't hold back now!" + } + }, + "aqua_boss_archie_2": { + "encounter": { + 1: "I've been waiting so long for this day to come.\nThis is the true power of my team!" + }, + "victory": { + 1: "Like I figured..." + }, + "defeat": { + 1: "I'll return everything in this world to its original, pure state!!" + } + }, + "galactic_boss_cyrus_1": { + "encounter": { + 1: "You were compelled to come here by such vacuous sentimentality\nI will make you regret paying heed to your heart!" + }, + "victory": { + 1: "Interesting. And quite curious." + }, + "defeat": { + 1: "I will create my new world..." + } + }, + "galactic_boss_cyrus_2": { + "encounter": { + 1: "So we meet again. It seems our fates have become intertwined.\nBut here and now, I will finally break that bond!" + }, + "victory": { + 1: "How? How? HOW?!" + }, + "defeat": { + 1: "Farewell." + } + }, + "plasma_boss_ghetsis_1": { + "encounter": { + 1: "I won't allow anyone to stop me! No matter who does what!" + }, + "victory": { + 1: "How can this be? I'm the creator of Team Plasma! I'm perfect!" + }, + "defeat": { + 1: "I am the perfect ruler of a perfect new world! Mwa ha ha!" + } + }, + "plasma_boss_ghetsis_2": { + "encounter": { + 1: "Come now! I want to see your face at the moment you lose all hope!" + }, + "victory": { + 1: "My calculations... No! My careful schemes! The world should be mine!" + }, + "defeat": { + 1: "Kyurem! Use Absofusion!" + } + }, + "flare_boss_lysandre_1": { + "encounter": { + 1: "Do you want to stop me? Show me in battle." + }, + "victory": { + 1: "You are here to stop me. But I ask you to wait. " + }, + "defeat": { + 1: "Pokemon...Shall no longer exist." + } + }, + "flare_boss_lysandre_2": { + "encounter": { + 1: "The future you want, or the future I want... Let us see which one is more deserving, shall we?" + }, + "victory": { + 1: "Whaugh!" + }, + "defeat": { + 1: "Fools with no vision will continue to befoul this beautiful world." + } + }, "brock": { "encounter": { 1: "我對岩石屬性寶可夢的專精會擊敗你!來吧!", @@ -2007,6 +2187,32 @@ export const PGMdialogue: DialogueTranslationEntries = { 2: "你被我的風暴捲入了!祝你下次好運!", } }, + "alder": { + "encounter": { + 1: "準備好和合眾最強的訓練家交手吧!" + }, + "victory": { + 1: "精彩!簡直就是天下無雙!" + }, + "defeat": { + 1: `戰鬥結束後,我的心像是吹過了溫和的風… + $真是厲害!` + } + }, + "kieran": { + "encounter": { + 1: `我的努力讓我越來越強! + $所以我不會輸。` + }, + "victory": { + 1: `不可能… + $真是一場有趣又激動人心的戰鬥啊!` + }, + "defeat": { + 1: `哇塞,好一場戰鬥! + $你得多練練了。` + } + }, "rival": { "encounter": { 1: "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!", @@ -2110,7 +2316,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "rival_6_female": { "encounter": { - 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", + 1: "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。", }, "victory": { 1: "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答應我……在你拯救世界之後\n……要……平安到家。$@c{smile_ehalf}……謝謝你。", diff --git a/src/locales/zh_TW/egg.ts b/src/locales/zh_TW/egg.ts index d25599036b0..eecfcf0b735 100644 --- a/src/locales/zh_TW/egg.ts +++ b/src/locales/zh_TW/egg.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const egg: SimpleTranslationEntries = { "egg": "蛋", @@ -17,5 +17,9 @@ export const egg: SimpleTranslationEntries = { "notEnoughVouchers": "你沒有足夠的兌換券!", "tooManyEggs": "你的蛋太多啦!", "pull": "抽", - "pulls": "抽" + "pulls": "抽", + "sameSpeciesEgg": "{{species}} 會從這個蛋裡孵化!", + "hatchFromTheEgg": "{{pokemonName}} 從蛋中孵化了!", + "eggMoveUnlock": "蛋招式已解鎖: {{moveName}}", + "rareEggMoveUnlock": "稀有蛋招式已解鎖: {{moveName}}", } as const; diff --git a/src/locales/zh_TW/fight-ui-handler.ts b/src/locales/zh_TW/fight-ui-handler.ts index 64df373ea7a..d86a703d844 100644 --- a/src/locales/zh_TW/fight-ui-handler.ts +++ b/src/locales/zh_TW/fight-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const fightUiHandler: SimpleTranslationEntries = { "pp": "PP", "power": "威力", "accuracy": "命中率", - "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive ", // The space at the end is important + "abilityFlyInText": " {{pokemonName}} 的 {{passive}}{{abilityName}}", + "passive": "被動能力 ", // The space at the end is important } as const; diff --git a/src/locales/zh_TW/game-mode.ts b/src/locales/zh_TW/game-mode.ts index be342b4c390..dc2a227d638 100644 --- a/src/locales/zh_TW/game-mode.ts +++ b/src/locales/zh_TW/game-mode.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameMode: SimpleTranslationEntries = { - "classic": "Classic", - "endless": "Endless", - "endlessSpliced": "Endless (Spliced)", - "dailyRun": "Daily Run", - "unknown": "Unknown", - "challenge": "Challenge", + "classic": "經典模式", + "endless": "無盡模式", + "endlessSpliced": "融合無盡模式", + "dailyRun": "每日挑戰", + "unknown": "未知", + "challenge": "挑戰模式", } as const; diff --git a/src/locales/zh_TW/game-stats-ui-handler.ts b/src/locales/zh_TW/game-stats-ui-handler.ts index cb3228c1a4a..343ae7240cb 100644 --- a/src/locales/zh_TW/game-stats-ui-handler.ts +++ b/src/locales/zh_TW/game-stats-ui-handler.ts @@ -1,44 +1,44 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const gameStatsUiHandler: SimpleTranslationEntries = { - "stats": "Stats", - "playTime": "Play Time", - "totalBattles": "Total Battles", - "starters": "Starters", - "shinyStarters": "Shiny Starters", - "speciesSeen": "Species Seen", - "speciesCaught": "Species Caught", - "ribbonsOwned": "Ribbons Owned", - "classicRuns": "Classic Runs", - "classicWins": "Classic Wins", - "dailyRunAttempts": "Daily Run Attempts", - "dailyRunWins": "Daily Run Wins", - "endlessRuns": "Endless Runs", - "highestWaveEndless": "Highest Wave (Endless)", - "highestMoney": "Highest Money", - "highestDamage": "Highest Damage", - "highestHPHealed": "Highest HP Healed", - "pokemonEncountered": "Pokémon Encountered", - "pokemonDefeated": "Pokémon Defeated", - "pokemonCaught": "Pokémon Caught", - "eggsHatched": "Eggs Hatched", - "subLegendsSeen": "Sub-Legends Seen", - "subLegendsCaught": "Sub-Legends Caught", - "subLegendsHatched": "Sub-Legends Hatched", - "legendsSeen": "Legends Seen", - "legendsCaught": "Legends Caught", - "legendsHatched": "Legends Hatched", - "mythicalsSeen": "Mythicals Seen", - "mythicalsCaught": "Mythicals Caught", - "mythicalsHatched": "Mythicals Hatched", - "shiniesSeen": "Shinies Seen", - "shiniesCaught": "Shinies Caught", - "shiniesHatched": "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", + "stats": "統計", + "playTime": "遊戲時間", + "totalBattles": "總戰鬥次數", + "starters": "初始寶可夢", + "shinyStarters": "閃光初始寶可夢", + "speciesSeen": "遇到的種類", + "speciesCaught": "捕捉的種類", + "ribbonsOwned": "擁有緞帶數", + "classicRuns": "經典模式次數", + "classicWins": "經典模式通關次數", + "dailyRunAttempts": "每日挑戰次數", + "dailyRunWins": "每日挑戰通關次數", + "endlessRuns": "無盡模式挑戰次數", + "highestWaveEndless": "最高層數(無盡)", + "highestMoney": "最多金錢", + "highestDamage": "最高傷害", + "highestHPHealed": "最多治療", + "pokemonEncountered": "遇敵數量", + "pokemonDefeated": "打倒數量", + "pokemonCaught": "捕捉數量", + "eggsHatched": "孵蛋數量", + "subLegendsSeen": "遇到的二級神寶可夢", + "subLegendsCaught": "捕捉的二級神寶可夢", + "subLegendsHatched": "孵化的二級神寶可夢", + "legendsSeen": "遇到的傳說寶可夢", + "legendsCaught": "捕捉的傳說寶可夢", + "legendsHatched": "孵化的傳說寶可夢", + "mythicalsSeen": "遇到的幻獸寶可夢", + "mythicalsCaught": "捕捉的幻獸寶可夢", + "mythicalsHatched": "孵化的幻獸寶可夢", + "shiniesSeen": "遇到的閃光寶可夢", + "shiniesCaught": "捕捉的閃光寶可夢", + "shiniesHatched": "孵化的閃光寶可夢", + "pokemonFused": "融合寶可夢次數", + "trainersDefeated": "打敗的訓練師數", + "eggsPulled": "總扭蛋次數", + "rareEggsPulled": "稀有扭蛋數", + "epicEggsPulled": "史詩扭蛋數", + "legendaryEggsPulled": "傳說扭蛋數", + "manaphyEggsPulled": "瑪娜霏扭蛋數", } as const; diff --git a/src/locales/zh_TW/growth.ts b/src/locales/zh_TW/growth.ts index 941ddb39e66..a67f108052a 100644 --- a/src/locales/zh_TW/growth.ts +++ b/src/locales/zh_TW/growth.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const growth: SimpleTranslationEntries = { "Erratic": "最快", diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index c38b447effd..21ba10ba30e 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const menuUiHandler: SimpleTranslationEntries = { "GAME_SETTINGS": "遊戲設置", @@ -19,5 +19,6 @@ export const menuUiHandler: SimpleTranslationEntries = { "importData": "導入數據", "exportData": "導出數據", "cancel": "取消", - "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?" + "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", + "noEggs": "You are not hatching\nany eggs at the moment!" } as const; diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index d16052f2ac7..6d89bc256c6 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -11,7 +11,7 @@ export const menu: SimpleTranslationEntries = { "dailyRun": "每日挑戰 (Beta)", "loadGame": "加載遊戲", "newGame": "新遊戲", - "settings": "Settings", + "settings": "設定", "selectGameMode": "選擇遊戲模式", "logInOrCreateAccount": "登入或註冊即可開始遊戲,無需郵箱!", "username": "用戶名", @@ -34,8 +34,6 @@ export const menu: SimpleTranslationEntries = { "sessionSuccess": "工作階段加載成功.", "failedToLoadSession": "無法加載您的工作階段數據。它可能已損壞。", "boyOrGirl": "你是男孩還是女孩?", - "boy": "男孩", - "girl": "女孩", "evolving": "甚麼?\n{{pokemonName}} 要進化了!", "stoppedEvolving": "{{pokemonName}} 停止了進化。", "pauseEvolutionsQuestion": "你確定要停止 {{pokemonName}} 的進化嗎?\n你可以在隊伍畫面中重新啟用進化。", @@ -44,11 +42,17 @@ export const menu: SimpleTranslationEntries = { "dailyRankings": "每日排名", "weeklyRankings": "每週排名", "noRankings": "無排名", + "positionIcon": "#", + "usernameScoreboard": "Username", + "score": "Score", + "wave": "Wave", "loading": "加載中…", "loadingAsset": "Loading asset: {{assetName}}", "playersOnline": "在線玩家", "yes":"是", "no":"否", "disclaimer": "DISCLAIMER", - "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed." + "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", + "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index 2577db69d65..d31d9b8a53d 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -1,4 +1,4 @@ -import { ModifierTypeTranslationEntries } from "#app/plugins/i18n"; +import { ModifierTypeTranslationEntries } from "#app/interfaces/locales"; export const modifierType: ModifierTypeTranslationEntries = { ModifierType: { @@ -187,6 +187,10 @@ export const modifierType: ModifierTypeTranslationEntries = { LUCKY_EGG: { name: "幸運蛋" }, GOLDEN_EGG: { name: "金蛋" }, SOOTHE_BELL: { name: "安撫之鈴" }, + EVIOLITE: { + name: "進化奇石", + description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" + }, SOUL_DEW: { name: "心之水滴", description: "增加寶可夢性格影響10% (加算)。", @@ -243,14 +247,14 @@ export const modifierType: ModifierTypeTranslationEntries = { "攜帶該道具的寶可夢在攻擊對方成功造成傷\n害時,攜帶者的HP會恢復其所造成傷害\n的1/8。", }, TOXIC_ORB: { - name: "Toxic Orb", + name: "劇毒寶珠", description: - "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle" + "觸碰後會放出毒的神奇寶珠。\n攜帶後,在戰鬥時會變成劇毒狀態。" }, FLAME_ORB: { - name: "Flame Orb", + name: "火焰寶珠", description: - "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle" + "觸碰後會放出熱量的神奇寶珠。\n攜帶後,在戰鬥時會變成灼傷狀態。" }, BATON: { name: "接力棒", @@ -297,6 +301,12 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "增加1%野生融合寶可夢出現概率。", }, }, + SpeciesBoosterItem: { + "LIGHT_BALL": { name: "電氣球", description: "讓皮卡丘攜帶後,攻擊和特攻就會 提高的神奇之球。" }, + "THICK_CLUB": { name: "粗骨頭", description: "某種堅硬的骨頭。讓卡拉卡拉或嘎啦嘎啦攜帶後,攻擊就會提高。" }, + "METAL_POWDER": { name: "金屬粉", description: "讓百變怪攜帶後,防禦就會提高的神奇粉末。非常細緻堅硬。" }, + "QUICK_POWDER": { name: "速度粉", description: "讓百變怪攜帶後,速度就會提高的神奇粉末。非常細緻堅硬。" } + }, TempBattleStatBoosterItem: { x_attack: "力量強化", x_defense: "防禦強化", @@ -306,6 +316,19 @@ export const modifierType: ModifierTypeTranslationEntries = { x_accuracy: "命中強化", dire_hit: "要害攻擊", }, + + TempBattleStatBoosterStatName: { + "ATK": "攻擊", + "DEF": "防禦", + "SPATK": "特攻", + "SPDEF": "特防", + "SPD": "速度", + "ACC": "命中", + "CRIT": "會心", + "EVA": "閃避", + "DEFAULT": "???", + }, + AttackTypeBoosterItem: { silk_scarf: "絲綢圍巾", black_belt: "黑帶", diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts index 87e19a0b531..0a6321850db 100644 --- a/src/locales/zh_TW/move.ts +++ b/src/locales/zh_TW/move.ts @@ -1,4 +1,4 @@ -import { MoveTranslationEntries } from "#app/plugins/i18n"; +import { MoveTranslationEntries } from "#app/interfaces/locales"; export const move: MoveTranslationEntries = { pound: { name: "拍擊", effect: "使用長長的尾巴或手等拍打\n對手進行攻擊" }, diff --git a/src/locales/zh_TW/nature.ts b/src/locales/zh_TW/nature.ts index 10ca9c71939..f72d271c139 100644 --- a/src/locales/zh_TW/nature.ts +++ b/src/locales/zh_TW/nature.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const nature: SimpleTranslationEntries = { "Hardy": "勤奮", diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts index 9d3c7baa9ae..dfe1a3629b6 100644 --- a/src/locales/zh_TW/party-ui-handler.ts +++ b/src/locales/zh_TW/party-ui-handler.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const partyUiHandler: SimpleTranslationEntries = { - "SEND_OUT": "Send Out", - "SUMMARY": "Summary", - "CANCEL": "Cancel", - "RELEASE": "Release", - "APPLY": "Apply", - "TEACH": "Teach" + "SEND_OUT": "上場", + "SUMMARY": "概要", + "CANCEL": "取消", + "RELEASE": "放生", + "APPLY": "應用", + "TEACH": "教授" } as const; diff --git a/src/locales/zh_TW/pokeball.ts b/src/locales/zh_TW/pokeball.ts index ce3d7a7a860..8919f3591e1 100644 --- a/src/locales/zh_TW/pokeball.ts +++ b/src/locales/zh_TW/pokeball.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokeball: SimpleTranslationEntries = { "pokeBall": "精靈球", diff --git a/src/locales/zh_TW/pokemon-info-container.ts b/src/locales/zh_TW/pokemon-info-container.ts index 068c9ebb431..19cb5219465 100644 --- a/src/locales/zh_TW/pokemon-info-container.ts +++ b/src/locales/zh_TW/pokemon-info-container.ts @@ -1,11 +1,11 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfoContainer: SimpleTranslationEntries = { - "moveset": "Moveset", - "gender": "Gender:", - "ability": "Ability:", - "nature": "Nature:", - "epic": "Epic", - "rare": "Rare", - "common": "Common" + "moveset": "招式", + "gender": "性别:", + "ability": "特性:", + "nature": "性格:", + "epic": "史詩", + "rare": "稀有", + "common": "常見" } as const; diff --git a/src/locales/zh_TW/pokemon-info.ts b/src/locales/zh_TW/pokemon-info.ts index 5c00add8081..b3edea0c3d4 100644 --- a/src/locales/zh_TW/pokemon-info.ts +++ b/src/locales/zh_TW/pokemon-info.ts @@ -1,4 +1,4 @@ -import { PokemonInfoTranslationEntries } from "#app/plugins/i18n"; +import { PokemonInfoTranslationEntries } from "#app/interfaces/locales"; export const pokemonInfo: PokemonInfoTranslationEntries = { Stat: { @@ -13,7 +13,9 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPDEF": "特殊防禦", "SPDEFshortened": "特防", "SPD": "速度", - "SPDshortened": "速度" + "SPDshortened": "速度", + "ACC": "Accuracy", + "EVA": "Evasiveness" }, Type: { diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.ts index cee85d8905b..2a82f11f4c3 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const pokemon: SimpleTranslationEntries = { "bulbasaur": "妙蛙種子", @@ -987,7 +987,7 @@ export const pokemon: SimpleTranslationEntries = { "great_tusk": "雄偉牙", "scream_tail": "吼叫尾", "brute_bonnet": "猛惡菇", - "flutter_mane": "振翼發", + "flutter_mane": "振翼髮", "slither_wing": "爬地翅", "sandy_shocks": "沙鐵皮", "iron_treads": "鐵轍跡", diff --git a/src/locales/zh_TW/save-slot-select-ui-handler.ts b/src/locales/zh_TW/save-slot-select-ui-handler.ts index 98b7764aee2..68377aec4b2 100644 --- a/src/locales/zh_TW/save-slot-select-ui-handler.ts +++ b/src/locales/zh_TW/save-slot-select-ui-handler.ts @@ -1,9 +1,9 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const saveSlotSelectUiHandler: SimpleTranslationEntries = { - "overwriteData": "Overwrite the data in the selected slot?", - "loading": "Loading...", - "wave": "Wave", + "overwriteData": "要覆蓋該槽位的存檔嗎?", + "loading": "正在加載...", + "wave": "層數", "lv": "Lv", "empty": "空", } as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.ts new file mode 100644 index 00000000000..dcb87fafe35 --- /dev/null +++ b/src/locales/zh_TW/settings.ts @@ -0,0 +1,99 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; + +export const settings: SimpleTranslationEntries = { + "boy": "男孩", + "girl": "女孩", + "general": "常規", + "display": "顯示", + "audio": "音頻", + "gamepad": "手柄", + "keyboard": "鍵盤", + "gameSpeed": "遊戲速度", + "hpBarSpeed": "血條速度", + "expGainsSpeed": "經驗值獲取動畫速度", + "expPartyDisplay": "顯示隊伍經驗", + "skipSeenDialogues": "跳過已讀對話", + "battleStyle": "對戰模式", + "enableRetries": "允許重試", + "tutorials": "教程", + "touchControls": "觸摸操作", + "vibrations": "手柄震動", + "normal": "普通", + "fast": "快", + "faster": "更快", + "skip": "跳過", + "levelUpNotifications": "升級提示", + "on": "啟用", + "off": "禁用", + "switch": "切換", + "set": "固定", + "auto": "自動", + "disabled": "禁用", + "language": "語言", + "change": "選擇", + "uiTheme": "界面風格", + "default": "默認", + "legacy": "經典", + "windowType": "窗口類型", + "moneyFormat": "金錢格式", + "damageNumbers": "傷害數字", + "simple": "簡單", + "fancy": "華麗", + "abbreviated": "縮寫", + "moveAnimations": "招式動畫", + "showStatsOnLevelUp": "升級時顯示能力值", + "candyUpgradeNotification": "糖果升級提示", + "passivesOnly": "僅被動", + "candyUpgradeDisplay": "糖果升級顯示", + "icon": "圖標", + "animation": "動畫", + "moveInfo": "招式信息", + "showMovesetFlyout": "顯示招式池彈窗", + "showArenaFlyout": "顯示戰場彈窗", + "showTimeOfDayWidget": "顯示時間指示器", + "timeOfDayAnimation": "時間指示器動畫", + "bounce": "彈一下", + "timeOfDay_back": "不彈", + "spriteSet": "寶可夢動畫", + "consistent": "默認", + "mixedAnimated": "全部動畫", + "fusionPaletteSwaps": "融合色調切換", + "playerGender": "玩家性別", + "typeHints": "屬性提示", + "masterVolume": "主音量", + "bgmVolume": "音樂", + "seVolume": "音效", + "musicPreference": "音樂偏好", + "mixed": "全曲混合", + "gamepadPleasePlug": "請連接手柄或按任意鍵", + "delete": "刪除", + "keyboardPleasePress": "請點擊鍵盤上的對應按鍵", + "reset": "重置", + "requireReload": "需要重新加載", + "action": "操作", + "back": "返回", + "pressToBind": "按下以綁定", + "pressButton": "請按鍵……", + "buttonUp": "上", + "buttonDown": "下", + "buttonLeft": "左", + "buttonRight": "右", + "buttonAction": "確認", + "buttonMenu": "菜單", + "buttonSubmit": "提交", + "buttonCancel": "取消", + "buttonStats": "狀態", + "buttonCycleForm": "切換形態", + "buttonCycleShiny": "切換閃光", + "buttonCycleGender": "切換性別", + "buttonCycleAbility": "切換特性", + "buttonCycleNature": "切換性格", + "buttonCycleVariant": "切換變種", + "buttonSpeedUp": "加速", + "buttonSlowDown": "減速", + "alt": " (備用)", + "mute": "靜音", + "controller": "控制器", + "gamepadSupport": "手柄支持", + "showBgmBar": "Show Music Names", +} as const; diff --git a/src/locales/zh_TW/splash-messages.ts b/src/locales/zh_TW/splash-messages.ts index 496f3c39dc4..3fbbea71564 100644 --- a/src/locales/zh_TW/splash-messages.ts +++ b/src/locales/zh_TW/splash-messages.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const splashMessages: SimpleTranslationEntries = { "battlesWon": "勝利場數!", diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index c28cb39b94b..ae9a4083d20 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The menu namespace holds most miscellaneous text that isn't directly part of the game's @@ -25,11 +25,14 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "addToParty": "加入隊伍", "toggleIVs": "查看個體值", "manageMoves": "管理技能", + "manageNature": "管理性格", "useCandies": "使用糖果", + "selectNature": "選擇性格", "selectMoveSwapOut": "選擇想要替換走的招式", "selectMoveSwapWith": "選擇想要替換成的招式", "unlockPassive": "解鎖被動", "reduceCost": "降低花費", + "sameSpeciesEgg": "買蛋", "cycleShiny": ": 閃光", "cycleForm": ": 形態", "cycleGender": ": 性別", diff --git a/src/locales/zh_TW/status-effect.ts b/src/locales/zh_TW/status-effect.ts new file mode 100644 index 00000000000..1a402ac30fd --- /dev/null +++ b/src/locales/zh_TW/status-effect.ts @@ -0,0 +1,67 @@ +import { StatusEffectTranslationEntries } from "#app/interfaces/locales.js"; + +export const statusEffect: StatusEffectTranslationEntries = { + none: { + name: "None", + description: "", + obtain: "", + obtainSource: "", + activation: "", + overlap: "", + heal: "" + }, + poison: { + name: "Poison", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + toxic: { + name: "Toxic", + description: "poisoning", + obtain: "{{pokemonNameWithAffix}}\nwas badly poisoned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas badly poisoned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby poison!", + overlap: "{{pokemonNameWithAffix}} is\nalready poisoned!", + heal: "{{pokemonNameWithAffix}} was\ncured of its poison!" + }, + paralysis: { + name: "Paralysis", + description: "paralysis", + obtain: "{{pokemonNameWithAffix}} was paralyzed,\nIt may be unable to move!", + obtainSource: "{{pokemonNameWithAffix}} was paralyzed by {{sourceText}},\nIt may be unable to move!", + activation: "{{pokemonNameWithAffix}} is paralyzed!\nIt can't move!", + overlap: "{{pokemonNameWithAffix}} is\nalready paralyzed!", + heal: "{{pokemonNameWithAffix}} was\nhealed of paralysis!" + }, + sleep: { + name: "Sleep", + description: "sleep", + obtain: "{{pokemonNameWithAffix}}\nfell asleep!", + obtainSource: "{{pokemonNameWithAffix}}\nfell asleep from {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is fast asleep.", + overlap: "{{pokemonNameWithAffix}} is\nalready asleep!", + heal: "{{pokemonNameWithAffix}} woke up!" + }, + freeze: { + name: "Freeze", + description: "freezing", + obtain: "{{pokemonNameWithAffix}}\nwas frozen solid!", + obtainSource: "{{pokemonNameWithAffix}}\nwas frozen solid by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is\nfrozen solid!", + overlap: "{{pokemonNameWithAffix}} is\nalready frozen!", + heal: "{{pokemonNameWithAffix}} was\ndefrosted!" + }, + burn: { + name: "Burn", + description: "burn", + obtain: "{{pokemonNameWithAffix}}\nwas burned!", + obtainSource: "{{pokemonNameWithAffix}}\nwas burned by {{sourceText}}!", + activation: "{{pokemonNameWithAffix}} is hurt\nby its burn!", + overlap: "{{pokemonNameWithAffix}} is\nalready burned!", + heal: "{{pokemonNameWithAffix}} was\nhealed of its burn!" + }, +} as const; diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 9a9af64ffb4..594363ce009 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/plugins/i18n"; +import {SimpleTranslationEntries} from "#app/interfaces/locales"; // Titles of special trainers like gym leaders, elite four, and the champion export const titles: SimpleTranslationEntries = { @@ -48,7 +48,7 @@ export const trainerClasses: SimpleTranslationEntries = { "depot_agent": "鐵路員工", "doctor": "醫生", "doctor_female": "醫生", - "firebreather": "Firebreather", + "firebreather": "吹火人", "fisherman": "垂釣者", "fisherman_female": "垂釣者", "gentleman": "紳士", diff --git a/src/locales/zh_TW/tutorial.ts b/src/locales/zh_TW/tutorial.ts index a97314abec8..482ac5ce651 100644 --- a/src/locales/zh_TW/tutorial.ts +++ b/src/locales/zh_TW/tutorial.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const tutorial: SimpleTranslationEntries = { "intro": `歡迎來到PokéRogue!這是一款以戰鬥爲核心的融合了roguelite元素的寶可夢同人遊戲。 diff --git a/src/locales/zh_TW/voucher.ts b/src/locales/zh_TW/voucher.ts index dd2d4a7891a..9b521e683fd 100644 --- a/src/locales/zh_TW/voucher.ts +++ b/src/locales/zh_TW/voucher.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const voucher: SimpleTranslationEntries = { "vouchers": "兌換券", diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index 03f3425aa43..7efdc8af0ad 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -1,10 +1,10 @@ -import { SimpleTranslationEntries } from "#app/plugins/i18n"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * The weather namespace holds text displayed when weather is active during a battle */ export const weather: SimpleTranslationEntries = { - "sunnyStartMessage": "日照變強了!", + "sunnyStartMessage": "日照變強了!", "sunnyLapseMessage": "日照很強。", "sunnyClearMessage": "日照復原了。", @@ -15,22 +15,22 @@ export const weather: SimpleTranslationEntries = { "sandstormStartMessage": "開始刮沙暴了!", "sandstormLapseMessage": "沙暴肆虐。", "sandstormClearMessage": "沙暴停止了。", - "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", + "sandstormDamageMessage": "沙暴襲擊了{{pokemonNameWithAffix}}!", - "hailStartMessage": "開始下冰雹了!", + "hailStartMessage": "開始下冰雹了!", "hailLapseMessage": "冰雹繼續肆虐。", "hailClearMessage": "冰雹不再下了。", - "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", + "hailDamageMessage": "冰雹襲擊了{{pokemonNameWithAffix}}!", - "snowStartMessage": "開始下雪了!", + "snowStartMessage": "開始下雪了!", "snowLapseMessage": "雪繼續下。", "snowClearMessage": "雪停了。", - "fogStartMessage": "起霧了!", + "fogStartMessage": "起霧了!", "fogLapseMessage": "霧很濃。", "fogClearMessage": "霧散了。", - "heavyRainStartMessage": "開始下起了暴雨!", + "heavyRainStartMessage": "開始下起了暴雨!", "heavyRainLapseMessage": "暴雨勢頭不減。", "heavyRainClearMessage": "暴雨停了。", @@ -38,7 +38,7 @@ export const weather: SimpleTranslationEntries = { "harshSunLapseMessage": "強日照勢頭不減。", "harshSunClearMessage": "日照復原了。", - "strongWindsStartMessage": "吹起了神秘的亂流!", + "strongWindsStartMessage": "吹起了神秘的亂流!", "strongWindsLapseMessage": "神秘的亂流勢頭不減。", "strongWindsClearMessage": "神秘的亂流停止了。" }; diff --git a/src/main.ts b/src/main.ts index e750335ddd4..41cd68afc1e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -150,7 +150,6 @@ Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems")); -document.fonts.load("12px unifont"); let game; diff --git a/src/messages.ts b/src/messages.ts index b9fbf7f7183..5c465cc08e9 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -1,6 +1,6 @@ import { BattleSpec } from "#enums/battle-spec"; import Pokemon from "./field/pokemon"; -import i18next from "./plugins/i18n"; +import i18next from "i18next"; /** * Builds a message by concatenating the Pokemon name with its potential affix and the given text diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index ac7452ae4c9..d8ec0072bd4 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,6 +1,6 @@ import * as Modifiers from "./modifier"; import { AttackMove, allMoves } from "../data/move"; -import { PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; +import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; import { Stat, getStatName } from "../data/pokemon-stat"; @@ -18,7 +18,7 @@ import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from "../system/v 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 i18next from "i18next"; import { getModifierTierTextTint } from "#app/ui/text"; import * as Overrides from "../overrides"; import { MoneyMultiplierModifier } from "./modifier"; @@ -26,6 +26,7 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -44,7 +45,6 @@ type NewModifierFunc = (type: ModifierType, args: any[]) => Modifier; export class ModifierType { public id: string; - public generatorId: string; public localeKey: string; public iconImage: string; public group: string; @@ -101,7 +101,7 @@ export class ModifierType { 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.id)) { return (this.tier = tier); } } @@ -132,7 +132,6 @@ export class ModifierTypeGenerator extends ModifierType { generateType(party: Pokemon[], pregenArgs?: any[]) { const ret = this.genTypeFunc(party, pregenArgs); if (ret) { - ret.generatorId = ret.id; ret.id = this.id; ret.setTier(this.tier); } @@ -539,6 +538,28 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i } } +export type SpeciesStatBoosterItem = keyof typeof SpeciesStatBoosterModifierTypeGenerator.items; + +/** + * Modifier type for {@linkcode Modifiers.SpeciesStatBoosterModifier} + * @extends PokemonHeldItemModifierType + * @implements GeneratedPersistentModifierType + */ +export class SpeciesStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { + private key: SpeciesStatBoosterItem; + + constructor(key: SpeciesStatBoosterItem) { + const item = SpeciesStatBoosterModifierTypeGenerator.items[key]; + super(`modifierType:SpeciesBoosterItem.${key}`, key.toLowerCase(), (type, args) => new Modifiers.SpeciesStatBoosterModifier(type, (args[0] as Pokemon).id, item.stats, item.multiplier, item.species)); + + this.key = key; + } + + getPregenArgs(): any[] { + return [ this.key ]; + } +} + export class PokemonLevelIncrementModifierType extends PokemonModifierType { constructor(localeKey: string, iconImage: string) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonLevelIncrementModifier(this, (args[0] as PlayerPokemon).id), (_pokemon: PlayerPokemon) => null); @@ -870,6 +891,81 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { } } +/** + * Modifier type generator for {@linkcode SpeciesStatBoosterModifierType}, which + * encapsulates the logic for weighting the most useful held item from + * the current list of {@linkcode items}. + * @extends ModifierTypeGenerator + */ +class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator { + /** Object comprised of the currently available species-based stat boosting held items */ + public static items = { + LIGHT_BALL: { stats: [Stat.ATK, Stat.SPATK], multiplier: 2, species: [Species.PIKACHU] }, + THICK_CLUB: { stats: [Stat.ATK], multiplier: 2, species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK] }, + METAL_POWDER: { stats: [Stat.DEF], multiplier: 2, species: [Species.DITTO] }, + QUICK_POWDER: { stats: [Stat.SPD], multiplier: 2, species: [Species.DITTO] }, + }; + + constructor() { + super((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new SpeciesStatBoosterModifierType(pregenArgs[0] as SpeciesStatBoosterItem); + } + + const values = Object.values(SpeciesStatBoosterModifierTypeGenerator.items); + const keys = Object.keys(SpeciesStatBoosterModifierTypeGenerator.items); + const weights = keys.map(() => 0); + + for (const p of party) { + const speciesId = p.getSpeciesForm(true).speciesId; + const fusionSpeciesId = p.isFusion() ? p.getFusionSpeciesForm(true).speciesId : null; + const hasFling = p.getMoveset(true).some(m => m.moveId === Moves.FLING); + + for (const i in values) { + const checkedSpecies = values[i].species; + const checkedStats = values[i].stats; + + // If party member already has the item being weighted currently, skip to the next item + const hasItem = p.getHeldItems().some(m => m instanceof Modifiers.SpeciesStatBoosterModifier + && (m as Modifiers.SpeciesStatBoosterModifier).contains(checkedSpecies[0], checkedStats[0])); + + if (!hasItem) { + if (checkedSpecies.includes(speciesId) || (!!fusionSpeciesId && checkedSpecies.includes(fusionSpeciesId))) { + // Add weight if party member has a matching species or, if applicable, a matching fusion species + weights[i]++; + } else if (checkedSpecies.includes(Species.PIKACHU) && hasFling) { + // Add weight to Light Ball if party member has Fling + weights[i]++; + } + } + } + } + + let totalWeight = 0; + for (const weight of weights) { + totalWeight += weight; + } + + if (totalWeight !== 0) { + const randInt = Utils.randSeedInt(totalWeight, 1); + let weight = 0; + + for (const i in weights) { + if (weights[i] !== 0) { + const curWeight = weight + weights[i]; + if (randInt <= weight + weights[i]) { + return new SpeciesStatBoosterModifierType(keys[i] as SpeciesStatBoosterItem); + } + weight = curWeight; + } + } + } + + return null; + }); + } +} + class TmModifierTypeGenerator extends ModifierTypeGenerator { constructor(tier: ModifierTier) { super((party: Pokemon[]) => { @@ -1017,6 +1113,30 @@ export class EnemyEndureChanceModifierType extends ModifierType { export type ModifierTypeFunc = () => ModifierType; type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: integer) => integer; +/** + * High order function that returns a WeightedModifierTypeWeightFunc that will only be applied on + * classic and skip an ModifierType if current wave is greater or equal to the one passed down + * @param wave - Wave where we should stop showing the modifier + * @param defaultWeight - ModifierType default weight + * @returns A WeightedModifierTypeWeightFunc + */ +function skipInClassicAfterWave(wave: integer, defaultWeight: integer): WeightedModifierTypeWeightFunc { + return (party: Pokemon[]) => { + const gameMode = party[0].scene.gameMode; + const currentWave = party[0].scene.currentBattle.waveIndex; + return gameMode.isClassic && currentWave >= wave ? 0 : defaultWeight; + }; +} + +/** + * High order function that returns a WeightedModifierTypeWeightFunc that will only be applied on + * classic and it will skip a ModifierType if it is the last wave pull. + * @param defaultWeight ModifierType default weight + * @returns A WeightedModifierTypeWeightFunc + */ +function skipInLastClassicWaveOrDefault(defaultWeight: integer) : WeightedModifierTypeWeightFunc { + return skipInClassicAfterWave(199, defaultWeight); +} class WeightedModifierType { public modifierType: ModifierType; public weight: integer | WeightedModifierTypeWeightFunc; @@ -1086,6 +1206,8 @@ export const modifierTypes = { SUPER_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.SUPER_LURE", "super_lure", 10), MAX_LURE: () => new DoubleBattleChanceBoosterModifierType("modifierType:ModifierType.MAX_LURE", "max_lure", 25), + SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(), + TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) { return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat); @@ -1169,6 +1291,8 @@ export const modifierTypes = { SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), + EVIOLITE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVIOLITE", "eviolite", (type, args) => new Modifiers.EvolutionStatBoosterModifier(type, (args[0] as Pokemon).id, [Stat.DEF, Stat.SPDEF], 1.5)), + SOUL_DEW: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SOUL_DEW", "soul_dew", (type, args) => new Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), NUGGET: () => new MoneyRewardModifierType("modifierType:ModifierType.NUGGET", "nugget", 1, "modifierType:ModifierType.MoneyRewardModifierType.extra.small"), @@ -1236,9 +1360,19 @@ interface ModifierPool { [tier: string]: WeightedModifierType[] } +/** + * Used to check if the player has max of a given ball type in Classic + * @param party The player's party, just used to access the scene + * @param ballType The {@linkcode PokeballType} being checked + * @returns boolean: true if the player has the maximum of a given ball type + */ +function hasMaximumBalls(party: Pokemon[], ballType: PokeballType): boolean { + return (party[0].scene.gameMode.isClassic && party[0].scene.pokeballCounts[ballType] >= MAX_PER_TYPE_POKEBALLS); +} + const modifierPool: ModifierPool = { [ModifierTier.COMMON]: [ - new WeightedModifierType(modifierTypes.POKEBALL, 6), + new WeightedModifierType(modifierTypes.POKEBALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.POKEBALL)) ? 0 : 6, 6), new WeightedModifierType(modifierTypes.RARE_CANDY, 2), new WeightedModifierType(modifierTypes.POTION, (party: Pokemon[]) => { const thresholdPartyMemberCount = Math.min(party.filter(p => (p.getInverseHp() >= 10 || p.getHpRatio() <= 0.875) && !p.isFainted()).length, 3); @@ -1259,12 +1393,13 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.LURE, 2), new WeightedModifierType(modifierTypes.TEMP_STAT_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), - new WeightedModifierType(modifierTypes.TM_COMMON, 1), + new WeightedModifierType(modifierTypes.TM_COMMON, 2), ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ - new WeightedModifierType(modifierTypes.GREAT_BALL, 6), + new WeightedModifierType(modifierTypes.GREAT_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.GREAT_BALL)) ? 0 : 6, 6), + new WeightedModifierType(modifierTypes.PP_UP, 2), new WeightedModifierType(modifierTypes.FULL_HEAL, (party: Pokemon[]) => { const statusEffectPartyMemberCount = Math.min(party.filter(p => p.hp && !!p.status && !p.getHeldItems().some(i => { if (i instanceof Modifiers.TurnStatusEffectModifier) { @@ -1313,12 +1448,12 @@ const modifierPool: ModifierPool = { }, 3), new WeightedModifierType(modifierTypes.DIRE_HIT, 4), new WeightedModifierType(modifierTypes.SUPER_LURE, 4), - new WeightedModifierType(modifierTypes.NUGGET, 5), + new WeightedModifierType(modifierTypes.NUGGET, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, (party: Pokemon[]) => { return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15), 8); }, 8), new WeightedModifierType(modifierTypes.MAP, (party: Pokemon[]) => party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex < 180 ? 1 : 0, 1), - new WeightedModifierType(modifierTypes.TM_GREAT, 2), + new WeightedModifierType(modifierTypes.TM_GREAT, 3), new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { if (!party.find(p => p.getLearnableLevelMoves().length)) { return 0; @@ -1334,14 +1469,15 @@ const modifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ULTRA_BALL, 24), + new WeightedModifierType(modifierTypes.ULTRA_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ULTRA_BALL)) ? 0 : 15, 15), new WeightedModifierType(modifierTypes.MAX_LURE, 4), - new WeightedModifierType(modifierTypes.BIG_NUGGET, 12), - new WeightedModifierType(modifierTypes.PP_UP, 9), + new WeightedModifierType(modifierTypes.BIG_NUGGET, skipInLastClassicWaveOrDefault(12)), new WeightedModifierType(modifierTypes.PP_MAX, 3), new WeightedModifierType(modifierTypes.MINT, 4), new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32), - new WeightedModifierType(modifierTypes.AMULET_COIN, 3), + new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), + //new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 0), + new WeightedModifierType(modifierTypes.SPECIES_STAT_BOOSTER, 12), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { const checkedAbilities = [Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD]; const checkedMoves = [Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT]; @@ -1356,49 +1492,49 @@ const modifierPool: ModifierPool = { }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), - new WeightedModifierType(modifierTypes.TM_ULTRA, 8), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), + new WeightedModifierType(modifierTypes.TM_ULTRA, 11), new WeightedModifierType(modifierTypes.RARER_CANDY, 4), - new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2), + new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.IV_SCANNER, 4), new WeightedModifierType(modifierTypes.EXP_CHARM, 8), - new WeightedModifierType(modifierTypes.EXP_SHARE, 12), - new WeightedModifierType(modifierTypes.EXP_BALANCE, 4), + new WeightedModifierType(modifierTypes.EXP_SHARE, 10), + new WeightedModifierType(modifierTypes.EXP_BALANCE, 3), new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), + new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.WIDE_LENS, 4), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ - new WeightedModifierType(modifierTypes.ROGUE_BALL, 24), - new WeightedModifierType(modifierTypes.RELIC_GOLD, 2), + new WeightedModifierType(modifierTypes.ROGUE_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.ROGUE_BALL)) ? 0 : 16, 16), + new WeightedModifierType(modifierTypes.RELIC_GOLD, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.LEFTOVERS, 3), new WeightedModifierType(modifierTypes.SHELL_BELL, 3), new WeightedModifierType(modifierTypes.BERRY_POUCH, 4), new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), new WeightedModifierType(modifierTypes.BATON, 2), - new WeightedModifierType(modifierTypes.SOUL_DEW, 8), + new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, 6), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), - new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), new WeightedModifierType(modifierTypes.LOCK_CAPSULE, 3), - new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 10), - 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), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(5 - rerollCount * 2, 0) : 0, 5), + new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, 8), + new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), + new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), + new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), + new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ - new WeightedModifierType(modifierTypes.MASTER_BALL, 24), + new WeightedModifierType(modifierTypes.MASTER_BALL, (party: Pokemon[]) => (hasMaximumBalls(party, PokeballType.MASTER_BALL)) ? 0 : 24, 24), new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(6 - rerollCount * 2, 0) : 0, 6), + new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), ].map(m => { @@ -1604,7 +1740,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod let i = 0; pool[t].reduce((total: integer, modifierType: WeightedModifierType) => { const weightedModifierType = modifierType as WeightedModifierType; - const existingModifiers = party[0].scene.findModifiers(m => (m.type.generatorId || m.type.id) === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); + const existingModifiers = party[0].scene.findModifiers(m => m.type.id === weightedModifierType.modifierType.id, poolType === ModifierPoolType.PLAYER); const itemModifierType = weightedModifierType.modifierType instanceof ModifierTypeGenerator ? weightedModifierType.modifierType.generateType(party) : weightedModifierType.modifierType; @@ -1617,7 +1753,7 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod : weightedModifierType.weight as integer : 0; if (weightedModifierType.maxWeight) { - const modifierId = weightedModifierType.modifierType.generatorId || weightedModifierType.modifierType.id; + const modifierId = weightedModifierType.modifierType.id; tierModifierIds.push(modifierId); const outputWeight = useMaxWeightForOutput ? weightedModifierType.maxWeight : weight; modifierTableData[modifierId] = { weight: outputWeight, tier: parseInt(t), tierPercent: 0, totalPercent: 0 }; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 5ea983fb598..f7c23406179 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2,14 +2,14 @@ import * as ModifierTypes from "./modifier-type"; import { LearnMovePhase, LevelUpPhase, PokemonHealPhase } from "../phases"; import BattleScene from "../battle-scene"; import { getLevelTotalExp } from "../data/exp"; -import { PokeballType } from "../data/pokeball"; +import { MAX_PER_TYPE_POKEBALLS, 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 {getPokemonMessage, getPokemonNameWithAffix} from "../messages"; import * as Utils from "../utils"; import { TempBattleStat } from "../data/temp-battle-stat"; import { getBerryEffectFunc, getBerryPredicate } from "../data/berry"; @@ -23,6 +23,10 @@ import { Nature } from "#app/data/nature"; import * as Overrides from "../overrides"; import { ModifierType, modifierTypes } from "./modifier-type"; import { Command } from "#app/ui/command-ui-handler.js"; +import { Species } from "#enums/species"; + +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -61,13 +65,19 @@ export class ModifierBar extends Phaser.GameObjects.Container { this.setScale(0.5); } - updateModifiers(modifiers: PersistentModifier[]) { + /** + * Method to update content displayed in {@linkcode ModifierBar} + * @param {PersistentModifier[]} modifiers - The list of modifiers to be displayed in the {@linkcode ModifierBar} + * @param {boolean} hideHeldItems - If set to "true", only modifiers not assigned to a Pokémon are displayed + */ + updateModifiers(modifiers: PersistentModifier[], hideHeldItems: boolean = false) { this.removeAll(true); const visibleIconModifiers = modifiers.filter(m => m.isIconVisible(this.scene as BattleScene)); const nonPokemonSpecificModifiers = visibleIconModifiers.filter(m => !(m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); const pokemonSpecificModifiers = visibleIconModifiers.filter(m => (m as PokemonHeldItemModifier).pokemonId).sort(modifierSortFunc); - const sortedVisibleIconModifiers = nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); + + const sortedVisibleIconModifiers = hideHeldItems ? nonPokemonSpecificModifiers : nonPokemonSpecificModifiers.concat(pokemonSpecificModifiers); const thisArg = this; @@ -253,7 +263,7 @@ export class AddPokeballModifier extends ConsumableModifier { apply(args: any[]): boolean { const pokeballCounts = (args[0] as BattleScene).pokeballCounts; - pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, 99); + pokeballCounts[this.pokeballType] = Math.min(pokeballCounts[this.pokeballType] + this.count, MAX_PER_TYPE_POKEBALLS); return true; } @@ -319,7 +329,8 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier match(modifier: Modifier): boolean { if (modifier instanceof DoubleBattleChanceBoosterModifier) { - return (modifier as DoubleBattleChanceBoosterModifier).battlesLeft === this.battlesLeft; + // Check type id to not match different tiers of lures + return modifier.type.id === this.type.id && modifier.battlesLeft === this.battlesLeft; } return false; } @@ -331,9 +342,15 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier getArgs(): any[] { return [ this.battlesLeft ]; } - + /** + * Modifies the chance of a double battle occurring + * @param args A single element array containing the double battle chance as a NumberHolder + * @returns {boolean} Returns true if the modifier was applied + */ apply(args: any[]): boolean { const doubleBattleChance = args[0] as Utils.NumberHolder; + // This is divided because the chance is generated as a number from 0 to doubleBattleChance.value using Utils.randSeedInt + // A double battle will initiate if the generated number is 0 doubleBattleChance.value = Math.ceil(doubleBattleChance.value / 2); return true; @@ -520,6 +537,22 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return 1; } + //Applies to items with chance of activating secondary effects ie Kings Rock + getSecondaryChanceMultiplier(pokemon: Pokemon): integer { + // Temporary quickfix to stop game from freezing when the opponet uses u-turn while holding on to king's rock + if (!pokemon.getLastXMoves(0)[0]) { + return 1; + } + const sheerForceAffected = allMoves[pokemon.getLastXMoves(0)[0].move].chance >= 0 && pokemon.hasAbility(Abilities.SHEER_FORCE); + + if (sheerForceAffected) { + return 0; + } else if (pokemon.hasAbility(Abilities.SERENE_GRACE)) { + return 2; + } + return 1; + } + getMaxStackCount(scene: BattleScene, forThreshold?: boolean): integer { const pokemon = this.getPokemon(scene); if (!pokemon) { @@ -674,6 +707,180 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for held items that apply {@linkcode Stat} boost(s) + * using a multiplier. + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class StatBoosterModifier extends PokemonHeldItemModifier { + /** The stats that the held item boosts */ + protected stats: Stat[]; + /** The multiplier used to increase the relevant stat(s) */ + protected multiplier: number; + + constructor(type: ModifierType, pokemonId: integer, stats: Stat[], multiplier: number, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.stats = stats; + this.multiplier = multiplier; + } + + clone() { + return new StatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.stats, this.multiplier ]; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof StatBoosterModifier) { + const modifierInstance = modifier as StatBoosterModifier; + if ((modifierInstance.multiplier === this.multiplier) && (modifierInstance.stats.length === this.stats.length)) { + return modifierInstance.stats.every((e, i) => e === this.stats[i]); + } + } + + return false; + } + + /** + * Checks if the incoming stat is listed in {@linkcode stats} + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Stat} being checked at the time + * [2] {@linkcode Utils.NumberHolder} N/A + * @returns true if the stat could be boosted, false otherwise + */ + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && this.stats.includes(args[1] as Stat); + } + + /** + * Boosts the incoming stat by a {@linkcode multiplier} if the stat is listed + * in {@linkcode stats}. + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Stat} N/A + * [2] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat + * @returns true if the stat boost applies successfully, false otherwise + * @see shouldApply + */ + apply(args: any[]): boolean { + const statValue = args[2] as Utils.NumberHolder; + + statValue.value *= this.multiplier; + return true; + } + + getMaxHeldItemCount(_pokemon: Pokemon): number { + return 1; + } +} + +/** + * Modifier used for held items, specifically Eviolite, that apply + * {@linkcode Stat} boost(s) using a multiplier if the holder can evolve. + * @extends StatBoosterModifier + * @see {@linkcode apply} + */ +export class EvolutionStatBoosterModifier extends StatBoosterModifier { + clone() { + return super.clone() as EvolutionStatBoosterModifier; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof EvolutionStatBoosterModifier; + } + + /** + * Boosts the incoming stat value by a {@linkcode multiplier} if the holder + * can evolve. Note that, if the holder is a fusion, they will receive + * only half of the boost if either of the fused members are fully + * evolved. However, if they are both unevolved, the full boost + * will apply. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Stat} N/A + * [2] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat + * @returns true if the stat boost applies successfully, false otherwise + * @see shouldApply + */ + apply(args: any[]): boolean { + const holder = args[0] as Pokemon; + const statValue = args[2] as Utils.NumberHolder; + const isUnevolved = holder.getSpeciesForm(true).speciesId in pokemonEvolutions; + + if (holder.isFusion() && (holder.getFusionSpeciesForm(true).speciesId in pokemonEvolutions) !== isUnevolved) { + // Half boost applied if holder is fused and either part of fusion is fully evolved + statValue.value *= 1 + (this.multiplier - 1) / 2; + return true; + } else if (isUnevolved) { + // Full boost applied if holder is unfused and unevolved or, if fused, both parts of fusion are unevolved + return super.apply(args); + } + + return false; + } +} + +/** + * Modifier used for held items that apply {@linkcode Stat} boost(s) using a + * multiplier if the holder is of a specific {@linkcode Species}. + * @extends StatBoosterModifier + * @see {@linkcode apply} + */ +export class SpeciesStatBoosterModifier extends StatBoosterModifier { + /** The species that the held item's stat boost(s) apply to */ + private species: Species[]; + + constructor(type: ModifierType, pokemonId: integer, stats: Stat[], multiplier: number, species: Species[], stackCount?: integer) { + super(type, pokemonId, stats, multiplier, stackCount); + + this.species = species; + } + + clone() { + return new SpeciesStatBoosterModifier(this.type, this.pokemonId, this.stats, this.multiplier, this.species, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.species ]; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof SpeciesStatBoosterModifier) { + const modifierInstance = modifier as SpeciesStatBoosterModifier; + if (modifierInstance.species.length === this.species.length) { + return super.matchType(modifier) && modifierInstance.species.every((e, i) => e === this.species[i]); + } + } + + return false; + } + + /** + * Checks if the incoming stat is listed in {@linkcode stats} and if the holder's {@linkcode Species} + * (or its fused species) is listed in {@linkcode species}. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Stat} being checked at the time + * [2] {@linkcode Utils.NumberHolder} N/A + * @returns true if the stat could be boosted, false otherwise + */ + shouldApply(args: any[]): boolean { + const holder = args[0] as Pokemon; + return super.shouldApply(args) && (this.species.includes(holder.getSpeciesForm(true).speciesId) || (holder.isFusion() && this.species.includes(holder.getFusionSpeciesForm(true).speciesId))); + } + + /** + * Checks if either parameter is included in the corresponding lists + * @param speciesId {@linkcode Species} being checked + * @param stat {@linkcode Stat} being checked + * @returns true if both parameters are in {@linkcode species} and {@linkcode stats} respectively, false otherwise + */ + contains(speciesId: Species, stat: Stat): boolean { + return this.species.includes(speciesId) && this.stats.includes(stat); + } +} + /** * Applies Specific Type item boosts (e.g., Magnet) */ @@ -831,7 +1038,7 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { const pokemon = args[0] as Pokemon; const flinched = args[1] as Utils.BooleanHolder; - if (!flinched.value && pokemon.randSeedInt(10) < this.getStackCount()) { + if (!flinched.value && pokemon.randSeedInt(10) < (this.getStackCount() * this.getSecondaryChanceMultiplier(pokemon))) { flinched.value = true; return true; } @@ -2262,7 +2469,7 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier apply(args: any[]): boolean { const target = (args[0] as Pokemon); if (target.status && Phaser.Math.RND.realInRange(0, 1) < (this.chance * this.getStackCount())) { - target.scene.queueMessage(getPokemonMessage(target, getStatusEffectHealText(target.status.effect))); + target.scene.queueMessage(getStatusEffectHealText(target.status.effect, getPokemonNameWithAffix(target))); target.resetStatus(); target.updateInfo(); return true; diff --git a/src/overrides.ts b/src/overrides.ts index 6ae3af64299..3e894967893 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -8,7 +8,9 @@ import { PokeballCounts } from "./battle-scene"; import { PokeballType } from "./data/pokeball"; import { Gender } from "./data/gender"; import { StatusEffect } from "./data/status-effect"; -import { modifierTypes } from "./modifier/modifier-type"; +import { SpeciesStatBoosterItem, modifierTypes } from "./modifier/modifier-type"; +import { VariantTier } from "./enums/variant-tiers"; +import { EggTier } from "#enums/egg-type"; import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; @@ -36,9 +38,9 @@ export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override export const XP_MULTIPLIER_OVERRIDE: number = null; -export const IMMEDIATE_HATCH_EGGS_OVERRIDE: boolean = false; // default 1000 export const STARTING_MONEY_OVERRIDE: integer = 0; +export const FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { active: false, pokeballs: { @@ -98,6 +100,17 @@ export const OPP_SHINY_OVERRIDE: boolean = false; export const OPP_VARIANT_OVERRIDE: Variant = 0; export const OPP_IVS_OVERRIDE: integer | integer[] = []; +/** + * EGG OVERRIDES + */ + +export const EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; +export const EGG_TIER_OVERRIDE: EggTier = null; +export const EGG_SHINY_OVERRIDE: boolean = false; +export const EGG_VARIANT_OVERRIDE: VariantTier = null; +export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; +export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; + /** * MODIFIER / ITEM OVERRIDES * if count is not provided, it will default to 1 @@ -112,11 +125,12 @@ export const OPP_IVS_OVERRIDE: integer | integer[] = []; * - Nature is for MINT * - Type is for TERA_SHARD or ATTACK_TYPE_BOOSTER (type boosting items i.e Silk Scarf) * - BerryType is for BERRY + * - SpeciesStatBoosterItem is for SPECIES_STAT_BOOSTER */ interface ModifierOverride { name: keyof typeof modifierTypes & string, count?: integer - type?: TempBattleStat|Stat|Nature|Type|BerryType + type?: TempBattleStat|Stat|Nature|Type|BerryType|SpeciesStatBoosterItem } export const STARTING_MODIFIER_OVERRIDE: Array = []; export const OPP_MODIFIER_OVERRIDE: Array = []; diff --git a/src/phases.ts b/src/phases.ts index 45fcc106c61..9f069a60dc5 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,7 +1,7 @@ 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 { 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 { 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"; @@ -19,14 +19,14 @@ import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, EncoreTag, HideSpriteTag as HiddenTag, ProtectedTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr } from "./data/ability"; +import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -35,7 +35,7 @@ import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; import { EggHatchPhase } from "./egg-hatch-phase"; import { Egg } from "./data/egg"; import { vouchers } from "./system/voucher"; -import { loggedInUser, updateUserInfo } from "./account"; +import { clientSessionId, loggedInUser, updateUserInfo } from "./account"; import { SessionSaveData } from "./system/game-data"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims"; import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; @@ -66,6 +66,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +const { t } = i18next; export class LoginPhase extends Phase { private showText: boolean; @@ -94,7 +95,14 @@ export class LoginPhase extends Phase { this.scene.playSound("menu_open"); const loadData = () => { - updateUserInfo().then(() => this.scene.gameData.loadSystem().then(() => this.end())); + updateUserInfo().then(success => { + if (!success[0]) { + Utils.setCookie(Utils.sessionIdKey, ""); + this.scene.reset(true, true); + return; + } + this.scene.gameData.loadSystem().then(() => this.end()); + }); }; this.scene.ui.setMode(Mode.LOGIN_FORM, { @@ -108,7 +116,14 @@ export class LoginPhase extends Phase { buttonActions: [ () => { this.scene.ui.playSelect(); - updateUserInfo().then(() => this.end()); + updateUserInfo().then(success => { + if (!success[0]) { + Utils.setCookie(Utils.sessionIdKey, ""); + this.scene.reset(true, true); + return; + } + this.end(); + } ); }, () => { this.scene.unshiftPhase(new LoginPhase(this.scene, false)); this.end(); @@ -118,6 +133,9 @@ export class LoginPhase extends Phase { } ] }); + } else if (statusCode === 401) { + Utils.setCookie(Utils.sessionIdKey, ""); + this.scene.reset(true, true); } else { this.scene.unshiftPhase(new UnavailablePhase(this.scene)); super.end(); @@ -129,7 +147,7 @@ export class LoginPhase extends Phase { this.end(); } else { this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("menu:failedToLoadSaveData")); + this.scene.ui.showText(t("menu:failedToLoadSaveData")); } }); } @@ -184,7 +202,7 @@ export class TitlePhase extends Phase { const options: OptionSelectItem[] = []; if (loggedInUser.lastSessionSlot > -1) { options.push({ - label: i18next.t("menu:continue"), + label: i18next.t("continue", null, { ns: "menu"}), handler: () => { this.loadSaveSlot(this.lastSessionData ? -1 : loggedInUser.lastSessionSlot); return true; @@ -489,7 +507,7 @@ export class SelectGenderPhase extends Phase { this.scene.ui.setMode(Mode.OPTION_SELECT, { options: [ { - label: i18next.t("menu:boy"), + label: i18next.t("settings:boy"), handler: () => { this.scene.gameData.gender = PlayerGender.MALE; this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 0); @@ -498,7 +516,7 @@ export class SelectGenderPhase extends Phase { } }, { - label: i18next.t("menu:girl"), + label: i18next.t("settings:girl"), handler: () => { this.scene.gameData.gender = PlayerGender.FEMALE; this.scene.gameData.saveSetting(SettingKeys.Player_Gender, 1); @@ -628,7 +646,7 @@ export class BattlePhase extends Phase { const tintSprites = this.scene.currentBattle.trainer.getTintSprites(); for (let i = 0; i < sprites.length; i++) { const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; - [ sprites[i], tintSprites[i] ].map(sprite => { + [sprites[i], tintSprites[i]].map(sprite => { if (visible) { sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; } @@ -850,9 +868,11 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); } else { + // This block only applies for double battles to init the boss segments (idk why it's split up like this) if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { for (const enemyPokemon of battle.enemyParty) { - if (enemyPokemon.isBoss()) { + // If the enemy pokemon is a boss and wasn't populated from data source, then set it up + if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) { enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst))); enemyPokemon.initBattleInfo(); } @@ -925,7 +945,7 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer ].flat(), + targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, duration: 2000, onComplete: () => { @@ -940,21 +960,21 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", {bossName: enemyField[0].name}); + return i18next.t("battle:bossAppeared", { bossName: 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)}); + 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) { @@ -984,7 +1004,7 @@ export class EncounterPhase extends BattlePhase { this.scene.currentBattle.started = true; this.scene.playBgm(undefined); this.scene.pbTray.showPbTray(this.scene.getParty()); - this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); + this.scene.pbTrayEnemy.showPbTray(this.scene.getEnemyParty()); const doTrainerSummon = () => { this.hideEnemyTrainer(); const availablePartyMembers = this.scene.getEnemyParty().filter(p => !p.isFainted()).length; @@ -1010,7 +1030,7 @@ export class EncounterPhase extends BattlePhase { this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.waveIndex); const showDialogueAndSummon = () => { - this.scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE,true), null, () => { + this.scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doSummon())); }); }; @@ -1041,7 +1061,7 @@ export class EncounterPhase extends BattlePhase { // how many player pokemon are on the field ? const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; // if it's a 2vs1, there will never be a 2nd pokemon on our field even - const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); + const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); // if it's a double, there should be 2, otherwise 1 if (this.scene.currentBattle.double) { return pokemonsOnFieldCount === requiredPokemonsOnField; @@ -1127,7 +1147,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(), + targets: [this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer].flat(), x: "+=300", duration: 2000, onComplete: () => { @@ -1170,7 +1190,7 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, enemyField ].flat(), + targets: [this.scene.arenaEnemy, enemyField].flat(), x: "+=300", duration: 2000, onComplete: () => { @@ -1236,7 +1256,7 @@ export class SelectBiomePhase extends BattlePhase { let biomeChoices: Biome[]; this.scene.executeWithSeedOffset(() => { biomeChoices = (!Array.isArray(biomeLinks[currentBiome]) - ? [ biomeLinks[currentBiome] as Biome ] + ? [biomeLinks[currentBiome] as Biome] : biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) .filter((b, i) => !Array.isArray(b) || !Utils.randSeedInt(b[1])) .map(b => Array.isArray(b) ? b[0] : b); @@ -1291,7 +1311,7 @@ export class SwitchBiomePhase extends BattlePhase { } this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, this.scene.lastEnemyTrainer ], + targets: [this.scene.arenaEnemy, this.scene.lastEnemyTrainer], x: "+=300", duration: 2000, onComplete: () => { @@ -1309,7 +1329,7 @@ export class SwitchBiomePhase extends BattlePhase { this.scene.arenaPlayerTransition.setVisible(true); this.scene.tweens.add({ - targets: [ this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition ], + targets: [this.scene.arenaPlayer, this.scene.arenaBgTransition, this.scene.arenaPlayerTransition], duration: 1000, delay: 1000, ease: "Sine.easeInOut", @@ -1789,7 +1809,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()); } } @@ -1821,7 +1841,7 @@ export class TurnInitPhase extends FieldPhase { this.scene.getPlayerField().forEach(p => { // If this pokemon is in play and evolved into something illegal under the current challenge, force a switch if (p.isOnField() && !p.isAllowedInBattle()) { - this.scene.queueMessage(i18next.t("challenges:illegalEvolution", {"pokemon": p.name}), null, true); + this.scene.queueMessage(i18next.t("challenges:illegalEvolution", { "pokemon": p.name }), null, true); const allowedPokemon = this.scene.getParty().filter(p => p.isAllowedInBattle()); @@ -1902,7 +1922,7 @@ 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))) { + || !playerPokemon.getMoveset()[playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable(playerPokemon, moveQueue[0].ignorePP))) { moveQueue.shift(); } @@ -1932,13 +1952,13 @@ export class CommandPhase extends FieldPhase { 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)) { + 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 ]; + turnCommand.targets = [this.fieldIndex]; } console.log(moveTargets, playerPokemon.name); if (moveTargets.targets.length <= 1 || moveTargets.multiple) { @@ -2159,7 +2179,7 @@ export class EnemyCommandPhase extends FieldPhase { const index = trainer.getNextSummonIndex(enemyPokemon.trainerSlot, partyMemberScores); battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = - { command: Command.POKEMON, cursor: index, args: [ false ] }; + { command: Command.POKEMON, cursor: index, args: [false] }; battle.enemySwitchCounter++; @@ -2196,7 +2216,7 @@ export class SelectTargetPhase extends PokemonPhase { this.scene.currentBattle.turnCommands[this.fieldIndex] = null; this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); } else { - turnCommand.targets = [ cursor ]; + turnCommand.targets = [cursor]; } if (turnCommand.command === Command.BALL && this.fieldIndex) { this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; @@ -2221,6 +2241,7 @@ export class TurnStartPhase extends FieldPhase { this.scene.getField(true).filter(p => p.summonData).map(p => { const bypassSpeed = new Utils.BooleanHolder(false); + applyAbAttrs(BypassSpeedChanceAbAttr, p, null, bypassSpeed); this.scene.applyModifiers(BypassSpeedChanceModifier, p.isPlayer(), p, bypassSpeed); battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed; }); @@ -2244,10 +2265,10 @@ export class TurnStartPhase extends FieldPhase { const aPriority = new Utils.IntegerHolder(aMove.priority); const bPriority = new Utils.IntegerHolder(bMove.priority); - applyMoveAttrs(IncrementMovePriorityAttr,this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a),null,aMove,aPriority); - applyMoveAttrs(IncrementMovePriorityAttr,this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b),null,bMove,bPriority); + applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a), null, aMove, aPriority); + applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); - applyAbAttrs(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() === a), null, aMove, aPriority); applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); if (aPriority.value !== bPriority.value) { @@ -2308,7 +2329,7 @@ export class TurnStartPhase extends FieldPhase { return; } }); - // if only one pokemon is alive, use that one + // if only one pokemon is alive, use that one if (playerActivePokemon.length > 1) { // find which active pokemon has faster speed const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; @@ -2404,7 +2425,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), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } if (!pokemon.isPlayer()) { @@ -2564,6 +2585,11 @@ export class MovePhase extends BattlePhase { if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) { this.scene.queueMessage(`${this.move.getName()} is disabled!`); } + if (this.pokemon.isActive(true) && this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails + this.fail(); + this.showMoveText(); + this.showFailedText(); + } return this.end(); } @@ -2583,6 +2609,12 @@ export class MovePhase extends BattlePhase { if (moveTarget) { const oldTarget = moveTarget.value; this.scene.getField(true).filter(p => p !== this.pokemon).forEach(p => applyAbAttrs(RedirectMoveAbAttr, p, null, this.move.moveId, moveTarget)); + this.pokemon.getOpponents().forEach(p => { + const redirectTag = p.getTag(CenterOfAttentionTag) as CenterOfAttentionTag; + if (redirectTag && (!redirectTag.powder || (!this.pokemon.isOfType(Type.GRASS) && !this.pokemon.hasAbility(Abilities.OVERCOAT)))) { + moveTarget.value = p.getBattlerIndex(); + } + }); //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().hasAttr(BypassRedirectAttr))) { //If an ability prevented this move from being redirected, display its ability pop up. @@ -2590,7 +2622,7 @@ export class MovePhase extends BattlePhase { this.scene.unshiftPhase(new ShowAbilityPhase(this.scene, this.pokemon.getBattlerIndex(), this.pokemon.getPassiveAbility().hasAttr(BlockRedirectAbAttr))); } moveTarget.value = oldTarget; - } + } this.targets[0] = moveTarget.value; } @@ -2749,12 +2781,12 @@ export class MovePhase extends BattlePhase { } if (activated) { - this.scene.queueMessage(getPokemonMessage(this.pokemon, getStatusEffectActivationText(this.pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectActivationText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); doMove(); } else { if (healed) { - this.scene.queueMessage(getPokemonMessage(this.pokemon, getStatusEffectHealText(this.pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectHealText(this.pokemon.status.effect, getPokemonNameWithAffix(this.pokemon))); this.pokemon.resetStatus(); this.pokemon.updateInfo(); } @@ -2817,7 +2849,7 @@ export class MoveEffectPhase extends PokemonPhase { // of the left Pokemon and gets hit unless this is checked. if (targets.includes(battlerIndex) && this.move.getMove().moveTarget === MoveTarget.ALL_NEAR_OTHERS) { const i = targets.indexOf(battlerIndex); - targets.splice(i,i+1); + targets.splice(i, i + 1); } this.targets = targets; } @@ -2848,6 +2880,7 @@ export class MoveEffectPhase extends PokemonPhase { const hitCount = new Utils.IntegerHolder(1); // Assume single target for multi hit applyMoveAttrs(MultiHitAttr, user, this.getTarget(), move, hitCount); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, targets.length, hitCount, new Utils.IntegerHolder(0)); if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); } @@ -2855,13 +2888,11 @@ export class MoveEffectPhase extends PokemonPhase { } const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; - user.pushMoveHistory(moveHistoryEntry); - const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); + const targetHitChecks = Object.fromEntries(targets.map(p => [p.getBattlerIndex(), this.hitCheck(p)])); const activeTargets = targets.map(t => t.isActive(true)); if (!activeTargets.length || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]])) { - user.turnData.hitCount = 1; - user.turnData.hitsLeft = 1; + this.stopMultiHit(); if (activeTargets.length) { this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); moveHistoryEntry.result = MoveResult.MISS; @@ -2870,6 +2901,7 @@ export class MoveEffectPhase extends PokemonPhase { this.scene.queueMessage(i18next.t("battle:attackFailed")); moveHistoryEntry.result = MoveResult.FAIL; } + user.pushMoveHistory(moveHistoryEntry); return this.end(); } @@ -2879,8 +2911,7 @@ export class MoveEffectPhase extends PokemonPhase { new MoveAnim(move.id as Moves, user, this.getTarget()?.getBattlerIndex()).play(this.scene, () => { for (const target of targets) { if (!targetHitChecks[target.getBattlerIndex()]) { - user.turnData.hitCount = 1; - user.turnData.hitsLeft = 1; + this.stopMultiHit(target); this.scene.queueMessage(getPokemonMessage(user, "'s\nattack missed!")); if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; @@ -2889,43 +2920,52 @@ export class MoveEffectPhase extends PokemonPhase { continue; } - const isProtected = !move.hasFlag(MoveFlags.IGNORE_PROTECT) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); + const isProtected = !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target) && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType)); - const firstHit = moveHistoryEntry.result !== MoveResult.SUCCESS; + const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); + const firstTarget = (moveHistoryEntry.result === MoveResult.PENDING); + + if (firstHit) { + user.pushMoveHistory(moveHistoryEntry); + } moveHistoryEntry.result = MoveResult.SUCCESS; const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; - this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); + + if (lastHit) { + this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + } applyAttrs.push(new Promise(resolve => { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit), + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move).then(() => { if (hitResult !== HitResult.FAIL) { const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget(), move)); // Charge attribute with charge effect takes all effect attributes and applies them to charge stage, so ignore them if this is present Utils.executeIf(!chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget && (!attr.firstHitOnly || firstHit), user, target, move)).then(() => { + && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move)).then(() => { if (hitResult !== HitResult.NO_EFFECT) { - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && !attr.selfTarget && (!attr.firstHitOnly || firstHit), user, target, move).then(() => { - if (hitResult < HitResult.NO_EFFECT) { + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_APPLY + && !(attr as MoveEffectAttr).selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()).then(() => { + if (hitResult < HitResult.NO_EFFECT && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr)) { const flinched = new Utils.BooleanHolder(false); user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); if (flinched.value) { target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); } } - Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.HIT && (!attr.firstHitOnly || firstHit), - user, target, move).then(() => { - return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, move, hitResult).then(() => { - if (!user.isPlayer() && move instanceof AttackMove) { + Utils.executeIf(!isProtected && !chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.HIT + && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()).then(() => { + return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); } })).then(() => { - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, move, hitResult).then(() => { - if (move instanceof AttackMove) { + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { + if (this.move.getMove() instanceof AttackMove) { this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target.getFieldIndex()); } resolve(); @@ -2944,14 +2984,17 @@ export class MoveEffectPhase extends PokemonPhase { }); })); } - // Trigger effect which should only apply one time after all targeted effects have already applied - const postTarget = applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, - user, null, move); + // Trigger effect which should only apply one time on the last hit after all targeted effects have already applied + const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? + applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : + null; - if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); - } else { // Otherwise, push a new asynchronous move effect - applyAttrs.push(postTarget); + if (!!postTarget) { + if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after + applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); + } else { // Otherwise, push a new asynchronous move effect + applyAttrs.push(postTarget); + } } Promise.allSettled(applyAttrs).then(() => this.end()); @@ -3004,7 +3047,7 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - const hiddenTag = target.getTag(HiddenTag); + const hiddenTag = target.getTag(SemiInvulnerableTag); if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === hiddenTag.tagType)) { return false; } @@ -3012,6 +3055,7 @@ export class MoveEffectPhase extends PokemonPhase { const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); + applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this.move.getMove(), { value: false }, moveAccuracy); if (moveAccuracy.value === -1) { return true; @@ -3073,6 +3117,28 @@ export class MoveEffectPhase extends PokemonPhase { return this.getTargets().find(() => true); } + removeTarget(target: Pokemon): void { + const targetIndex = this.targets.findIndex(ind => ind === target.getBattlerIndex()); + if (targetIndex !== -1) { + this.targets.splice(this.targets.findIndex(ind => ind === target.getBattlerIndex()), 1); + } + } + + stopMultiHit(target?: Pokemon): void { + /** If given a specific target, remove the target from subsequent strikes */ + if (target) { + this.removeTarget(target); + } + /** + * If no target specified, or the specified target was the last of this move's + * targets, completely cancel all subsequent strikes. + */ + if (!target || this.targets.length === 0 ) { + this.getUserPokemon().turnData.hitCount = 1; + this.getUserPokemon().turnData.hitsLeft = 1; + } + } + getNewHitPhase() { return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); } @@ -3121,7 +3187,7 @@ export class MoveAnimTestPhase extends BattlePhase { } initMoveAnim(this.scene, moveId).then(() => { - loadMoveAnimAssets(this.scene, [ moveId ], true) + 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) { @@ -3298,7 +3364,7 @@ export class StatChangePhase extends PokemonPhase { } aggregateStatChanges(random: boolean = false): void { - const isAccEva = [ BattleStat.ACC, BattleStat.EVA ].some(s => this.stats.includes(s)); + const isAccEva = [BattleStat.ACC, BattleStat.EVA].some(s => this.stats.includes(s)); let existingPhase: StatChangePhase; if (this.stats.length === 1) { while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1 @@ -3318,7 +3384,7 @@ export class StatChangePhase extends PokemonPhase { } } 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) + && ([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)) { @@ -3350,7 +3416,7 @@ export class StatChangePhase extends PokemonPhase { } else { statsFragment = getBattleStatName(relLevelStats[0]); } - messages.push(getPokemonMessage(this.getPokemon(), `'s ${statsFragment} ${getBattleStatLevelChangeDescription(Math.abs(parseInt(rl)), levels >= 1)}!`)); + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); }); return messages; @@ -3440,7 +3506,7 @@ export class ObtainStatusEffectPhase extends PokemonPhase { } pokemon.updateInfo(true); new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect - 1), pokemon).play(this.scene, () => { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectObtainText(this.statusEffect, this.sourceText))); + this.scene.queueMessage(getStatusEffectObtainText(this.statusEffect, getPokemonNameWithAffix(pokemon), this.sourceText)); if (pokemon.status.isPostTurn()) { this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, this.battlerIndex)); } @@ -3449,7 +3515,7 @@ export class ObtainStatusEffectPhase extends PokemonPhase { return; } } else if (pokemon.status.effect === this.statusEffect) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectOverlapText(this.statusEffect))); + this.scene.queueMessage(getStatusEffectOverlapText(this.statusEffect, getPokemonNameWithAffix(pokemon))); } this.end(); } @@ -3466,9 +3532,10 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { pokemon.status.incrementTurn(); const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); + applyAbAttrs(BlockStatusDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectActivationText(pokemon.status.effect))); + this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); let damage: integer = 0; switch (pokemon.status.effect) { case StatusEffect.POISON: @@ -3482,7 +3549,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { break; } if (damage) { - // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... + // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... this.scene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage, false, true)); pokemon.updateInfo(); } @@ -3932,7 +3999,7 @@ export class TrainerVictoryPhase extends BattlePhase { 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) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); } } @@ -3979,6 +4046,10 @@ export class MoneyRewardPhase extends BattlePhase { this.scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + if (this.scene.arena.getTag(ArenaTagType.HAPPY_HOUR)) { + moneyAmount.value *= 2; + } + this.scene.addMoney(moneyAmount.value); const userLocale = navigator.language || "en-US"; @@ -4009,7 +4080,7 @@ export class ModifierRewardPhase extends BattlePhase { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { this.scene.playSound("item_fanfare"); - this.scene.ui.showText(`You received\n${newModifier.type.name}!`, null, () => resolve(), null, true); + this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => resolve(), null, true); }); }); } @@ -4027,7 +4098,7 @@ export class GameOverModifierRewardPhase extends ModifierRewardPhase { 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.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier.type.name }), null, () => { this.scene.time.delayedCall(1500, () => this.scene.arenaBg.setVisible(true)); resolve(); }, null, true, 1500); @@ -4197,7 +4268,7 @@ export class GameOverPhase extends BattlePhase { If Offline, execute offlineNewClear(), a localStorage implementation of newClear daily run checks */ if (this.victory) { if (!Utils.isLocal) { - Utils.apiFetch(`savedata/newclear?slot=${this.scene.sessionSlotId}`, true) + Utils.apiFetch(`savedata/session/newclear?slot=${this.scene.sessionSlotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.json()) .then(newClear => doGameOver(newClear)); } else { @@ -4541,7 +4612,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { if (emptyMoveIndex > -1) { pokemon.setMove(emptyMoveIndex, this.moveId); initMoveAnim(this.scene, this.moveId).then(() => { - loadMoveAnimAssets(this.scene, [ this.moveId ], true) + loadMoveAnimAssets(this.scene, [this.moveId], true) .then(() => { this.scene.ui.setMode(messageMode).then(() => { this.scene.playSound("level_up_fanfare"); @@ -4678,7 +4749,7 @@ export class PokemonHealPhase extends CommonAnimPhase { pokemon.resetStatus(); pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) { - this.message = getPokemonMessage(pokemon, "'s\nHP is full!"); + this.message = i18next.t("battle:hpIsFull", { pokemonName: getPokemonNameWithAffix(pokemon) }); } if (this.message) { @@ -4686,7 +4757,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } if (this.healStatus && lastStatusEffect && !hasMessage) { - this.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(lastStatusEffect))); + this.scene.queueMessage(getStatusEffectHealText(lastStatusEffect, getPokemonNameWithAffix(pokemon))); } if (!healOrDamage && !lastStatusEffect) { @@ -4819,9 +4890,7 @@ export class AttemptCapturePhase extends PokemonPhase { }); } }, - onComplete: () => { - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); this.scene.gameData.setPokemonCaught(pokemon); this.catch(); - } + onComplete: () => this.catch() }); }; @@ -4862,6 +4931,7 @@ export class AttemptCapturePhase extends PokemonPhase { catch() { const pokemon = this.getPokemon() as EnemyPokemon; + this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -4915,18 +4985,12 @@ export class AttemptCapturePhase extends PokemonPhase { } }); }; - Promise.all([ pokemon.hideInfo() ]).then(() => { + Promise.all([pokemon.hideInfo(), this.scene.gameData.setPokemonCaught(pokemon)]).then(() => { if (this.scene.getParty().length === 6) { const promptRelease = () => { this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { - this.scene.pokemonInfoContainer.makeRoomForConfirmUi(1, true); + this.scene.pokemonInfoContainer.makeRoomForConfirmUi(); this.scene.ui.setMode(Mode.CONFIRM, () => { - const newPokemon = this.scene.addPlayerPokemon(pokemon.species, pokemon.level, pokemon.abilityIndex, pokemon.formIndex, pokemon.gender, pokemon.shiny, pokemon.variant, pokemon.ivs, pokemon.nature, pokemon); - this.scene.ui.setMode(Mode.SUMMARY, newPokemon).then(() => { - this.catch(); - return; - }); - }, () => { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (slotIndex < 6) { @@ -4985,7 +5049,7 @@ export class AttemptRunPhase extends PokemonPhase { this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); this.scene.tweens.add({ - targets: [ this.scene.arenaEnemy, enemyField ].flat(), + targets: [this.scene.arenaEnemy, enemyField].flat(), alpha: 0, duration: 250, ease: "Sine.easeIn", @@ -5074,7 +5138,7 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; const itemModifier = itemModifiers[itemIndex]; this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); } else { @@ -5200,7 +5264,7 @@ export class SelectModifierPhase extends BattlePhase { getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { let baseValue = 0; if (lockRarities) { - const tierValues = [ 50, 125, 300, 750, 2000 ]; + const tierValues = [50, 125, 300, 750, 2000]; for (const opt of typeOptions) { baseValue += tierValues[opt.type.tier]; } @@ -5232,7 +5296,7 @@ export class EggLapsePhase extends Phase { super.start(); const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => { - return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1; + return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1; }); let eggCount: integer = eggsToHatch.length; @@ -5420,7 +5484,7 @@ export class TrainerMessageTestPhase extends BattlePhase { continue; } const config = trainerConfigs[type]; - [ config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages ] + [config.encounterMessages, config.femaleEncounterMessages, config.victoryMessages, config.femaleVictoryMessages, config.defeatMessages, config.femaleDefeatMessages] .map(messages => { if (messages?.length) { testMessages.push(...messages); diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index a9a610693a1..3bcac101465 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -12,94 +12,56 @@ 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 -} +const unicodeHalfAndFullWidthForms = [ + "U+FF00-FFEF" +]; -export interface MoveTranslationEntry { - name: string, - effect: string -} +const unicodeCJK = [ + "U+2E80-2EFF", + "U+3000-303F", + "U+31C0-31EF", + "U+3200-32FF", + "U+3400-4DBF", + "U+4E00-9FFF", + "U+F900-FAFF", + "U+FE30-FE4F", +].join(","); -export interface MoveTranslationEntries { - [key: string]: MoveTranslationEntry -} - -export interface AbilityTranslationEntry { - name: string, - description: string -} - -export interface AbilityTranslationEntries { - [key: string]: AbilityTranslationEntry -} - -export interface ModifierTypeTranslationEntry { - name?: string, - description?: string, - extra?: SimpleTranslationEntries -} - -export interface ModifierTypeTranslationEntries { - ModifierType: { [key: string]: ModifierTypeTranslationEntry }, - AttackTypeBoosterItem: SimpleTranslationEntries, - TempBattleStatBoosterItem: SimpleTranslationEntries, - BaseStatBoosterItem: SimpleTranslationEntries, - EvolutionItem: SimpleTranslationEntries, - FormChangeItem: SimpleTranslationEntries, -} -export interface PokemonInfoTranslationEntries { - Stat: SimpleTranslationEntries, - Type: SimpleTranslationEntries, -} - -export interface BerryTranslationEntry { - name: string, - effect: string, -} - -export interface BerryTranslationEntries { - [key: string]: BerryTranslationEntry -} - -export interface AchievementTranslationEntry { - name?: string, - description?: string, -} - -export interface AchievementTranslationEntries { - [key: string]: AchievementTranslationEntry; -} - -export interface DialogueTranslationEntry { - [key: number]: string; -} - -export interface DialogueTranslationCategory { - [category: string]: DialogueTranslationEntry; -} - -export interface DialogueTranslationEntries { - [trainertype: string]: DialogueTranslationCategory; -} - - -export interface Localizable { - localize(): void; -} +const unicodeHangul = [ + "U+1100-11FF", + "U+3130-318F", + "U+A960-A97F", + "U+AC00-D7AF", + "U+D7B0-D7FF", +].join(","); const fonts = [ - new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + // korean + new FontFace("emerald", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), Object.assign( - new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: "U+AC00-D7AC"}), + new FontFace("pkmnems", "url(./fonts/PokePT_Wansung.ttf)", { unicodeRange: unicodeHangul}), { sizeAdjust: "133%" } ), + // unicode + Object.assign( + new FontFace("emerald", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { sizeAdjust: "70%", format: "opentype" } + ), + Object.assign( + new FontFace("pkmnems", "url(./fonts/unifont-15.1.05.otf)", { unicodeRange: [unicodeCJK, unicodeHalfAndFullWidthForms].join(",") }), + { format: "opentype" } + ), ]; -function initFonts() { - fonts.forEach((fontFace: FontFace) => { - fontFace.load().then(f => document.fonts.add(f)).catch(e => console.error(e)); - }); +async function initFonts() { + const results = await Promise.allSettled(fonts.map(font => font.load())); + for (const result of results) { + if (result.status === "fulfilled") { + document.fonts?.add(result.value); + } else { + console.error(result.reason); + } + } } export async function initI18n(): Promise { @@ -109,8 +71,6 @@ export async function initI18n(): Promise { } isInitialized = true; - initFonts(); - /** * i18next is a localization library for maintaining and using translation resources. * @@ -121,7 +81,8 @@ export async function initI18n(): Promise { * * Q: How do I add a new namespace? * A: To add a new namespace, create a new file in each language folder with the translations. - * Then update the `resources` field in the init() call and the CustomTypeOptions interface. + * Then update the config file for that language in its locale directory + * and the CustomTypeOptions interface in the @types/i18next.d.ts file. * * Q: How do I make a language selectable in the settings? * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. @@ -134,6 +95,8 @@ export async function initI18n(): Promise { nonExplicitSupportedLngs: true, fallbackLng: "en", supportedLngs: ["en", "es", "fr", "it", "de", "zh", "pt", "ko"], + defaultNS: "menu", + ns: Object.keys(enConfig), detection: { lookupLocalStorage: "prLang" }, @@ -172,58 +135,8 @@ export async function initI18n(): Promise { }, postProcess: ["korean-postposition"], }); -} -// Module declared to make referencing keys in the localization files type-safe. -declare module "i18next" { - interface CustomTypeOptions { - defaultNS: "menu"; // Even if we don't use it, i18next requires a valid default namespace - resources: { - ability: AbilityTranslationEntries; - abilityTriggers: SimpleTranslationEntries; - achv: AchievementTranslationEntries; - battle: SimpleTranslationEntries; - battleMessageUiHandler: SimpleTranslationEntries; - berry: BerryTranslationEntries; - biome: SimpleTranslationEntries; - challenges: SimpleTranslationEntries; - commandUiHandler: SimpleTranslationEntries; - PGMachv: AchievementTranslationEntries; - PGMdialogue: DialogueTranslationEntries; - PGMbattleSpecDialogue: SimpleTranslationEntries; - PGMmiscDialogue: SimpleTranslationEntries; - PGMdoubleBattleDialogue: DialogueTranslationEntries; - PGFdialogue: DialogueTranslationEntries; - PGFbattleSpecDialogue: SimpleTranslationEntries; - PGFmiscDialogue: SimpleTranslationEntries; - PGFdoubleBattleDialogue: DialogueTranslationEntries; - PGFachv: AchievementTranslationEntries; - egg: SimpleTranslationEntries; - fightUiHandler: SimpleTranslationEntries; - gameMode: SimpleTranslationEntries; - gameStatsUiHandler: SimpleTranslationEntries; - growth: SimpleTranslationEntries; - menu: SimpleTranslationEntries; - menuUiHandler: SimpleTranslationEntries; - modifierType: ModifierTypeTranslationEntries; - move: MoveTranslationEntries; - nature: SimpleTranslationEntries; - partyUiHandler: SimpleTranslationEntries; - pokeball: SimpleTranslationEntries; - pokemon: SimpleTranslationEntries; - pokemonInfo: PokemonInfoTranslationEntries; - pokemonInfoContainer: SimpleTranslationEntries; - saveSlotSelectUiHandler: SimpleTranslationEntries; - splashMessages: SimpleTranslationEntries; - starterSelectUiHandler: SimpleTranslationEntries; - titles: SimpleTranslationEntries; - trainerClasses: SimpleTranslationEntries; - trainerNames: SimpleTranslationEntries; - tutorial: SimpleTranslationEntries; - voucher: SimpleTranslationEntries; - weather: SimpleTranslationEntries; - }; - } + await initFonts(); } export default i18next; diff --git a/src/scene-base.ts b/src/scene-base.ts index 48b7238387c..1d7a2518300 100644 --- a/src/scene-base.ts +++ b/src/scene-base.ts @@ -1,6 +1,19 @@ export const legacyCompatibleImages: string[] = []; export class SceneBase extends Phaser.Scene { + /** + * Since everything is scaled up by 6 by default using the game.canvas is annoying + * Until such point that we use the canvas normally, this will be easier than + * having to divide every width and heigh by 6 to position and scale the ui + * @readonly + * @defaultValue + * width: `320` + * height: `180` + */ + public readonly scaledCanvas = { + width: 1920 / 6, + height: 1080 / 6 + }; constructor(config?: string | Phaser.Types.Scenes.SettingsConfig) { super(config); } diff --git a/src/system/achv.ts b/src/system/achv.ts index 21393862d92..511ddd1eb8e 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -1,7 +1,7 @@ import { Modifier } from "typescript"; import BattleScene from "../battle-scene"; import { TurnHeldItemTransferModifier } from "../modifier/modifier"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; import { ParseKeys } from "i18next"; diff --git a/src/system/egg-data.ts b/src/system/egg-data.ts index 9bacb357035..b4bd4368bd9 100644 --- a/src/system/egg-data.ts +++ b/src/system/egg-data.ts @@ -1,20 +1,49 @@ -import { Egg, GachaType } from "../data/egg"; +import { EggTier } from "#enums/egg-type"; +import { Species } from "#enums/species"; +import { VariantTier } from "#enums/variant-tiers"; +import { EGG_SEED, Egg } from "../data/egg"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export default class EggData { public id: integer; - public gachaType: GachaType; + public tier: EggTier; + public sourceType: EggSourceType; public hatchWaves: integer; public timestamp: integer; + public variantTier: VariantTier; + public isShiny: boolean; + public species: Species; + public eggMoveIndex: number; + public overrideHiddenAbility: boolean; constructor(source: Egg | any) { const sourceEgg = source instanceof Egg ? source as Egg : null; this.id = sourceEgg ? sourceEgg.id : source.id; - this.gachaType = sourceEgg ? sourceEgg.gachaType : source.gachaType; + this.tier = sourceEgg ? sourceEgg.tier : (source.tier ?? Math.floor(this.id / EGG_SEED)); + // legacy egg + if (source.species === 0) { + // check if it has a gachaType (deprecated) + this.sourceType = source.gachaType ?? source.sourceType; + } else { + this.sourceType = sourceEgg ? sourceEgg.sourceType : source.sourceType; + } this.hatchWaves = sourceEgg ? sourceEgg.hatchWaves : source.hatchWaves; this.timestamp = sourceEgg ? sourceEgg.timestamp : source.timestamp; + this.variantTier = sourceEgg ? sourceEgg.variantTier : source.variantTier; + this.isShiny = sourceEgg ? sourceEgg.isShiny : source.isShiny; + this.species = sourceEgg ? sourceEgg.species : source.species; + this.eggMoveIndex = sourceEgg ? sourceEgg.eggMoveIndex : source.eggMoveIndex; + this.overrideHiddenAbility = sourceEgg ? sourceEgg.overrideHiddenAbility : source.overrideHiddenAbility; } toEgg(): Egg { - return new Egg(this.id, this.gachaType, this.hatchWaves, this.timestamp); + // Species will be 0 if an old legacy is loaded from DB + if (!this.species) { + return new Egg({ id: this.id, hatchWaves: this.hatchWaves, sourceType: this.sourceType, timestamp: this.timestamp, tier: Math.floor(this.id / EGG_SEED) }); + } else { + return new Egg({id: this.id, tier: this.tier, sourceType: this.sourceType, hatchWaves: this.hatchWaves, + timestamp: this.timestamp, variantTier: this.variantTier, isShiny: this.isShiny, species: this.species, + eggMoveIndex: this.eggMoveIndex, overrideHiddenAbility: this.overrideHiddenAbility }); + } } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 119842cb621..ac54c942fc7 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1,3 +1,4 @@ +import i18next from "i18next"; import BattleScene, { PokeballCounts, bypassLogin } from "../battle-scene"; import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; @@ -136,7 +137,7 @@ interface VoucherUnlocks { } export interface VoucherCounts { - [type: string]: integer; + [type: string]: integer; } export interface DexData { @@ -187,6 +188,46 @@ export interface StarterMoveData { [key: integer]: StarterMoveset | StarterFormMoveData } +export interface StarterAttributes { + nature?: integer; + ability?: integer; + variant?: integer; + form?: integer; + female?: boolean; +} + +export interface StarterPreferences { + [key: integer]: StarterAttributes; +} + +// the latest data saved/loaded for the Starter Preferences. Required to reduce read/writes. Initialize as "{}", since this is the default value and no data needs to be stored if present. +// if they ever add private static variables, move this into StarterPrefs +const StarterPrefers_DEFAULT : string = "{}"; +let StarterPrefers_private_latest : string = StarterPrefers_DEFAULT; + +// This is its own class as StarterPreferences... +// - don't need to be loaded on startup +// - isn't stored with other data +// - don't require to be encrypted +// - shouldn't require calls outside of the starter selection +export class StarterPrefs { + // called on starter selection show once + static load(): StarterPreferences { + return JSON.parse( + StarterPrefers_private_latest = (localStorage.getItem(`starterPrefs_${loggedInUser?.username}`) || StarterPrefers_DEFAULT) + ); + } + + // called on starter selection clear, always + static save(prefs: StarterPreferences): void { + const pStr : string = JSON.stringify(prefs); + if (pStr !== StarterPrefers_private_latest) { + // something changed, store the update + localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr); + } + } +} + export interface StarterDataEntry { moveset: StarterMoveset | StarterFormMoveData; eggMoves: integer; @@ -313,7 +354,7 @@ export class GameData { localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemData, bypassLogin)); if (!bypassLogin) { - Utils.apiPost(`savedata/update?datatype=${GameDataType.SYSTEM}&clientSessionId=${clientSessionId}`, systemData, undefined, true) + Utils.apiPost(`savedata/system/update?clientSessionId=${clientSessionId}`, systemData, undefined, true) .then(response => response.text()) .then(error => { this.scene.ui.savingIcon.hide(); @@ -347,7 +388,7 @@ export class GameData { } if (!bypassLogin) { - Utils.apiFetch(`savedata/system?clientSessionId=${clientSessionId}`, true) + Utils.apiFetch(`savedata/system/get?clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(response => { if (!response.length || response[0] !== "{") { @@ -545,7 +586,7 @@ export class GameData { return true; } - const response = await Utils.apiPost("savedata/system/verify", JSON.stringify({ clientSessionId: clientSessionId }), undefined, true) + const response = await Utils.apiFetch(`savedata/system/verify?clientSessionId=${clientSessionId}`, true) .then(response => response.json()); if (!response.valid) { @@ -815,7 +856,7 @@ export class GameData { }; if (!bypassLogin && !localStorage.getItem(`sessionData${slotId ? slotId : ""}_${loggedInUser.username}`)) { - Utils.apiFetch(`savedata/session?slot=${slotId}&clientSessionId=${clientSessionId}`, true) + Utils.apiFetch(`savedata/session/get?slot=${slotId}&clientSessionId=${clientSessionId}`, true) .then(response => response.text()) .then(async response => { if (!response.length || response[0] !== "{") { @@ -963,7 +1004,7 @@ export class GameData { if (success !== null && !success) { return resolve(false); } - Utils.apiFetch(`savedata/delete?datatype=${GameDataType.SESSION}&slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { + Utils.apiFetch(`savedata/session/delete?slot=${slotId}&clientSessionId=${clientSessionId}`, true).then(response => { if (response.ok) { loggedInUser.lastSessionSlot = -1; localStorage.removeItem(`sessionData${this.scene.sessionSlotId ? this.scene.sessionSlotId : ""}_${loggedInUser.username}`); @@ -1027,7 +1068,7 @@ export class GameData { 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 => { + Utils.apiPost(`savedata/session/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}`); @@ -1184,7 +1225,7 @@ export class GameData { 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"}/get?clientSessionId=${clientSessionId}${dataType === GameDataType.SESSION ? `&slot=${slotId}` : ""}`, true) .then(response => response.text()) .then(response => { if (!response.length || response[0] !== "{") { @@ -1261,10 +1302,16 @@ export class GameData { if (!bypassLogin && dataType < GameDataType.SETTINGS) { updateUserInfo().then(success => { - if (!success) { + if (!success[0]) { 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) + let url: string; + if (dataType === GameDataType.SESSION) { + url = `savedata/session/update?slot=${slotId}&trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`; + } else { + url = `savedata/system/update?trainerId=${this.trainerId}&secretId=${this.secretId}&clientSessionId=${clientSessionId}`; + } + Utils.apiPost(url, dataStr, undefined, true) .then(response => response.text()) .then(error => { if (error) { @@ -1439,7 +1486,7 @@ export class GameData { if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(`${species.name} has been\nadded as a starter!`, null, () => checkPrevolution(), null, true); + this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(), null, true); } else { checkPrevolution(); } @@ -1505,7 +1552,9 @@ 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); + + const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; + this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, () => resolve(true), null, true); }); } diff --git a/src/system/modifier-data.ts b/src/system/modifier-data.ts index d79206d89df..6f169280da1 100644 --- a/src/system/modifier-data.ts +++ b/src/system/modifier-data.ts @@ -5,7 +5,6 @@ import { GeneratedPersistentModifierType, ModifierTypeGenerator, getModifierType export default class ModifierData { private player: boolean; private typeId: string; - private typeGeneratorId: string; private typePregenArgs: any[]; private args: any[]; private stackCount: integer; @@ -16,7 +15,6 @@ export default class ModifierData { const sourceModifier = source instanceof PersistentModifier ? source as PersistentModifier : null; this.player = player; this.typeId = sourceModifier ? sourceModifier.type.id : source.typeId; - this.typeGeneratorId = sourceModifier ? sourceModifier.type.generatorId : source.typeGeneratorId; if (sourceModifier) { if ("getPregenArgs" in source.type) { this.typePregenArgs = (source.type as GeneratedPersistentModifierType).getPregenArgs(); @@ -38,7 +36,6 @@ export default class ModifierData { try { let type = typeFunc(); type.id = this.typeId; - type.generatorId = this.typeGeneratorId; if (type instanceof ModifierTypeGenerator) { type = (type as ModifierTypeGenerator).generateType(this.player ? scene.getParty() : scene.getEnemyField(), this.typePregenArgs); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index e30cfd7e24e..57f4c0aea93 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -50,6 +50,7 @@ export default class PokemonData { public fusionLuck: integer; public boss: boolean; + public bossSegments?: integer; public summonData: PokemonSummonData; @@ -96,6 +97,7 @@ export default class PokemonData { if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); + this.bossSegments = source.bossSegments; } if (sourcePokemon) { diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index 662c718ddcc..d60af06e12b 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -2,6 +2,7 @@ import {Button} from "#enums/buttons"; import BattleScene from "#app/battle-scene"; import {Mode} from "#app/ui/ui"; import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler"; +import i18next from "i18next"; export enum SettingKeyboard { // Default_Layout = "DEFAULT_LAYOUT", @@ -41,7 +42,7 @@ export enum SettingKeyboard { Alt_Button_Submit = "ALT_BUTTON_SUBMIT", } -const pressAction = "Press action to assign"; +const pressAction = i18next.t("settings:pressToBind"); export const settingKeyboardOptions = { // [SettingKeyboard.Default_Layout]: ['Default'], diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index b929e8ad1e8..b09de095259 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -9,10 +9,33 @@ import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; -const MUTE = "Mute"; -const VOLUME_OPTIONS = new Array(11).fill(null).map((_, i) => i ? (i * 10).toString() : MUTE); -const OFF_ON = ["Off", "On"]; -const AUTO_DISABLED = ["Auto", "Disabled"]; +const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i ? { + value: (i * 10).toString(), + label: (i * 10).toString(), +} : { + value: "Mute", + label: i18next.t("settings:mute") +}); +const OFF_ON: SettingOption[] = [ + { + value: "Off", + label: i18next.t("settings:off") + }, + { + value: "On", + label: i18next.t("settings:on") + } +]; +const AUTO_DISABLED: SettingOption[] = [ + { + value: "Auto", + label: i18next.t("settings:auto") + }, + { + value: "Disabled", + label: i18next.t("settings:disabled") + } +]; /** * Types for helping separate settings to different menus @@ -23,10 +46,15 @@ export enum SettingType { AUDIO } +type SettingOption = { + value: string, + label: string +}; + export interface Setting { key: string label: string - options: Array + options: SettingOption[] default: number type: SettingType requireReload?: boolean @@ -68,7 +96,8 @@ export const SettingKeys = { Master_Volume: "MASTER_VOLUME", BGM_Volume: "BGM_VOLUME", SE_Volume: "SE_VOLUME", - Music_Preference: "MUSIC_PREFERENCE" + Music_Preference: "MUSIC_PREFERENCE", + Show_BGM_Bar: "SHOW_BGM_BAR", }; /** @@ -77,164 +106,321 @@ export const SettingKeys = { export const Setting: Array = [ { key: SettingKeys.Game_Speed, - label: "Game Speed", - options: ["1x", "1.25x", "1.5x", "2x", "2.5x", "3x", "4x", "5x"], + label: i18next.t("settings:gameSpeed"), + options: [ + { + value: "1", + label: "1x" + }, + { + value: "1.25", + label: "1.25x" + }, + { + value: "1.5", + label: "1.5x" + }, + { + value: "2", + label: "2x" + }, + { + value: "2.5", + label: "2.5x" + }, + { + value: "3", + label: "3x" + }, + { + value: "4", + label: "4x" + }, + { + value: "5", + label: "5x" + } + ], default: 3, type: SettingType.GENERAL }, { key: SettingKeys.HP_Bar_Speed, - label: "HP Bar Speed", - options: ["Normal", "Fast", "Faster", "Skip"], + label: i18next.t("settings:hpBarSpeed"), + options: [ + { + value: "Normal", + label: i18next.t("settings:normal") + }, + { + value: "Fast", + label: i18next.t("settings:fast") + }, + { + value: "Faster", + label: i18next.t("settings:faster") + }, + { + value: "Skip", + label: i18next.t("settings:skip") + } + ], default: 0, type: SettingType.GENERAL }, { key: SettingKeys.EXP_Gains_Speed, - label: "EXP Gains Speed", - options: ["Normal", "Fast", "Faster", "Skip"], + label: i18next.t("settings:expGainsSpeed"), + options: [ + { + value: "Normal", + label: i18next.t("settings:normal") + }, + { + value: "Fast", + label: i18next.t("settings:fast") + }, + { + value: "Faster", + label: i18next.t("settings:faster") + }, + { + value: "Skip", + label: i18next.t("settings:skip") + } + ], default: 0, type: SettingType.GENERAL }, { key: SettingKeys.EXP_Party_Display, - label: "EXP Party Display", - options: ["Normal", "Level Up Notification", "Skip"], + label: i18next.t("settings:expPartyDisplay"), + options: [ + { + value: "Normal", + label: i18next.t("settings:normal") + }, + { + value: "Level Up Notification", + label: i18next.t("settings:levelUpNotifications") + }, + { + value: "Skip", + label: i18next.t("settings:skip") + } + ], default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Skip_Seen_Dialogues, - label: "Skip Seen Dialogues", + label: i18next.t("settings:skipSeenDialogues"), options: OFF_ON, default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Battle_Style, - label: "Battle Style", - options: ["Switch", "Set"], + label: i18next.t("settings:battleStyle"), + options: [ + { + value: "Switch", + label: i18next.t("settings:switch") + }, + { + value: "Set", + label: i18next.t("settings:set") + } + ], default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Enable_Retries, - label: "Enable Retries", + label: i18next.t("settings:enableRetries"), options: OFF_ON, default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Tutorials, - label: "Tutorials", + label: i18next.t("settings:tutorials"), options: OFF_ON, default: 1, type: SettingType.GENERAL }, { key: SettingKeys.Touch_Controls, - label: "Touch Controls", + label: i18next.t("settings:touchControls"), options: AUTO_DISABLED, default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Vibration, - label: "Vibration", + label: i18next.t("settings:vibrations"), options: AUTO_DISABLED, default: 0, type: SettingType.GENERAL }, { key: SettingKeys.Language, - label: "Language", - options: ["English", "Change"], + label: i18next.t("settings:language"), + options: [ + { + value: "English", + label: "English" + }, + { + value: "Change", + label: i18next.t("settings:change") + } + ], default: 0, type: SettingType.DISPLAY, requireReload: true }, { key: SettingKeys.UI_Theme, - label: "UI Theme", - options: ["Default", "Legacy"], + label: i18next.t("settings:uiTheme"), + options: [ + { + value: "Default", + label: i18next.t("settings:default") + }, + { + value: "Legacy", + label: i18next.t("settings:legacy") + } + ], default: 0, type: SettingType.DISPLAY, requireReload: true }, { key: SettingKeys.Window_Type, - label: "Window Type", - options: new Array(5).fill(null).map((_, i) => (i + 1).toString()), + label: i18next.t("settings:windowType"), + options: new Array(5).fill(null).map((_, i) => { + const windowType = (i + 1).toString(); + return { + value: windowType, + label: windowType + }; + }), default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Money_Format, - label: "Money Format", - options: ["Normal", "Abbreviated"], + label: i18next.t("settings:moneyFormat"), + options: [ + { + value: "Normal", + label: i18next.t("settings:normal") + }, + { + value: "Abbreviated", + label: i18next.t("settings:abbreviated") + } + ], default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Damage_Numbers, - label: "Damage Numbers", - options: ["Off", "Simple", "Fancy"], + label: i18next.t("settings:damageNumbers"), + options: [ + { + value: "Off", + label: i18next.t("settings:off") + }, + { + value: "Simple", + label: i18next.t("settings:simple") + }, + { + value: "Fancy", + label: i18next.t("settings:fancy") + } + ], default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Move_Animations, - label: "Move Animations", + label: i18next.t("settings:moveAnimations"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Show_Stats_on_Level_Up, - label: "Show Stats on Level Up", + label: i18next.t("settings:showStatsOnLevelUp"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Candy_Upgrade_Notification, - label: "Candy Upgrade Notification", - options: ["Off", "Passives Only", "On"], + label: i18next.t("settings:candyUpgradeNotification"), + options: [ + { + value: "Off", + label: i18next.t("settings:off") + }, + { + value: "Passives Only", + label: i18next.t("settings:passivesOnly") + }, + { + value: "On", + label: i18next.t("settings:on") + } + ], default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Candy_Upgrade_Display, - label: "Candy Upgrade Display", - options: ["Icon", "Animation"], + label: i18next.t("settings:candyUpgradeDisplay"), + options: [ + { + value: "Icon", + label: i18next.t("settings:icon") + }, + { + value: "Animation", + label: i18next.t("settings:animation") + } + ], default: 0, type: SettingType.DISPLAY, requireReload: true }, { key: SettingKeys.Move_Info, - label: "Move Info", + label: i18next.t("settings:moveInfo"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Show_Moveset_Flyout, - label: "Show Moveset Flyout", + label: i18next.t("settings:showMovesetFlyout"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Show_Arena_Flyout, - label: "Show Battle Effects Flyout", + label: i18next.t("settings:showArenaFlyout"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Show_Time_Of_Day_Widget, - label: "Show Time of Day Widget", + label: i18next.t("settings:showTimeOfDayWidget"), options: OFF_ON, default: 1, type: SettingType.DISPLAY, @@ -242,69 +428,114 @@ export const Setting: Array = [ }, { key: SettingKeys.Time_Of_Day_Animation, - label: "Time of Day Animation", - options: ["Bounce", "Back"], + label: i18next.t("settings:timeOfDayAnimation"), + options: [ + { + value: "Bounce", + label: i18next.t("settings:bounce") + }, + { + value: "Back", + label: i18next.t("settings:timeOfDay_back") + } + ], default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Sprite_Set, - label: "Sprite Set", - options: ["Consistent", "Mixed Animated"], + label: i18next.t("settings:spriteSet"), + options: [ + { + value: "Consistent", + label: i18next.t("settings:consistent") + }, + { + value: "Mixed Animated", + label: i18next.t("settings:mixedAnimated") + } + ], default: 0, type: SettingType.DISPLAY, requireReload: true }, { key: SettingKeys.Fusion_Palette_Swaps, - label: "Fusion Palette Swaps", + label: i18next.t("settings:fusionPaletteSwaps"), options: OFF_ON, default: 1, type: SettingType.DISPLAY }, { key: SettingKeys.Player_Gender, - label: "Player Gender", - options: ["Boy", "Girl"], + label: i18next.t("settings:playerGender"), + options: [ + { + value: "Boy", + label: i18next.t("settings:boy") + }, + { + value: "Girl", + label: i18next.t("settings:girl") + } + ], default: 0, type: SettingType.DISPLAY }, { key: SettingKeys.Type_Hints, - label: "Type hints", + label: i18next.t("settings:typeHints"), options: OFF_ON, default: 0, type: SettingType.DISPLAY }, + { + key: SettingKeys.Show_BGM_Bar, + label: i18next.t("settings:showBgmBar"), + options: OFF_ON, + default: 0, + type: SettingType.DISPLAY, + requireReload: true + }, { key: SettingKeys.Master_Volume, - label: "Master Volume", + label: i18next.t("settings:masterVolume"), options: VOLUME_OPTIONS, default: 5, type: SettingType.AUDIO }, { key: SettingKeys.BGM_Volume, - label: "BGM Volume", + label: i18next.t("settings:bgmVolume"), options: VOLUME_OPTIONS, default: 10, type: SettingType.AUDIO }, { key: SettingKeys.SE_Volume, - label: "SE Volume", + label: i18next.t("settings:seVolume"), options: VOLUME_OPTIONS, default: 10, type: SettingType.AUDIO }, { key: SettingKeys.Music_Preference, - label: "Music Preference", - options: ["Consistent", "Mixed"], + label: i18next.t("settings:musicPreference"), + options: [ + { + value: "Consistent", + label: i18next.t("settings:consistent") + }, + { + value: "Mixed", + label: i18next.t("settings:mixed") + } + ], default: 0, type: SettingType.AUDIO, requireReload: true - } + }, + ]; /** @@ -333,23 +564,23 @@ export function resetSettings(scene: BattleScene) { */ export function setSetting(scene: BattleScene, setting: string, value: integer): boolean { const index: number = settingIndex(setting); - if ( index === -1) { + if (index === -1) { return false; } switch (Setting[index].key) { case SettingKeys.Game_Speed: - scene.gameSpeed = parseFloat(Setting[index].options[value].replace("x", "")); + scene.gameSpeed = parseFloat(Setting[index].options[value].value.replace("x", "")); break; case SettingKeys.Master_Volume: - scene.masterVolume = value ? parseInt(Setting[index].options[value]) * 0.01 : 0; + scene.masterVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; case SettingKeys.BGM_Volume: - scene.bgmVolume = value ? parseInt(Setting[index].options[value]) * 0.01 : 0; + scene.bgmVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; case SettingKeys.SE_Volume: - scene.seVolume = value ? parseInt(Setting[index].options[value]) * 0.01 : 0; + scene.seVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; scene.updateSoundVolume(); break; case SettingKeys.Music_Preference: @@ -362,35 +593,37 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): scene.uiTheme = value; break; case SettingKeys.Window_Type: - updateWindowType(scene, parseInt(Setting[index].options[value])); + updateWindowType(scene, parseInt(Setting[index].options[value].value)); break; case SettingKeys.Tutorials: - scene.enableTutorials = Setting[index].options[value] === "On"; + scene.enableTutorials = Setting[index].options[value].value === "On"; break; case SettingKeys.Move_Info: - scene.enableMoveInfo = Setting[index].options[value] === "On"; + scene.enableMoveInfo = Setting[index].options[value].value === "On"; break; case SettingKeys.Enable_Retries: - scene.enableRetries = Setting[index].options[value] === "On"; + scene.enableRetries = Setting[index].options[value].value === "On"; break; case SettingKeys.Skip_Seen_Dialogues: - scene.skipSeenDialogues = Setting[index].options[value] === "On"; + scene.skipSeenDialogues = Setting[index].options[value].value === "On"; break; case SettingKeys.Battle_Style: scene.battleStyle = value; break; + case SettingKeys.Show_BGM_Bar: + scene.showBgmBar = Setting[index].options[value].value === "On"; + break; case SettingKeys.Candy_Upgrade_Notification: if (scene.candyUpgradeNotification === value) { break; } - scene.candyUpgradeNotification = value; scene.eventTarget.dispatchEvent(new CandyUpgradeNotificationChangedEvent(value)); break; case SettingKeys.Candy_Upgrade_Display: scene.candyUpgradeDisplay = value; case SettingKeys.Money_Format: - switch (Setting[index].options[value]) { + switch (Setting[index].options[value].value) { case "Normal": scene.moneyFormat = MoneyFormat.NORMAL; break; @@ -407,22 +640,22 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): } break; case SettingKeys.Move_Animations: - scene.moveAnimations = Setting[index].options[value] === "On"; + scene.moveAnimations = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Moveset_Flyout: - scene.showMovesetFlyout = Setting[index].options[value] === "On"; + scene.showMovesetFlyout = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Arena_Flyout: - scene.showArenaFlyout = Setting[index].options[value] === "On"; + scene.showArenaFlyout = Setting[index].options[value].value === "On"; break; case SettingKeys.Show_Time_Of_Day_Widget: - scene.showTimeOfDayWidget = Setting[index].options[value] === "On"; + scene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; break; case SettingKeys.Time_Of_Day_Animation: - scene.timeOfDayAnimation = Setting[index].options[value] === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; + scene.timeOfDayAnimation = Setting[index].options[value].value === "Bounce" ? EaseType.BOUNCE : EaseType.BACK; break; case SettingKeys.Show_Stats_on_Level_Up: - scene.showLevelUpStats = Setting[index].options[value] === "On"; + scene.showLevelUpStats = Setting[index].options[value].value === "On"; break; case SettingKeys.EXP_Gains_Speed: scene.expGainsSpeed = value; @@ -438,7 +671,7 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): break; case SettingKeys.Player_Gender: if (scene.gameData) { - const female = Setting[index].options[value] === "Girl"; + const female = Setting[index].options[value].value === "Girl"; scene.gameData.gender = female ? PlayerGender.FEMALE : PlayerGender.MALE; scene.trainer.setTexture(scene.trainer.texture.key.replace(female ? "m" : "f", female ? "f" : "m")); } else { @@ -446,17 +679,17 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): } break; case SettingKeys.Touch_Controls: - scene.enableTouchControls = Setting[index].options[value] !== "Disabled" && hasTouchscreen(); + scene.enableTouchControls = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); const touchControls = document.getElementById("touchControls"); if (touchControls) { touchControls.classList.toggle("visible", scene.enableTouchControls); } break; case SettingKeys.Vibration: - scene.enableVibration = Setting[index].options[value] !== "Disabled" && hasTouchscreen(); + scene.enableVibration = Setting[index].options[value].value !== "Disabled" && hasTouchscreen(); break; case SettingKeys.Type_Hints: - scene.typeHints = Setting[index].options[value] === "On"; + scene.typeHints = Setting[index].options[value].value === "On"; break; case SettingKeys.Language: if (value) { @@ -517,7 +750,7 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): handler: () => changeLocaleHandler("ko") }, { - label: "Cancel", + label: i18next.t("settings:back"), handler: () => cancelHandler() } ], diff --git a/src/system/voucher.ts b/src/system/voucher.ts index dd0aa0ef6d4..2238a95e690 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -1,5 +1,5 @@ import BattleScene from "../battle-scene"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { Achv, AchvTier, achvs, getAchievementDescription } from "./achv"; import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts new file mode 100644 index 00000000000..bfd1fdf59fe --- /dev/null +++ b/src/test/abilities/aura_break.test.ts @@ -0,0 +1,95 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { MoveEffectPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import Move, { allMoves } from "#app/data/move.js"; +import Pokemon from "#app/field/pokemon.js"; +import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; + +describe("Abilities - Aura Break", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const multiplier = 9 / 16; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + }); + + it("reverses the effect of fairy aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); + const basePower = allMoves[Moves.MOONBLAST].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + + }); + + it("reverses the effect of dark aura", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); + const basePower = allMoves[Moves.DARK_PULSE].power; + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); + + const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(appliedPower).not.toBe(undefined); + expect(appliedPower).not.toBe(basePower); + expect(appliedPower).toBe(basePower * multiplier); + }); +}); + +/** + * Calculates the mocked power of a move in a Pokémon battle, taking into account certain abilities. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used in the attack. + * @returns The calculated power of the move after applying any relevant ability effects. + * + * @remarks + * This function creates a NumberHolder with the initial power of the move. + * It then checks if the defender has an ability with the FieldMoveTypePowerBoostAbAttr. + * If so, it applies a power modification of 9/16 using an instance of FieldMoveTypePowerBoostAbAttr. + * The final calculated power is then returned. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move): number => { + const powerHolder = new NumberHolder(move.power); + + if (defender.hasAbilityWithAttr(FieldMoveTypePowerBoostAbAttr)) { + const auraBreakInstance = new FieldMoveTypePowerBoostAbAttr(move.type, 9 / 16); + auraBreakInstance.applyPreAttack(attacker, false, defender, move, [powerHolder]); + } + + return powerHolder.value; +}; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts new file mode 100644 index 00000000000..53a04732b74 --- /dev/null +++ b/src/test/abilities/battery.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import Move, { allMoves, MoveCategory } from "#app/data/move.js"; +import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; +import Pokemon from "#app/field/pokemon.js"; + +describe("Abilities - Battery", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("raises the power of allies' special moves by 30%", async () => { + const moveToBeUsed = Moves.HEAT_WAVE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); + }); + + it("does not raise the power of allies' non-special moves", async () => { + const moveToBeUsed = Moves.ROCK_SLIDE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); + }); + + it("does not raise the power of the ability owner's special moves", async () => { + const moveToBeUsed = Moves.HEAT_WAVE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.CHARJABUG, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); + }); +}); + +/** + * Calculates the mocked power of a move. + * Note this does not consider other damage calculations + * except the power multiplier from Battery. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used by the attacker. + * @returns The adjusted power of the move. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const powerHolder = new NumberHolder(move.power); + + /** + * @see AllyMoveCategoryPowerBoostAbAttr + */ + if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { + const batteryInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL], 1.3); + batteryInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); + } + + return powerHolder.value; +}; + +/** + * Retrieves the power multiplier from a Pokémon's ability attribute. + * + * @param pokemon - The Pokémon whose ability attributes are being queried. + * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. + */ +const getAttrPowerMultiplier = (pokemon: Pokemon) => { + const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); + + return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; +}; diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts new file mode 100644 index 00000000000..1b7eb3f7b90 --- /dev/null +++ b/src/test/abilities/costar.test.ts @@ -0,0 +1,91 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import Phaser from "phaser"; +import * as Overrides from "#app/overrides"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { CommandPhase, MessagePhase } from "#app/phases.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { Abilities } from "#app/enums/abilities.js"; +import { Moves } from "#app/enums/moves.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - COSTAR", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT, Moves.CURSE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + + test( + "ability copies positive stat changes", + async () => { + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon).not.toBe(undefined); + expect(rightPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.NASTY_PLOT)); + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2); + }, + TIMEOUT, + ); + + test( + "ability copies negative stat changes", + async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP, Species.FLAMIGO]); + + let [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon).not.toBe(undefined); + expect(rightPokemon).not.toBe(undefined); + + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(CommandPhase); + game.doSwitchPokemon(2); + await game.phaseInterceptor.to(MessagePhase); + + [leftPokemon, rightPokemon] = game.scene.getPlayerField(); + expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + expect(rightPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2); + }, + TIMEOUT, + ); +}); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index cf8ba386b2e..297aa33e06c 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -64,4 +64,35 @@ describe("Abilities - DISGUISE", () => { }, TIMEOUT ); + + test( + "damage taken should be equal to 1/8 of its maximum HP, rounded down", + async () => { + const baseForm = 0, + bustedForm = 1; + + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE, Moves.DARK_PULSE]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(20); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(20); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + [Species.MIMIKYU]: baseForm, + }); + + await game.startBattle([Species.MIMIKYU]); + + const mimikyu = game.scene.getPlayerPokemon(); + const damage = (Math.floor(mimikyu.getMaxHp()/8)); + + expect(mimikyu).not.toBe(undefined); + expect(mimikyu.formIndex).toBe(baseForm); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mimikyu.formIndex).toBe(bustedForm); + expect(game.scene.getEnemyPokemon().turnData.currDamageDealt).toBe(damage); + }, + TIMEOUT + ); }); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts new file mode 100644 index 00000000000..bfb8f45a11f --- /dev/null +++ b/src/test/abilities/dry_skin.test.ts @@ -0,0 +1,163 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { TurnEndPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#app/enums/species.js"; + +describe("Abilities - Dry Skin", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); + }); + + it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + // first turn + let previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SUNNY_DAY)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(previousEnemyHp); + + // second turn + previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(previousEnemyHp); + }); + + it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + // first turn + let previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.RAIN_DANCE)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + + // second turn + previousEnemyHp = enemy.hp; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + }); + + it("opposing fire attacks do 25% more damage", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EMBER]); + + // ensure the enemy doesn't die to this + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + // first turn + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); // this makes moves always deal 85% damage + game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + await game.phaseInterceptor.to(TurnEndPhase); + const fireDamageTakenWithDrySkin = enemy.getMaxHp() - enemy.hp; + + expect(enemy.hp > 0); + enemy.hp = enemy.getMaxHp(); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + + // second turn + game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + await game.phaseInterceptor.to(TurnEndPhase); + const fireDamageTakenWithoutDrySkin = enemy.getMaxHp() - enemy.hp; + + expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin); + }); + + it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeGreaterThan(1); + }); + + it("opposing water attacks do not heal if they were protected from", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBe(1); + }); + + it("multi-strike water attacks only heal once", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); + + await game.startBattle(); + + const enemy = game.scene.getEnemyPokemon(); + expect(enemy).not.toBe(undefined); + + enemy.hp = 1; + + // first turn + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_SHURIKEN)); + await game.phaseInterceptor.to(TurnEndPhase); + const healthGainedFromWaterShuriken = enemy.hp - 1; + + enemy.hp = 1; + + // second turn + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + await game.phaseInterceptor.to(TurnEndPhase); + const healthGainedFromWaterGun = enemy.hp - 1; + + expect(healthGainedFromWaterShuriken).toBe(healthGainedFromWaterGun); + }); +}); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts new file mode 100644 index 00000000000..7d85f5bbc55 --- /dev/null +++ b/src/test/abilities/ice_face.test.ts @@ -0,0 +1,276 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + MoveEffectPhase, + MoveEndPhase, + TurnEndPhase, + TurnInitPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { QuietFormChangePhase } from "#app/form-change-phase"; + +describe("Abilities - Ice Face", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const noiceForm = 1; + const icefaceForm = 0; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); + }); + + it("takes no damage from physical move and transforms to Noice", async () => { + await game.startBattle([Species.HITMONLEE]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(MoveEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + }); + + it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + await game.startBattle([Species.HITMONLEE]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); + + const eiscue = game.scene.getEnemyPokemon(); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeDefined(); + + // First hit + await game.phaseInterceptor.to(MoveEffectPhase); + expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); + + // Second hit + await game.phaseInterceptor.to(MoveEffectPhase); + expect(eiscue.hp).lessThan(eiscue.getMaxHp()); + expect(eiscue.formIndex).toBe(noiceForm); + + await game.phaseInterceptor.to(MoveEndPhase); + + expect(eiscue.hp).lessThan(eiscue.getMaxHp()); + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); + }); + + it("takes damage from special moves", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + + await game.phaseInterceptor.to(MoveEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.hp).toBeLessThan(eiscue.getMaxHp()); + }); + + it("takes effects from status moves", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_THREAD)); + + await game.phaseInterceptor.to(MoveEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + }); + + it("transforms to Ice Face when Hail or Snow starts", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); + + await game.phaseInterceptor.to(MoveEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + + await game.phaseInterceptor.to(MoveEndPhase); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + }); + + it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); + + await game.startBattle([Species.EISCUE, Species.NINJASK]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SNOWSCAPE)); + + await game.phaseInterceptor.to(TurnEndPhase); + let eiscue = game.scene.getPlayerPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.hp).equals(eiscue.getMaxHp()); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + + await game.phaseInterceptor.to(QuietFormChangePhase); + eiscue = game.scene.getPlayerPokemon(); + + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + }); + + it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + + await game.startBattle([Species.EISCUE]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HAIL)); + const eiscue = game.scene.getPlayerPokemon(); + + await game.phaseInterceptor.to(QuietFormChangePhase); + + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + }); + + it("persists form change when switched out", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + + await game.startBattle([Species.EISCUE, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + + await game.phaseInterceptor.to(TurnEndPhase); + let eiscue = game.scene.getPlayerPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.hp).equals(eiscue.getMaxHp()); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + + await game.phaseInterceptor.to(TurnEndPhase); + eiscue = game.scene.getParty()[1]; + + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + }); + + it("reverts to Ice Face on arena reset", async () => { + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + [Species.EISCUE]: noiceForm, + }); + + await game.startBattle([Species.EISCUE]); + + const eiscue = game.scene.getPlayerPokemon(); + + expect(eiscue.formIndex).toBe(noiceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ICE_BEAM)); + await game.doKillOpponents(); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSelectModifier(); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + }); + + it("cannot be suppressed", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID]); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.summonData.abilitySuppressed).toBe(false); + }); + + it("cannot be swapped with another ability", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SKILL_SWAP]); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SKILL_SWAP)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + expect(eiscue.hasAbility(Abilities.ICE_FACE)).toBe(true); + }); + + it("cannot be copied", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TRACE); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SIMPLE_BEAM)); + + await game.phaseInterceptor.to(TurnInitPhase); + + const eiscue = game.scene.getEnemyPokemon(); + + expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); + expect(eiscue.formIndex).toBe(icefaceForm); + expect(game.scene.getPlayerPokemon().hasAbility(Abilities.TRACE)).toBe(true); + }); +}); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index a11feea9f88..a00239a651b 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts new file mode 100644 index 00000000000..4401ee0d40a --- /dev/null +++ b/src/test/abilities/parental_bond.test.ts @@ -0,0 +1,650 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import * as Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { BerryPhase, CommandPhase, DamagePhase, MoveEffectPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Type } from "#app/data/type.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { StatusEffect } from "#app/data/status-effect.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Parental Bond", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + test( + "ability should add second strike to attack move", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + let enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); + + await game.phaseInterceptor.to(DamagePhase); + const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; + enemyStartingHp = enemyPokemon.hp; + + await game.phaseInterceptor.to(BerryPhase, false); + + const secondStrikeDamage = enemyStartingHp - enemyPokemon.hp; + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(secondStrikeDamage).toBe(Math.ceil(0.25 * firstStrikeDamage)); + }, TIMEOUT + ); + + test( + "ability should apply secondary effects to both strikes", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.POWER_UP_PUNCH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.POWER_UP_PUNCH)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2); + }, TIMEOUT + ); + + test( + "ability should not apply to Status moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BABY_DOLL_EYES]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BABY_DOLL_EYES)); + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-hit moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_HIT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DOUBLE_HIT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }, TIMEOUT + ); + + test( + "ability should not apply to self-sacrifice moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SELF_DESTRUCT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SELF_DESTRUCT)); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply to Rollout", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ROLLOUT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply multiplier to fixed-damage moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 80); + }, TIMEOUT + ); + + test( + "ability should not apply multiplier to counter moves", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.COUNTER]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const playerStartingHp = leadPokemon.hp; + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.COUNTER)); + await game.phaseInterceptor.to(DamagePhase); + + const playerDamage = playerStartingHp - leadPokemon.hp; + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 4*playerDamage); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-target moves", + async () => { + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + + await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(BerryPhase, false); + + playerPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); + }, TIMEOUT + ); + + test( + "ability should apply to multi-target moves when hitting only one target", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + }, TIMEOUT + ); + + test( + "ability should only trigger post-target move effects once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MIND_BLOWN]); + + await game.startBattle([Species.PIDGEOT]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MIND_BLOWN)); + + await game.phaseInterceptor.to(DamagePhase, false); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This test will time out if the user faints + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.hp).toBe(Math.floor(leadPokemon.getMaxHp()/2)); + }, TIMEOUT + ); + + test( + "Burn Up only removes type after second strike with this ability", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.BURN_UP]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BURN_UP)); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.hp).toBeGreaterThan(0); + expect(leadPokemon.isOfType(Type.FIRE)).toBe(true); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.isOfType(Type.FIRE)).toBe(false); + }, TIMEOUT + ); + + test( + "Moves boosted by this ability and Multi-Lens should strike 4 times", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(4); + }, TIMEOUT + ); + + test( + "Super Fang boosted by this ability and Multi-Lens should strike twice", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUPER_FANG]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.SUPER_FANG)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.hp).toBe(Math.ceil(enemyStartingHp * 0.25)); + }, TIMEOUT + ); + + test( + "Seismic Toss boosted by this ability and Multi-Lens should strike twice", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SEISMIC_TOSS]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.SEISMIC_TOSS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.hp).toBe(enemyStartingHp - 200); + }, TIMEOUT + ); + + test( + "Hyper Beam boosted by this ability should strike twice, then recharge", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HYPER_BEAM]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HYPER_BEAM)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeDefined(); + }, TIMEOUT + ); + + /** TODO: Fix TRAPPED tag lapsing incorrectly, then run this test */ + test.skip( + "Anchor Shot boosted by this ability should only trap the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ANCHOR_SHOT]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ANCHOR_SHOT)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); // Passes + + await game.phaseInterceptor.to(MoveEndPhase); + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Passes + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeDefined(); // Fails :( + }, TIMEOUT + ); + + test( + "Smack Down boosted by this ability should only ground the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SMACK_DOWN]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SMACK_DOWN)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + }, TIMEOUT + ); + + test( + "U-turn boosted by this ability should strike twice before forcing a switch", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.U_TURN]); + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.U_TURN)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(MoveEffectPhase); + expect(leadPokemon.turnData.hitCount).toBe(2); + + // This will cause this test to time out if the switch was forced on the first hit. + await game.phaseInterceptor.to(MoveEffectPhase, false); + }, TIMEOUT + ); + + test( + "Wake-Up Slap boosted by this ability should only wake up the target after the second hit", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WAKE_UP_SLAP]); + vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(StatusEffect.SLEEP); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WAKE_UP_SLAP)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + + await game.phaseInterceptor.to(DamagePhase); + + expect(leadPokemon.turnData.hitCount).toBe(2); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.status?.effect).toBeUndefined(); + }, TIMEOUT + ); + + test( + "ability should not cause user to hit into King's Shield more than once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD,Moves.KINGS_SHIELD]); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1); + }, TIMEOUT + ); + + test( + "ability should not cause user to hit into Storm Drain more than once", + async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STORM_DRAIN); + + await game.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1); + }, TIMEOUT + ); + + test( + "ability should not apply to multi-target moves with Multi-Lens", + async () => { + vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); + + await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.EARTHQUAKE)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); + + await game.phaseInterceptor.to(DamagePhase); + const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); + + await game.phaseInterceptor.to(BerryPhase, false); + + enemyPokemon.forEach((p, i) => expect(enemyStartingHp[i] - p.hp).toBe(2*enemyFirstHitDamage[i])); + + }, TIMEOUT + ); +}); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts new file mode 100644 index 00000000000..0ed2b10f4be --- /dev/null +++ b/src/test/abilities/power_spot.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import Move, { allMoves, MoveCategory } from "#app/data/move.js"; +import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; +import Pokemon from "#app/field/pokemon.js"; + +describe("Abilities - Power Spot", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("raises the power of allies' special moves by 30%", async () => { + const moveToBeUsed = Moves.HEAT_WAVE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); + }); + + it("raises the power of allies' physical moves by 30%", async () => { + const moveToBeUsed = Moves.ROCK_SLIDE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).not.toBe(basePower); + expect(mockedPower).toBe(basePower * multiplier); + }); + + it("does not raise the power of the ability owner's moves", async () => { + const moveToBeUsed = Moves.HEAT_WAVE; + const basePower = allMoves[moveToBeUsed].power; + + await game.startBattle([Species.STONJOURNER, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); + const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); + + expect(mockedPower).not.toBe(undefined); + expect(mockedPower).toBe(basePower); + expect(mockedPower).not.toBe(basePower * multiplier); + }); +}); + +/** + * Calculates the mocked power of a move. + * Note this does not consider other damage calculations + * except the power multiplier from Power Spot. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used by the attacker. + * @returns The adjusted power of the move. + */ +const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const powerHolder = new NumberHolder(move.power); + + /** + * @see AllyMoveCategoryPowerBoostAbAttr + */ + if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { + const powerSpotInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3); + powerSpotInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); + } + + return powerHolder.value; +}; + +/** + * Retrieves the power multiplier from a Pokémon's ability attribute. + * + * @param pokemon - The Pokémon whose ability attributes are being queried. + * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. + */ +const getAttrPowerMultiplier = (pokemon: Pokemon) => { + const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); + + return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; +}; diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index d102daf7fcc..125c03eb39c 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Protean", () => { TIMEOUT, ); - test( + test.skip( "ability applies only once per switch in", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.AGILITY]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts new file mode 100644 index 00000000000..884b108381d --- /dev/null +++ b/src/test/abilities/quick_draw.test.ts @@ -0,0 +1,90 @@ +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as Overrides from "#app/overrides"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import { FaintPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allAbilities, BypassSpeedChanceAbAttr } from "#app/data/ability"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; + +describe("Abilities - Quick Draw", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + + vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); + }); + + test("makes pokemon going first in its priority bracket", async () => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(false); + expect(enemy.isFainted()).toBe(true); + expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); + }, 20000); + + test("does not triggered by non damage moves", async () => { + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAIL_WHIP)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); + }, 20000); + + test("does not increase priority", async () => { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); + + await game.startBattle([Species.SLOWBRO]); + + const pokemon = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + pokemon.hp = 1; + enemy.hp = 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(FaintPhase, false); + + expect(pokemon.isFainted()).toBe(true); + expect(enemy.isFainted()).toBe(false); + expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); + }, 20000); +}); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts new file mode 100644 index 00000000000..d790469e952 --- /dev/null +++ b/src/test/abilities/screen_cleaner.test.ts @@ -0,0 +1,84 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + +describe("Abilities - Screen Cleaner", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + }); + + it("removes Aurora Veil", async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HAIL)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.AURORA_VEIL)).toBeDefined(); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(PostSummonPhase); + + expect(game.scene.arena.getTag(ArenaTagType.AURORA_VEIL)).toBeUndefined(); + }); + + it("removes Light Screen", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.LIGHT_SCREEN)).toBeDefined(); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(PostSummonPhase); + + expect(game.scene.arena.getTag(ArenaTagType.LIGHT_SCREEN)).toBeUndefined(); + }); + + it("removes Reflect", async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + + await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.REFLECT)).toBeDefined(); + + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(PostSummonPhase); + + expect(game.scene.arena.getTag(ArenaTagType.REFLECT)).toBeUndefined(); + }); +}); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts new file mode 100644 index 00000000000..cf283ea92a8 --- /dev/null +++ b/src/test/abilities/serene_grace.test.ts @@ -0,0 +1,110 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import {Abilities} from "#enums/abilities"; +import {applyAbAttrs ,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; +import {Species} from "#enums/species"; +import { + CommandPhase, + MoveEffectPhase, +} from "#app/phases"; +import {Mode} from "#app/ui/ui"; +import {Stat} from "#app/data/pokemon-stat"; +import {Moves} from "#enums/moves"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import {Command} from "#app/ui/command-ui-handler"; +import * as Utils from "#app/utils"; + + +describe("Abilities - Serene Grace", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + it("Move chance without Serene Grace", async() => { + const moveToUse = Moves.AIR_SLASH; + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + // Check chance of Air Slash without Serene Grace + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.AIR_SLASH); + + const chance = new Utils.IntegerHolder(move.chance); + console.log(move.chance + " Their ability is " + phase.getUserPokemon().getAbility().name); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + expect(chance.value).toBe(30); + + }, 20000); + + it("Move chance with Serene Grace", async() => { + const moveToUse = Moves.AIR_SLASH; + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SERENE_GRACE); + await game.startBattle([ + Species.TOGEKISS + ]); + + game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + // Check chance of Air Slash with Serene Grace + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.AIR_SLASH); + + const chance = new Utils.IntegerHolder(move.chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + expect(chance.value).toBe(60); + + }, 20000); + + //TODO King's Rock Interaction Unit Test +}); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts new file mode 100644 index 00000000000..c01ec176f4d --- /dev/null +++ b/src/test/abilities/sheer_force.test.ts @@ -0,0 +1,208 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import {Abilities} from "#enums/abilities"; +import {applyAbAttrs ,applyPreAttackAbAttrs,applyPostDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr} from "#app/data/ability"; +import {Species} from "#enums/species"; +import { + CommandPhase, + MoveEffectPhase, +} from "#app/phases"; +import {Mode} from "#app/ui/ui"; +import {Stat} from "#app/data/pokemon-stat"; +import {Moves} from "#enums/moves"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import {Command} from "#app/ui/command-ui-handler"; +import * as Utils from "#app/utils"; + + +describe("Abilities - Sheer Force", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + it("Sheer Force", async() => { + const moveToUse = Moves.AIR_SLASH; + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.AIR_SLASH); + + //Verify the move is boosted and has no chance of secondary effects + const power = new Utils.IntegerHolder(move.power); + const chance = new Utils.IntegerHolder(move.chance); + + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + + expect(chance.value).toBe(0); + expect(power.value).toBe(move.power * 5461/4096); + + + }, 20000); + + it("Sheer Force with exceptions including binding moves", async() => { + const moveToUse = Moves.BIND; + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.BIND); + + //Binding moves and other exceptions are not affected by Sheer Force and have a chance.value of -1 + const power = new Utils.IntegerHolder(move.power); + const chance = new Utils.IntegerHolder(move.chance); + + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + + expect(chance.value).toBe(-1); + expect(power.value).toBe(move.power); + + + }, 20000); + + it("Sheer Force with moves with no secondary effect", async() => { + const moveToUse = Moves.TACKLE; + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.TACKLE); + + //Binding moves and other exceptions are not affected by Sheer Force and have a chance.value of -1 + const power = new Utils.IntegerHolder(move.power); + const chance = new Utils.IntegerHolder(move.chance); + + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon(), phase.getTarget(), move, power); + + expect(chance.value).toBe(-1); + expect(power.value).toBe(move.power); + + + }, 20000); + + it("Sheer Force Disabling Specific Abilities", async() => { + const moveToUse = Moves.CRUSH_CLAW; + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COLOR_CHANGE); + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.DEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.CRUSH_CLAW); + + //Disable color change due to being hit by Sheer Force + const power = new Utils.IntegerHolder(move.power); + const chance = new Utils.IntegerHolder(move.chance); + const user = phase.getUserPokemon(); + const target = phase.getTarget(); + const opponentType = target.getTypes()[0]; + + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, chance, move, target, false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, user, target, move, power); + applyPostDefendAbAttrs(PostDefendTypeChangeAbAttr, target, user, move, target.apply(user, move)); + + expect(chance.value).toBe(0); + expect(power.value).toBe(move.power * 5461/4096); + expect(target.getTypes().length).toBe(2); + expect(target.getTypes()[0]).toBe(opponentType); + + }, 20000); + + //TODO King's Rock Interaction Unit Test +}); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts new file mode 100644 index 00000000000..f52a1d6c7d4 --- /dev/null +++ b/src/test/abilities/shield_dust.test.ts @@ -0,0 +1,79 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Abilities } from "#enums/abilities"; +import {applyAbAttrs ,applyPreDefendAbAttrs,IgnoreMoveEffectsAbAttr,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; +import {Species} from "#enums/species"; +import { + CommandPhase, + MoveEffectPhase, +} from "#app/phases"; +import {Mode} from "#app/ui/ui"; +import {Stat} from "#app/data/pokemon-stat"; +import {Moves} from "#enums/moves"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import {Command} from "#app/ui/command-ui-handler"; +import * as Utils from "#app/utils"; + + +describe("Abilities - Shield Dust", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const movesToUse = [Moves.AIR_SLASH]; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + it("Shield Dust", async() => { + const moveToUse = Moves.AIR_SLASH; + await game.startBattle([ + Species.PIDGEOT + ]); + + + game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; + game.scene.getEnemyParty()[0].stats[Stat.SPD] = 1; + expect(game.scene.getParty()[0].formIndex).toBe(0); + + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + }); + game.onNextPrompt("CommandPhase", Mode.FIGHT, () => { + const movePosition = getMovePosition(game.scene, 0, moveToUse); + (game.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); + }); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + + // Shield Dust negates secondary effect + const phase = game.scene.getCurrentPhase() as MoveEffectPhase; + const move = phase.move.getMove(); + expect(move.id).toBe(Moves.AIR_SLASH); + + const chance = new Utils.IntegerHolder(move.chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon(), null, chance, move, phase.getTarget(), false); + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getTarget(),phase.getUserPokemon(),null,null, chance); + expect(chance.value).toBe(0); + + }, 20000); + + //TODO King's Rock Interaction Unit Test +}); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts new file mode 100644 index 00000000000..b9d764971f0 --- /dev/null +++ b/src/test/abilities/sturdy.test.ts @@ -0,0 +1,101 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + DamagePhase, + MoveEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { EnemyPokemon } from "#app/field/pokemon.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Sturdy", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ARON); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); + }); + + test( + "Sturdy activates when user is at full HP", + async () => { + await game.startBattle(); + game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.getEnemyParty()[0].hp).toBe(1); + }, + TIMEOUT + ); + + test( + "Sturdy doesn't activate when user is not at full HP", + async () => { + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + await game.phaseInterceptor.to(DamagePhase); + + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }, + TIMEOUT + ); + + test( + "Sturdy pokemon should be immune to OHKO moves", + async () => { + await game.startBattle(); + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(MoveEndPhase); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }, + TIMEOUT + ); + + test( + "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", + async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + + await game.startBattle(); + game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); + await game.phaseInterceptor.to(DamagePhase); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; + expect(enemyPokemon.hp).toBe(0); + expect(enemyPokemon.isFainted()).toBe(true); + }, + TIMEOUT + ); + +}); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts new file mode 100644 index 00000000000..c53be8c82a4 --- /dev/null +++ b/src/test/abilities/unseen_fist.test.ts @@ -0,0 +1,92 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import * as Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases.js"; + +const TIMEOUT = 20 * 1000; + +describe("Abilities - Unseen Fist", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + test( + "ability causes a contact move to ignore Protect", + () => testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, true), + TIMEOUT + ); + + test( + "ability does not cause a non-contact move to ignore Protect", + () => testUnseenFistHitResult(game, Moves.ABSORB, Moves.PROTECT, false), + TIMEOUT + ); + + test( + "ability does not apply if the source has Long Reach", + () => { + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LONG_REACH); + testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); + }, TIMEOUT + ); + + test( + "ability causes a contact move to ignore Wide Guard", + () => testUnseenFistHitResult(game, Moves.BREAKING_SWIPE, Moves.WIDE_GUARD, true), + TIMEOUT + ); + + test( + "ability does not cause a non-contact move to ignore Wide Guard", + () => testUnseenFistHitResult(game, Moves.BULLDOZE, Moves.WIDE_GUARD, false), + TIMEOUT + ); +}); + +async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, protectMove: Moves, shouldSucceed: boolean = true): Promise { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([attackMove]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([protectMove, protectMove, protectMove, protectMove]); + + await game.startBattle(); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).not.toBe(undefined); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).not.toBe(undefined); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, attackMove)); + await game.phaseInterceptor.to(TurnEndPhase, false); + + if (shouldSucceed) { + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + } else { + expect(enemyPokemon.hp).toBe(enemyStartingHp); + } +} diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 8c629d8d771..86efd1a9d93 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -41,7 +41,7 @@ describe("Abilities - Volt Absorb", () => { vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); await game.startBattle(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts new file mode 100644 index 00000000000..89957362268 --- /dev/null +++ b/src/test/abilities/wind_power.test.ts @@ -0,0 +1,97 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +describe("Abilities - Wind Power", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("it becomes charged when hit by wind moves", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("it becomes charged when Tailwind takes effect on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + }); + + it("does not become charged when Tailwind takes effect on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeDefined(); + expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); + }); +}); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts new file mode 100644 index 00000000000..2b9361f5839 --- /dev/null +++ b/src/test/abilities/wind_rider.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { + await game.startBattle([Species.MAGIKARP]); + const shiftry = game.scene.getEnemyPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PETAL_BLIZZARD)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("Attack is increased by one stage when Tailwind is present on its side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not increase Attack when Tailwind is present on opposing side", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const magikarp = game.scene.getEnemyPokemon(); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); + expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0); + }); + + it("does not interact with Sandstorm", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.SHIFTRY]); + const shiftry = game.scene.getPlayerPokemon(); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).equals(shiftry.getMaxHp()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); + expect(shiftry.hp).lessThan(shiftry.getMaxHp()); + }); +}); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts new file mode 100644 index 00000000000..4dc4b1d4282 --- /dev/null +++ b/src/test/abilities/wonder_skin.test.ts @@ -0,0 +1,141 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { TurnEndPhase, } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import Move, { allMoves } from "#app/data/move.js"; +import { MoveAbilityBypassAbAttr, WonderSkinAbAttr } from "#app/data/ability.js"; +import { NumberHolder } from "#app/utils.js"; +import Pokemon from "#app/field/pokemon.js"; + +describe("Abilities - Wonder Skin", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("lowers accuracy of status moves to 50%", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).not.toBe(100); + expect(mockedAccuracy).toBe(50); + }); + + it("does not lower accuracy of non-status moves", async () => { + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); + }); + + it("does not affect pokemon with Mold Breaker", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); + }); + + it("does not affect pokemon with Teravolt", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TERAVOLT); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); + }); + + it("does not affect pokemon with Turboblaze", async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TURBOBLAZE); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + + const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(mockedAccuracy).not.toBe(undefined); + expect(mockedAccuracy).toBe(100); + expect(mockedAccuracy).not.toBe(50); + }); +}); + +/** + * Calculates the mocked accuracy of a move. + * Note this does not consider other accuracy calculations + * except the power multiplier from Wonder Skin. + * Bypassed by MoveAbilityBypassAbAttr {@linkcode MoveAbilityBypassAbAttr} + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used by the attacker. + * @returns The adjusted accuracy of the move. + */ +const getMockedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const accuracyHolder = new NumberHolder(move.accuracy); + + /** + * Simulate ignoring ability + * @see MoveAbilityBypassAbAttr + */ + if (attacker.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { + return accuracyHolder.value; + } + + const wonderSkinInstance = new WonderSkinAbAttr(); + + wonderSkinInstance.applyPreDefend(defender, false, attacker, move, { value: false }, [ accuracyHolder ]); + + return accuracyHolder.value; +}; diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index e6c4ad0e16e..a098620f5eb 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,17 +1,35 @@ -import {beforeAll, describe, expect, it} from "vitest"; +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import BattleScene from "../../battle-scene"; -import { getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; +import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg.js"; import { Species } from "#enums/species"; import Phaser from "phaser"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; +import { EggTier } from "#app/enums/egg-type.js"; +import { VariantTier } from "#app/enums/variant-tiers.js"; +import GameManager from "../utils/gameManager"; +import EggData from "#app/system/egg-data.js"; +import * as Utils from "#app/utils.js"; -describe("getLegendaryGachaSpeciesForTimestamp", () => { +describe("Egg Generation Tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; beforeAll(() => { - new Phaser.Game({ + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); }); + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.restoreAllMocks(); + }); + + beforeEach(async() => { + game = new GameManager(phaserGame); + await game.importData("src/test/utils/saves/everything.prsv"); + }); + it("should return Arceus for the 10th of June", () => { const scene = new BattleScene(); const timestamp = new Date(2024, 5, 10, 15, 0, 0, 0).getTime(); @@ -30,4 +48,259 @@ describe("getLegendaryGachaSpeciesForTimestamp", () => { expect(result).toBe(expectedSpecies); }); + it("should hatch an Arceus. Set from legendary gacha", async() => { + const scene = game.scene; + const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.MASTER}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should hatch an Arceus. Set from species", () => { + const scene = game.scene; + const expectedSpecies = Species.ARCEUS; + + const result = new Egg({scene,species: expectedSpecies}).generatePlayerPokemon(scene).species.speciesId; + + expect(result).toBe(expectedSpecies); + }); + it("should return an common tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.COMMON; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an rare tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.GREAT; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an epic tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.ULTRA; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return an legendary tier egg", () => { + const scene = game.scene; + const expectedTier = EggTier.MASTER; + + const result = new Egg({scene, tier: expectedTier}).tier; + + expect(result).toBe(expectedTier); + }); + it("should return a manaphy egg set via species", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, species: Species.MANAPHY}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return a manaphy egg set via id", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, tier: EggTier.COMMON, id: 204}).isManaphyEgg(); + + expect(result).toBe(expectedResult); + }); + it("should return an egg with 1000 hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 1000; + + const result = new Egg({scene, hatchWaves: expectedHatchWaves}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should return an shiny pokemon", () => { + const scene = game.scene; + const expectedResult = true; + + const result = new Egg({scene, isShiny: expectedResult, species: Species.BULBASAUR}).generatePlayerPokemon(scene).isShiny(); + + expect(result).toBe(expectedResult); + }); + it("should return a shiny common variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.COMMON; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny rare variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.RARE; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return a shiny epic variant", () => { + const scene = game.scene; + const expectedVariantTier = VariantTier.EPIC; + + const result = new Egg({scene, isShiny: true, variantTier: expectedVariantTier, species: Species.BULBASAUR}).generatePlayerPokemon(scene).variant; + + expect(result).toBe(expectedVariantTier); + }); + it("should return an egg with an egg move index of 0, 1, 2 or 3", () => { + const scene = game.scene; + + const eggMoveIndex = new Egg({scene}).eggMoveIndex; + const result = eggMoveIndex && eggMoveIndex >= 0 && eggMoveIndex <= 3; + + expect(result).toBe(true); + }); + it("should return an egg with an rare egg move. Egg move index should be 3", () => { + const scene = game.scene; + const expectedEggMoveIndex = 3; + + const result = new Egg({scene, eggMoveIndex: expectedEggMoveIndex}).eggMoveIndex; + + expect(result).toBe(expectedEggMoveIndex); + }); + it("should return a hatched pokemon with a hidden ability", () => { + const scene = game.scene; + + const playerPokemon = new Egg({scene, overrideHiddenAbility: true, species: Species.BULBASAUR}).generatePlayerPokemon(scene); + const expectedAbilityIndex = playerPokemon.species.ability2 ? 2 : 1; + + const result = playerPokemon.abilityIndex; + + expect(result).toBe(expectedAbilityIndex); + }); + it("should add the egg to the game data", () => { + const scene = game.scene; + const expectedEggCount = 1; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}); + + const result = scene.gameData.eggs.length; + + expect(result).toBe(expectedEggCount); + }); + it("should override the egg tier to common", () => { + const scene = game.scene; + const expectedEggTier = EggTier.COMMON; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).tier; + + expect(result).toBe(expectedEggTier); + }); + it("should override the egg hatch waves", () => { + const scene = game.scene; + const expectedHatchWaves = 10; + + const result = new Egg({scene, tier: EggTier.MASTER, species: Species.BULBASAUR}).hatchWaves; + + expect(result).toBe(expectedHatchWaves); + }); + it("should correctly load a legacy egg", () => { + const legacyEgg = { + gachaType: 1, + hatchWaves: 25, + id: 2077000788, + timestamp: 1718908955085, + isShiny: false, + overrideHiddenAbility: false, + sourceType: 0, + species: 0, + tier: 0, + variantTier: 0, + eggMoveIndex: 0, + }; + + const result = new EggData(legacyEgg).toEgg(); + + expect(result.tier).toBe(EggTier.GREAT); + expect(result.id).toBe(legacyEgg.id); + expect(result.timestamp).toBe(legacyEgg.timestamp); + expect(result.hatchWaves).toBe(legacyEgg.hatchWaves); + expect(result.sourceType).toBe(legacyEgg.gachaType); + }); + it("should increase egg pity", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 1); + }); + it("should increase legendary egg pity by two", () => { + const scene = game.scene; + const startPityValues = [...scene.gameData.eggPity]; + + new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true, tier: EggTier.COMMON}); + + expect(scene.gameData.eggPity[EggTier.GREAT]).toBe(startPityValues[EggTier.GREAT] + 1); + expect(scene.gameData.eggPity[EggTier.ULTRA]).toBe(startPityValues[EggTier.ULTRA] + 1); + expect(scene.gameData.eggPity[EggTier.MASTER]).toBe(startPityValues[EggTier.MASTER] + 2); + }); + it("should not increase manaphy egg count if bulbasaurs are pulled", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + for (let i = 0; i < 200; i++) { + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, species: Species.BULBASAUR}); + } + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount); + }); + it("should increase manaphy egg count", () => { + const scene = game.scene; + const startingManaphyEggCount = scene.gameData.gameStats.manaphyEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, id: 204, tier: EggTier.COMMON}); + + expect(scene.gameData.gameStats.manaphyEggsPulled).toBe(startingManaphyEggCount + 1); + }); + it("should increase rare eggs pulled statistic", () => { + const scene = game.scene; + const startingRareEggsPulled = scene.gameData.gameStats.rareEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.GREAT}); + + expect(scene.gameData.gameStats.rareEggsPulled).toBe(startingRareEggsPulled + 1); + }); + it("should increase epic eggs pulled statistic", () => { + const scene = game.scene; + const startingEpicEggsPulled = scene.gameData.gameStats.epicEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.ULTRA}); + + expect(scene.gameData.gameStats.epicEggsPulled).toBe(startingEpicEggsPulled + 1); + }); + it("should increase legendary eggs pulled statistic", () => { + const scene = game.scene; + const startingLegendaryEggsPulled = scene.gameData.gameStats.legendaryEggsPulled; + + new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true, tier: EggTier.MASTER}); + + expect(scene.gameData.gameStats.legendaryEggsPulled).toBe(startingLegendaryEggsPulled + 1); + }); + it("should increase legendary egg rate", () => { + vi.spyOn(Utils, "randInt").mockReturnValue(1); + + const scene = game.scene; + const expectedTier1 = EggTier.MASTER; + const expectedTier2 = EggTier.ULTRA; + + const result1 = new Egg({scene, sourceType: EggSourceType.GACHA_LEGENDARY, pulled: true}).tier; + const result2 = new Egg({scene, sourceType: EggSourceType.GACHA_MOVE, pulled: true}).tier; + + expect(result1).toBe(expectedTier1); + expect(result2).toBe(expectedTier2); + }); }); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts new file mode 100644 index 00000000000..5b4561d4877 --- /dev/null +++ b/src/test/items/eviolite.test.ts @@ -0,0 +1,278 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Stat } from "#app/data/pokemon-stat"; +import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; +import { Species } from "#enums/species"; + +describe("Items - Eviolite", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("EVIOLITE activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Eviolite is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), ""); + }); + + it("EVIOLITE held by unevolved, unfused pokemon", async() => { + await game.startBattle([ + Species.PICHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by fully evolved, unfused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); + + it("EVIOLITE held by completely unevolved, fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.5); + expect(spDefValue.value / spDefStat).toBe(1.5); + }, 20000); + + it("EVIOLITE held by partially unevolved (base), fused pokemon", async() => { + await game.startBattle([ + Species.PICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by partially unevolved (fusion), fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFFA + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1.25); + expect(spDefValue.value / spDefStat).toBe(1.25); + }, 20000); + + it("EVIOLITE held by completely evolved, fused pokemon", async() => { + await game.startBattle([ + Species.RAICHU, + Species.CLEFABLE + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + const spDefStat = partyMember.getStat(Stat.SPDEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + const spDefValue = new Utils.NumberHolder(spDefStat); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.EVIOLITE().newModifier(partyMember), true); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + partyMember.scene.applyModifiers(EvolutionStatBoosterModifier, true, partyMember, Stat.SPDEF, spDefValue); + + expect(defValue.value / defStat).toBe(1); + expect(spDefValue.value / spDefStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts new file mode 100644 index 00000000000..52fab7b044a --- /dev/null +++ b/src/test/items/light_ball.test.ts @@ -0,0 +1,200 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Light Ball", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("LIGHT_BALL activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Light Ball is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), ""); + }); + + it("LIGHT_BALL held by PIKACHU", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL held by fused PIKACHU (base)", async() => { + await game.startBattle([ + Species.PIKACHU, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL held by fused PIKACHU (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(2); + expect(spAtkValue.value / spAtkStat).toBe(2); + }, 20000); + + it("LIGHT_BALL not held by PIKACHU", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + const spAtkStat = partyMember.getStat(Stat.SPATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, atkValue); + const spAtkValue = new Utils.NumberHolder(spAtkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPDEF, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["LIGHT_BALL"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); + + expect(atkValue.value / atkStat).toBe(1); + expect(spAtkValue.value / spAtkStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts new file mode 100644 index 00000000000..5aa2c517ac9 --- /dev/null +++ b/src/test/items/metal_powder.test.ts @@ -0,0 +1,176 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Metal Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("METAL_POWDER activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Metal Powder is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), ""); + }); + + it("METAL_POWDER held by DITTO", async() => { + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER held by fused DITTO (base)", async() => { + await game.startBattle([ + Species.DITTO, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER held by fused DITTO (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(2); + }, 20000); + + it("METAL_POWDER not held by DITTO", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const defStat = partyMember.getStat(Stat.DEF); + + // Making sure modifier is not applied without holding item + const defValue = new Utils.NumberHolder(defStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["METAL_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); + + expect(defValue.value / defStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts new file mode 100644 index 00000000000..753f62e36eb --- /dev/null +++ b/src/test/items/quick_powder.test.ts @@ -0,0 +1,176 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Quick Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("QUICK_POWDER activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Quick Powder is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), ""); + }); + + it("QUICK_POWDER held by DITTO", async() => { + await game.startBattle([ + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER held by fused DITTO (base)", async() => { + await game.startBattle([ + Species.DITTO, + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER held by fused DITTO (part)", async() => { + await game.startBattle([ + Species.MAROWAK, + Species.DITTO + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(2); + }, 20000); + + it("QUICK_POWDER not held by DITTO", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const spdStat = partyMember.getStat(Stat.SPD); + + // Making sure modifier is not applied without holding item + const spdValue = new Utils.NumberHolder(spdStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["QUICK_POWDER"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); + + expect(spdValue.value / spdStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts new file mode 100644 index 00000000000..3356196e8c5 --- /dev/null +++ b/src/test/items/thick_club.test.ts @@ -0,0 +1,228 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Stat } from "#app/data/pokemon-stat"; +import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import i18next from "#app/plugins/i18n"; + +describe("Items - Thick Club", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + }); + + it("THICK_CLUB activates in battle correctly", async() => { + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.CUBONE + ]); + + const partyMember = game.scene.getParty()[0]; + + // Checking consoe log to make sure Thick Club is applied when getBattleStat (with the appropriate stat) is called + partyMember.getBattleStat(Stat.DEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + // Printing dummy console messages along the way so subsequent checks don't pass because of the first + console.log(""); + + partyMember.getBattleStat(Stat.SPDEF); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.ATK); + expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPATK); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + + console.log(""); + + partyMember.getBattleStat(Stat.SPD); + expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), ""); + }); + + it("THICK_CLUB held by CUBONE", async() => { + await game.startBattle([ + Species.CUBONE + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by MAROWAK", async() => { + await game.startBattle([ + Species.MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by ALOLA_MAROWAK", async() => { + await game.startBattle([ + Species.ALOLA_MAROWAK + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by fused CUBONE line (base)", async() => { + // Randomly choose from the Cubone line + const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const randSpecies = Utils.randInt(species.length); + + await game.startBattle([ + species[randSpecies], + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB held by fused CUBONE line (part)", async() => { + // Randomly choose from the Cubone line + const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; + const randSpecies = Utils.randInt(species.length); + + await game.startBattle([ + Species.PIKACHU, + species[randSpecies] + ]); + + const partyMember = game.scene.getParty()[0]; + const ally = game.scene.getParty()[1]; + + // Fuse party members (taken from PlayerPokemon.fuse(...) function) + partyMember.fusionSpecies = ally.species; + partyMember.fusionFormIndex = ally.formIndex; + partyMember.fusionAbilityIndex = ally.abilityIndex; + partyMember.fusionShiny = ally.shiny; + partyMember.fusionVariant = ally.variant; + partyMember.fusionGender = ally.gender; + partyMember.fusionLuck = ally.luck; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(2); + }, 20000); + + it("THICK_CLUB not held by CUBONE", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getParty()[0]; + + const atkStat = partyMember.getStat(Stat.ATK); + + // Making sure modifier is not applied without holding item + const atkValue = new Utils.NumberHolder(atkStat); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + + // Giving Eviolite to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType(null, ["THICK_CLUB"]).newModifier(partyMember), true); + partyMember.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); + + expect(atkValue.value / atkStat).toBe(1); + }, 20000); +}); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 6aacfd0e5e7..64dc3191d88 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -15,6 +15,7 @@ import {StatusEffect} from "#app/data/status-effect"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import i18next, { initI18n } from "#app/plugins/i18n"; describe("Items - Toxic orb", () => { @@ -48,6 +49,8 @@ describe("Items - Toxic orb", () => { }); it("TOXIC ORB", async() => { + initI18n(); + i18next.changeLanguage("en"); const moveToUse = Moves.GROWTH; await game.startBattle([ Species.MIGHTYENA, diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/lokalisation/battle-stat.test.ts new file mode 100644 index 00000000000..d894d705947 --- /dev/null +++ b/src/test/lokalisation/battle-stat.test.ts @@ -0,0 +1,208 @@ +import {beforeAll, describe, expect, it} from "vitest"; +import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; +import { battle as enBattleStat } from "#app/locales/en/battle.js"; +import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; +import { battle as deBattleStat } from "#app/locales/de/battle.js"; +import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; +import { battle as esBattleStat } from "#app/locales/es/battle.js"; +import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; +import { battle as frBattleStat } from "#app/locales/fr/battle.js"; +import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; +import { battle as itBattleStat } from "#app/locales/it/battle.js"; +import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; +import { battle as koBattleStat } from "#app/locales/ko/battle.js"; +import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; +import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; +import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; +import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; +import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; +import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; + +import i18next, {initI18n} from "#app/plugins/i18n"; +import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; + +interface BattleStatTestUnit { + stat: BattleStat, + key: string +} + +interface BattleStatLevelTestUnit { + levels: integer, + up: boolean, + key: string +} + +function testBattleStatName(stat: BattleStat, expectMessage: string) { + const message = getBattleStatName(stat); + console.log(`message ${message}, expected ${expectMessage}`); + expect(message).toBe(expectMessage); +} + +function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); + console.log(`message ${message}, expected ${expectMessage}`); + expect(message).toBe(expectMessage); +} + +describe("Test for BattleStat Localization", () => { + const battleStatUnits: BattleStatTestUnit[] = []; + const battleStatLevelUnits: BattleStatLevelTestUnit[] = []; + + beforeAll(() => { + initI18n(); + + battleStatUnits.push({ stat: BattleStat.ATK, key: "Stat.ATK" }); + battleStatUnits.push({ stat: BattleStat.DEF, key: "Stat.DEF" }); + battleStatUnits.push({ stat: BattleStat.SPATK, key: "Stat.SPATK" }); + battleStatUnits.push({ stat: BattleStat.SPDEF, key: "Stat.SPDEF" }); + battleStatUnits.push({ stat: BattleStat.SPD, key: "Stat.SPD" }); + battleStatUnits.push({ stat: BattleStat.ACC, key: "Stat.ACC" }); + battleStatUnits.push({ stat: BattleStat.EVA, key: "Stat.EVA" }); + + battleStatLevelUnits.push({ levels: 1, up: true, key: "statRose" }); + battleStatLevelUnits.push({ levels: 2, up: true, key: "statSharplyRose" }); + battleStatLevelUnits.push({ levels: 3, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 4, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 5, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 6, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 7, up: true, key: "statWontGoAnyHigher" }); + battleStatLevelUnits.push({ levels: 1, up: false, key: "statFell" }); + battleStatLevelUnits.push({ levels: 2, up: false, key: "statHarshlyFell" }); + battleStatLevelUnits.push({ levels: 3, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 4, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 5, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 6, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 7, up: false, key: "statWontGoAnyLower" }); + }); + + it("Test getBattleStatName() in English", async () => { + i18next.changeLanguage("en"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, enPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in English", async () => { + i18next.changeLanguage("en"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Español", async () => { + i18next.changeLanguage("es"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, esPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Español", async () => { + i18next.changeLanguage("es"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Italiano", async () => { + i18next.changeLanguage("it"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, itPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { + i18next.changeLanguage("it"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Français", async () => { + i18next.changeLanguage("fr"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, frPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Français", async () => { + i18next.changeLanguage("fr"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Deutsch", async () => { + i18next.changeLanguage("de"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, dePokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { + i18next.changeLanguage("de"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Português (BR)", async () => { + i18next.changeLanguage("pt-BR"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, ptBrPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { + i18next.changeLanguage("pt-BR"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 简体中文", async () => { + i18next.changeLanguage("zh-CN"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, zhCnPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { + i18next.changeLanguage("zh-CN"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 繁體中文", async () => { + i18next.changeLanguage("zh-TW"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, zhTwPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { + i18next.changeLanguage("zh-TW"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 한국어", async () => { + await i18next.changeLanguage("ko"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, koPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 한국어", async () => { + i18next.changeLanguage("ko", () => { + battleStatLevelUnits.forEach(unit => { + const processor = new KoreanPostpositionProcessor(); + const message = processor.process(koBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, message); + }); + }); + }); +}); diff --git a/src/test/lokalisation/status-effect.test.ts b/src/test/lokalisation/status-effect.test.ts new file mode 100644 index 00000000000..4c79dacbff7 --- /dev/null +++ b/src/test/lokalisation/status-effect.test.ts @@ -0,0 +1,301 @@ +import { beforeAll, describe, expect, it, vi } from "vitest"; +import { + StatusEffect, + getStatusEffectActivationText, + getStatusEffectDescriptor, + getStatusEffectHealText, + getStatusEffectObtainText, + getStatusEffectOverlapText, +} from "#app/data/status-effect"; +import i18next, { ParseKeys } from "i18next"; +import { afterEach } from "node:test"; + +const tMock = (key: ParseKeys) => key; +const pokemonName = "PKM"; +const sourceText = "SOURCE"; + +describe("status-effect", () => { + beforeAll(() => { + i18next.init(); + }); + + describe("NONE", () => { + const statusEffect = StatusEffect.NONE; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:none.obtain"); + }); + + it("should return the source-obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName, sourceText); + expect(text).toBe("statusEffect:none.obtainSource"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).not.toBe("statusEffect:none.obtainSource"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.activation"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.overlap"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.heal"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:none.description"); + }); + }); + + describe("POISON", () => { + const statusEffect = StatusEffect.POISON; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:poison.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:poison.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.overlap"); + }); + }); + + describe("TOXIC", () => { + const statusEffect = StatusEffect.TOXIC; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:toxic.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:toxic.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.overlap"); + }); + }); + + describe("PARALYSIS", () => { + const statusEffect = StatusEffect.PARALYSIS; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:paralysis.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:paralysis.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.overlap"); + }); + }); + + describe("SLEEP", () => { + const statusEffect = StatusEffect.SLEEP; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:sleep.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:sleep.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.overlap"); + }); + }); + + describe("FREEZE", () => { + const statusEffect = StatusEffect.FREEZE; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:freeze.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:freeze.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.overlap"); + }); + }); + + describe("BURN", () => { + const statusEffect = StatusEffect.BURN; + + it("should return the obtain text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:burn.obtain"); + }); + + it("should return the activation text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.activation"); + }); + + it("should return the descriptor", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:burn.description"); + }); + + it("should return the heal text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.heal"); + }); + + it("should return the overlap text", () => { + vi.spyOn(i18next, "t").mockImplementation(tMock); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.overlap"); + }); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); +}); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts new file mode 100644 index 00000000000..e9c3d920717 --- /dev/null +++ b/src/test/moves/aurora_veil.test.ts @@ -0,0 +1,124 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { WeatherType } from "#app/data/weather.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Aurora Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Auroa Veil in this case {@linkcode Moves.AURORA_VEIL}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts new file mode 100644 index 00000000000..f94af93fc66 --- /dev/null +++ b/src/test/moves/flower_shield.test.ts @@ -0,0 +1,120 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Biome } from "#app/enums/biome.js"; +import { Type } from "#app/data/type.js"; +import { SemiInvulnerableTag } from "#app/data/battler-tags.js"; + +describe("Moves - Flower Shield", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + + await game.startBattle([Species.MAGIKARP]); + const cherrim = game.scene.getEnemyPokemon(); + const magikarp = game.scene.getPlayerPokemon(); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); + const field = game.scene.getField(true); + + const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS)); + const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon)); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + + grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(1)); + nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0)); + }); + + /** + * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} + */ + it("does not increase defense of a pokemon in semi-vulnerable state", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + + await game.startBattle([Species.CHERRIM]); + const paras = game.scene.getEnemyPokemon(); + const cherrim = game.scene.getPlayerPokemon(); + + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(paras.getTag(SemiInvulnerableTag)).toBeUndefined; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(paras.getTag(SemiInvulnerableTag)).toBeDefined(); + expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1); + }); + + it("does nothing if there are no Grass-type pokemon on the field", async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + + await game.startBattle([Species.MAGIKARP]); + const enemy = game.scene.getEnemyPokemon(); + const ally = game.scene.getPlayerPokemon(); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FLOWER_SHIELD)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0); + }); +}); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts new file mode 100644 index 00000000000..f0b80ab90c0 --- /dev/null +++ b/src/test/moves/follow_me.test.ts @@ -0,0 +1,169 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + CommandPhase, + SelectTargetPhase, + TurnEndPhase, +} from "#app/phases"; +import {Stat} from "#app/data/pokemon-stat"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Follow Me", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + test( + "move should redirect enemy attacks to the user", + async () => { + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const playerStartingHp = playerPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(playerPokemon[0].hp).toBeLessThan(playerStartingHp[0]); + expect(playerPokemon[1].hp).toBe(playerStartingHp[1]); + }, TIMEOUT + ); + + test( + "move should redirect enemy attacks to the first ally that uses it", + async () => { + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const playerStartingHp = playerPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FOLLOW_ME)); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.FOLLOW_ME)); + await game.phaseInterceptor.to(TurnEndPhase, false); + + playerPokemon.sort((a, b) => a.getBattleStat(Stat.SPD) - b.getBattleStat(Stat.SPD)); + + expect(playerPokemon[1].hp).toBeLessThan(playerStartingHp[1]); + expect(playerPokemon[0].hp).toBe(playerStartingHp[0]); + }, TIMEOUT + ); + + test( + "move effect should be bypassed by Stalwart", + async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY_2); + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }, TIMEOUT + ); + + test( + "move effect should be bypassed by Snipe Shot", + async () => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SNIPE_SHOT)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.SNIPE_SHOT)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY_2); + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts new file mode 100644 index 00000000000..063a17aead9 --- /dev/null +++ b/src/test/moves/gastro_acid.test.ts @@ -0,0 +1,93 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import { + Moves +} from "#app/enums/moves.js"; +import * as overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { BattlerIndex } from "#app/battle.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveResult } from "#app/field/pokemon.js"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { Species } from "#app/enums/species.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Gastro Acid", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + }); + + it("suppresses effect of ability", async () => { + /* + * Expected flow (enemies have WATER ABSORD, can only use SPLASH) + * - player mon 1 uses GASTRO ACID, player mon 2 uses SPLASH + * - both player mons use WATER GUN on their respective enemy mon + * - player mon 1 should have dealt damage, player mon 2 should have not + */ + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doSelectTarget(BattlerIndex.PLAYER_2); + + await game.phaseInterceptor.to("TurnInitPhase"); + + const enemyField = game.scene.getEnemyField(); + expect(enemyField[0].summonData.abilitySuppressed).toBe(true); + expect(enemyField[1].summonData.abilitySuppressed).toBe(false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY); + game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); + game.doSelectTarget(BattlerIndex.ENEMY_2); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(enemyField[0].hp).toBeLessThan(enemyField[0].getMaxHp()); + expect(enemyField[1].hp).toBe(enemyField[1].getMaxHp()); + }, TIMEOUT); + + it("fails if used on an enemy with an already-suppressed ability", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + + await game.startBattle(); + + // Force player to be slower to enable Core Enforcer to proc its suppression effect + game.scene.getPlayerPokemon().stats[Stat.SPD] = 1; + game.scene.getEnemyPokemon().stats[Stat.SPD] = 2; + + game.doAttack(getMovePosition(game.scene, 0, Moves.CORE_ENFORCER)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GASTRO_ACID)); + + await game.phaseInterceptor.to("TurnInitPhase"); + + expect(game.scene.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT); +}); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts new file mode 100644 index 00000000000..30a27ce4412 --- /dev/null +++ b/src/test/moves/light_screen.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Light Screen", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of special attacks by half in a single battle", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of special attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.DAZZLING_GLEAM; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect physical attacks", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Light Screen in this case {@linkcode Moves.LIGHT_SCREEN}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts new file mode 100644 index 00000000000..7ed5b84654c --- /dev/null +++ b/src/test/moves/magnet_rise.test.ts @@ -0,0 +1,61 @@ +import {beforeAll, afterEach, beforeEach, describe, vi, it, expect} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import {Moves} from "#enums/moves"; +import {Species} from "#enums/species"; +import {CommandPhase, TurnEndPhase} from "#app/phases.js"; + +describe("Moves - Magnet Rise", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + const moveToUse = Moves.MAGNET_RISE; + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); + }); + + it("MAGNET RISE", async () => { + await game.startBattle(); + + const startingHp = game.scene.getParty()[0].hp; + game.doAttack(0); + await game.phaseInterceptor.to(TurnEndPhase); + const finalHp = game.scene.getParty()[0].hp; + const hpLost = finalHp - startingHp; + expect(hpLost).toBe(0); + }, 20000); + + it("MAGNET RISE - Gravity", async () => { + await game.startBattle(); + + const startingHp = game.scene.getParty()[0].hp; + game.doAttack(0); + await game.phaseInterceptor.to(CommandPhase); + let finalHp = game.scene.getParty()[0].hp; + let hpLost = finalHp - startingHp; + expect(hpLost).toBe(0); + game.doAttack(2); + await game.phaseInterceptor.to(TurnEndPhase); + finalHp = game.scene.getParty()[0].hp; + hpLost = finalHp - startingHp; + expect(hpLost).not.toBe(0); + }, 20000); +}); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts new file mode 100644 index 00000000000..a700ff10aae --- /dev/null +++ b/src/test/moves/make_it_rain.test.ts @@ -0,0 +1,106 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + CommandPhase, + MoveEndPhase, + StatChangePhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { BattleStat } from "#app/data/battle-stat.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Make It Rain", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + }); + + it("should only reduce Sp. Atk. once in a double battle", async () => { + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).toBeDefined()); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).toBeDefined()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); + + it("should apply effects even if the target faints", async () => { + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon(); + expect(playerPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(StatChangePhase); + + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); + + it("should reduce Sp. Atk. once after KOing two enemies", async () => { + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + + await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); + + const playerPokemon = game.scene.getPlayerField(); + playerPokemon.forEach(p => expect(p).toBeDefined()); + + const enemyPokemon = game.scene.getEnemyField(); + enemyPokemon.forEach(p => expect(p).toBeDefined()); + + game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN)); + + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(StatChangePhase); + + enemyPokemon.forEach(p => expect(p.isFainted()).toBe(true)); + expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1); + }, TIMEOUT); +}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts new file mode 100644 index 00000000000..21ebb3d5515 --- /dev/null +++ b/src/test/moves/purify.test.ts @@ -0,0 +1,81 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon.js"; +import { Status, StatusEffect } from "#app/data/status-effect.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Purify", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + }); + + test( + "Purify heals opponent status effect and restores user hp", + async () => { + await game.startBattle(); + + const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon(); + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + enemyPokemon.status = new Status(StatusEffect.BURN); + + game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(enemyPokemon.status).toBe(undefined); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + }, + TIMEOUT + ); + + test( + "Purify does not heal if opponent doesnt have any status effect", + async () => { + await game.startBattle(); + + const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon(); + + playerPokemon.hp = playerPokemon.getMaxHp() - 1; + const playerInitialHp = playerPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.PURIFY)); + await game.phaseInterceptor.to(MoveEndPhase); + + expect(playerPokemon.hp).toBe(playerInitialHp); + }, + TIMEOUT + ); + +}); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts new file mode 100644 index 00000000000..1116810f743 --- /dev/null +++ b/src/test/moves/rage_powder.test.ts @@ -0,0 +1,110 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + CommandPhase, + SelectTargetPhase, + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Rage Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + test( + "move effect should be bypassed by Grass type", + async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + + await game.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY_2); + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }, TIMEOUT + ); + + test( + "move effect should be bypassed by Overcoat", + async () => { + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + + // Test with two non-Grass type player Pokemon + await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY_2); + await game.phaseInterceptor.to(TurnEndPhase, false); + + // If redirection was bypassed, both enemies should be damaged + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts new file mode 100644 index 00000000000..00fb9a69f2f --- /dev/null +++ b/src/test/moves/reflect.test.ts @@ -0,0 +1,106 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + TurnEndPhase, +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import Pokemon from "#app/field/pokemon.js"; +import Move, { allMoves } from "#app/data/move.js"; +import { NumberHolder } from "#app/utils.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; + + +describe("Moves - Reflect", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const singleBattleMultiplier = 0.5; + const doubleBattleMultiplier = 2732/4096; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + }); + + it("reduces damage of physical attacks by half in a single battle", async() => { + const moveToUse = Moves.TACKLE; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * singleBattleMultiplier); + }); + + it("reduces damage of physical attacks by a third in a double battle", async() => { + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + const moveToUse = Moves.ROCK_SLIDE; + await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + game.doAttack(getMovePosition(game.scene, 1, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power * doubleBattleMultiplier); + }); + + it("does not affect special attacks", async() => { + const moveToUse = Moves.ABSORB; + await game.startBattle([Species.SHUCKLE]); + + game.doAttack(getMovePosition(game.scene, 0, moveToUse)); + + await game.phaseInterceptor.to(TurnEndPhase); + + const mockedDmg = getMockedMoveDamage(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToUse]); + + expect(mockedDmg).toBe(allMoves[moveToUse].power); + }); +}); + +/** + * Calculates the damage of a move multiplied by screen's multiplier, Reflect in this case {@linkcode Moves.REFLECT}. + * Please note this does not consider other damage calculations except the screen multiplier. + * + * @param defender - The defending Pokémon. + * @param attacker - The attacking Pokémon. + * @param move - The move being used. + * @returns The calculated move damage considering any weakening effects. + */ +const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => { + const multiplierHolder = new NumberHolder(1); + const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + if (defender.scene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { + defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, move.category, defender.scene.currentBattle.double, multiplierHolder); + } + + return move.power * multiplierHolder.value; +}; diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts new file mode 100644 index 00000000000..db9363313a1 --- /dev/null +++ b/src/test/moves/roost.test.ts @@ -0,0 +1,64 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Roost", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + }); + + test( + "move should ground the user until the end of turn", + async () => { + await game.startBattle([Species.MAGIKARP]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOMPING_TANTRUM)); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.getTag(BattlerTagType.ROOSTED)).toBeUndefined(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts new file mode 100644 index 00000000000..ec3f4977007 --- /dev/null +++ b/src/test/moves/spotlight.test.ts @@ -0,0 +1,112 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + CommandPhase, + SelectTargetPhase, + TurnEndPhase, +} from "#app/phases"; +import {Stat} from "#app/data/pokemon-stat"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Spotlight", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + }); + + test( + "move should redirect attacks to the target", + async () => { + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(BattlerIndex.ENEMY_2); + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]); + expect(enemyPokemon[1].hp).toBe(enemyStartingHp[1]); + }, TIMEOUT + ); + + test( + "move should cause other redirection moves to fail", + async () => { + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + + await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerField(); + expect(playerPokemon.length).toBe(2); + playerPokemon.forEach(p => expect(p).not.toBe(undefined)); + + const enemyPokemon = game.scene.getEnemyField(); + expect(enemyPokemon.length).toBe(2); + enemyPokemon.forEach(p => expect(p).not.toBe(undefined)); + + /** + * Spotlight will target the slower enemy. In this situation without Spotlight being used, + * the faster enemy would normally end up with the Center of Attention tag. + */ + enemyPokemon.sort((a, b) => b.getBattleStat(Stat.SPD) - a.getBattleStat(Stat.SPD)); + const spotTarget = enemyPokemon[1].getBattlerIndex(); + const attackTarget = enemyPokemon[0].getBattlerIndex(); + + const enemyStartingHp = enemyPokemon.map(p => p.hp); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPOTLIGHT)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(spotTarget); + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 1, Moves.QUICK_ATTACK)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(attackTarget); + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]); + expect(enemyPokemon[0].hp).toBe(enemyStartingHp[0]); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts new file mode 100644 index 00000000000..efba97f8fe1 --- /dev/null +++ b/src/test/moves/tailwind.test.ts @@ -0,0 +1,108 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Stat } from "#app/data/pokemon-stat.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { ArenaTagSide } from "#app/data/arena-tag.js"; + +describe("Abilities - Wind Rider", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + }); + + it("doubles the Speed stat of the Pokemons on its side", async () => { + await game.startBattle([Species.MAGIKARP, Species.MEOWTH]); + const magikarp = game.scene.getPlayerField()[0]; + const meowth = game.scene.getPlayerField()[1]; + + const magikarpSpd = magikarp.getStat(Stat.SPD); + const meowthSpd = meowth.getStat(Stat.SPD); + + expect(magikarp.getBattleStat(Stat.SPD)).equal(magikarpSpd); + expect(meowth.getBattleStat(Stat.SPD)).equal(meowthSpd); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(magikarp.getBattleStat(Stat.SPD)).toBe(magikarpSpd * 2); + expect(meowth.getBattleStat(Stat.SPD)).toBe(meowthSpd * 2); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + }); + + it("lasts for 4 turns", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.toNextTurn(); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + }); + + it("does not affect the opposing side", async () => { + vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + + await game.startBattle([Species.MAGIKARP]); + + const ally = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + const allySpd = ally.getStat(Stat.SPD); + const enemySpd = enemy.getStat(Stat.SPD); + + + expect(ally.getBattleStat(Stat.SPD)).equal(allySpd); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TAILWIND)); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(ally.getBattleStat(Stat.SPD)).toBe(allySpd * 2); + expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined(); + }); +}); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts new file mode 100644 index 00000000000..c641643593e --- /dev/null +++ b/src/test/moves/thousand_arrows.test.ts @@ -0,0 +1,95 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { + MoveEffectPhase, + TurnEndPhase +} from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Thousand Arrows", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + }); + + test( + "move should hit and ground Flying-type targets", + async () => { + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); + + test( + "move should hit and ground targets with Levitate", + async () => { + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + + await game.startBattle([ Species.ILLUMISE ]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + const enemyStartingHp = enemyPokemon.hp; + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + // Enemy should not be grounded before move effect is applied + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); + + await game.phaseInterceptor.to(TurnEndPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts new file mode 100644 index 00000000000..78b72492e04 --- /dev/null +++ b/src/test/moves/tidy_up.test.ts @@ -0,0 +1,122 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import * as overrides from "#app/overrides"; +import { MoveEndPhase, TurnEndPhase } from "#app/phases"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { BattleStat } from "#app/data/battle-stat.js"; + + +describe("Moves - Tidy Up", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + }); + + it("spikes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPIKES)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.SPIKES)).toBeUndefined(); + + }, 20000); + + it("stealth rocks are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STEALTH_ROCK)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.STEALTH_ROCK)).toBeUndefined(); + + }, 20000); + + it("toxic spikes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_SPIKES)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.TOXIC_SPIKES)).toBeUndefined(); + + }, 20000); + + it("sticky webs are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STICKY_WEB)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + expect(game.scene.arena.getTag(ArenaTagType.STICKY_WEB)).toBeUndefined(); + + }, 20000); + + it.skip("substitutes are cleared", async() => { + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); + + await game.startBattle(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SUBSTITUTE)); + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(MoveEndPhase); + // TODO: check for subs here once the move is implemented + + }, 20000); + + it("user's stats are raised with no traps set", async() => { + await game.startBattle(); + const player = game.scene.getPlayerPokemon().summonData.battleStats; + + expect(player[BattleStat.ATK]).toBe(0); + expect(player[BattleStat.SPD]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TIDY_UP)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player[BattleStat.ATK]).toBe(+1); + expect(player[BattleStat.SPD]).toBe(+1); + + }, 20000); + +}); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index e0585395ff9..84d39024dc9 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -5,9 +5,11 @@ import { CommandPhase, EncounterPhase, FaintPhase, - LoginPhase, NewBattlePhase, + LoginPhase, + NewBattlePhase, SelectStarterPhase, TitlePhase, TurnInitPhase, + TurnStartPhase, } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; import PhaseInterceptor from "#app/test/utils/phaseInterceptor"; @@ -29,6 +31,8 @@ import { GameDataType } from "#enums/game-data-type"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; +import { BattlerIndex } from "#app/battle.js"; +import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; /** * Class to manage the game state and transitions between phases. @@ -168,6 +172,19 @@ export default class GameManager { }); } + /** + * Emulate a player's target selection after an attack is chosen, + * usually called after {@linkcode doAttack} in a double battle. + * @param {BattlerIndex} targetIndex the index of the attack target + */ + doSelectTarget(targetIndex: BattlerIndex) { + this.onNextPrompt("SelectTargetPhase", Mode.TARGET_SELECT, () => { + const handler = this.scene.ui.getHandler() as TargetSelectUiHandler; + handler.setCursor(targetIndex); + handler.processInput(Button.ACTION); + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnStartPhase)); + } + /** Faint all opponents currently on the field */ async doKillOpponents() { await this.killPokemon(this.scene.currentBattle.enemyParty[0]); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index da54471a7e3..b1b00c8e15d 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -24,6 +24,7 @@ import BattleScene from "#app/battle-scene.js"; import {MoveAnim} from "#app/data/battle-anims"; import Pokemon from "#app/field/pokemon"; import * as battleScene from "#app/battle-scene"; +import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage.js"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -35,6 +36,7 @@ Object.defineProperty(window, "console", { InputText.prototype.setElement = () => null; InputText.prototype.resize = () => null; +Phaser.GameObjects.Image = MockImage; window.URL.createObjectURL = (blob: Blob) => { blobToString(blob).then((data: string) => { localStorage.setItem("toExport", data); diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 699dea31ad5..2eb77f81302 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -122,6 +122,10 @@ export default class MockSprite { return this.phaserSprite.setPositionRelative(source, x, y); } + setY(y) { + return this.phaserSprite.setY(y); + } + setCrop(x, y, width, height) { // Sets the crop size of this Game Object. return this.phaserSprite.setCrop(x, y, width, height); diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 29af5b034b2..2caa82289d9 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -1,16 +1,19 @@ -import "vitest-canvas-mock"; import "#app/test/fontFace.setup"; -import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; -import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions"; -import {initBiomes} from "#app/data/biomes"; -import {initEggMoves} from "#app/data/egg-moves"; -import {initPokemonForms} from "#app/data/pokemon-forms"; -import {initSpecies} from "#app/data/pokemon-species"; -import {initMoves} from "#app/data/move"; -import {initAbilities} from "#app/data/ability"; -import {initAchievements} from "#app/system/achv.js"; +import "vitest-canvas-mock"; + +import { initLoggedInUser } from "#app/account"; +import { initAbilities } from "#app/data/ability"; +import { initBiomes } from "#app/data/biomes"; +import { initEggMoves } from "#app/data/egg-moves"; +import { initMoves } from "#app/data/move"; +import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; +import { initPokemonForms } from "#app/data/pokemon-forms"; +import { initSpecies } from "#app/data/pokemon-species"; +import { initAchievements } from "#app/system/achv.js"; import { initVouchers } from "#app/system/voucher.js"; -import {initLoggedInUser} from "#app/account"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; + +import { beforeAll } from "vitest"; initVouchers(); initAchievements(); @@ -25,3 +28,12 @@ initAbilities(); initLoggedInUser(); global.testFailed = false; + +beforeAll(() => { + Object.defineProperty(document, "fonts", { + writable: true, + value: { + add: () => {}, + } + }); +}); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 18ff40aec50..dac67bd7b4e 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -1,3 +1,5 @@ +import BattleScene from "#app/battle-scene.js"; +import { TextStyle, addTextObject } from "#app/ui/text.js"; export enum EventType { SHINY @@ -18,7 +20,7 @@ const timedEvents: TimedEvent[] = [ eventType: EventType.SHINY, shinyMultiplier: 2, startDate: new Date(Date.UTC(2024, 5, 14, 0)), - endDate: new Date(Date.UTC(2024, 5, 21, 0)), + endDate: new Date(Date.UTC(2024, 5, 23, 0)), bannerFilename: "pride-update" }, ]; @@ -60,3 +62,89 @@ export class TimedEventManager { return timedEvents.find((te: TimedEvent) => this.isActive(te)).bannerFilename ?? null; } } + +export class TimedEventDisplay extends Phaser.GameObjects.Container { + private event: TimedEvent; + private eventTimerText: Phaser.GameObjects.Text; + private banner: Phaser.GameObjects.Image; + private bannerShadow: Phaser.GameObjects.Rectangle; + private eventTimer: NodeJS.Timeout; + + constructor(scene: BattleScene, x: number, y: number, event: TimedEvent) { + super(scene, x, y); + this.event = event; + this.setVisible(false); + } + + setup() { + this.banner = new Phaser.GameObjects.Image(this.scene, 29, 64, this.event.bannerFilename); + this.banner.setName("img-event-banner"); + this.banner.setOrigin(0, 0); + this.banner.setScale(0.07); + this.bannerShadow = new Phaser.GameObjects.Rectangle( + this.scene, + this.banner.x - 2, + this.banner.y + 2, + this.banner.width, + this.banner.height, + 0x484848 + ); + this.bannerShadow.setName("rect-event-banner-shadow"); + this.bannerShadow.setScale(0.07); + this.bannerShadow.setAlpha(0.5); + this.bannerShadow.setOrigin(0,0); + this.eventTimerText = addTextObject( + this.scene, + this.banner.x + 8, + this.banner.y + 100, + this.timeToGo(this.event.endDate), + TextStyle.WINDOW + ); + this.eventTimerText.setName("text-event-timer"); + this.eventTimerText.setScale(0.15); + this.eventTimerText.setOrigin(0,0); + + this.add([this.eventTimerText, this.bannerShadow, this.banner]); + } + + show() { + this.setVisible(true); + this.updateCountdown(); + + this.eventTimer = setInterval(() => { + this.updateCountdown(); + }, 1000); + } + + clear() { + this.setVisible(false); + clearInterval(this.eventTimer); + this.eventTimer = null; + } + + private timeToGo(date: Date) { + + // Utility to add leading zero + function z(n) { + return (n < 10? "0" : "") + n; + } + const now = new Date(); + let diff = Math.abs(date.getTime() - now.getTime()); + + // Allow for previous times + diff = Math.abs(diff); + + // Get time components + const days = diff/8.64e7 | 0; + const hours = diff%8.64e7 / 3.6e6 | 0; + const mins = diff%3.6e6 / 6e4 | 0; + const secs = Math.round(diff%6e4 / 1e3); + + // Return formatted string + return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; + } + + updateCountdown() { + this.eventTimerText.setText(this.timeToGo(this.event.endDate)); + } +} diff --git a/src/tutorial.ts b/src/tutorial.ts index ecb45e543a1..c4482839779 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 "i18next"; export enum Tutorial { Intro = "INTRO", diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 00c88504ef1..9288fd35892 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -190,12 +190,12 @@ export class UiInputs { buttonSpeedChange(up = true): void { const settingGameSpeed = settingIndex(SettingKeys.Game_Speed); if (up && this.scene.gameSpeed < 5) { - this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Setting[settingGameSpeed].options.indexOf(`${this.scene.gameSpeed}x`) + 1); + this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Setting[settingGameSpeed].options.findIndex((item) => item.label === `${this.scene.gameSpeed}x`) + 1); if (this.scene.ui?.getMode() === Mode.SETTINGS) { (this.scene.ui.getHandler() as SettingsUiHandler).show([]); } } else if (!up && this.scene.gameSpeed > 1) { - this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Math.max(Setting[settingGameSpeed].options.indexOf(`${this.scene.gameSpeed}x`) - 1, 0)); + this.scene.gameData.saveSetting(SettingKeys.Game_Speed, Math.max(Setting[settingGameSpeed].options.findIndex((item) => item.label === `${this.scene.gameSpeed}x`) - 1, 0)); if (this.scene.ui?.getMode() === Mode.SETTINGS) { (this.scene.ui.getHandler() as SettingsUiHandler).show([]); } diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 2bc5f028ddb..a0b249695b9 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -44,9 +44,6 @@ export default class AbilityBar extends Phaser.GameObjects.Container { (this.scene as BattleScene).fieldUI.bringToTop(this); - if (this.tween) { - this.tween.stop(); - } this.y = baseY + ((this.scene as BattleScene).currentBattle.double ? 14 : 0); this.tween = this.scene.tweens.add({ diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index c4877cfca59..2069f034e89 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -58,10 +58,12 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const ui = this.getUi(); this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); + this.optionSelectContainer.setName(`option-select-${Mode[this.mode]}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); this.optionSelectBg = addWindow(this.scene, 0, 0, this.getWindowWidth(), this.getWindowHeight()); + this.optionSelectBg.setName("option-select-bg"); this.optionSelectBg.setOrigin(1, 1); this.optionSelectContainer.add(this.optionSelectBg); @@ -82,6 +84,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } 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.setName("text-option-select"); this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((this.scene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 843ebc4e266..b5e17ce2b67 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../battle-scene"; import { Button } from "#enums/buttons"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { Achv, achvs, getAchievementDescription } from "../system/achv"; import MessageUiHandler from "./message-ui-handler"; import { addTextObject, TextStyle } from "./text"; diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 0568d1524aa..9c0a2e7c8ce 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -1,6 +1,6 @@ import { addTextObject, TextStyle } from "./text"; import BattleScene from "#app/battle-scene.js"; -import { ArenaTagSide } from "#app/data/arena-tag.js"; +import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag.js"; import { WeatherType } from "#app/data/weather.js"; import { TerrainType } from "#app/data/terrain.js"; import { addWindow, WindowVariant } from "./ui-theme"; @@ -23,12 +23,14 @@ interface ArenaEffectInfo { /** The enum string representation of the effect */ name: string; /** {@linkcode ArenaEffectType} type of effect */ - type: ArenaEffectType, + effecType: ArenaEffectType, /** The maximum duration set by the effect */ maxDuration: number; /** The current duration left on the effect */ duration: number; + /** The arena tag type being added */ + tagType?: ArenaTagType; } export default class ArenaFlyout extends Phaser.GameObjects.Container { @@ -87,6 +89,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { constructor(scene: Phaser.Scene) { super(scene, 0, 0); + this.setName("arena-flyout"); this.battleScene = this.scene as BattleScene; this.translationX = this.flyoutWidth; @@ -181,19 +184,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.battleScene.arena.eventTarget.addEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent); } - /** - * Formats a string to title case - * @param unformattedText Text to be formatted - * @returns the formatted string - */ - private formatText(unformattedText: string): string { - const text = unformattedText.split("_"); - for (let i = 0; i < text.length; i++) { - text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); - } - return text.join(" "); - } /** Clears out the current string stored in all arena effect texts */ private clearText() { @@ -213,7 +204,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { // Creates a proxy object to decide which text object needs to be updated let textObject: Phaser.GameObjects.Text; - switch (fieldEffectInfo.type) { + switch (fieldEffectInfo.effecType) { case ArenaEffectType.PLAYER: textObject = this.flyoutTextPlayer; break; @@ -230,8 +221,8 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { break; } - textObject.text += this.formatText(fieldEffectInfo.name); - if (fieldEffectInfo.type === ArenaEffectType.TERRAIN) { + textObject.text += Utils.formatText(fieldEffectInfo.name); + if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) { textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it } @@ -257,19 +248,42 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { switch (arenaEffectChangedEvent.constructor) { case TagAddedEvent: const tagAddedEvent = arenaEffectChangedEvent as TagAddedEvent; + const isArenaTrapTag = this.battleScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag; + let arenaEffectType: ArenaEffectType; + + if (tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH) { + arenaEffectType = ArenaEffectType.FIELD; + } else if (tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER) { + arenaEffectType = ArenaEffectType.PLAYER; + } else { + arenaEffectType = ArenaEffectType.ENEMY; + } + + const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; + let name: string = ArenaTagType[tagAddedEvent.arenaTagType]; + + if (isArenaTrapTag) { + if (existingTrapTagIndex !== -1) { + const layers = tagAddedEvent.arenaTagMaxLayers > 1 ? ` (${tagAddedEvent.arenaTagLayers})` : ""; + this.fieldEffectInfo[existingTrapTagIndex].name = `${name}${layers}`; + break; + } else if (tagAddedEvent.arenaTagMaxLayers > 1) { + name = `${name} (${tagAddedEvent.arenaTagLayers})`; + } + } + this.fieldEffectInfo.push({ - name: ArenaTagType[tagAddedEvent.arenaTagType], - type: tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH - ? ArenaEffectType.FIELD - : tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER - ? ArenaEffectType.PLAYER - : ArenaEffectType.ENEMY, + name, + effecType: arenaEffectType, maxDuration: tagAddedEvent.duration, - duration: tagAddedEvent.duration}); + duration: tagAddedEvent.duration, + tagType: tagAddedEvent.arenaTagType + }); break; case TagRemovedEvent: const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent; - foundIndex = this.fieldEffectInfo.findIndex(info => info.name === ArenaTagType[tagRemovedEvent.arenaTagType]); + foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType); + if (foundIndex !== -1) { // If the tag was being tracked, remove it this.fieldEffectInfo.splice(foundIndex, 1); } @@ -290,7 +304,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { fieldEffectChangedEvent instanceof WeatherChangedEvent ? WeatherType[fieldEffectChangedEvent.newWeatherType] : TerrainType[fieldEffectChangedEvent.newTerrainType], - type: fieldEffectChangedEvent instanceof WeatherChangedEvent + effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, maxDuration: fieldEffectChangedEvent.duration, diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 6edb359746a..f2da553c6da 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 "i18next"; export default class BattleMessageUiHandler extends MessageUiHandler { private levelUpStatsContainer: Phaser.GameObjects.Container; @@ -16,7 +16,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { private nameBox: Phaser.GameObjects.NineSlice; private nameText: Phaser.GameObjects.Text; - public bg: Phaser.GameObjects.Image; + public bg: Phaser.GameObjects.Sprite; public commandWindow: Phaser.GameObjects.NineSlice; public movesWindowContainer: Phaser.GameObjects.Container; public nameBoxContainer: Phaser.GameObjects.Container; @@ -31,33 +31,30 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.textTimer = null; this.textCallbackTimer = null; - const bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); - bg.setOrigin(0, 1); - ui.add(bg); + this.bg = this.scene.add.sprite(0, 0, "bg", this.scene.windowType); + this.bg.setName("sprite-battle-msg-bg"); + this.bg.setOrigin(0, 1); + ui.add(this.bg); - this.bg = bg; - - this.commandWindow = addWindow(this.scene, 201, -1, 118, 46); + this.commandWindow = addWindow(this.scene, 202, 0, 118, 48); + this.commandWindow.setName("window-command"); this.commandWindow.setOrigin(0, 1); this.commandWindow.setVisible(false); ui.add(this.commandWindow); - this.movesWindowContainer = this.scene.add.container(1, -1); + this.movesWindowContainer = this.scene.add.container(0, 0); + this.movesWindowContainer.setName("moves-bg"); this.movesWindowContainer.setVisible(false); - const movesWindow = addWindow(this.scene, 0, 0, 243, 46); + const movesWindow = addWindow(this.scene, 0, 0, 243, 48); + movesWindow.setName("moves-window"); movesWindow.setOrigin(0, 1); - this.movesWindowContainer.add(movesWindow); - const moveDetailsWindow = addWindow(this.scene, 238, 0, 80, 46, false, true, 2, 133); + const moveDetailsWindow = addWindow(this.scene, 240, 0, 80, 48, false, false, -1, 132); + moveDetailsWindow.setName("move-details-window"); moveDetailsWindow.setOrigin(0, 1); - this.movesWindowContainer.add(moveDetailsWindow); - - // TODO: Maybe remove this asset definitively if it's no longer needed? - // const commandFightLabels = this.scene.add.image(246, -10, 'command_fight_labels'); - // commandFightLabels.setOrigin(0, 1); - // this.movesWindowContainer.add(commandFightLabels); + this.movesWindowContainer.add([movesWindow, moveDetailsWindow]); ui.add(this.movesWindowContainer); const messageContainer = this.scene.add.container(12, -39); diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts new file mode 100644 index 00000000000..5bca9632012 --- /dev/null +++ b/src/ui/bgm-bar.ts @@ -0,0 +1,101 @@ +import BattleScene from "../battle-scene"; +import {addTextObject, TextStyle} from "./text"; +import i18next from "i18next"; +import * as Utils from "#app/utils"; + + +const hiddenX = -150; +const shownX = 0; +const baseY = 0; + + +export default class BgmBar extends Phaser.GameObjects.Container { + private defaultWidth: number; + private defaultHeight: number; + + private bg: Phaser.GameObjects.NineSlice; + private musicText: Phaser.GameObjects.Text; + private noteText: Phaser.GameObjects.Text; + + private tween: Phaser.Tweens.Tween; + private autoHideTimer: NodeJS.Timeout; + private queue: (string)[] = []; + + + public shown: boolean; + + constructor(scene: BattleScene) { + super(scene, hiddenX, baseY); + } + + setup(): void { + this.defaultWidth = 200; + this.defaultHeight = 100; + + this.bg = this.scene.add.nineslice(-5, -5, "ability_bar_left", null, this.defaultWidth, this.defaultHeight, 0, 0, 10, 10); + this.bg.setOrigin(0, 0); + + this.add(this.bg); + + this.noteText = addTextObject(this.scene, 5, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.noteText.setOrigin(0, 0); + this.add(this.noteText); + + this.musicText = addTextObject(this.scene, 30, 5, "", TextStyle.MESSAGE, {fontSize: "72px"}); + this.musicText.setOrigin(0, 0); + this.musicText.setWordWrapWidth(650, true); + + this.add(this.musicText); + + this.setVisible(false); + this.shown = false; + } + + /* + * Set the BGM Name to the BGM bar. + * @param {string} bgmName The name of the BGM to set. + */ + setBgmToBgmBar(bgmName: string): void { + this.noteText.setText(`${i18next.t("bgmName:music")}:`); + this.musicText.setText(`${this.getRealBgmName(bgmName)}`); + if (!(this.scene as BattleScene).showBgmBar) { + return; + } + + this.musicText.width = this.bg.width - 20; + this.musicText.setWordWrapWidth(this.defaultWidth * 4); + this.bg.width = Math.min(this.defaultWidth, this.noteText.displayWidth + this.musicText.displayWidth + 30); + + this.bg.height = Math.min(this.defaultHeight, this.musicText.displayHeight + 20); + + (this.scene as BattleScene).fieldUI.bringToTop(this); + + this.y = baseY; + } + + /* + Show or hide the BGM bar. + @param {boolean} visible Whether to show or hide the BGM bar. + */ + public toggleBgmBar(visible: boolean): void { + if (!(this.scene as BattleScene).showBgmBar) { + this.setVisible(false); + return; + } + this.scene.tweens.add({ + targets: this, + x: visible ? shownX : hiddenX, + duration: 500, + ease: "Sine.easeInOut", + onComplete: () => { + this.setVisible(true); + } + }); + } + + getRealBgmName(bgmName: string): string { + return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], {name: Utils.formatText(bgmName)}); + } +} + + diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index ae613c69a4d..dce04276a4d 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -4,9 +4,13 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; -import i18next from "#app/plugins/i18n.js"; +import i18next from "i18next"; import { SelectStarterPhase, TitlePhase } from "#app/phases.js"; -import { Challenge } from "#app/data/challenge.js"; +import { Challenge, ChallengeType } from "#app/data/challenge.js"; +import * as Utils from "../utils"; +import { Challenges } from "#app/enums/challenges.js"; +import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; +import { Color, ShadowColor } from "#app/enums/color.js"; /** * Handles all the UI for choosing optional challenges. @@ -21,10 +25,9 @@ export default class GameChallengesUiHandler extends UiHandler { // private difficultyText: Phaser.GameObjects.Text; - private descriptionText: Phaser.GameObjects.Text; + private descriptionText: BBCodeText; - private challengeLabels: Phaser.GameObjects.Text[]; - private challengeValueLabels: Phaser.GameObjects.Text[]; + private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text | Phaser.GameObjects.Sprite }>; private cursorObj: Phaser.GameObjects.NineSlice; @@ -38,14 +41,22 @@ export default class GameChallengesUiHandler extends UiHandler { const ui = this.getUi(); this.challengesContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.challengesContainer.setName("challenges"); this.challengesContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + const bgOverlay = this.scene.add.rectangle(-1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0x424242, 0.8); + bgOverlay.setName("rect-challenge-overlay"); + bgOverlay.setOrigin(0, 0); + this.challengesContainer.add(bgOverlay); + // TODO: Change this back to /9 when adding in difficulty const headerBg = addWindow(this.scene, 0, 0, (this.scene.game.canvas.width / 6), 24); + headerBg.setName("window-header-bg"); headerBg.setOrigin(0, 0); const headerText = addTextObject(this.scene, 0, 0, i18next.t("challenges:title"), TextStyle.SETTINGS_LABEL); + headerText.setName("text-header"); headerText.setOrigin(0, 0); headerText.setPositionRelative(headerBg, 8, 4); @@ -62,45 +73,78 @@ export default class GameChallengesUiHandler extends UiHandler { // difficultyName.setPositionRelative(difficultyBg, difficultyBg.width - difficultyName.displayWidth - 8, 4); this.optionsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 9), (this.scene.game.canvas.height / 6) - headerBg.height - 2); + this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const descriptionBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 18) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 26); + descriptionBg.setName("window-desc-bg"); descriptionBg.setOrigin(0, 0); descriptionBg.setPositionRelative(this.optionsBg, this.optionsBg.width, 0); - this.descriptionText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL); + this.descriptionText = new BBCodeText(this.scene, descriptionBg.x + 6, descriptionBg.y + 4, "", { + fontFamily: "emerald", + fontSize: 96, + color: Color.ORANGE, + padding: { + bottom: 6 + }, + wrap: { + mode: "word", + width: (descriptionBg.width - 12) * 6, + } + }); + this.descriptionText.setName("text-desc"); + this.scene.add.existing(this.descriptionText); + this.descriptionText.setScale(1/6); + this.descriptionText.setShadow(4, 5, ShadowColor.ORANGE); this.descriptionText.setOrigin(0, 0); - this.descriptionText.setWordWrapWidth(500, true); - this.descriptionText.setPositionRelative(descriptionBg, 6, 4); const startBg = addWindow(this.scene, 0, 0, descriptionBg.width, 24); + startBg.setName("window-start-bg"); startBg.setOrigin(0, 0); startBg.setPositionRelative(descriptionBg, 0, descriptionBg.height); - const startText = addTextObject(this.scene, 0, 0, i18next.t("challenges:start"), TextStyle.SETTINGS_LABEL); + const startText = addTextObject(this.scene, 0, 0, i18next.t("common:start"), TextStyle.SETTINGS_LABEL); + startText.setName("text-start"); startText.setOrigin(0, 0); startText.setPositionRelative(startBg, 8, 4); this.startCursor = this.scene.add.nineslice(0, 0, "summary_moves_cursor", null, (this.scene.game.canvas.width / 18) - 10, 16, 1, 1, 1, 1); + this.startCursor.setName("9s-start-cursor"); this.startCursor.setOrigin(0, 0); this.startCursor.setPositionRelative(startBg, 4, 4); this.startCursor.setVisible(false); this.valuesContainer = this.scene.add.container(0, 0); + this.valuesContainer.setName("values"); this.challengeLabels = []; - this.challengeValueLabels = []; - for (let i = 0; i < 9; i++) { - this.challengeLabels[i] = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - this.challengeLabels[i].setOrigin(0, 0); + for (let i = 0; i < Object.keys(ChallengeType).length; i++) { + const label = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + label.setName(`text-challenge-label-${i}`); + label.setOrigin(0, 0); - this.valuesContainer.add(this.challengeLabels[i]); + this.valuesContainer.add(label); - this.challengeValueLabels[i] = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - this.challengeValueLabels[i].setPositionRelative(this.challengeLabels[i], 100, 0); + let value; + if (i === Challenges.SINGLE_TYPE) { + const type = `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; + value = this.scene.add.sprite(8, 98, type); + value.setName("sprite-single-type"); + value.setScale(0.86); + value.setPositionRelative(label, 113, 8); + } else { + value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + value.setName(`text-challenge-value-label-${i}`); + value.setPositionRelative(label, 100, 0); + } - this.valuesContainer.add(this.challengeValueLabels[i]); + this.valuesContainer.add(value); + this.challengeLabels[i] = { + label: label, + value: value + }; } this.challengesContainer.add(headerBg); @@ -124,31 +168,49 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengesContainer.setVisible(false); } + /** + * Adds the default text color to the description text + * @param text text to set to the BBCode description + */ + setDescription(text: string): void { + this.descriptionText.setText(`[color=${Color.ORANGE}][shadow=${ShadowColor.ORANGE}]${text}`); + } + /** + * initLabels + * init all challenge labels + */ + initLabels(): void { + this.setDescription(this.scene.gameMode.challenges[this.cursor].getDescription()); + this.scene.gameMode.challenges.forEach((challenge, i) => { + this.challengeLabels[i].label.setVisible(true); + this.challengeLabels[i].value.setVisible(true); + this.challengeLabels[i].label.setText(challenge.getName()); + if (this.challengeLabels[i].value.type.toLowerCase() === "sprite") { + (this.challengeLabels[i].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); + } else { + (this.challengeLabels[i].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + } + }); + } + + /** + * update the text the cursor is on + */ updateText(): void { - if (this.scene.gameMode.challenges.length > 0) { - this.descriptionText.text = this.getActiveChallenge().getDescription(); - this.descriptionText.updateText(); - } + const challenge = this.getActiveChallenge(); + const { id } = challenge; + this.setDescription(this.getActiveChallenge().getDescription()); + if (this.challengeLabels[id].value.type.toLowerCase() === "sprite") { + (this.challengeLabels[id].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); + } else { + (this.challengeLabels[id].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + } // const totalDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getDifficulty(), 0); // const totalMinDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getMinDifficulty(), 0); // this.difficultyText.text = `${totalDifficulty}` + (totalMinDifficulty ? `/${totalMinDifficulty}` : ""); // this.difficultyText.updateText(); - - for (let i = 0; i < this.challengeLabels.length; i++) { - if (i + this.scrollCursor < this.scene.gameMode.challenges.length) { - this.challengeLabels[i].setVisible(true); - this.challengeValueLabels[i].setVisible(true); - this.challengeLabels[i].text = this.scene.gameMode.challenges[i + this.scrollCursor].getName(); - this.challengeValueLabels[i].text = this.scene.gameMode.challenges[i + this.scrollCursor].getValue(); - this.challengeLabels[i].updateText(); - this.challengeValueLabels[i].updateText(); - } else { - this.challengeLabels[i].setVisible(false); - this.challengeValueLabels[i].setVisible(false); - } - } } show(args: any[]): boolean { @@ -158,7 +220,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengesContainer.setVisible(true); this.setCursor(0); - this.updateText(); + this.initLabels(); this.getUi().moveTo(this.challengesContainer, this.getUi().length - 1); diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 67b587fd076..8ccd05675c8 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 "i18next"; import {Button} from "#enums/buttons"; export enum Command { @@ -34,12 +34,14 @@ export default class CommandUiHandler extends UiHandler { i18next.t("commandUiHandler:run") ]; - this.commandsContainer = this.scene.add.container(216, -38.7); + this.commandsContainer = this.scene.add.container(217, -38.7); + this.commandsContainer.setName("commands"); this.commandsContainer.setVisible(false); ui.add(this.commandsContainer); for (let c = 0; c < commands.length; c++) { const commandText = addTextObject(this.scene, c % 2 === 0 ? 0 : 55.8, c < 2 ? 0 : 16, commands[c], TextStyle.WINDOW); + commandText.setName(commands[c]); this.commandsContainer.add(commandText); } } @@ -60,6 +62,7 @@ export default class CommandUiHandler extends UiHandler { } const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(true); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index aa0cce62525..212d7b2a66c 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -1,8 +1,8 @@ +import i18next from "i18next"; import BattleScene from "../battle-scene"; +import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { WindowVariant, addWindow } from "./ui-theme"; -import * as Utils from "../utils"; -import i18next from "i18next"; interface RankingEntry { rank: integer, @@ -154,7 +154,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { return entryContainer; }; - this.rankingsContainer.add(getEntry("#", "Username", "Score", "Wave")); + this.rankingsContainer.add(getEntry(i18next.t("menu:positionIcon"), i18next.t("menu:usernameScoreboard"), i18next.t("menu:score"), i18next.t("menu:wave"))); rankings.forEach((r: RankingEntry, i: integer) => { const entryContainer = getEntry(r.rank.toString(), r.username, r.score.toString(), r.wave.toString()); diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts index 1c5779ef777..a688b8b7efc 100644 --- a/src/ui/egg-counter-container.ts +++ b/src/ui/egg-counter-container.ts @@ -17,7 +17,7 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { private battleScene: BattleScene; private eggCount: integer; private eggCountWindow: Phaser.GameObjects.NineSlice; - private eggCountText: Phaser.GameObjects.Text; + public eggCountText: Phaser.GameObjects.Text; /** * @param {BattleScene} scene - The scene to which this container belongs. @@ -49,6 +49,7 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { eggSprite.setScale(0.32); this.eggCountText = addTextObject(this.battleScene, 28, 13, `${this.eggCount}`, TextStyle.MESSAGE, { fontSize: "66px" }); + this.eggCountText.setName("text-egg-count"); this.add(eggSprite); this.add(this.eggCountText); @@ -69,7 +70,7 @@ export default class EggCounterContainer extends Phaser.GameObjects.Container { */ private onEggCountChanged(event: Event): void { const eggCountChangedEvent = event as EggCountChangedEvent; - if (!eggCountChangedEvent) { + if (!eggCountChangedEvent || !this.eggCountText?.data) { return; } diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 4d987ee8fcc..0081b589288 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -3,13 +3,15 @@ import { Mode } from "./ui"; import { TextStyle, addTextObject, getEggTierTextTint } from "./text"; import MessageUiHandler from "./message-ui-handler"; import * as Utils from "../utils"; -import { EGG_SEED, Egg, GachaType, getEggTierDefaultHatchWaves, getEggDescriptor, getLegendaryGachaSpeciesForTimestamp } from "../data/egg"; +import { Egg, getLegendaryGachaSpeciesForTimestamp, IEggOptions } from "../data/egg"; import { VoucherType, getVoucherTypeIcon } from "../system/voucher"; import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import {Button} from "#enums/buttons"; -import i18next from "../plugins/i18n"; +import * as Overrides from "../overrides"; +import { GachaType } from "#app/enums/gacha-types"; +import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; export default class EggGachaUiHandler extends MessageUiHandler { @@ -285,6 +287,10 @@ export default class EggGachaUiHandler extends MessageUiHandler { } pull(pullCount?: integer, count?: integer, eggs?: Egg[]): void { + if (Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE && !count) { + pullCount = Overrides.EGG_GACHA_PULL_COUNT_OVERRIDE; + } + this.eggGachaOptionsContainer.setVisible(false); this.setTransitioning(true); @@ -379,56 +385,24 @@ export default class EggGachaUiHandler extends MessageUiHandler { } if (!eggs) { eggs = []; - const tierValueOffset = this.gachaCursor === GachaType.LEGENDARY ? 1 : 0; - const tiers = new Array(pullCount).fill(null).map(() => { - 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) { - tiers[Utils.randInt(tiers.length)] = EggTier.ULTRA; - } else if (pullCount >= 10 && !tiers.filter(t => t >= EggTier.GREAT).length) { - tiers[Utils.randInt(tiers.length)] = EggTier.GREAT; - } - for (let i = 0; i < pullCount; i++) { - this.scene.gameData.eggPity[EggTier.GREAT] += 1; - this.scene.gameData.eggPity[EggTier.ULTRA] += 1; - this.scene.gameData.eggPity[EggTier.MASTER] += 1 + tierValueOffset; - // These numbers are roughly the 80% mark. That is, 80% of the time you'll get an egg before this gets triggered. - if (this.scene.gameData.eggPity[EggTier.MASTER] >= 412 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.MASTER; - } else if (this.scene.gameData.eggPity[EggTier.ULTRA] >= 59 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.ULTRA; - } else if (this.scene.gameData.eggPity[EggTier.GREAT] >= 9 && tiers[i] === EggTier.COMMON) { - tiers[i] = EggTier.GREAT; - } - this.scene.gameData.eggPity[tiers[i]] = 0; - } + for (let i = 1; i <= pullCount; i++) { + const eggOptions: IEggOptions = { scene: this.scene, pulled: true, sourceType: this.gachaCursor }; - const timestamp = new Date().getTime(); - - for (const tier of tiers) { - const eggId = Utils.randInt(EGG_SEED, EGG_SEED * tier); - const egg = new Egg(eggId, 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; + // Before creating the last egg, check if the guaranteed egg tier was already generated + // if not, override the egg tier + if (i === pullCount) { + const guaranteedEggTier = this.getGuaranteedEggTierFromPullCount(pullCount); + if (!eggs.some(egg => egg.tier >= guaranteedEggTier) && guaranteedEggTier !== EggTier.COMMON) { + eggOptions.tier = guaranteedEggTier; } } + + const egg = new Egg(eggOptions); eggs.push(egg); - this.scene.gameData.eggs.push(egg); - this.scene.gameData.gameStats.eggsPulled++; } + // Shuffle the eggs in case the guaranteed one got added as last egg + eggs = Utils.randSeedShuffle(eggs); + (this.scene.currentBattle ? this.scene.gameData.saveAll(this.scene, true, true, true) : this.scene.gameData.saveSystem()).then(success => { if (!success) { @@ -442,6 +416,17 @@ export default class EggGachaUiHandler extends MessageUiHandler { doPull(); } + getGuaranteedEggTierFromPullCount(pullCount: number): EggTier { + switch (pullCount) { + case 10: + return EggTier.GREAT; + case 25: + return EggTier.ULTRA; + default: + return EggTier.COMMON; + } + } + showSummary(eggs: Egg[]): void { this.transitioning = false; this.eggGachaSummaryContainer.setVisible(true); @@ -470,7 +455,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { 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, egg.getEggDescriptor(), TextStyle.PARTY, { align: "center" }); eggText.setOrigin(0.5, 0); eggText.setTint(getEggTierTextTint(!egg.isManaphyEgg() ? egg.tier : EggTier.ULTRA)); ret.add(eggText); @@ -586,11 +571,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { case Button.ACTION: switch (this.cursor) { case 0: - if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR]) { + if (!this.scene.gameData.voucherCounts[VoucherType.REGULAR] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 99) { - this.consumeVouchers(VoucherType.REGULAR, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 1); + } this.pull(); success = true; } else { @@ -599,11 +586,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS]) { + if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 95) { - this.consumeVouchers(VoucherType.PLUS, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PLUS, 1); + } this.pull(5); success = true; } else { @@ -613,15 +602,19 @@ export default class EggGachaUiHandler extends MessageUiHandler { 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])) { + if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + || (this.cursor === 3 && !this.scene.gameData.voucherCounts[VoucherType.PREMIUM] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE)) { 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); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PREMIUM, 1); + } } else { - this.consumeVouchers(VoucherType.REGULAR, 10); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 10); + } } this.pull(10); success = true; @@ -631,11 +624,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { } break; case 4: - if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN]) { + if (!this.scene.gameData.voucherCounts[VoucherType.GOLDEN] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { error = true; this.showError(i18next.t("egg:notEnoughVouchers")); } else if (this.scene.gameData.eggs.length < 75) { - this.consumeVouchers(VoucherType.GOLDEN, 1); + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.GOLDEN, 1); + } this.pull(25); success = true; } else { diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 8c4621ffb3d..fd8444f73ef 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -3,10 +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, getEggGachaTypeDescriptor, getEggHatchWavesMessage, getEggDescriptor } from "../data/egg"; +import { Egg } from "../data/egg"; import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; export default class EggListUiHandler extends MessageUiHandler { private eggListContainer: Phaser.GameObjects.Container; @@ -163,7 +163,7 @@ export default class EggListUiHandler extends MessageUiHandler { 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")} (${egg.getEggDescriptor()})`); this.eggDateText.setText( new Date(egg.timestamp).toLocaleString(undefined, { weekday: "short", @@ -172,8 +172,8 @@ export default class EggListUiHandler extends MessageUiHandler { day: "numeric" }) ); - this.eggHatchWavesText.setText(getEggHatchWavesMessage(egg.hatchWaves)); - this.eggGachaInfoText.setText(getEggGachaTypeDescriptor(this.scene, egg)); + this.eggHatchWavesText.setText(egg.getEggHatchWavesMessage()); + this.eggGachaInfoText.setText(egg.getEggTypeDescriptor(this.scene)); } setCursor(cursor: integer): boolean { diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 217f4d75820..ed520512443 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -7,12 +7,13 @@ 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 "i18next"; import {Button} from "#enums/buttons"; import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; export default class FightUiHandler extends UiHandler { private movesContainer: Phaser.GameObjects.Container; + private moveInfoContainer: Phaser.GameObjects.Container; private typeIcon: Phaser.GameObjects.Sprite; private ppLabel: Phaser.GameObjects.Text; private ppText: Phaser.GameObjects.Text; @@ -34,48 +35,53 @@ export default class FightUiHandler extends UiHandler { const ui = this.getUi(); this.movesContainer = this.scene.add.container(18, -38.7); + this.movesContainer.setName("moves"); ui.add(this.movesContainer); - this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); + this.moveInfoContainer = this.scene.add.container(1, 0); + this.moveInfoContainer.setName("move-info"); + ui.add(this.moveInfoContainer); + + this.typeIcon = this.scene.add.sprite(this.scene.scaledCanvas.width - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown"); this.typeIcon.setVisible(false); - ui.add(this.typeIcon); + this.moveInfoContainer.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.scaledCanvas.width - 25, -36, "categories", "physical"); this.moveCategoryIcon.setVisible(false); - ui.add(this.moveCategoryIcon); + this.moveInfoContainer.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.scaledCanvas.width - 70, -26, "PP", TextStyle.MOVE_INFO_CONTENT); this.ppLabel.setOrigin(0.0, 0.5); this.ppLabel.setVisible(false); this.ppLabel.setText(i18next.t("fightUiHandler:pp")); - ui.add(this.ppLabel); + this.moveInfoContainer.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.scaledCanvas.width - 12, -26, "--/--", TextStyle.MOVE_INFO_CONTENT); this.ppText.setOrigin(1, 0.5); this.ppText.setVisible(false); - ui.add(this.ppText); + this.moveInfoContainer.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.scaledCanvas.width - 70, -18, "POWER", TextStyle.MOVE_INFO_CONTENT); this.powerLabel.setOrigin(0.0, 0.5); this.powerLabel.setVisible(false); this.powerLabel.setText(i18next.t("fightUiHandler:power")); - ui.add(this.powerLabel); + this.moveInfoContainer.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.scaledCanvas.width - 12, -18, "---", TextStyle.MOVE_INFO_CONTENT); this.powerText.setOrigin(1, 0.5); this.powerText.setVisible(false); - ui.add(this.powerText); + this.moveInfoContainer.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.scaledCanvas.width - 70, -10, "ACC", TextStyle.MOVE_INFO_CONTENT); this.accuracyLabel.setOrigin(0.0, 0.5); this.accuracyLabel.setVisible(false); this.accuracyLabel.setText(i18next.t("fightUiHandler:accuracy")); - ui.add(this.accuracyLabel); + this.moveInfoContainer.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.scaledCanvas.width - 12, -10, "---", TextStyle.MOVE_INFO_CONTENT); this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setVisible(false); - ui.add(this.accuracyText); + this.moveInfoContainer.add(this.accuracyText); } show(args: any[]): boolean { @@ -84,6 +90,7 @@ export default class FightUiHandler extends UiHandler { this.fieldIndex = args.length ? args[0] as integer : 0; const messageHandler = this.getUi().getMessageHandler(); + messageHandler.bg.setVisible(false); messageHandler.commandWindow.setVisible(false); messageHandler.movesWindowContainer.setVisible(true); this.setCursor(this.getCursor()); @@ -236,10 +243,12 @@ export default class FightUiHandler extends UiHandler { for (let moveIndex = 0; moveIndex < 4; moveIndex++) { const moveText = addTextObject(this.scene, moveIndex % 2 === 0 ? 0 : 100, moveIndex < 2 ? 0 : 16, "-", TextStyle.WINDOW); + moveText.setName("text-empty-move"); if (moveIndex < moveset.length) { const pokemonMove = moveset[moveIndex]; moveText.setText(pokemonMove.getName()); + moveText.setName(pokemonMove.getName()); moveText.setColor(this.getMoveColor(pokemon, pokemonMove) ?? moveText.style.color); } @@ -273,6 +282,7 @@ export default class FightUiHandler extends UiHandler { clear() { super.clear(); + const messageHandler = this.getUi().getMessageHandler(); this.clearMoves(); this.typeIcon.setVisible(false); this.ppLabel.setVisible(false); @@ -282,6 +292,7 @@ export default class FightUiHandler extends UiHandler { this.accuracyLabel.setVisible(false); this.accuracyText.setVisible(false); this.moveCategoryIcon.setVisible(false); + messageHandler.bg.setVisible(true); this.eraseCursor(); } diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 4c60a3bad9b..2c576a0fbaa 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 "i18next"; import {Button} from "#enums/buttons"; export interface FormModalConfig extends ModalConfig { diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 4a9c62ca012..8f1e8890a76 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -8,7 +8,7 @@ import * as Utils from "../utils"; import { DexAttr, GameData } from "../system/game-data"; import { speciesStarters } from "../data/pokemon-species"; import {Button} from "#enums/buttons"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; interface DisplayStat { label_key?: string; diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 890aabeb7af..3b75c6f7c13 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -2,7 +2,7 @@ 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 "i18next"; export default class LoginFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index b068080bdda..571a09f3b37 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -7,11 +7,12 @@ import MessageUiHandler from "./message-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler"; import { Tutorial, handleTutorial } from "../tutorial"; import { updateUserInfo } from "../account"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import {Button} from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; +import BgmBar from "#app/ui/bgm-bar"; -export enum MenuOptions { +enum MenuOptions { GAME_SETTINGS, ACHIEVEMENTS, STATS, @@ -24,13 +25,15 @@ export enum MenuOptions { LOG_OUT } -const wikiUrl = "https://wiki.pokerogue.net"; +let wikiUrl = "https://wiki.pokerogue.net/start"; const discordUrl = "https://discord.gg/uWpTfdKG49"; const githubUrl = "https://github.com/pagefaultgames/pokerogue"; +const redditUrl = "https://www.reddit.com/r/pokerogue"; export default class MenuUiHandler extends MessageUiHandler { private menuContainer: Phaser.GameObjects.Container; private menuMessageBoxContainer: Phaser.GameObjects.Container; + private menuOverlay: Phaser.GameObjects.Rectangle; private menuBg: Phaser.GameObjects.NineSlice; protected optionSelectText: Phaser.GameObjects.Text; @@ -43,6 +46,9 @@ export default class MenuUiHandler extends MessageUiHandler { protected manageDataConfig: OptionSelectConfig; protected communityConfig: OptionSelectConfig; + public bgmBar: BgmBar; + + constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); @@ -54,12 +60,28 @@ export default class MenuUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); + // wiki url directs based on languges available on wiki + const lang = i18next.resolvedLanguage.substring(0,2); + if (["de", "fr", "ko", "zh"].includes(lang)) { + wikiUrl = `https://wiki.pokerogue.net/${lang}:start`; + } + + this.bgmBar = new BgmBar(this.scene); + this.bgmBar.setup(); + + ui.bgmBar = this.bgmBar; this.menuContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.menuContainer.setName("menu"); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + this.menuOverlay = new Phaser.GameObjects.Rectangle(this.scene, -1, -1, this.scene.scaledCanvas.width, this.scene.scaledCanvas.height, 0xffffff, 0.3); + this.menuOverlay.setName("menu-overlay"); + this.menuOverlay.setOrigin(0,0); + this.menuContainer.add(this.menuOverlay); + const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); menuMessageText.setWordWrapWidth(1224); menuMessageText.setOrigin(0, 0); @@ -78,6 +100,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.add(this.menuContainer); this.menuMessageBoxContainer = this.scene.add.container(0, 130); + this.menuMessageBoxContainer.setName("menu-message-box"); this.menuMessageBoxContainer.setVisible(false); this.menuContainer.add(this.menuMessageBoxContainer); @@ -87,6 +110,8 @@ export default class MenuUiHandler extends MessageUiHandler { this.menuMessageBoxContainer.add(menuMessageText); + this.menuContainer.add(this.bgmBar); + this.message = menuMessageText; this.menuContainer.add(this.menuMessageBoxContainer); @@ -211,6 +236,14 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }, + { + label: "Reddit", + handler: () => { + window.open(redditUrl, "_blank").focus(); + return true; + }, + keepOpen: true + }, { label: i18next.t("menuUiHandler:cancel"), handler: () => { @@ -231,6 +264,7 @@ export default class MenuUiHandler extends MessageUiHandler { } show(args: any[]): boolean { + super.show(args); this.menuContainer.setVisible(true); @@ -244,6 +278,9 @@ export default class MenuUiHandler extends MessageUiHandler { handleTutorial(this.scene, Tutorial.Menu); + this.bgmBar.toggleBgmBar(true); + + return true; } @@ -285,6 +322,7 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.EGG_LIST); success = true; } else { + ui.showText(i18next.t("menuUiHandler:noEggs"), null, () => ui.showText(""), Utils.fixedInt(1500)); error = true; } break; @@ -399,6 +437,7 @@ export default class MenuUiHandler extends MessageUiHandler { clear() { super.clear(); this.menuContainer.setVisible(false); + this.bgmBar.toggleBgmBar(false); this.eraseCursor(); } diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 09f73ac2749..c403dc28abb 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -47,7 +47,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { ui.add(this.modifierContainer); this.transferButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 71, -64); - this.transferButtonContainer.setName("container-transfer-btn"); + this.transferButtonContainer.setName("transfer-btn"); this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); @@ -57,7 +57,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.transferButtonContainer.add(transferButtonText); this.checkButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -64); - this.checkButtonContainer.setName("container-use-btn"); + this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); @@ -67,7 +67,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.checkButtonContainer.add(checkButtonText); this.rerollButtonContainer = this.scene.add.container(16, -64); - this.rerollButtonContainer.setName("container-reroll-brn"); + this.rerollButtonContainer.setName("reroll-brn"); this.rerollButtonContainer.setVisible(false); ui.add(this.rerollButtonContainer); @@ -180,8 +180,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const maxUpgradeCount = typeOptions.map(to => to.upgradeCount).reduce((max, current) => Math.max(current, max), 0); - this.scene.showFieldOverlay(750); + /* Force updateModifiers without pokemonSpecificModifiers */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers, true); + + /* Multiplies the appearance duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.showShopOverlay(750 * this.scene.gameSpeed); this.scene.updateAndShowText(750); + this.scene.updateBiomeWaveText(); this.scene.updateMoneyText(); let i = 0; @@ -472,9 +477,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.getUi().clearText(); this.eraseCursor(); - this.scene.hideFieldOverlay(250); + /* Multiplies the fade time duration by the speed parameter so that it is always constant, and avoids "flashbangs" at game speed x5 */ + this.scene.hideShopOverlay(750 * this.scene.gameSpeed); this.scene.hideLuckText(250); + /* Normally already called just after the shop, but not sure if it happens in 100% of cases */ + this.scene.getModifierBar().updateModifiers(this.scene.modifiers); + const options = this.options.concat(this.shopOptionsRows.flat()); this.options.splice(0, this.options.length); this.shopOptionsRows.splice(0, this.shopOptionsRows.length); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index fadbb2ff7e9..93dc052b09d 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -21,7 +21,7 @@ import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import { Moves } from "#enums/moves"; -const defaultMessage = "Choose a Pokémon."; +const defaultMessage = i18next.t("menu:choosePokemon"); export enum PartyUiMode { SWITCH, @@ -57,7 +57,8 @@ export enum PartyOption { MOVE_1 = 3000, MOVE_2, MOVE_3, - MOVE_4 + MOVE_4, + ALL = 4000 } export type PartySelectCallback = (cursor: integer, option: PartyOption) => void; @@ -96,6 +97,8 @@ export default class PartyUiHandler extends MessageUiHandler { private transferQuantities: integer[]; /** Stack size of every item that the selected pokemon is holding */ private transferQuantitiesMax: integer[]; + /** Whether to transfer all items */ + private transferAll: boolean; private lastCursor: integer = 0; private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback; @@ -158,31 +161,37 @@ export default class PartyUiHandler extends MessageUiHandler { const ui = this.getUi(); const partyContainer = this.scene.add.container(0, 0); + partyContainer.setName("party"); partyContainer.setVisible(false); ui.add(partyContainer); this.partyContainer = partyContainer; this.partyBg = this.scene.add.image(0, 0, "party_bg"); + this.partyBg.setName("img-party-bg"); partyContainer.add(this.partyBg); this.partyBg.setOrigin(0, 1); const partySlotsContainer = this.scene.add.container(0, 0); + partySlotsContainer.setName("party-slots"); partyContainer.add(partySlotsContainer); this.partySlotsContainer = partySlotsContainer; const partyMessageBoxContainer = this.scene.add.container(0, -32); + partyMessageBoxContainer.setName("party-msg-box"); partyContainer.add(partyMessageBoxContainer); const partyMessageBox = addWindow(this.scene, 1, 31, 262, 30); + partyMessageBox.setName("window-party-msg-box"); partyMessageBox.setOrigin(0, 1); partyMessageBoxContainer.add(partyMessageBox); this.partyMessageBox = partyMessageBox; - const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + const partyMessageText = addTextObject(this.scene, 10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); + partyMessageText.setName("text-party-msg"); partyMessageText.setOrigin(0, 0); partyMessageBoxContainer.add(partyMessageText); @@ -294,6 +303,8 @@ export default class PartyUiHandler extends MessageUiHandler { } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.UNSPLICE && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL) || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { let filterResult: string; + const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => + this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === pokemon.id) as PokemonHeldItemModifier[]; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { filterResult = (this.selectFilter as PokemonSelectFilter)(pokemon); if (filterResult === null && (option === PartyOption.SEND_OUT || option === PartyOption.PASS_BATON)) { @@ -303,10 +314,7 @@ export default class PartyUiHandler extends MessageUiHandler { filterResult = this.moveSelectFilter(pokemon.moveset[this.optionsCursor]); } } else { - const transferPokemon = this.scene.getParty()[this.transferCursor]; - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === transferPokemon.id) as PokemonHeldItemModifier[]; - filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, itemModifiers[this.transferOptionCursor]); + filterResult = (this.selectFilter as PokemonModifierTransferSelectFilter)(pokemon, getTransferrableItemsFromPokemon(this.scene.getParty()[this.transferCursor])[this.transferOptionCursor]); } if (filterResult === null) { if (this.partyUiMode !== PartyUiMode.SPLICE) { @@ -315,7 +323,11 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.selectCallback && this.partyUiMode !== PartyUiMode.CHECK) { if (option === PartyOption.TRANSFER) { if (this.transferCursor !== this.cursor) { - (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); + if (this.transferAll) { + getTransferrableItemsFromPokemon(this.scene.getParty()[this.transferCursor]).forEach((_, i) => (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, i, this.transferQuantitiesMax[i], this.cursor)); + } else { + (this.selectCallback as PartyModifierTransferSelectCallback)(this.transferCursor, this.transferOptionCursor, this.transferQuantities[this.transferOptionCursor], this.cursor); + } } this.clearTransfer(); } else if (this.partyUiMode === PartyUiMode.SPLICE) { @@ -430,7 +442,9 @@ export default class PartyUiHandler extends MessageUiHandler { case Button.UP: /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantitiesMax[option]; + if (option !== PartyOption.ALL) { + this.transferQuantities[option] = this.transferQuantitiesMax[option]; + } this.updateOptions(); } success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); /** Move cursor */ @@ -438,7 +452,9 @@ export default class PartyUiHandler extends MessageUiHandler { case Button.DOWN: /** If currently selecting items to transfer, reset quantity selection */ if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantitiesMax[option]; + if (option !== PartyOption.ALL) { + this.transferQuantities[option] = this.transferQuantitiesMax[option]; + } this.updateOptions(); } success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); /** Move cursor */ @@ -770,6 +786,9 @@ export default class PartyUiHandler extends MessageUiHandler { for (let im = 0; im < itemModifiers.length; im++) { this.options.push(im); } + if (itemModifiers.length > 1) { + this.options.push(PartyOption.ALL); + } } this.optionsScrollTotal = this.options.length; @@ -843,11 +862,15 @@ export default class PartyUiHandler extends MessageUiHandler { optionName = allMoves[move].name; altText = !pokemon.getSpeciesForm().getLevelMoves().find(plm => plm[1] === move); } else { - const itemModifier = itemModifiers[option]; - optionName = itemModifier.type.name; - /** For every item that has stack bigger than 1, display the current quantity selection */ - if (this.transferQuantitiesMax[option] > 1) { - optionName += ` (${this.transferQuantities[option]})`; + if (option === PartyOption.ALL) { + optionName = i18next.t("partyUiHandler:ALL"); + } else { + const itemModifier = itemModifiers[option]; + optionName = itemModifier.type.name; + /** For every item that has stack bigger than 1, display the current quantity selection */ + if (this.transferQuantitiesMax[option] > 1) { + optionName += ` (${this.transferQuantities[option]})`; + } } } @@ -876,12 +899,14 @@ export default class PartyUiHandler extends MessageUiHandler { this.transferMode = true; this.transferCursor = this.cursor; this.transferOptionCursor = this.getOptionsCursorWithScroll(); + this.transferAll = this.options[this.optionsCursor] === PartyOption.ALL; this.partySlots[this.transferCursor].setTransfer(true); } clearTransfer(): void { this.transferMode = false; + this.transferAll = false; this.partySlots[this.transferCursor].setTransfer(false); } @@ -1054,7 +1079,7 @@ class PartySlot extends Phaser.GameObjects.Container { if (this.slotIndex >= battlerCount) { slotGenderText.setPositionRelative(slotLevelLabel, 36, 0); } else { - slotGenderText.setPositionRelative(slotName, 76, 3); + slotGenderText.setPositionRelative(slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3); } slotGenderText.setOrigin(0, 0.25); @@ -1066,9 +1091,9 @@ class PartySlot extends Phaser.GameObjects.Container { splicedIcon.setScale(0.5); splicedIcon.setOrigin(0, 0); if (this.slotIndex >= battlerCount) { - splicedIcon.setPositionRelative(slotLevelLabel, 36 - (genderSymbol ? 8 : 0), 0.5); + splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5); } else { - splicedIcon.setPositionRelative(slotName, 76 - (genderSymbol ? 8 : 0), 3.5); + splicedIcon.setPositionRelative(slotName, 76, 3.5); } slotInfoContainer.add(splicedIcon); @@ -1205,7 +1230,7 @@ class PartyCancelButton extends Phaser.GameObjects.Container { this.partyCancelPb = partyCancelPb; - const partyCancelText = addTextObject(this.scene, -7, -6, "Cancel", TextStyle.PARTY); + const partyCancelText = addTextObject(this.scene, -8, -7, "Cancel", TextStyle.PARTY); this.add(partyCancelText); } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 78e6b934d79..0a398e56871 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -5,7 +5,7 @@ import { Gender, getGenderColor, getGenderSymbol } from "../data/gender"; import { getNatureName } from "../data/nature"; import { Type } from "../data/type"; import Pokemon from "../field/pokemon"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { DexAttr } from "../system/game-data"; import * as Utils from "../utils"; import ConfirmUiHandler from "./confirm-ui-handler"; @@ -79,7 +79,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { } setup(): void { - this.setName("container-pkmn-info"); + this.setName("pkmn-info"); const currentLanguage = i18next.resolvedLanguage; const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)); const textSettings = languageSettings[langSettingKey]; @@ -88,7 +88,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { infoBg.setName("window-info-bg"); this.pokemonMovesContainer = this.scene.add.container(6, 14); - this.pokemonMovesContainer.setName("container-pkmn-moves"); + this.pokemonMovesContainer.setName("pkmn-moves"); this.movesContainerInitialX = this.pokemonMovesContainer.x; @@ -109,7 +109,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { for (let m = 0; m < 4; m++) { const moveContainer = this.scene.add.container(-6, 18 + 7 * m); moveContainer.setScale(0.5); - moveContainer.setName("container-move"); + moveContainer.setName("move"); const moveBg = this.scene.add.nineslice(0, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2); moveBg.setOrigin(1, 0); diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index e4bb5c6395b..d5e7f239378 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -3,7 +3,7 @@ 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 "i18next"; export default class RegistrationFormUiHandler extends FormModalUiHandler { getModalTitle(config?: ModalConfig): string { diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 47c61011f8c..8a81ac4858d 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -119,7 +119,15 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { }; if (this.sessionSlots[cursor].hasData) { ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => saveAndCallback(), () => { + ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + this.scene.reset(true); + } else { + saveAndCallback(); + } + }); + }, () => { ui.revertMode(); ui.showText(null, 0); }, false, 0, 19, 2000); diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 1cc59c13035..809c4ffa2f8 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -5,6 +5,7 @@ import {addWindow} from "../ui-theme"; import {addTextObject, TextStyle} from "../text"; import {Button} from "#enums/buttons"; import {NavigationManager} from "#app/ui/settings/navigationMenu"; +import i18next from "i18next"; /** * Abstract class for handling UI elements related to button bindings. @@ -78,7 +79,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { this.actionsContainer.add(this.actionBg); // Text prompts and instructions for the user. - this.unlockText = addTextObject(this.scene, 0, 0, "Press a button...", TextStyle.WINDOW); + this.unlockText = addTextObject(this.scene, 0, 0, i18next.t("settings:pressButton"), TextStyle.WINDOW); this.unlockText.setOrigin(0, 0); this.unlockText.setPositionRelative(this.titleBg, 36, 4); this.optionSelectContainer.add(this.unlockText); @@ -92,7 +93,7 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { this.optionSelectBg.setOrigin(0.5); this.optionSelectContainer.add(this.optionSelectBg); - this.cancelLabel = addTextObject(this.scene, 0, 0, "Cancel", TextStyle.SETTINGS_LABEL); + this.cancelLabel = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); this.cancelLabel.setOrigin(0, 0.5); this.cancelLabel.setPositionRelative(this.actionBg, 10, this.actionBg.height / 2); this.actionsContainer.add(this.cancelLabel); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 4abc19f9087..9bf0cb40975 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -8,6 +8,7 @@ import {getIconWithSettingName} from "#app/configs/inputs/configHandler"; import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu"; import { Device } from "#enums/devices"; import { Button } from "#enums/buttons"; +import i18next from "i18next"; export interface InputsIcons { [key: string]: Phaser.GameObjects.Sprite; @@ -83,6 +84,12 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler return settings; } + private camelize(string: string): string { + return string.replace(/(?:^\w|[A-Z]|\b\w)/g, function(word, index) { + return index === 0 ? word.toLowerCase() : word.toUpperCase(); + }).replace(/\s+/g, ""); + } + /** * Setup UI elements. */ @@ -91,6 +98,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler this.navigationIcons = {}; this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); + this.settingsContainer.setName(`settings-${this.titleSelected}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -108,7 +116,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler iconAction.setPositionRelative(this.actionsBg, this.navigationContainer.width - 32, 4); this.navigationIcons["BUTTON_ACTION"] = iconAction; - const actionText = addTextObject(this.scene, 0, 0, "Action", TextStyle.SETTINGS_LABEL); + const actionText = addTextObject(this.scene, 0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); actionText.setOrigin(0, 0.15); actionText.setPositionRelative(iconAction, -actionText.width/6-2, 0); @@ -117,7 +125,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler iconCancel.setPositionRelative(this.actionsBg, this.navigationContainer.width - 100, 4); this.navigationIcons["BUTTON_CANCEL"] = iconCancel; - const cancelText = addTextObject(this.scene, 0, 0, "Cancel", TextStyle.SETTINGS_LABEL); + const cancelText = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); cancelText.setOrigin(0, 0.15); cancelText.setPositionRelative(iconCancel, -cancelText.width/6-2, 0); @@ -126,7 +134,7 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler iconReset.setPositionRelative(this.actionsBg, this.navigationContainer.width - 180, 4); this.navigationIcons["BUTTON_HOME"] = iconReset; - const resetText = addTextObject(this.scene, 0, 0, "Reset all", TextStyle.SETTINGS_LABEL); + const resetText = addTextObject(this.scene, 0, 0, i18next.t("settings:reset"), TextStyle.SETTINGS_LABEL); resetText.setOrigin(0, 0.15); resetText.setPositionRelative(iconReset, -resetText.width/6-2, 0); @@ -178,7 +186,14 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler // Create and add a text object for the setting name to the scene. const isLock = this.settingBlacklisted.includes(this.setting[setting]); const labelStyle = isLock ? TextStyle.SETTINGS_LOCKED : TextStyle.SETTINGS_LABEL; - settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, settingName, labelStyle); + let labelText: string; + const i18nKey = this.camelize(settingName.replace("Alt ", "")); + if (settingName.toLowerCase().includes("alt")) { + labelText = `${i18next.t(`settings:${i18nKey}`)}${i18next.t("settings:alt")}`; + } else { + labelText = i18next.t(`settings:${i18nKey}`); + } + settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, labelText, labelStyle); settingLabels[s].setOrigin(0, 0); optionsContainer.add(settingLabels[s]); diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index dad797d43a5..6763c8d3d85 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -8,6 +8,7 @@ import {Button} from "#enums/buttons"; import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler.js"; import NavigationMenu, {NavigationManager} from "#app/ui/settings/navigationMenu"; import { Setting, SettingKeys } from "#app/system/settings/settings"; +import i18next from "i18next"; /** @@ -53,7 +54,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { const ui = this.getUi(); this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); - + this.settingsContainer.setName(`settings-${this.title}`); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6 - 20), Phaser.Geom.Rectangle.Contains); this.navigationIcons = {}; @@ -61,6 +62,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.navigationContainer = new NavigationMenu(this.scene, 0, 0); this.optionsBg = addWindow(this.scene, 0, this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 16 - this.navigationContainer.height - 2); + this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const actionsBg = addWindow(this.scene, 0, (this.scene.game.canvas.height / 6) - this.navigationContainer.height, (this.scene.game.canvas.width / 6) - 2, 22); @@ -71,7 +73,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { iconAction.setPositionRelative(actionsBg, this.navigationContainer.width - 32, 4); this.navigationIcons["BUTTON_ACTION"] = iconAction; - const actionText = addTextObject(this.scene, 0, 0, "Action", TextStyle.SETTINGS_LABEL); + const actionText = addTextObject(this.scene, 0, 0, i18next.t("settings:action"), TextStyle.SETTINGS_LABEL); actionText.setOrigin(0, 0.15); actionText.setPositionRelative(iconAction, -actionText.width/6-2, 0); @@ -80,7 +82,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { iconCancel.setPositionRelative(actionsBg, this.navigationContainer.width - 100, 4); this.navigationIcons["BUTTON_CANCEL"] = iconCancel; - const cancelText = addTextObject(this.scene, 0, 0, "Cancel", TextStyle.SETTINGS_LABEL); + const cancelText = addTextObject(this.scene, 0, 0, i18next.t("settings:back"), TextStyle.SETTINGS_LABEL); cancelText.setOrigin(0, 0.15); cancelText.setPositionRelative(iconCancel, -cancelText.width/6-2, 0); @@ -95,7 +97,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { .forEach((setting, s) => { let settingName = setting.label; if (setting?.requireReload) { - settingName += " (Requires Reload)"; + settingName += ` (${i18next.t("settings:requireReload")})`; } this.settingLabels[s] = addTextObject(this.scene, 8, 28 + s * 16, settingName, TextStyle.SETTINGS_LABEL); @@ -103,7 +105,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.optionsContainer.add(this.settingLabels[s]); this.optionValueLabels.push(setting.options.map((option, o) => { - const valueLabel = addTextObject(this.scene, 0, 0, option, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW); + const valueLabel = addTextObject(this.scene, 0, 0, option.label, setting.default === o ? TextStyle.SETTINGS_SELECTED : TextStyle.WINDOW); valueLabel.setOrigin(0, 0); this.optionsContainer.add(valueLabel); diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index eb65ea95e0c..370b6f67c76 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -4,6 +4,7 @@ import {InputsIcons} from "#app/ui/settings/abstract-control-settings-ui-handler import {addTextObject, setTextStyle, TextStyle} from "#app/ui/text"; import {addWindow} from "#app/ui/ui-theme"; import {Button} from "#enums/buttons"; +import i18next from "i18next"; const LEFT = "LEFT"; const RIGHT = "RIGHT"; @@ -32,7 +33,7 @@ export class NavigationManager { Mode.SETTINGS_GAMEPAD, Mode.SETTINGS_KEYBOARD, ]; - this.labels = ["General", "Display", "Audio", "Gamepad", "Keyboard"]; + this.labels = [i18next.t("settings:general"), i18next.t("settings:display"), i18next.t("settings:audio"), i18next.t("settings:gamepad"), i18next.t("settings:keyboard")]; } public reset() { diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index 0aed0689388..f0e84f29e00 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -25,34 +25,65 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler const currentLocale = localStorage.getItem("prLang"); switch (currentLocale) { case "en": - this.settings[languageIndex].options[0] = "English"; + this.settings[languageIndex].options[0] = { + value: "English", + label: "English", + }; break; case "es": - this.settings[languageIndex].options[0] = "Español"; + this.settings[languageIndex].options[0] = { + value: "Español", + label: "Español", + }; break; case "it": - this.settings[languageIndex].options[0] = "Italiano"; + this.settings[languageIndex].options[0] = { + value: "Italiano", + label: "Italiano", + }; break; case "fr": - this.settings[languageIndex].options[0] = "Français"; + this.settings[languageIndex].options[0] = { + value: "Français", + label: "Français", + }; break; case "de": - this.settings[languageIndex].options[0] = "Deutsch"; + this.settings[languageIndex].options[0] = { + value: "Deutsch", + label: "Deutsch", + }; break; case "pt-BR": - this.settings[languageIndex].options[0] = "Português (BR)"; + this.settings[languageIndex].options[0] = { + value: "Português (BR)", + label: "Português (BR)", + }; break; case "zh-CN": - this.settings[languageIndex].options[0] = "简体中文"; + this.settings[languageIndex].options[0] = { + value: "简体中文", + label: "简体中文", + }; break; case "zh-TW": - this.settings[languageIndex].options[0] = "繁體中文"; + this.settings[languageIndex].options[0] = { + value: "繁體中文", + label: "繁體中文", + }; break; case "ko": - this.settings[languageIndex].options[0] = "한국어"; + case "ko-KR": + this.settings[languageIndex].options[0] = { + value: "한국어", + label: "한국어", + }; break; default: - this.settings[languageIndex].options[0] = "English"; + this.settings[languageIndex].options[0] = { + value: "English", + label: "English", + }; break; } } diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index 18ebde962f1..f86e8088ec6 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -15,6 +15,7 @@ import {InterfaceConfig} from "#app/inputs-controller"; import AbstractControlSettingsUiHandler from "#app/ui/settings/abstract-control-settings-ui-handler.js"; import {Device} from "#enums/devices"; import {truncateString} from "#app/utils"; +import i18next from "i18next"; /** * Class representing the settings UI handler for gamepads. @@ -54,7 +55,7 @@ export default class SettingsGamepadUiHandler extends AbstractControlSettingsUiH this.layout["noGamepads"] = new Map(); const optionsContainer = this.scene.add.container(0, 0); optionsContainer.setVisible(false); // Initially hide the container as no gamepads are connected. - const label = addTextObject(this.scene, 8, 28, "Please plug a controller or press a button", TextStyle.SETTINGS_LABEL); + const label = addTextObject(this.scene, 8, 28, i18next.t("settings:gamepadPleasePlug"), TextStyle.SETTINGS_LABEL); label.setOrigin(0, 0); optionsContainer.add(label); this.settingsContainer.add(optionsContainer); diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index 7eb1e4f6c60..5c4444991ad 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -15,6 +15,7 @@ import {addTextObject, TextStyle} from "#app/ui/text"; import {deleteBind} from "#app/configs/inputs/configHandler"; import {Device} from "#enums/devices"; import {NavigationManager} from "#app/ui/settings/navigationMenu"; +import i18next from "i18next"; /** * Class representing the settings UI handler for keyboards. @@ -58,7 +59,7 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi this.layout["noKeyboard"] = new Map(); const optionsContainer = this.scene.add.container(0, 0); optionsContainer.setVisible(false); // Initially hide the container as no gamepads are connected. - const label = addTextObject(this.scene, 8, 28, "Please press a key on your keyboard", TextStyle.SETTINGS_LABEL); + const label = addTextObject(this.scene, 8, 28, i18next.t("settings:keyboardPleasePress"), TextStyle.SETTINGS_LABEL); label.setOrigin(0, 0); optionsContainer.add(label); this.settingsContainer.add(optionsContainer); @@ -68,7 +69,7 @@ export default class SettingsKeyboardUiHandler extends AbstractControlSettingsUi iconDelete.setPositionRelative(this.actionsBg, this.navigationContainer.width - 260, 4); this.navigationIcons["BUTTON_DELETE"] = iconDelete; - const deleteText = addTextObject(this.scene, 0, 0, "Delete", TextStyle.SETTINGS_LABEL); + const deleteText = addTextObject(this.scene, 0, 0, i18next.t("settings:delete"), TextStyle.SETTINGS_LABEL); deleteText.setOrigin(0, 0.15); deleteText.setPositionRelative(iconDelete, -deleteText.width/6-2, 0); diff --git a/public/images/pokemon/678ms.json b/src/ui/settings/shiny_icons.json similarity index 58% rename from public/images/pokemon/678ms.json rename to src/ui/settings/shiny_icons.json index 0fac19c59c4..d6465cf2c3a 100644 --- a/public/images/pokemon/678ms.json +++ b/src/ui/settings/shiny_icons.json @@ -1,33 +1,33 @@ { "textures": [ { - "image": "678ms.png", + "image": "shiny_icons.png", "format": "RGBA8888", "size": { - "w": 56, - "h": 56 + "w": 45, + "h": 14 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0", "rotated": false, "trimmed": false, "sourceSize": { "w": 45, - "h": 56 + "h": 14 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 45, - "h": 56 + "w": 15, + "h": 14 }, "frame": { "x": 0, "y": 0, - "w": 45, - "h": 56 + "w": 15, + "h": 14 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:935ddcd2ff1f413e94967151e2f4cc6d:bdb048fb547d7ebb9a83d391e8f1c9ba:81f219fee9493a3658266d8c5e858b9e$" + "smartupdate": "$TexturePacker:SmartUpdate:a3275c7504a9b35b288265e191b1d14c:420725f3fb73c2cac0ab3bbc0a46f2e1:3a8b8ca0f0e4be067dd46c07b78ee013$" } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 2c114ec3e8d..db014432b13 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1,6 +1,6 @@ import { BattleSceneEventType, CandyUpgradeNotificationChangedEvent } from "../events/battle-scene"; import { pokemonPrevolutions } from "#app/data/pokemon-evolutions"; -import { Variant, getVariantTint } from "#app/data/variant"; +import { Variant, getVariantTint, getVariantIcon } from "#app/data/variant"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -17,7 +17,7 @@ import PokemonSpecies, { allSpecies, getPokemonSpecies, getPokemonSpeciesForm, g import { Type } from "../data/type"; import { GameModes } from "../game-mode"; import { SelectChallengePhase, TitlePhase } from "../phases"; -import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterFormMoveData, StarterMoveset } from "../system/game-data"; +import { AbilityAttr, DexAttr, DexAttrProps, DexEntry, StarterFormMoveData, StarterMoveset, StarterAttributes, StarterPreferences, StarterPrefs } from "../system/game-data"; import { Tutorial, handleTutorial } from "../tutorial"; import * as Utils from "../utils"; import { OptionSelectItem } from "./abstact-option-select-ui-handler"; @@ -27,6 +27,8 @@ import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; +import { Egg } from "#app/data/egg"; +import * as Overrides from "../overrides"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import {Passive as PassiveAttr} from "#enums/passive"; import * as Challenge from "../data/challenge"; @@ -36,6 +38,7 @@ import { Device } from "#enums/devices"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import {Button} from "#enums/buttons"; +import { EggSourceType } from "#app/enums/egg-source-types.js"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -98,17 +101,17 @@ const languageSettings: { [key: string]: LanguageSetting } = { } }; -const starterCandyCosts: { passive: integer, costReduction: [integer, integer] }[] = [ - { passive: 50, costReduction: [30, 75] }, // 1 - { passive: 45, costReduction: [25, 60] }, // 2 - { passive: 40, costReduction: [20, 50] }, // 3 - { passive: 30, costReduction: [15, 40] }, // 4 - { passive: 25, costReduction: [12, 35] }, // 5 - { passive: 20, costReduction: [10, 30] }, // 6 - { passive: 15, costReduction: [8, 20] }, // 7 - { passive: 10, costReduction: [5, 15] }, // 8 - { passive: 10, costReduction: [3, 10] }, // 9 - { passive: 10, costReduction: [3, 10] }, // 10 +const starterCandyCosts: { passive: integer, costReduction: [integer, integer], egg: integer }[] = [ + { passive: 50, costReduction: [30, 75], egg: 35 }, // 1 + { passive: 45, costReduction: [25, 60], egg: 35 }, // 2 + { passive: 40, costReduction: [20, 50], egg: 35 }, // 3 + { passive: 30, costReduction: [15, 40], egg: 30 }, // 4 + { passive: 25, costReduction: [12, 35], egg: 25 }, // 5 + { passive: 20, costReduction: [10, 30], egg: 20 }, // 6 + { passive: 15, costReduction: [8, 20], egg: 15 }, // 7 + { passive: 10, costReduction: [5, 15], egg: 10 }, // 8 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 9 + { passive: 10, costReduction: [3, 10], egg: 10 }, // 10 ]; function getPassiveCandyCount(baseValue: integer): integer { @@ -119,6 +122,10 @@ function getValueReductionCandyCounts(baseValue: integer): [integer, integer] { return starterCandyCosts[baseValue - 1].costReduction; } +function getSameSpeciesEggCandyCounts(baseValue: integer): integer { + return starterCandyCosts[baseValue - 1].egg; +} + /** * Calculates the icon position for a Pokemon of a given UI index * @param index UI index to calculate the icon position of @@ -192,6 +199,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonCaughtCountText: Phaser.GameObjects.Text; private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; + private pokemonShinyIcon: Phaser.GameObjects.Sprite; private genOptionsText: Phaser.GameObjects.Text; private instructionsContainer: Phaser.GameObjects.Container; @@ -270,6 +278,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectCallback: StarterSelectCallback; + private starterPreferences: StarterPreferences; + protected blockInput: boolean = false; constructor(scene: BattleScene) { @@ -430,7 +440,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.valueLimitLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(this.valueLimitLabel); - const startLabel = addTextObject(this.scene, 124, 162, i18next.t("starterSelectUiHandler:start"), TextStyle.TOOLTIP_CONTENT); + const startLabel = addTextObject(this.scene, 124, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); startLabel.setOrigin(0.5, 0); this.starterSelectContainer.add(startLabel); @@ -545,11 +555,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type1Icon.setScale(0.5); + this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type1Icon.setScale(0.5); this.type1Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type1Icon); - this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type2Icon.setScale(0.5); + this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.type2Icon.setScale(0.5); this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); @@ -605,6 +617,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setScale(0.8); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); + this.pokemonShinyIcon = this.scene.add.sprite(14, 76, "shiny_icons"); + this.pokemonShinyIcon.setOrigin(0.15, 0.2); + this.pokemonShinyIcon.setScale(1); + this.pokemonCaughtHatchedContainer.add ((this.pokemonShinyIcon)); + this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, "0", TextStyle.SUMMARY_ALT); this.pokemonHatchedCountText.setOrigin(0, 0); this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); @@ -676,35 +693,48 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.add(this.instructionsContainer); // instruction rows that will be pushed into the container dynamically based on need - this.shinyIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + // creating new sprites since they will be added to the scene later + this.shinyIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement.setName("sprite-shiny-icon-element"); this.shinyIconElement.setScale(0.675); this.shinyIconElement.setOrigin(0.0, 0.0); this.shinyLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel.setName("text-shiny-label"); - this.formIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement.setName("sprite-form-icon-element"); this.formIconElement.setScale(0.675); this.formIconElement.setOrigin(0.0, 0.0); this.formLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel.setName("text-form-label"); - this.genderIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement.setName("sprite-gender-icon-element"); this.genderIconElement.setScale(0.675); this.genderIconElement.setOrigin(0.0, 0.0); this.genderLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel.setName("text-gender-label"); - this.abilityIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "E.png"); + this.abilityIconElement.setName("sprite-ability-icon-element"); this.abilityIconElement.setScale(0.675); this.abilityIconElement.setOrigin(0.0, 0.0); this.abilityLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.abilityLabel.setName("text-ability-label"); - this.natureIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "N.png"); + this.natureIconElement.setName("sprite-nature-icon-element"); this.natureIconElement.setScale(0.675); this.natureIconElement.setOrigin(0.0, 0.0); this.natureLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.natureLabel.setName("text-nature-label"); - this.variantIconElement = this.scene.add.sprite(this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement = new Phaser.GameObjects.Sprite(this.scene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement.setName("sprite-variant-icon-element"); this.variantIconElement.setScale(0.675); this.variantIconElement.setOrigin(0.0, 0.0); this.variantLabel = addTextObject(this.scene, this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("starterSelectUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.variantLabel.setName("text-variant-label"); this.hideInstructions(); @@ -780,6 +810,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } show(args: any[]): boolean { + if (!this.starterPreferences) { + // starterPreferences haven't been loaded yet + this.starterPreferences = StarterPrefs.load(); + } this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers if (args.length >= 1 && args[0] instanceof Function) { super.show(args); @@ -787,6 +821,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(true); + this.setCursor(0); this.setGenMode(false); this.setCursor(0); this.setGenMode(true); @@ -871,6 +906,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { && starterData.valueReduction < 2; } + /** + * Determines if an same species egg can be baught for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = this.scene.gameData.starterData[speciesId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarters[speciesId]); + } + /** * Sets a bounce animation if enabled and the Pokemon has an upgrade * @param icon {@linkcode Phaser.GameObjects.GameObject} to animate @@ -1090,7 +1137,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const species = this.genSpecies[this.getGenCursorWithScroll()][this.cursor]; const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); if (!isDupe && isValidForChallenge.value && this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId))) { const cursorObj = this.starterCursorObjs[this.starterCursors.length]; @@ -1222,6 +1269,54 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; + if (this.canCycleNature) { + // if we could cycle natures, enable the improved nature menu + const showNatureOptions = () => { + ui.setMode(Mode.STARTER_SELECT).then(() => { + ui.showText(i18next.t("starterSelectUiHandler:selectNature"), null, () => { + const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: natures.map((n: Nature, i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, this.scene.uiTheme), + handler: () => { + // update default nature in starter save data + if (!starterAttributes) { + starterAttributes= + this.starterPreferences[this.lastSpecies.speciesId] = {}; + } + starterAttributes.nature = n as unknown as integer; + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); + // set nature for starter + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, n, undefined); + return true; + } + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.clearText(); + ui.setMode(Mode.STARTER_SELECT); + return true; + } + }), + maxOptions: 8, + yOffset: 19 + }); + }); + }); + }; + options.push({ + label: i18next.t("starterSelectUiHandler:manageNature"), + handler: () => { + showNatureOptions(); + return true; + } + }); + } const candyCount = starterData.candyCount; const passiveAttr = starterData.passiveAttr; if (passiveAttr & PassiveAttr.UNLOCKED) { @@ -1254,9 +1349,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${passiveCost} ${i18next.t("starterSelectUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name})`, handler: () => { - if (candyCount >= passiveCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; - starterData.candyCount -= passiveCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= passiveCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1289,9 +1386,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${reductionCost} ${i18next.t("starterSelectUiHandler:reduceCost")}`, handler: () => { - if (candyCount >= reductionCost) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { starterData.valueReduction++; - starterData.candyCount -= reductionCost; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); this.scene.gameData.saveSystem().then(success => { if (!success) { @@ -1322,6 +1421,49 @@ export default class StarterSelectUiHandler extends MessageUiHandler { itemArgs: starterColors[this.lastSpecies.speciesId] }); } + + // Same species egg menu option. Only visible if passive is bought + if (passiveAttr & PassiveAttr.UNLOCKED) { + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarters[this.lastSpecies.speciesId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (this.scene.gameData.eggs.length < 99 && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({scene: this.scene, species: this.lastSpecies.speciesId, sourceType: EggSourceType.SAME_SPECIES_EGG}); + egg.addEggToGameData(this.scene); + + this.scene.gameData.saveSystem().then(success => { + if (!success) { + return this.scene.reset(true); + } + }); + ui.setMode(Mode.STARTER_SELECT); + this.scene.playSound("buy"); + + // If the notification setting is set to 'On', update the candy upgrade display + // if (this.scene.candyUpgradeNotification === 2) { + // if (this.isUpgradeIconEnabled() ) { + // this.setUpgradeIcon(this.cursor); + // } + // if (this.isUpgradeAnimationEnabled()) { + // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; + // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + // } + // } + + return true; + } + return false; + }, + item: "candy", + itemArgs: starterColors[this.lastSpecies.speciesId] + }); + } options.push({ label: i18next.t("menu:cancel"), handler: () => { @@ -1361,13 +1503,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const rows = Math.ceil(genStarters / 9); const row = Math.floor(this.cursor / 9); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); + // prepare persistent starter data to store changes + let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; + if (!starterAttributes) { + starterAttributes = + this.starterPreferences[this.lastSpecies.speciesId] = {}; + } switch (button) { case Button.CYCLE_SHINY: if (this.canCycleShiny) { + const newVariant = props.variant; this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined); if (this.dexAttrCursor & DexAttr.SHINY) { this.scene.playSound("sparkle"); + // Set the variant label to the shiny tint + const tint = getVariantTint(newVariant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setVisible(true); } else { + this.pokemonShinyIcon.setVisible(false); success = true; } } @@ -1382,12 +1537,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } while (newFormIndex !== props.formIndex); + starterAttributes.form = newFormIndex; // store the selected form this.setSpeciesDetails(this.lastSpecies, undefined, newFormIndex, undefined, undefined, undefined, undefined); success = true; } break; case Button.CYCLE_GENDER: if (this.canCycleGender) { + starterAttributes.female = !props.female; this.setSpeciesDetails(this.lastSpecies, undefined, undefined, !props.female, undefined, undefined, undefined); success = true; } @@ -1413,6 +1570,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } } while (newAbilityIndex !== this.abilityCursor); + starterAttributes.ability = newAbilityIndex; // store the selected ability this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); success = true; } @@ -1422,6 +1580,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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]; + // store cycled nature as default + starterAttributes.nature = newNature as unknown as integer; this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, newNature, undefined); success = true; } @@ -1446,11 +1606,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newVariant !== props.variant); this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); - // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant); - this.variantLabel.setTint(tint); - + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); success = true; } break; @@ -1726,8 +1885,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); const variant = defaultProps.variant; const tint = getVariantTint(variant); - - this.variantLabel.setTint(tint); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); this.setSpecies(species); this.updateInstructions(); } @@ -1775,12 +1934,68 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + + setSpecies(species: PokemonSpecies) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; this.dexAttrCursor = species ? this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true) : 0n; this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0; + const starterAttributes : StarterAttributes = species ? {...this.starterPreferences[species.speciesId]} : null; + // validate starterAttributes + if (starterAttributes) { + // this may cause changes so we created a copy of the attributes before + if (!isNaN(starterAttributes.variant)) { + if (![ + this.speciesStarterDexEntry.caughtAttr & DexAttr.NON_SHINY, + this.speciesStarterDexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT, + this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_2, + this.speciesStarterDexEntry.caughtAttr & DexAttr.VARIANT_3 + ][starterAttributes.variant+1]) { // add 1 as -1 = non-shiny + // requested variant wasn't unlocked, purging setting + delete starterAttributes.variant; + } + } + + if (typeof starterAttributes.female !== "boolean" || !(starterAttributes.female ? + this.speciesStarterDexEntry.caughtAttr & DexAttr.FEMALE : + this.speciesStarterDexEntry.caughtAttr & DexAttr.MALE + )) { + // requested gender wasn't unlocked, purging setting + delete starterAttributes.female; + } + + const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr; + if (![ + abilityAttr & AbilityAttr.ABILITY_1, + species.ability2 ? (abilityAttr & AbilityAttr.ABILITY_2) : abilityAttr & AbilityAttr.ABILITY_HIDDEN, + species.ability2 && abilityAttr & AbilityAttr.ABILITY_HIDDEN + ][starterAttributes.ability]) { + // requested ability wasn't unlocked, purging setting + delete starterAttributes.ability; + } + + if (!(species.forms[starterAttributes.form]?.isStarterSelectable && this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(starterAttributes.form))) { + // requested form wasn't unlocked/isn't a starter form, purging setting + delete starterAttributes.form; + } + + if (this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry.natureAttr).indexOf(starterAttributes.nature as unknown as Nature) < 0) { + // requested nature wasn't unlocked, purging setting + delete starterAttributes.nature; + } + } + + if (starterAttributes?.nature) { + // load default nature from stater save data, if set + this.natureCursor = starterAttributes.nature; + } + if (!isNaN(starterAttributes?.ability)) { + // load default nature from stater save data, if set + this.abilityCursor = starterAttributes.ability; + } + if (this.statsMode) { if (this.speciesStarterDexEntry?.caughtAttr) { this.statsContainer.setVisible(true); @@ -1819,6 +2034,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonLuckText.setText(luck.toString()); this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); + this.pokemonShinyIcon.setVisible(this.pokemonLuckText.visible); //Growth translate let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); @@ -1842,9 +2058,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); } this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`); + const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = defaultProps.variant; + const tint = getVariantTint(variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); this.pokemonCaughtHatchedContainer.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { this.pokemonCaughtHatchedContainer.setY(16); + this.pokemonShinyIcon.setY(135); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); [ this.pokemonCandyIcon, this.pokemonCandyOverlayIcon, @@ -1858,6 +2082,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedCountText.setVisible(false); } else { this.pokemonCaughtHatchedContainer.setY(25); + this.pokemonShinyIcon.setY(117); this.pokemonCandyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0]))); this.pokemonCandyIcon.setVisible(true); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1]))); @@ -1919,9 +2144,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, this.starterAbilityIndexes[starterIndex], this.starterNatures[starterIndex]); } else { const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); + const defaultAbilityIndex = starterAttributes?.ability ?? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + // load default nature from stater save data, if set + const defaultNature = starterAttributes?.nature || this.scene.gameData.getSpeciesDefaultNature(species); props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + if (!isNaN(starterAttributes?.variant)) { + if (props.shiny = (starterAttributes.variant >= 0)) { + props.variant = starterAttributes.variant as Variant; + } + } + props.formIndex = starterAttributes?.form ?? props.formIndex; + props.female = starterAttributes?.female ?? props.female; this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.variant, defaultAbilityIndex, defaultNature); } @@ -1940,6 +2173,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); this.pokemonUncaughtText.setVisible(true); this.pokemonAbilityLabelText.setVisible(false); this.pokemonPassiveLabelText.setVisible(false); @@ -1968,6 +2202,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.type2Icon.setVisible(false); this.pokemonLuckLabelText.setVisible(false); this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); this.pokemonUncaughtText.setVisible(!!species); this.pokemonAbilityLabelText.setVisible(false); this.pokemonPassiveLabelText.setVisible(false); @@ -1984,6 +2219,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } + + setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, variant: Variant, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void { const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species); @@ -2084,8 +2321,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonSprite.setVisible(!this.statsMode); }); - (this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite) - .setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); + + const isValidForChallenge = new Utils.BooleanHolder(true); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); + const starterSprite = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite; + starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); + starterSprite.setAlpha(isValidForChallenge.value ? 1 : 0.375); this.checkIconId((this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite), species, female, formIndex, shiny, variant); this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); @@ -2302,7 +2543,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { * we change to can AddParty value to true since the user has enough cost to choose this pokemon and this pokemon registered too. */ const isValidForChallenge = new Utils.BooleanHolder(true); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.genSpecies[g][s], isValidForChallenge); + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.genSpecies[g][s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.genSpecies[g][s], this.scene.gameData.getSpeciesDefaultDexAttr(this.genSpecies[g][s], false, true)), this.starterGens.length + (add ? 1 : 0)); const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; @@ -2416,6 +2657,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { clear(): void { super.clear(); + + StarterPrefs.save(this.starterPreferences); this.cursor = -1; this.hideInstructions(); this.starterSelectContainer.setVisible(false); diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 11154bd700b..b4e799bafc0 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -26,7 +26,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { } setup() { - this.setName("container-stats"); + this.setName("stats"); const ivChartBgData = new Array(6).fill(null).map((_, i: integer) => [ ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); const ivChartBg = this.scene.add.polygon(48, 44, ivChartBgData, 0xd8e0f0, 0.625); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index ab94610ecb5..17012182496 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -15,7 +15,7 @@ import { Stat, getStatName } from "../data/pokemon-stat"; import { PokemonHeldItemModifier } from "../modifier/modifier"; import { StatusEffect } from "../data/status-effect"; import { getBiomeName } from "../data/biomes"; -import { Nature, getNatureStatMultiplier } from "../data/nature"; +import { getNatureName, getNatureStatMultiplier } from "../data/nature"; import { loggedInUser } from "../account"; import { Variant, getVariantTint } from "#app/data/variant"; import {Button} from "#enums/buttons"; @@ -802,7 +802,7 @@ export default class SummaryUiHandler extends UiHandler { 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 memoString = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon.getNature())), TextStyle.SUMMARY_RED)}${getBBCodeFrag(" nature,", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? "apparently " : ""}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(",", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag(".", TextStyle.WINDOW_ALT)}`; const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); diff --git a/src/ui/text.ts b/src/ui/text.ts index b74742fef74..dd1ac57523a 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -89,7 +89,7 @@ function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptio const defaultFontSize = 96; let styleOptions: Phaser.Types.GameObjects.Text.TextStyle = { - fontFamily: "emerald, unifont", + fontFamily: "emerald", fontSize: 96, color: getTextColor(style, false, uiTheme), padding: { @@ -198,10 +198,10 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui case TextStyle.PARTY_RED: return !shadow ? "#f89890" : "#984038"; case TextStyle.SUMMARY: - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; case TextStyle.SUMMARY_ALT: if (uiTheme) { - return !shadow ? "#ffffff" : "#636363"; + return !shadow ? "#f8f8f8" : "#636363"; } return !shadow ? "#484848" : "#d0d0c8"; case TextStyle.SUMMARY_RED: @@ -233,17 +233,17 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui export function getModifierTierTextTint(tier: ModifierTier): integer { switch (tier) { case ModifierTier.COMMON: - return 0xffffff; + return 0xf8f8f8; case ModifierTier.GREAT: - return 0x3890f8; + return 0x4998f8; case ModifierTier.ULTRA: return 0xf8d038; case ModifierTier.ROGUE: - return 0xd52929; + return 0xdb4343; case ModifierTier.MASTER: - return 0xe020c0; + return 0xe331c5; case ModifierTier.LUXURY: - return 0xe64a18; + return 0xe74c18; } } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 54c478a7ad7..4036e0b9922 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,22 +1,20 @@ import BattleScene from "../battle-scene"; -import { DailyRunScoreboard } from "./daily-run-scoreboard"; import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; import { TextStyle, addTextObject } from "./text"; import { getBattleCountSplashMessage, getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; +import { TimedEventDisplay } from "#app/timed-event-manager.js"; export default class TitleUiHandler extends OptionSelectUiHandler { private titleContainer: Phaser.GameObjects.Container; - private dailyRunScoreboard: DailyRunScoreboard; private playerCountLabel: Phaser.GameObjects.Text; private splashMessage: string; private splashMessageText: Phaser.GameObjects.Text; - private eventTimerText: Phaser.GameObjects.Text; + private eventDisplay: TimedEventDisplay; private titleStatsTimer: NodeJS.Timeout; - private eventTimer: NodeJS.Timeout; constructor(scene: BattleScene, mode: Mode = Mode.TITLE) { super(scene, mode); @@ -28,7 +26,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); this.titleContainer = this.scene.add.container(0, -(this.scene.game.canvas.height / 6)); - this.titleContainer.setName("container-title"); + this.titleContainer.setName("title"); this.titleContainer.setAlpha(0); ui.add(this.titleContainer); @@ -37,36 +35,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.add(logo); if (this.scene.eventManager.isEventActive()) { - const event = this.scene.eventManager.activeEvent(); - const banner = this.scene.add.image(29, 64, event.bannerFilename); - banner.setName("img-event-banner"); - banner.setOrigin(0, 0); - banner.setScale(0.07); - const bannerShadow = this.scene.add.rectangle( - banner.x - 2, - banner.y + 2, - banner.width, - banner.height, - 0x484848 - ); - bannerShadow.setName("rect-event-banner-shadow"); - bannerShadow.setScale(0.07); - bannerShadow.setAlpha(0.5); - bannerShadow.setOrigin(0,0); - this.eventTimerText = addTextObject( - this.scene, - banner.x + 8, - banner.y + 100, - this.timeToGo(event.endDate), - TextStyle.WINDOW - ); - this.eventTimerText.setName("text-event-timer"); - this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0,0); - - this.titleContainer.add(bannerShadow); - this.titleContainer.add(banner); - this.titleContainer.add(this.eventTimerText); + this.eventDisplay = new TimedEventDisplay(this.scene, 0, 0, this.scene.eventManager.activeEvent()); + this.eventDisplay.setup(); + this.titleContainer.add(this.eventDisplay); } this.playerCountLabel = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - 109, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" }); @@ -89,33 +60,6 @@ export default class TitleUiHandler extends OptionSelectUiHandler { }); } - timeToGo(date: Date) { - - // Utility to add leading zero - function z(n) { - return (n < 10? "0" : "") + n; - } - const now = new Date(); - let diff = Math.abs(date.getTime() - now.getTime()); - - // Allow for previous times - diff = Math.abs(diff); - - // Get time components - const days = diff/8.64e7 | 0; - const hours = diff%8.64e7 / 3.6e6 | 0; - const mins = diff%3.6e6 / 6e4 | 0; - const secs = Math.round(diff%6e4 / 1e3); - - // Return formatted string - return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs)+ "s"; - } - - updateCountdown() { - const event = this.scene.eventManager.activeEvent(); - this.eventTimerText.setText(this.timeToGo(event.endDate)); - } - updateTitleStats(): void { Utils.apiFetch("game/titlestats") .then(request => request.json()) @@ -139,14 +83,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - // this.dailyRunScoreboard.update(); - if (this.scene.eventManager.isEventActive()) { - this.updateCountdown(); - - this.eventTimer = setInterval(() => { - this.updateCountdown(); - }, 1000); + this.eventDisplay.show(); } this.updateTitleStats(); @@ -171,8 +109,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - clearInterval(this.eventTimer); - this.eventTimer = null; + this.eventDisplay?.clear(); clearInterval(this.titleStatsTimer); this.titleStatsTimer = null; diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index b2992d049cb..58490e1c618 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -46,13 +46,25 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, null, width, height, borderSize, borderSize, borderSize, borderSize); window.setOrigin(0, 0); - if (mergeMaskTop || mergeMaskLeft) { - const maskRect = scene.make.graphics({}); + if (mergeMaskLeft || mergeMaskTop || maskOffsetX || maskOffsetY) { + /** + * x: left + * y: top + * width: right + * height: bottom + */ + const maskRect = new Phaser.GameObjects.Rectangle( + scene, + 6*(x - (mergeMaskLeft ? 2 : 0) - (maskOffsetX || 0)), + 6*(y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0)), + width - (mergeMaskLeft ? 2 : 0), + height - (mergeMaskTop ? 2 : 0), + 0xffffff + ); + maskRect.setOrigin(0); maskRect.setScale(6); - maskRect.fillStyle(0xFFFFFF); - maskRect.beginPath(); - maskRect.fillRect(window.x + (mergeMaskLeft ? 2 : 0) + (maskOffsetX || 0), window.y + (mergeMaskTop ? 2 : 0) + (maskOffsetY || 0), window.width - (mergeMaskLeft ? 2 : 0), window.height - (mergeMaskTop ? 2 : 0)); - window.setMask(maskRect.createGeometryMask()); + const mask = maskRect.createGeometryMask(); + window.setMask(mask); } return window; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 55982d049cf..ce834a83645 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -45,6 +45,7 @@ import KeyboardBindingUiHandler from "#app/ui/settings/keyboard-binding-ui-handl import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; +import BgmBar from "#app/ui/bgm-bar"; export enum Mode { MESSAGE, @@ -127,6 +128,7 @@ export default class UI extends Phaser.GameObjects.Container { public handlers: UiHandler[]; private overlay: Phaser.GameObjects.Rectangle; public achvBar: AchvBar; + public bgmBar: BgmBar; public savingIcon: SavingIconHandler; private tooltipContainer: Phaser.GameObjects.Container; @@ -159,6 +161,7 @@ export default class UI extends Phaser.GameObjects.Container { new OptionSelectUiHandler(scene), new MenuUiHandler(scene), new OptionSelectUiHandler(scene, Mode.MENU_OPTION_SELECT), + // settings new SettingsUiHandler(scene), new SettingsDisplayUiHandler(scene), new SettingsAudioUiHandler(scene), @@ -182,11 +185,12 @@ export default class UI extends Phaser.GameObjects.Container { } setup(): void { - this.setName("container-ui"); + this.setName(`ui-${Mode[this.mode]}`); 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.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); (this.scene as BattleScene).uiContainer.add(this.overlay); this.overlay.setVisible(false); @@ -205,15 +209,19 @@ export default class UI extends Phaser.GameObjects.Container { private setupTooltip() { this.tooltipContainer = this.scene.add.container(0, 0); + this.tooltipContainer.setName("tooltip"); this.tooltipContainer.setVisible(false); this.tooltipBg = addWindow(this.scene as BattleScene, 0, 0, 128, 31); + this.tooltipBg.setName("window-tooltip-bg"); this.tooltipBg.setOrigin(0, 0); this.tooltipTitle = addTextObject(this.scene, 64, 4, "", TextStyle.TOOLTIP_TITLE); + this.tooltipTitle.setName("text-tooltip-title"); this.tooltipTitle.setOrigin(0.5, 0); this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); + this.tooltipContent.setName("text-tooltip-content"); this.tooltipContent.setWordWrapWidth(696); this.tooltipContainer.add(this.tooltipBg); @@ -241,7 +249,6 @@ export default class UI extends Phaser.GameObjects.Container { battleScene?.processInfoButton(pressed); return true; } - battleScene?.processInfoButton(false); return true; } diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 60d01a93c82..2f6e1c08832 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -3,6 +3,8 @@ import { ModalConfig, ModalUiHandler } from "./modal-ui-handler"; import { addTextObject, TextStyle } from "./text"; import { Mode } from "./ui"; import { updateUserInfo } from "#app/account"; +import * as Utils from "#app/utils"; +import i18next from "i18next"; export default class UnavailableModalUiHandler extends ModalUiHandler { private reconnectTimer: NodeJS.Timeout; @@ -42,7 +44,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, i18next.t("menu:errorServerDown"), TextStyle.WINDOW, { fontSize: "48px", align: "center" }); label.setOrigin(0.5, 0.5); this.modalContainer.add(label); @@ -55,6 +57,9 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { this.reconnectDuration = this.minTime; this.scene.playSound("pb_bounce_1"); this.reconnectCallback(); + } else if (response[1] === 401) { + Utils.setCookie(Utils.sessionIdKey, ""); + this.scene.reset(true, true); } else { this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite this.reconnectTimer = diff --git a/src/ui/vouchers-ui-handler.ts b/src/ui/vouchers-ui-handler.ts index a57a5dda9e7..370859bed54 100644 --- a/src/ui/vouchers-ui-handler.ts +++ b/src/ui/vouchers-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene from "../battle-scene"; import { Button } from "#enums/buttons"; -import i18next from "../plugins/i18n"; +import i18next from "i18next"; import { Voucher, getVoucherTypeIcon, getVoucherTypeName, vouchers } from "../system/voucher"; import MessageUiHandler from "./message-ui-handler"; import { TextStyle, addTextObject } from "./text"; diff --git a/src/utils.ts b/src/utils.ts index 7c1a24a6d5e..5a67df314d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -361,6 +361,9 @@ export function apiPost(path: string, data?: any, contentType: string = "applica }) : new Promise(() => {}); } +/** Alias for the constructor of a class */ +export type Constructor = new(...args: unknown[]) => T; + export class BooleanHolder { public value: boolean; @@ -393,6 +396,20 @@ export function fixedInt(value: integer): integer { return new FixedInt(value) as unknown as integer; } +/** + * Formats a string to title case + * @param unformattedText Text to be formatted + * @returns the formatted string + */ +export function formatText(unformattedText: string): string { + const text = unformattedText.split("_"); + for (let i = 0; i < text.length; i++) { + text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); + } + + return text.join(" "); +} + export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -447,9 +464,9 @@ export function verifyLang(lang?: string): boolean { case "fr": case "de": case "it": - case "zh_CN": - case "zh_TW": - case "pt_BR": + case "zh-CN": + case "zh-TW": + case "pt-BR": case "ko": return true; default: diff --git a/tsconfig.json b/tsconfig.json index 2df676d8433..682b3a7084b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,8 +20,15 @@ "noEmit": true }, "typedocOptions": { - "entryPoints": ["src/"], + "entryPoints": ["./src"], "entryPointStrategy": "expand", - "out": "typedoc", - } + "exclude": "**/*+.test.ts", + "out": "typedoc" + }, + "exclude": [ + "node_modules", + "dist", + "vite.config.ts", + "vitest.config.ts" + ] } \ No newline at end of file diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index d0fff2e428b..00000000000 --- a/vite.config.js +++ /dev/null @@ -1,34 +0,0 @@ -import { resolve } from 'path'; -import { defineConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; -// import fs from 'vite-plugin-fs'; - -export default defineConfig(({ mode }) => { - return { - plugins: [tsconfigPaths()], - server: { host: '0.0.0.0', port: 8000 }, - clearScreen: false, - build: { - minify: 'esbuild', - sourcemap: false, - }, - rollupOptions: { - onwarn(warning, warn) { - // Suppress "Module level directives cause errors when bundled" warnings - if (warning.code === "MODULE_LEVEL_DIRECTIVE") { - return; - } - warn(warning); - }, - }, - resolve: { - alias: { - "#enums": resolve('./src/enums') - } - }, - esbuild: { - pure: mode === 'production' ? [ 'console.log' ] : [], - keepNames: true, - }, - } -}) diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000000..f0830f5b9be --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,30 @@ +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export const defaultConfig = { + plugins: [tsconfigPaths() as any], + server: { host: '0.0.0.0', port: 8000 }, + clearScreen: false, + build: { + minify: 'esbuild' as const, + sourcemap: false, + }, + rollupOptions: { + onwarn(warning, warn) { + // Suppress "Module level directives cause errors when bundled" warnings + if (warning.code === "MODULE_LEVEL_DIRECTIVE") { + return; + } + warn(warning); + }, + } +}; + + +export default defineConfig(({mode}) => ({ + ...defaultConfig, + esbuild: { + pure: mode === 'production' ? [ 'console.log' ] : [], + keepNames: true, + }, +})); diff --git a/vitest.config.js b/vitest.config.js deleted file mode 100644 index d68ce4d52fe..00000000000 --- a/vitest.config.js +++ /dev/null @@ -1,48 +0,0 @@ -import { defineConfig } from 'vite'; -import path from 'path'; -// import fs from 'vite-plugin-fs'; - -export default defineConfig(({ mode }) => { - return { - test: { - setupFiles: ['./src/test/vitest.setup.ts'], - environment: 'jsdom', - deps: { - optimizer: { - web: { - include: ['vitest-canvas-mock'], - } - } - }, - threads: false, - trace: true, - restoreMocks: true, - environmentOptions: { - jsdom: { - resources: 'usable', - }, - }, - coverage: { - provider: 'istanbul', - reportsDirectory: 'coverage', - reporters: ['text-summary', 'html'], - }, - }, - plugins: [/*fs()*/], - server: { host: '0.0.0.0', port: 8000 }, - clearScreen: false, - build: { - minify: 'esbuild', - sourcemap: true - }, - resolve: { - alias: { - "#enums": path.resolve('./src/enums') - } - }, - esbuild: { - pure: mode === 'production' ? [ 'console.log' ] : [], - keepNames: true, - }, - } -}) diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000000..7f16059a8ad --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vitest/config'; +import { defaultConfig } from './vite.config'; + +export default defineConfig(({mode}) => ({ + ...defaultConfig, + test: { + setupFiles: ['./src/test/vitest.setup.ts'], + server: { + deps: { + inline: ['vitest-canvas-mock'], + optimizer: { + web: { + include: ['vitest-canvas-mock'], + } + } + } + }, + environment: 'jsdom' as const, + environmentOptions: { + jsdom: { + resources: 'usable', + }, + }, + threads: false, + trace: true, + restoreMocks: true, + watch: false, + coverage: { + provider: 'istanbul' as const, + reportsDirectory: 'coverage' as const, + reporters: ['text-summary', 'html'], + }, + }, + esbuild: { + pure: mode === 'production' ? [ 'console.log' ] : [], + keepNames: true, + }, +}))